项目

常规

个人资料

操作

本文档非常混乱 - 它讨论了安装mod_fcgid、mod_fastcgi和mod_passenger。这些都需要运行redmine,还是代表不同的选项?如果是选项,如何知道需要哪个?一个简单的编号步骤列表对新手来说更容易遵循。还有,CentOS 6和/或Fedora的说明怎么样?

如何配置Apache以运行Redmine

以下说明假设您已经通过webrick服务器运行了Redmine,并且正在尝试通过现有的Apache安装来运行Redmine。大多数命令假设您位于redmine的根安装目录中,因此在开始之前请确保更改到该目录。

对于CentOS 5

假设

  • 操作系统是CentOS 5
  • Web服务器是Apache 2
    • mod_cgi已启用
    • 使用基于名称的虚拟服务器
    • Web服务器在用户apache,组apache下运行

神话

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

此部分需要改进。我无法确定这些是神话还是对神话的纠正。
(注意:如果有人在这里慷慨地发布了启用FastCGI的有效、已知良好的步骤,那么这对整个社区都将非常有价值。)
据报道,www.redmine.org 本身运行FastCGI,因此显然这是一个有效、有价值、稳定、性能良好的运行此伟大Web应用的方式。)

我在下面添加了有关mod_fastcgi和mod_fcgid的安装和配置的章节。--wmbaum,(2009-08-30)

我们在使Rails 2.3.5与cgi和fastcgi一起工作时遇到了问题。fcgid在Apache2中对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-3.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)。我们在服务器的/live/redmine文件夹中安装了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
    
  • 确保你的文件、日志、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日志文件中获得“premature script headers”错误。

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

注意:我的脚本头是“#!/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配置

当我第一次启动Apache并连接Redmine时,Apache启动非常缓慢,并且占用的RAM比正常情况大得多。进一步调查发现,它启动了 8ruby .../redmine/public/dispatch.fcgi 进程!难怪它会这么慢。

我正在使用Apache默认的VirtualHost运行Redmine,并且应用了默认的StartServers、MinSpareServers等设置。您可以在 /etc/httpd/conf/httpd.conf 中调整默认设置,或者更好的方法是让Redmine在 NameVirtualHost 或不同的 VirtualHost 下运行。这样可以防止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>

现在您应该可以通过将其中一个重命名到除*.conf以外的名称来在 /etc/httpd/conf.d/ 中在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的默认目录权限是用于标准的非fcgid Apache安装。您需要为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 hack,这在当前技术中不再需要)。以下是我使它工作的方式。

请确保已安装 '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. 添加处理程序 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: No such file or directory而失败。此外,ruby将不知道它需要在生产环境中启动。有了这一行,你就不需要修复dispatch.fcgi的shebang(#!/usr/bin/env ruby行),也不需要更改config/environment.rb文件中的ENV['RAILS_ENV'] ||= 'production'。

重新启动Apache,你应该就设置好了。

steevithak . 更新,约10年前 · 2014-05-21 17:47 · 26次修订