專案

一般

設定檔

動作

這份文件非常令人困惑 - 它提到了安裝 mod_fcgid、mod_fastcgi 和 mod_passenger。運行 Redmine 是否需要所有這些,或者它們代表不同的選項?如果它們是選項,如何知道需要哪個?對於新使用者來說,一個簡單的、編號的步驟列表會更容易遵循。另外,關於 CentOS 6 和/或 Fedora 的說明呢?

如何配置 Apache 以運行 Redmine

這些說明假設您已經透過 webrick 伺服器運行 Redmine,並且正在尋求透過現有的 Apache 安裝運行 Redmine。大多數指令假設您位於 redmine 的根安裝目錄中,因此請務必在開始之前更改到該目錄。

適用於 CentOS 5

假設

  • 作業系統為 CentOS 5
  • 網路伺服器為 Apache 2
    • 已啟用 mod_cgi
    • 正在使用基於名稱的虛擬伺服器
    • 網路伺服器以使用者 apache、群組 apache 運行

迷思

  • 您不需要運行 mod_fcgid
  • 您不需要運行 mod_fastcgi

本節需要修改。我看不出這些是迷思還是對迷思的修正。
(注意:如果有人能如此慷慨地在此發布有效的、已知的、良好的、啟用 FastCGI 的操作步驟,那將對整個社群非常有價值。
據報導,www.redmine.org 本身運行 FastCGI,因此顯然是一種有效、值得、穩定、高效的運行這個偉大網路應用程式的的方式。)

我在下面添加了詳細說明 mod_fastcgi 和 mod_fcgid 安裝和配置的部分。 --wmbaum,(2009-08-30)

我們在讓 Rails 2.3.5 與 cgi 和 fastcgi 配合使用時遇到了問題。Apache2 上的 fcgid 在 9.3 上運行良好。我們根據最近的 fcgid 更新調整了一些說明。 -- cybersprocket, (2010-04-25)

基本步驟

  • 根據安裝說明安裝 Redmine,並使用 webrick 運行它。
  • 終止 webrick 會話
  • 將 public/dispatch.cgi.example 複製到 public/dispatch.cgi
  • 編輯 public/dispatch.cgi 以修復 Shell 腳本呼叫,使其指向 Ruby 可執行文件
    #!/usr/local/bin/ruby

    #!/usr/bin/ruby

    #!c:/ruby_root/bin/ruby.exe
  • 同樣在 public/dispatch.cgi 中,您可能需要將 require 行更改為註釋中所述的絕對路徑,例如
    require "/usr/lib/ruby/gems/1.8/gems/rails-2.1.2/lib/dispatcher.rb"

    require "c:/ruby_root/lib/ruby/gems/1.8/gems/rails-2.3.11/lib/dispatcher.rb"
  • 透過以下方式確保 public/dispatch.cgi 擁有執行權限
    # chmod 755 public/dispatch.cgi
  • 更新 config/environment.rb 文件以強制 Rails 環境為生產環境,只需取消註釋文件開頭的這一行即可
    ENV['RAILS_ENV'] ||= 'production'
  • 將您的虛擬主機條目添加到 Apache 配置文件 (/etc/httpd/conf/httpd.conf)。 我們已將 Redmine 安裝到我們服務器上的 /live/redmine 文件夾中。*備註:請確保將您的 DocumentRoot 指向 public 子文件夾!*
    <VirtualHost *:80>
        ServerName redmine.<YOUR-DOMAIN>.com
        ServerAdmin webmaster@<YOUR-DOMAIN>.com
        DocumentRoot /live/redmine/public/
        ErrorLog logs/redmine_error_log

        #If you are using mod_fcgid and are going to upload files larger than
        #131072 bytes you should consider adding the following line
        #that allows to upload files up to 20 mb
        MaxRequestLen 20971520

        <Directory "/live/redmine/public/">
                Options Indexes ExecCGI FollowSymLinks
                Order allow,deny
                Allow from all
                AllowOverride all
        </Directory>
    </VirtualHost>
  • 不要忘記綁定端口!
    Listen *:3000
    
  • 確保您的 files、log、tmp 和 vendor 目錄都可由用戶 apache、組 apache 讀取/寫入。 我們透過更改所有權來實現這一點
    # chown -R apache:apache files log tmp vendor

