playing with nginx

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.

Trackback URL for this post:

http://cafuego.net/trackback/347

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

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.
  • E-Mail addresses are hidden with reCAPTCHA Mailhide.

More information about formatting options

CAPTCHA
This question is used to make sure you are a human visitor and to prevent spam submissions.