Virtually all of my Drupals are hosted on a single server, running Apache with mod_php5. Apache is by no means light-weight, so the server is starting to creak a bit under the combined load of all these sites.
I've been meaning to have a go at configuring nginx with php5 in fastcgi mode, to check the difference this would make on system load.
The tricky thing is that I run all my Drupals from a single code base and use Apache's mod_vhost to run all these sites from a single configuration file. Basically mod_vhost will service a web site from a specific directory if that directory exists in a specific location.
Because of this, none of the Drupals use the /files directory either, but store all their data in sites/sitename/files. Some rewrite rules then make sure that a request for an image or css in /files gets redirected to the correct location.
Of course I wouldn't want to switch back to a per-host configuration file, so I needed to find out how to make nginx do the same thing. A spot of googling found me the right configuration directives. I've included the basics below.
server {
listen 80;
location / {
# Define a virtual document root, based on the host name.
root /srv/www/$host/html;
index index.php;
# Strip www. from the host name and redirect.
# This means less symlinks are needed for sites/* and search
# engines only index foo.com, not www.foo.com as well.
if ($host ~* "^www\.(.*)$") {
set "$domain" "$1";
rewrite (.*) http://$domain$uri permanent;
}
# Make index.php handle urls that don't exist on disk.
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
break;
}
}
# Rewrite /files to be served from the per-site files dir.
location /files {
rewrite ^/files/(.*)$ /sites/$host/files/$1 last;
}
}
Nginx current runs on port 81, so you can have a go of it via http://cafuego.net:81/. Nginx is now live on port 80. I'm not sure if it would be possible or more efficient to simply stick a different root directive in the /files location, rather than rewriting the uri.
The rest of the nginx and fastcgi configuration, including init scripts, can be found at http://drupal.org/node/110224.
Comments
SSL
When you also use SSL and want to use the securepages Drupal module, you need to make sure the HTTPS environment variable is set. Courtesy of http://sigttou.com/ssl-php-fastcgi-nginx
Add new comment