錯誤訊息和解決方案

  • Rails 需要 RubyGems >= 0.9.4。 請安裝 RubyGems
    尋找流氓版本的 ruby 二進制文件。 我們在 /usr/bin/ruby 和 /usr/local/bin/ruby 中都有一個較舊的版本。
  • 過早的腳本標頭
    這是來自 Apache 的通用「在 CGI 腳本中的 Content-Type: 標頭之前獲得了某些內容」錯誤。 運行 dispatch.cgi(見下文)並查看 Content-Type: 指令之前出現的內容。

有用的命令

  • # which ruby
    告訴您在未指定完整文件名時正在運行哪個 ruby 二進制文件。
  • # find / -name ruby
    在您的整個系統中搜索任何名為 ruby 的文件,警告:在大型文件系統上可能需要一段時間。
  • # ruby -v
    告訴您默認情況下您正在運行哪個版本的 ruby
  • #public/dispatch.cgi
    運行 dispatch CGI 腳本。 它應該輸出以 Content-Type: text/html; charset=utf-8 開頭的 HTML,如果在 Content-Type 文本之前有任何內容,您將在 Apache 日誌文件中收到「過早的腳本標頭」錯誤。

mod_fastcgi

我建議使用上面的 mod_cgi 運行 Redmine,不僅可以驗證您的基本 Redmine 和 Apache 配置,還可以讓您了解從 mod_fastcgi 或 mod_fcgid 中獲得的性能提升。

我們將從 mod_fastcgi 開始。

安裝先決條件

yum install libtool httpd-devel apr-devel apr

下載並安裝 mod_fastcgi

cd /usr/local/src/
wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz

tar -zxvf mod_fastcgi-current.tar.gz
cd mod_fastcgi-2.4.6/
cp Makefile.AP2 Makefile 
make top_dir=/usr/lib/httpd
make install top_dir=/usr/lib/httpd

創建或編輯 /etc/httpd/conf.d/mod_fastcgi.conf

LoadModule fastcgi_module modules/mod_fastcgi.so
<IfModule mod_fastcgi.c>
FastCgiIpcDir /tmp/fcgi_ipc/
</IfModule>

/tmp/fcgi_ipc/ 目錄需要對 apache 用戶可寫

chown -R apache.apache /tmp/fcgi_ipc/
chmod -R 777 /tmp/fcgi_ipc/

備註:我不得不做了不止一次.. 它創建了目錄,然後它又不擁有.. ??

下載並安裝 fcgi(適用於 fcgi gem)

wget http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
tar -zxvf fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure
make
make install

安裝 fcgi gem:

gem install fcgi

配置 Redmine 以使用 fastcgi:

在您的 redmine/public/ 目錄中,將 dispatch.fcgi.example 複製到 dispatch.fcgi

備註:我的是 shebanged 到「#!/usr/bin/env ruby」,這沒問題。我發現一兩個參考似乎表明 'env' 位比直接調用 ruby 更可取。如果這不起作用,那麼您需要將其更改為上面您的 ruby 所在的位置。

./public/.htaccess

#RewriteRule ^(stylesheets.*|images.*|favicon.*|javascripts.*|plugin_assets.*|themes.*|help.*)$ $1 [L]
#<IfModule mod_fastcgi.c>
#       RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
#</IfModule>
#<IfModule mod_fcgid.c>
#       RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
#</IfModule>
#<IfModule mod_cgi.c>
#       RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
#</IfModule>
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

