這份文件非常令人困惑 - 它提到了安裝 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
本節需要修改。我看不出這些是迷思還是對迷思的修正。據報導,www.redmine.org 本身運行 FastCGI,因此顯然是一種有效、值得、穩定、高效的運行這個偉大網路應用程式的的方式。)
(注意:如果有人能如此慷慨地在此發布有效的、已知的、良好的、啟用 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。進一步調查發現,它啟動了8 個 ruby .../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>現在讓我們來解釋一下發生了什麼以及為什麼
- AddHandler fastcgi-script fcgi:定義當 Apache 辨識到副檔名為 fcgi 的檔案時,應由 fastcgi-script 處理常式處理。此處理常式的定義由 mod_fastcgi.so 模組建立(當然是透過 LoadModule 指令載入)。
- Options +FollowSymLinks +ExecCGI:告訴 Apache 在此目錄中允許執行 CGI 類似腳本。
- RewriteCond %{REQUEST_FILENAME} !-f:僅在檔案不存在時才進行重寫。
- RewriteRule ^(.*)$ dispatch.fcgi:所有請求都轉至 dispatch.fcgi。
- 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 個修訂版本