HowTo configure Apache to run Redmine » History » Version 8
William Baum, 2009-08-31 04:03
1 | 1 | Cyber Sprocket | h1. HowTo configure Apache to run Redmine |
---|---|---|---|
2 | |||
3 | 7 | Mischa The Evil | {{>toc}} |
4 | 1 | Cyber Sprocket | |
5 | 2 | Cyber Sprocket | These notes assume you already have Redmine running via the webrick server and are looking to get Redmine running via your existing Apache installation. Most of the commands assume you are in the root installation directory of redmine, so be sure to change directory there before starting. |
6 | 1 | Cyber Sprocket | |
7 | h2. For CentOS 5 |
||
8 | |||
9 | h3. Assumptions |
||
10 | |||
11 | * OS is CentOS 5 |
||
12 | * Web server is Apache 2 |
||
13 | ** mod_cgi is enabled |
||
14 | ** name based virtual servers are being used |
||
15 | 2 | Cyber Sprocket | ** the web server runs under the user apache, group apache |
16 | 1 | Cyber Sprocket | |
17 | 4 | Cyber Sprocket | h3. Myths |
18 | |||
19 | * You do not need to run mod_fcgid |
||
20 | * You do not need to run mod_fastcgi |
||
21 | 8 | William Baum | |
22 | bq. -This section needs work. I can't tell if these are the myths or the corrections to the myths. |
||
23 | _(note: if someone were so generous to post working, known good, HOWTO steps here for enabling FastCGI, that would be highly valuable to the entire community.- It is reported that www.redmine.org itself runs FastCGI, so it is obviously a valid, worthwhile, stable, performing way to run this great great web app'.)_ |
||
24 | 5 | Brad Mace | |
25 | 8 | William Baum | bq. I have added sections detailing the installation and configuration of mod_fastcgi and mod_fcid below. --wmbaum, (2009-08-30) |
26 | |||
27 | 1 | Cyber Sprocket | h3. Basic Steps |
28 | |||
29 | * Install Redmine per the installation instructions and get it running with webrick. |
||
30 | |||
31 | * Kill the webrick session |
||
32 | |||
33 | * Copy the public/dispatch.cgi.example to public/dispatch.cgi |
||
34 | |||
35 | * Edit public/dispatch.cgi to fix the shell script invocation to read: |
||
36 | @#!/usr/local/bin/ruby@ |
||
37 | |||
38 | * Make sure public/dispatch.cgi has execute permissions via: |
||
39 | @# chmod 755 public/dispatch.cgi@ |
||
40 | |||
41 | * Update the config/environment.rb file to force the rails environment to production, simply uncomment this line at the start of the file: |
||
42 | @ENV['RAILS_ENV'] ||= 'production'@ |
||
43 | |||
44 | 3 | Cyber Sprocket | * Add your virtual host entry to the apache configuration file (/etc/httpd/conf/httpd.conf). We installed redmine into the /live/redmine folder on our server. _Note: be sure to point your DocumentRoot to the public sub-folder!_ |
45 | |||
46 | 1 | Cyber Sprocket | <pre> |
47 | <VirtualHost *:80> |
||
48 | ServerName redmine.<YOUR-DOMAIN>.com |
||
49 | ServerAdmin webmaster@<YOUR-DOMAIN>.com |
||
50 | DocumentRoot /live/redmine/public/ |
||
51 | ErrorLog logs/redmine_error_log |
||
52 | |||
53 | <Directory "/live/redmine/public/"> |
||
54 | Options Indexes ExecCGI FollowSymLinks |
||
55 | Order allow,deny |
||
56 | Allow from all |
||
57 | AllowOverride all |
||
58 | </Directory> |
||
59 | </VirtualHost> |
||
60 | </pre> |
||
61 | |||
62 | * Make sure your files, log, tmp, and vendor directories are all accessible (read/write) by user apache, group apache. We did that via a change of ownership: |
||
63 | @# chown -R apache:apache files log tmp vendor@ |
||
64 | |||
65 | |||
66 | 2 | Cyber Sprocket | h3. Error Messages and Resolutions |
67 | 1 | Cyber Sprocket | |
68 | 2 | Cyber Sprocket | * @Rails requires RubyGems >= 0.9.4. Please install RubyGems@ |
69 | 1 | Cyber Sprocket | Look for rogue versions of ruby binaries. We had an older version in /usr/bin/ruby as well as /usr/local/bin/ruby. |
70 | |||
71 | 2 | Cyber Sprocket | * @Premature script headers@ |
72 | This is the generic "got something before the Content-Type: header in a CGI script" error from Apache. Run dispatch.cgi (see below) and see what comes out BEFORE the Content-Type: directive. |
||
73 | |||
74 | 8 | William Baum | h3. Helpful Commands |
75 | 2 | Cyber Sprocket | |
76 | * @# which ruby@ |
||
77 | tells you which ruby binary is being run when the fully-qualified-filename has not been specified. |
||
78 | |||
79 | * @# find / -name ruby@ |
||
80 | searches your entire system for any file named ruby, warning: can take a while on large filesystems. |
||
81 | |||
82 | * @# ruby -v@ |
||
83 | 1 | Cyber Sprocket | tell you what version of ruby you are running by default |
84 | |||
85 | * @#public/dispatch.cgi@ |
||
86 | runs the dispatch CGI script. It should spit out HTML that start with @Content-Type: text/html; charset=utf-8@, if ANYTHING precedes the Content-Type text you will get a "premature script headers" error in the Apache log files. |
||
87 | 8 | William Baum | |
88 | |||
89 | h2. mod_fastcgi |
||
90 | |||
91 | I suggest getting redmine running with mod_cgi above, not only to verify your basic redmine and apache configuration, but also so you can appreciate the perfomance gains you'll get from mod_fastcgi or mod_fcid. |
||
92 | |||
93 | We'll start with "mod_fastcgi":http://www.fastcgi.com/. |
||
94 | |||
95 | Install prerequisites: |
||
96 | |||
97 | <pre> |
||
98 | yum install libtool httpd-devel apr-devel apr |
||
99 | </pre> |
||
100 | |||
101 | h3. Download and Install mod_fastcgi |
||
102 | |||
103 | <pre> |
||
104 | cd /usr/local/src/ |
||
105 | wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz |
||
106 | |||
107 | tar -zxvf mod_fastcgi-current.tar.gz |
||
108 | cd mod_fastcgi-2.4.6/ |
||
109 | cp Makefile.AP2 Makefile |
||
110 | make top_dir=/usr/lib/httpd |
||
111 | make install top_dir=/usr/lib/httpd |
||
112 | </pre> |
||
113 | |||
114 | Create or edit @/etc/httpd/conf.d/mod_fastcgi.conf@ |
||
115 | <pre> |
||
116 | LoadModule fastcgi_module modules/mod_fastcgi.so |
||
117 | <IfModule mod_fastcgi.c> |
||
118 | FastCgiIpcDir /tmp/fcgi_ipc/ |
||
119 | </IfModule> |
||
120 | </pre> |
||
121 | |||
122 | The @/tmp/fcgi_ipc/@ directory needs to be writable to the apache user: |
||
123 | <pre> |
||
124 | chown -R apache.apache /tmp/fcgi_ipc/ |
||
125 | chmod -R 777 /tmp/fcgi_ipc/ |
||
126 | </pre> |
||
127 | |||
128 | > Note: I had to do this more than once.. It created directories which it then didn't own.. ?? |
||
129 | |||
130 | h3. Download and install @fcgi@ (for fcgi gem) |
||
131 | |||
132 | <pre> |
||
133 | wget http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz |
||
134 | tar -zxvf fcgi-2.4.0.tar.gz |
||
135 | cd fcgi-2.4.0 |
||
136 | ./configure |
||
137 | make |
||
138 | make install |
||
139 | </pre> |
||
140 | |||
141 | h3. Install fcgi gem: |
||
142 | |||
143 | <pre> |
||
144 | gem install fcgi |
||
145 | </pre> |
||
146 | |||
147 | h2. Configuring redmine to use fastcgi: |
||
148 | |||
149 | In your redmine/public/ directory, copy @dispatch.fcgi.example@ to @dispatch.fcgi@ |
||
150 | > Note: Mine was shebanged to "#!/usr/bin/env ruby", which is fine. I found a reference or two that seemed to indicate the 'env' bit is preferable to calling ruby directly. If this doesn't work, then you'll need to change it to wherever your ruby is as above. |
||
151 | |||
152 | @./public/.htaccess@ |
||
153 | <pre> |
||
154 | #<IfModule mod_fastcgi.c> |
||
155 | # RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] |
||
156 | #</IfModule> |
||
157 | #<IfModule mod_fcgid.c> |
||
158 | # RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] |
||
159 | #</IfModule> |
||
160 | #<IfModule mod_cgi.c> |
||
161 | # RewriteRule ^(.*)$ dispatch.cgi [QSA,L] |
||
162 | #</IfModule> |
||
163 | RewriteRule ^(.*)$ dispatch.fcgi [QSA,L] |
||
164 | </pre> |
||
165 | |||
166 | The default .htaccess will use cgi if it's available, so we need to force fcgi. You could perhaps rearrange the directives to prefer fcgi -- I just commented out the others and forced it with <code>RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]</code> You can see which one is actually in use with <code>ps gaux</code> |
||
167 | |||
168 | Give it a whirl: |
||
169 | <pre> |
||
170 | /etc/init.d/httpd configtest |
||
171 | /etc/init.d/httpd restart |
||
172 | </pre> |
||
173 | |||
174 | h2. Additional Apache Configuration |
||
175 | |||
176 | When I first fired up apache with redmine, apache started very slowly and sucked up a significantly larger chunk of RAM than normal. Further investigation revealed that it had fired off *8* @ruby .../redmine/public/dispatch.fcgi@ processes! No wonder it was slow. |
||
177 | |||
178 | I was running redmin under the apache default VirtualHost, and the default StartServers, MinSpareServers, etc. applied. You can adjust the defaults in @/etc/httpd/conf/httpd.conf@ or even better is to run redmine under a @NameVirtualHost@ or a different @VirtualHost@. This prevents apache from firing off a bunch of extraneous processes, and @NameVirtualHost@ should allow you to configure multiple redmine environments on the same IP without wasting a bunch of resources. |
||
179 | |||
180 | If you're having issues with apache virtual hosts, this can be very helpful: |
||
181 | <pre> |
||
182 | /usr/sbin/httpd -t -D DUMP_VHOSTS |
||
183 | </pre> |
||
184 | |||
185 | h2. mod_fcgid |
||
186 | |||
187 | "mod_fcgid":http://fastcgi.coremail.cn/ seems newer and preferable to mod_fastcgi. |
||
188 | |||
189 | <pre> |
||
190 | cd /usr/local/src/ |
||
191 | http://downloads.sourceforge.net/project/mod-fcgid/mod-fcgid/mod_fcgid.2.2.tar.gz/mod_fcgid.2.2.tgz |
||
192 | </pre> |
||
193 | |||
194 | Edit Makefile |
||
195 | <pre> |
||
196 | #top_dir = /usr/local/apache2 |
||
197 | top_dir = /usr/lib/httpd |
||
198 | </pre> |
||
199 | |||
200 | Edit/create @/etc/httpd/conf.d/mod_fcgid.conf@ |
||
201 | <pre> |
||
202 | LoadModule fcgid_module /usr/lib/httpd/modules/mod_fcgid.so |
||
203 | |||
204 | <IfModule mod_fcgid.c> |
||
205 | SocketPath /tmp/fcgid_sock/ |
||
206 | AddHandler fcgid-script .fcgi |
||
207 | </IfModule> |
||
208 | </pre> |
||
209 | |||
210 | Now you should be able to switch between mod_fastcgi and mod_fcgid by renaming one of them to other than *.conf in @/etc/httpd/conf.d/@ |
||
211 | <pre> |
||
212 | cd /etc/httpd/conf.d/ |
||
213 | mv mod_fastcgi.conf mod_fastcgi.conf.not |
||
214 | /etc/init.d/httpd restart |
||
215 | </pre> |
||
216 | |||
217 | h2. Installation Sources |
||
218 | |||
219 | In the above steps, I installed from sources only where I didn't find any RPM's in common repo's. I'm rather surprised that one can't simply @yum install@ mod_fastcgi, mod_fcgid, fcgi, etc., but there we are. If you find better methods or sources for any of the above, please feel free to update. |