默認的 .htaccess 將使用 cgi(如果可用),因此我們需要強制使用 fcgi。您也許可以重新排列指令以優先使用 fcgi——我只是將其他指令註釋掉,並使用 RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] 強制使用它。您可以使用 ps gaux 查看實際使用的是哪一個。

試一試

/etc/init.d/httpd configtest
/etc/init.d/httpd restart

其他 Apache 配置

當我第一次用 Redmine 啟動 Apache 時,Apache 啟動非常緩慢,並且占用了比平常多很多的 RAM。進一步調查發現,它啟動了8ruby .../redmine/public/dispatch.fcgi 進程!難怪它很慢。

我是在 Apache 預設的 VirtualHost 下運行 Redmine,並套用了預設的 StartServers、MinSpareServers 等。您可以在 /etc/httpd/conf/httpd.conf 中調整預設值,或者更好的方法是在 NameVirtualHost 或不同的 VirtualHost 下運行 Redmine。這可以防止 Apache 啟動一堆無關的進程,而 NameVirtualHost 應該允許您在同一個 IP 上配置多個 Redmine 環境,而不會浪費一堆資源。

如果您在 Apache 虛擬主機方面遇到問題,這可能會很有幫助

/usr/sbin/httpd -t -D DUMP_VHOSTS

mod_fcgid

來自 Apache 的 fcgid

官方 Apache mod_fcgid 這是 Apache 版本,似乎更新,而且我們使用這個版本比下面的 Coremail 主機版本更幸運。

cd /usr/local/src/
wget http://apache.mirrors.hoobly.com/httpd/mod_fcgid/mod_fcgid-2.3.5.tar.gz
tar zxvf mod_fcgid.2.3.5.tgz
cd mod_fcgid.2.3.5

配置和安裝

./configure.apxs
make
make install
service httpd restart

來自中國 Coremail 服務的 fcgid

mod_fcgid 似乎更新,並且比 mod_fastcgi 更可取。

cd /usr/local/src/
wget http://apache.mirrors.hoobly.com/httpd/mod_fcgid/mod_fcgid-2.2.tar.gz
tar zxvf mod_fcgid.2.2.tgz
cd mod_fcgid.2.2

編輯 Makefile

#top_dir      = /usr/local/apache2
top_dir      = /usr/lib/httpd

建置它..

make
make install

編輯/建立 /etc/httpd/conf.d/mod_fcgid.conf

LoadModule fcgid_module /usr/lib/httpd/modules/mod_fcgid.so

<IfModule mod_fcgid.c>
    SocketPath /tmp/fcgid_sock/
    AddHandler fcgid-script .fcgi
</IfModule>

現在,您應該能夠通過將其中一個重命名為 /etc/httpd/conf.d/ 中的 *.conf 以外的名稱,在 mod_fastcgi 和 mod_fcgid 之間切換

cd /etc/httpd/conf.d/
mv mod_fastcgi.conf mod_fastcgi.conf.not
/etc/init.d/httpd restart

任何版本,權限

使用任何 fcgid 版本,您都可能會遇到 fcgid 服務啟動的問題。請確保 socks 父目錄(通常是 /var/log/httpd)具有適當的權限。/var/log/httpd 的預設目錄權限適用於 Apache 的標準非 fcgid 安裝。您需要為 Apache 添加執行權限,以便它在運行 fcgid 時可以正確讀取/寫入目錄。

chmod 755 /var/log/httpd
service httpd restart

安裝來源

在上述步驟中,我只在沒有在通用儲存庫中找到任何 RPM 的情況下才從來源安裝。我很驚訝人們不能簡單地使用 yum install 安裝 mod_fastcgi、mod_fcgid、fcgi 等,但我們就是這樣做的。如果您為上述任何一項找到了更好的方法或來源,請隨時更新。

您可以在 這裡 找到 mod_fcgid rpm --yingchun437, (2012-06-25)

Ubuntu 伺服器(版本?)(這不適用於 8.04 LTS)

安裝 Passenger

sudo aptitude install libapache2-mod-passenger

這確實將 Apache 伺服器的類型從 prefork 切換到 worker,但在我的情況下,這是可以接受的。

我已將 Redmine tarball 安裝到 /opt/redmine 中,名稱為 redmine-0.8.5,並建立了一個名為 current 的符號連結。
然後,從 Apache DocumentRoot 建立到 Redmine 公共目錄的連結(請參閱 /etc/apache2/config.d/*)。

ln -s /opt/redmine/current/public /var/www/redmine

使用以下內容更新 /etc/apache/config.d/redmine(或定義虛擬主機的位置):

RailsEnv production
RailsBaseURI /redmine

重新啟動 Apache。

適用於 FreeBSD(以及其他可能的操作系統)

我發現目前的說明在某些方面有所欠缺。根據上面的資訊,腳本和 css 可能無法正確顯示,連結會斷裂等等。此外,一些技巧似乎已經消失在歷史中(#!/bin/bash/ruby 技巧,使用這種技術則不需要)。以下是我如何讓它運作的。

確保已安裝「Apache 2.2」、「Ruby」、「fastcgi」(包括 gem)。
首先,將 Redmine 放在子目錄中需要更多工作,並且留給讀者作為練習,以便正確完成(提示:Rewrite 是您的朋友),所以從現在開始,我將假設 Redmine 將是 DocumentRoot。
所以這就是我的 httpd.conf

LoadModule fastcgi_module     libexec/apache22/mod_fastcgi.so

DocumentRoot "/usr/local/www/redmine/public" 

FastCgiServer /usr/local/www/redmine/public/dispatch.fcgi -idle-timeout 120 -initial-env RAILS_ENV=production -initial-env PATH=/usr/local/bin -processes 2

<Directory /usr/local/www/redmine/public>
   AddHandler fastcgi-script fcgi
   Order allow,deny
   Allow from all
   AllowOverride all
   Options +FollowSymLinks +ExecCGI
   RewriteEngine On
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ dispatch.fcgi
</Directory>

現在讓我們來解釋一下發生了什麼以及為什麼
  1. AddHandler fastcgi-script fcgi:定義當 Apache 辨識到副檔名為 fcgi 的檔案時,應由 fastcgi-script 處理常式處理。此處理常式的定義由 mod_fastcgi.so 模組建立(當然是透過 LoadModule 指令載入)。
  2. Options +FollowSymLinks +ExecCGI:告訴 Apache 在此目錄中允許執行 CGI 類似腳本。
  3. RewriteCond %{REQUEST_FILENAME} !-f:僅在檔案不存在時才進行重寫。
  4. RewriteRule ^(.*)$ dispatch.fcgi:所有請求都轉至 dispatch.fcgi。
  5. FastCgiServer /usr/local/www/redmine/public/dispatch.fcgi -idle-timeout 120 -initial-env RAILS_ENV=production -initial-env PATH=/usr/local/bin -processes 2:這是重點。正如 Scott Laird 在這篇部落格文章中所解釋的,執行 FastCGI 可以採用三種模式(請參閱文章)。這行程式碼告訴 FastCGI 如何處理我們的腳本,其中重要的部分是 initial-env,用於定義在 FastCGI 環境中應設置哪些變數。當 FastCGI 啟動時,它通常會以空白(空的)環境變數啟動,所以是的,你的 $PATH 將會是空的,而且沒有 /usr/bin/env 將不會在路徑中找到 ruby ​​可執行檔,因此會出現錯誤訊息 _env: ruby​​: 找不到檔案或目錄_。此外,ruby 不會知道它應該在生產環境中啟動。透過這一行程式碼,你就不必修改你的 dispatch.fcgi 的 shebang 行(#!/usr/bin/env ruby​​ 行),也不必在 config/environment.rb 檔案中使用 ENV['RAILS_ENV'] ||= 'production' 來進行設定。

重新啟動 Apache,設定應該就完成了。

steevithak . 更新於 大約 10 年前 · 26 個修訂版本