Nginx and Drupal 7

Events happening in the community are now at Drupal community events on www.drupal.org.
perusio's picture

Has anyone tried to run the new drupal 7 beta1 with nginx?

I'm getting a very strange behavior. The site works perfectly in the browser but if I do a:

curl -I mysite

I get a FastCGI timeout: status code 499. That's strange. I had to add:
proxy_ignore_client_abort on;

to my server config to make it work. Of course the HTTP request status fails miserably. That's how I got alerted to this.

What's your experience with D7?

Thanks,

Comments

No problems yet. I set up a

brianmercer's picture

No problems yet. I set up a test site at http://e.brianmercer.com with devel and xhprof.

xxx@xxxxxxxxx:~$ curl -I e.brianmercer.com
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 08 Oct 2010 18:55:52 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=5
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.3-1ubuntu9pre1~lucid
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Fri, 08 Oct 2010 18:55:52 +0000
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
ETag: "1286564152"
X-Generator: Drupal 7 (http://drupal.org)
x-nginx-conf: drupal7-default

My nginx config is a little slimmer with D7 since they've resolved the http://drupal.org/index.php?q=/ problem. Are you using the same config as on the nginx wiki? How are you doing PHP?

My test install on standard

omega8cc's picture

My test install on standard Barracuda/Octopus stack at Linode, Drupal7 beta1, Standard install profile:

eq1:~# curl -I d7b1.o1.linode.us.host8.biz
HTTP/1.1 200 OK
Server: nginx/0.8.52
Date: Fri, 08 Oct 2010 19:16:30 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.2.14
X-Drupal-Cache: MISS
Etag: "1286565389-0"
X-Generator: Drupal 7 (http://drupal.org)
Cache-Control: public, max-age=0
Last-Modified: Fri, 08 Oct 2010 19:16:29 +0000
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Vary: Cookie
Vary: Accept-Encoding

eq1:~#

Well

perusio's picture

Thank you Grace and Brian. I've tried sorting out this snafu. But no dice. In the browser everything is snappy.

I ended up removing a bunch of PHP extensions I don't use and increasing the number of workers in nginx. My d7 install is a standard one. There's no "X-Generator" header in the CLI reply (curl or netcat). Although I can see it in firebug, hence it works in the browser.

This is really strange. Drush hangs, if enabling or disabling a module. Although the action gets done.

My nginx config is on github. It's basically that one that I'm using for d7. Thank you Brian for tipping me on the fact that d7 no longer needs a regex capturing pattern in the rewrite. I checked the .htaccess and in fact it just checks for the file and if not found it invokes index.php.

My @drupal in the nginx config is:

location @drupal {
  rewrite ^ /index.php last;
}

I use php-cgi, no fpm. The php-cgi init script is also on github.

Well I've posted an issue regarding this. Any ideas or suggestions?

Thanks,
António

Solved

perusio's picture

I was using Admin and it turned out to block the reading from the socket.
Opened #936766.

Thank you. BTW, feel free to chime in on my nginx config for D7.

nginx config

pillarsdotnet's picture
nginx.conf
index index.html;
    fastcgi_index index.php;

    server {
        listen       80;
        server_name  www.example.com example.com;
        root /path/to/drupal;
        include drupal_params;
    }
drupal_params
location = / {
  rewrite ^ /index.php;
}

location = /index.php {
  include fastcgi_drupal;
  break;
}

#  Disable after installation
location = /install.php {
  include fastcgi_drupal;
  break;
}

#  Disable if using Drush for update
location = /update.php {
  include fastcgi_drupal; 
  break;
}

# Disable if using Drush for cron
location = /cron.php {
  include fastcgi_drupal;
  break;
}


# Disable if not using any xmlrpc services
#location = /xmlrpc.php {
#  include fastcgi_drupal;
#}

# Let the browser cache resource files
location ~* ^/.+\.(jpg|jpeg|gif|png|ico|css|js)$ {
  access_log      off;
  expires         45d;
}

# Imagecache urls need to go through drupal to create the missing image derivatives
location ~ ^/sites/.*?/files/imagecache/ {
  access_log      off;
  expires         45d;
  try_files $uri @drupal;
}

# Everything else in public:// can be served directly.
location ~ ^/sites/.*?/files/ {}

# Default: first try directly, then through Drupal
location ~ ^/ {
try_files $uri @drupal;
}

location @drupal {
  rewrite ^/(.*)$ /index.php?q=$1 last;
}
fastcgi_drupal
fastcgi_param  SCRIPT_FILENAME    $document_root/$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  PATH_INFO          "";
fastcgi_param  PATH_TRANSLATED    $document_root/$fastcgi_script_name;
fastcgi_param  DOCUMENT_ROOT      $document_root;

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
fastcgi_param  HOSTNAME           $server_name;

fastcgi_param  REDIRECT_STATUS    200;
fastcgi_pass unix:/var/tmp/php.socket;

Of course, that last line will probably vary with your installation.

I compiled nginx 0.8.53 from source, adding the headers-more-nginx-module, and PHP 5.3.4 from source, adding APC-3.1.6. Compiled xapian as a separate module because I couldn't figure out how to add it statically.

I applied the following patch to APC to eliminate erroneous "GC cache entry" warnings:

--- APC-3.1.6/apc_cache.c       2010-11-30 05:18:31.000000000 -0500
+++ APC-3.1.6-PATCHED/apc_cache.c       2011-01-07 03:32:55.020693003 -0500
@@ -180,8 +180,13 @@
             if (dead->value->ref_count > 0) {
                 switch(dead->value->type) {
                     case APC_CACHE_ENTRY_FILE:
-                        apc_warning("GC cache entry '%s' (dev=%d ino=%d) was on gc-list for %d seconds" TSRMLS_CC,
-                            dead->value->data.file.filename, dead->key.data.file.device, dead->key.data.file.inode, gc_sec);
+                        if (APCG(slam_defense)) {
+                            apc_warning("GC cache entry '%s' (dev=%d ino=%d) was on gc-list for %d seconds" TSRMLS_CC,
+                                        dead->value->data.file.filename,
+                                        dead->key.data.file.device,
+                                        dead->key.data.file.inode,
+                                        gc_sec);
+                        }
                         break;
                     case APC_CACHE_ENTRY_USER:
                         apc_warning("GC cache entry '%s'was on gc-list for %d seconds" TSRMLS_CC, dead->value->data.user.info, gc_sec);

(Would link to the issue page but I forgot where I found it.)

Running php-fpm, nginx, and MySQL (also custom-compiled) under runit. Converted all tables to InnoDB and tweaked MySQL using mysqltuner.

I'm currently using the following homebrew script to install/upgrade Drupal. (No, I don't actually use all those modules, but I've verified that they're all installable under D7):

#!/usr/bin/perl -w
use strict;
my $DRUPAL_HOME="/path/to/drupal";
my $name = $ARGV[0] || '';
my $next = $ARGV[1] || '';
my $zip = 'COMPRESSOR PROGRAM';
sub data();
if (! -d $DRUPAL_HOME)
  { system("git clone -qb master git://git.drupalcode.org/project/drupal.git $DRUPAL_HOME")==0 or die $!;
    chdir $DRUPAL_HOME or die "drupal: $!";
    system("git log -1 --no-merges --pretty=format:%H > .git/info/grafts")==0 or die $!;
    system("git filter-branch -- --all")==0 or die "drupal: $!";
    system("git gc --aggressive --quiet --prune=now")==0 or die "drupal: $!";
    system("git branch local")==0 or die "drupal: $!";
  }
else
  { chdir $DRUPAL_HOME or die "drupal: $!";
    if (!$name or $name eq 'drupal')
      { system("git pull -qf origin master >/dev/null")==0 or die "drupal: $!";
      }
  }
foreach(data())
{ my ($project,$method,$prefix,$url,$branch) = split;
  my ($file) = reverse(split('/',$url));
  next if $name && ($project ne $name);
  $name = '' if $next;
  die "No branch: $_" unless $branch;
  print "$prefix...";
  if ($method eq 'git')
    { if (-d $prefix)
{ chdir $prefix or die "$prefix: $!";
  system("git pull -qf origin $branch:$branch >/dev/null 2>\&1")==0 or die "$prefix: $!";
}
      else
{ system("git clone -qb $branch $url $prefix")==0 or die "$prefix: $!";
  chdir $prefix or die "$prefix: $!";
  system("basename $DRUPAL_HOME/$prefix >> ../.gitignore")==0 or die "$prefix: $!";
  system("git log -1 --no-merges --pretty=format:%H > .git/info/grafts")==0 or die "$prefix: $!";
  system("git filter-branch -- --all")==0 or die "$prefix: $!";
  system("git gc --aggressive --quiet --prune=now")==0 or die "$prefix: $!";
  system("git branch local")== 0 or die "$prefix: $!";
}
    }
  elsif ($method eq 'svn')
    { if (-d $prefix)
{ chdir $prefix or die "$prefix: $!";
  system("git checkout -q $branch")==0 or die "$prefix: $!";
  system("git svn -qq fetch")==0 or die "$prefix: $!";
}
      else
{ system("git svn -qq clone $url $prefix")==0 or die "$prefix: $!";
  chdir $prefix or die "$prefix: $!";
  system("basename $DRUPAL_HOME/$prefix >> ../.gitignore")==0 or die "$prefix: $!";
  system("git branch -m $branch")==0 or die "$prefix: $!";
  system("git log -1 --no-merges --pretty=format:%H > .git/info/grafts")==0 or die "$prefix: $!";
  system("git filter-branch -- --all")==0 or die "$prefix: $!";
  system("git gc --aggressive --quiet --prune=now")==0 or die "$prefix: $!";
  system("git svn -qq gc")==0 or die "$prefix: $!";
  system("git branch local")==0 or die "$prefix: $!";
}
    }
  elsif (($zip) = ($method =~ /tar-(.*)/))
    { if (-d $prefix)
{ chdir $prefix or die "$prefix: $!";
  system("git checkout -q master")==0 or die "$prefix: $!";
  chdir ".git/.orig" or die "$prefix: $!";
  system("wget -N $url 2>\&1 | grep -q 'Server file no newer' || ( rm -rf $project \&\& mkdir $project \&\& $zip -dc < $file | tar -C $project -x \&\& rsync -aC --delete $project/$branch/ $DRUPAL_HOME/$prefix/ )")==0 or die "$prefix: $!";
  chdir "$DRUPAL_HOME/$prefix" or die "$prefix: $!";
  system("git add .")==0 or die "$prefix: $!";
  system("[ -z \"\$(git status -s)\" ] || git commit -aqm 'Update from $url'")==0 or die "$prefix: $!";
}
      else
        { system("git init -q $prefix")==0 or die "$prefix: $!";
  mkdir "$prefix/.git/.orig" or die "$prefix: $!";
  chdir "$prefix/.git/.orig" or die "$prefix: $!";
  system("basename $DRUPAL_HOME/$prefix >> ../.gitignore")==0 or die "$prefix: $!";
  system("wget -q $url \&\& mkdir $project \&\& $zip -dc < $file | tar -C $project -x \&\& rsync -aC $project/$branch/ $DRUPAL_HOME/$prefix/")==0 or die "$prefix: $!";
  chdir "$DRUPAL_HOME/$prefix" or die "$prefix: $!";
  system("git add .")==0 or die "$prefix: $!";
  system("git commit -aqm 'Initial download from $url'")==0 or die "$prefix: $!";
  system("git branch local")==0 or die "$prefix: $!";
}
      $branch = 'master';
    }
  elsif ($method eq 'zip')
    { if (-d $prefix)
{ chdir $prefix or die "$prefix: $!";
  system("git checkout -q master")==0 or die "$prefix: $!";
  chdir ".git/.orig" or die "$prefix: $!";
  system("wget -N $url 2>\&1 | grep -q 'Server file no newer' || ( rm -rf $project \&\& mkdir $project \&\& cd $project \&\& unzip -u ../$file \&\& rsync -aC --delete $branch/ $DRUPAL_HOME/$prefix/ )")==0 or die "$prefix: $!";
  chdir "$DRUPAL_HOME/$prefix" or die "$prefix: $!";
  system("git add .")==0 or die "$prefix: $!";
  system("[ -z \"\$(git status -s)\" ] || git commit -aqm 'Update from $url'")==0 or die "$prefix: $!";
}
      else
{ system("git init -q $prefix")==0 or die "$prefix: $!";
  mkdir "$prefix/.git/.orig";
  chdir "$prefix/.git/.orig" or die "$prefix: $!";
  system("wget -q $url \&\& mkdir $project \&\& cd $project \&\& unzip -qq ../$file \&\& rsync -aC $branch/ $DRUPAL_HOME/$prefix/")==0 or die "$prefix: $!";
  chdir "$DRUPAL_HOME/$prefix" or die "$prefix: $!";
  system("basename $DRUPAL_HOME/$prefix >> ../.gitignore")==0 or die "$prefix: $!";
  system("git add .")==0 or die "$prefix: $!";
  system("git commit -aqm 'Initial download from $url'")==0 or die "$prefix: $!";
  system("git branch local")==0 or die "$prefix: $!";
}
      $branch = 'master';
    }
  else
    { die "Bad method: $method";
    }
  # print("git checkout -q local\n");
  system("git checkout -q local")==0 or die "$prefix: $!";
  # print("git pull -qf . $branch\n");
  system("git pull -qf . $branch 2>/dev/null")==0 or die "$prefix: $!";
  # print("chdir $DRUPAL_HOME\n");
  chdir $DRUPAL_HOME or die "drupal: $!";
}
print 'drupal...';
# print("git checkout -q local\n");
system("git checkout -q local")==0 or die "drupal: $!";
# print("git pull -qf . master\n");
system("git pull -qf . master 2>/dev/null")==0 or die "drupal: $!";
system("[ -z \"\$(git status -s)\" ] || git commit -aqm 'Update from git://git.drupalcode.org/project/drupal.git'")==0 or die "drupal: $!";
print "Done.\n";

sub data()
  { return
      ( 'a-cloudy-day-mobile git sites/all/themes/a-cloudy-day-mobile git://git.drupalcode.org/project/a-cloudy-day-mobile.git 7.x-1.x',
'aberdeen git sites/all/themes/aberdeen git://git.drupalcode.org/project/aberdeen.git 7.x-1.x',
'abessive git sites/all/themes/abessive git://git.drupalcode.org/project/abessive.git 7.x-1.x',
'adaptivetheme git sites/all/themes/adaptivetheme git://git.drupalcode.org/project/adaptivetheme.git 7.x-1.x',
'addanother git sites/all/modules/addanother git://git.drupalcode.org/project/addanother.git 7.x-1.x',
'addressfield git sites/all/modules/addressfield git://git.drupalcode.org/project/addressfield.git master',
'addthis git sites/all/modules/addthis git://git.drupalcode.org/project/addthis.git 7.x-2.x',
'addtoany git sites/all/modules/addtoany git://git.drupalcode.org/project/addtoany.git 7.x-1.x',
'admin git sites/all/modules/admin git://git.drupalcode.org/project/admin.git 7.x-2.x',
'admin_menu git sites/all/modules/admin_menu git://git.drupalcode.org/project/admin_menu.git master',
'admin_tools git sites/all/modules/admin_tools git://git.drupalcode.org/project/admin_tools.git master',
'advanced_help git sites/all/modules/advanced_help git://git.drupalcode.org/project/advanced_help.git 7.x-1.x',
'alt_login git sites/all/modules/alt_login git://git.drupalcode.org/project/alt_login.git master',
'amazon git sites/all/modules/amazon git://git.drupalcode.org/project/amazon.git master',
'antonelli git sites/all/themes/antonelli git://git.drupalcode.org/project/antonelli.git 7.x-1.x',
'apc git sites/all/modules/apc git://git.drupalcode.org/project/apc.git 7.x-1.x 7.x-1.x',
'atom git sites/all/modules/atom git://git.drupalcode.org/project/atom.git master',
'austin git sites/all/themes/austin git://git.drupalcode.org/project/austin.git master',
'balance_tracker git sites/all/modules/balance_tracker git://git.drupalcode.org/project/balance_tracker.git master',
'basic git sites/all/themes/basic git://git.drupalcode.org/project/basic.git 7.x-1.x 7.x-1.x',
'blockcache_alter git sites/all/modules/blockcache_alter git://git.drupalcode.org/project/blockcache_alter.git 7.x-1.x',
'blueprint git sites/all/themes/blueprint git://git.drupalcode.org/project/blueprint.git 7.x-1.x',
'boost git sites/all/modules/boost git://git.drupalcode.org/project/boost.git 7.x-1.x',
'boron git sites/all/themes/boron git://git.drupalcode.org/project/boron.git 7.x-1.x',
'browscap tar-gzip sites/all/modules/browscap http://windmill.sk/files/modules/browscap-7.x-1.x-dev-pasq.tgz browscap',
'calendar git sites/all/modules/calendar git://git.drupalcode.org/project/calendar.git master',
'cck git sites/all/modules/cck git://git.drupalcode.org/project/cck.git master',
'chamilo git sites/all/modules/chamilo git://git.drupalcode.org/project/chamilo.git 7.x-1.x',
'charts git sites/all/modules/charts git://git.drupalcode.org/project/charts.git 7.x-1.x',
'chromephp git sites/all/libraries/chromephp git://github.com/ccampbell/chromephp.git master',
'ckeditor tar-gzip sites/all/libraries/ckeditor http://download.cksource.com/CKEditor/CKEditor/Nightly%20Build/ckeditor_... ckeditor',
'comment_subject git sites/all/modules/comment_subject git://git.drupalcode.org/project/comment_subject.git master',
'commerce git sites/all/modules/commerce git://git.drupalcode.org/project/commerce.git master',
'commerce_authnet git sites/all/modules/commerce_authnet git://git.drupalcode.org/project/commerce_authnet.git master',
'commerce_cybersource git sites/all/modules/commerce_cybersource git://git.drupalcode.org/project/commerce_cybersource.git master',
'commerce_paypal git sites/all/modules/commerce_paypal git://git.drupalcode.org/project/commerce_paypal.git master',
'content_type_overview git sites/all/modules/content_type_overview git://git.drupalcode.org/project/content_type_overview.git 7.x-1.x',
'corolla git sites/all/themes/corolla git://git.drupalcode.org/project/corolla.git master',
'ctools git sites/all/modules/ctools git://git.drupalcode.org/project/ctools.git master',
'custom_breadcrumbs git sites/all/modules/custom_breadcrumbs git://git.drupalcode.org/project/custom_breadcrumbs.git 7.x-1.x',
'custom_formatters git sites/all/modules/custom_formatters git://git.drupalcode.org/project/custom_formatters.git master',
'danland git sites/all/themes/danland git://git.drupalcode.org/project/danland.git 7.x-1.x',
'date git sites/all/modules/date git://git.drupalcode.org/project/date.git master',
'date_popup_authored git sites/all/modules/date_popup_authored git://git.drupalcode.org/project/date_popup_authored.git 7.x-1.x 7.x-1.x 7.x-1.x',
'date_repeat_presets git sites/all/modules/date_repeat_presets git://git.drupalcode.org/project/date_repeat_presets.git 7.x-1.x',
'devel git sites/all/modules/devel git://git.drupalcode.org/project/devel.git master',
'dhtml_menu git sites/all/modules/dhtml_menu git://git.drupalcode.org/project/dhtml_menu.git master',
'diff git sites/all/modules/diff git://git.drupalcode.org/project/diff.git 7.x-2.x',
'dingus git sites/all/themes/dingus git://git.drupalcode.org/project/dingus.git 7.x-1.x',
'disqus git sites/all/modules/disqus git://git.drupalcode.org/project/disqus.git 7.x-1.x',
'download_file git sites/all/modules/download_file git://git.drupalcode.org/project/download_file.git 7.x-1.x',
'dragndrop_uploads git sites/all/modules/dragndrop_uploads git://git.drupalcode.org/project/dragndrop_uploads.git master',
'drupalforfirebug git sites/all/modules/drupalforfirebug git://git.drupalcode.org/project/drupalforfirebug.git 7.x-1.x',
'ds git sites/all/modules/ds git://git.drupalcode.org/project/ds.git 7.x-1.x',
'email git sites/all/modules/email git://git.drupalcode.org/project/email.git 7.x-1.x',
'email_confirm git sites/all/modules/email_confirm git://git.drupalcode.org/project/email_confirm.git 7.x-1.x',
'emogrifier zip sites/all/libraries/emogrifier http://www.pelagodesign.com/emogrifier/emogrifier.zip .',
'enabled_modules git sites/all/modules/enabled_modules git://git.drupalcode.org/project/enabled_modules.git master',
'enews git sites/all/modules/enews git://git.drupalcode.org/project/enews.git master',
'entity git sites/all/modules/entity git://git.drupalcode.org/project/entity.git 7.x-1.x',
'extlink git sites/all/modules/extlink git://git.drupalcode.org/project/extlink.git master',
'ext_search_page git sites/all/modules/ext_search_page git://git.drupalcode.org/project/ext_search_page.git master',
'ezmlm git sites/all/modules/ezmlm git://git.drupalcode.org/project/ezmlm.git 7.x-1.x',
'facebook_stream git sites/all/modules/facebook_stream git://git.drupalcode.org/project/facebook_stream.git 7.x-1.x',
'farbtastic svn sites/all/libraries/farbtastic http://farbtastic.googlecode.com/svn/trunk/src farbtastic',
'featured_content git sites/all/modules/featured_content git://git.drupalcode.org/project/featured_content.git 7.x-1.x',
'field_group git sites/all/modules/field_group git://git.drupalcode.org/project/field_group.git 7.x-1.x',
'file_aliases git sites/all/modules/file_aliases git://git.drupalcode.org/project/file_aliases.git master',
'filefield_nginx_progress git sites/all/modules/filefield_nginx_progress git://git.drupalcode.org/project/filefield_nginx_progress.git master',
'filefield_paths git sites/all/modules/filefield_paths git://git.drupalcode.org/project/filefield_paths.git master',
'firephp-libs git sites/all/libraries/firephp-libs git://github.com/cadorn/firephp-libs.git master',
'flexifilter git sites/all/modules/flexifilter git://github.com/axyjo/flexifilter-d7.git master',
'floater git sites/all/themes/floater git://git.drupalcode.org/project/floater.git 7.x-1.x',
'follow git sites/all/modules/follow git://git.drupalcode.org/project/follow.git master',
'forward git sites/all/modules/forward git://git.drupalcode.org/project/forward.git master',
'fusion git sites/all/themes/fusion git://git.drupalcode.org/project/fusion.git master',
'galleryformatter git sites/all/modules/galleryformatter git://git.drupalcode.org/project/galleryformatter.git 7.x-1.x',
'genesis git sites/all/themes/genesis git://git.drupalcode.org/project/genesis.git master',
'getid3 git sites/all/modules/getid3 git://git.drupalcode.org/project/getid3.git master',
'getid3 zip sites/all/libraries/getid3 http://softlayer.dl.sourceforge.net/project/getid3/getID3%28%29%201.x/1.... .',
'git_deploy git sites/all/modules/git_deploy git://git.drupalcode.org/project/git_deploy.git master',
'globalredirect git sites/all/modules/globalredirect git://git.drupalcode.org/project/globalredirect.git 7.x-1.x',
'google_analytics git sites/all/modules/google_analytics git://git.drupalcode.org/project/google_analytics.git master',
'gravatar git sites/all/modules/gravatar git://git.drupalcode.org/project/gravatar.git 7.x-1.x',
'heartbeat git sites/all/modules/heartbeat git://git.drupalcode.org/project/heartbeat.git 7.x-1.x',
'htmlmail git sites/all/modules/htmlmail git://git.drupalcode.org/project/htmlmail.git 7.x-1.x',
'htmlpurifier git sites/all/libraries/htmlpurifier git://repo.or.cz/htmlpurifier.git master',
'htmlpurifier git sites/all/modules/htmlpurifier git://git.drupalcode.org/project/htmlpurifier.git 7.x-1.x',
'i18n git sites/all/modules/i18n git://git.drupalcode.org/project/i18n.git 7.x-1.x',
'imageapi git sites/all/modules/imageapi git://git.drupalcode.org/project/imageapi.git master',
'imce git sites/all/modules/imce git://git.drupalcode.org/project/imce.git 7.x-1.x',
'imce_wysiwyg git sites/all/modules/imce_wysiwyg git://git.drupalcode.org/project/imce_wysiwyg.git master',
'inkribbon git sites/all/themes/inkribbon git://git.drupalcode.org/project/inkribbon.git master',
'inline_messages git sites/all/modules/inline_messages git://git.drupalcode.org/project/inline_messages.git 7.x-1.x',
'intlinks git sites/all/modules/intlinks git://git.drupalcode.org/project/intlinks.git master',
'jquery git sites/all/libraries/jquery git://github.com/jquery/jquery.git master',
'jquery git sites/all/modules/jquery git://git.drupalcode.org/project/jquery.git master',
'jquery-ui git sites/all/libraries/jquery-ui git://github.com/jquery/jquery-ui.git master',
'jquery_ui git sites/all/modules/jquery_ui git://git.drupalcode.org/project/jquery_ui.git 7.x-1.x',
'jquery_update git sites/all/modules/jquery_update git://git.drupalcode.org/project/jquery_update.git master',
'jskitcomments git sites/all/modules/jskitcomments git://git.drupalcode.org/project/jskitcomments.git master',
'jwysiwyg git sites/all/libraries/jwysiwyg-git git://github.com/akzhan/jwysiwyg.git master',
'layoutstudio git sites/all/themes/layoutstudio git://git.drupalcode.org/project/layoutstudio.git 7.x-1.x',
'less git sites/all/modules/less git://git.drupalcode.org/project/less.git 7.x-2.x',
'libraries git sites/all/modules/libraries git://git.drupalcode.org/project/libraries.git master',
'link git sites/all/modules/link git://git.drupalcode.org/project/link.git 7.x-1.x',
'logintoboggan git sites/all/modules/logintoboggan git://git.drupalcode.org/project/logintoboggan.git master',
'markdown git sites/all/modules/markdown git://git.drupalcode.org/project/markdown.git 7.x-1.x',
'media git sites/all/modules/media git://git.drupalcode.org/project/media.git master',
'media_gallery git sites/all/modules/media_gallery git://git.drupalcode.org/project/media_gallery.git master',
'mediafront git sites/all/modules/mediafront git://git.drupalcode.org/project/mediafront.git 7.x-1.x',
'memcache git sites/all/modules/memcache git://git.drupalcode.org/project/memcache.git 7.x-1.x',
'menu_admin_per_menu git sites/all/modules/menu_admin_per_menu git://git.drupalcode.org/project/menu_admin_per_menu.git master',
'menu_firstchild git sites/all/modules/menu_firstchild git://git.drupalcode.org/project/menu_firstchild.git master',
'mobi git sites/all/themes/mobi git://git.drupalcode.org/project/mobi.git master',
'mobile git sites/all/themes/mobile git://git.drupalcode.org/project/mobile.git 7.x-1.x',
'mobile_theme git sites/all/modules/mobile_theme git://git.drupalcode.org/project/mobile_theme.git 7.x-1.x',
'mollom git sites/all/modules/mollom git://git.drupalcode.org/project/mollom.git master',
'mpac git sites/all/modules/mpac git://git.drupalcode.org/project/mpac.git 7.x-1.x',
'mulpo git sites/all/themes/mulpo git://git.drupalcode.org/project/mulpo.git 7.x-1.x',
'multiblock git sites/all/modules/multiblock git://git.drupalcode.org/project/multiblock.git 7.x-1.x',
'multiform git sites/all/modules/multiform git://git.drupalcode.org/project/multiform.git master',
'mystique_theme git sites/all/themes/mystique_theme git://git.drupalcode.org/project/mystique_theme.git 7.x-1.x',
'nice_menus git sites/all/modules/nice_menus git://git.drupalcode.org/project/nice_menus.git master',
'nodesinblock git sites/all/modules/nodesinblock git://git.drupalcode.org/project/nodesinblock.git 7.x-1.x',
'orange git sites/all/themes/orange git://git.drupalcode.org/project/orange.git 7.x-1.x',
'page_title git sites/all/modules/page_title git://git.drupalcode.org/project/page_title.git 7.x-2.x',
'pagestyle git sites/all/modules/pagestyle git://git.drupalcode.org/project/pagestyle.git master',
'panels git sites/all/modules/panels git://git.drupalcode.org/project/panels.git master',
'path_redirect git sites/all/modules/path_redirect git://git.drupalcode.org/project/path_redirect.git master',
'pathauto git sites/all/modules/pathauto git://git.drupalcode.org/project/pathauto.git master',
'pathcache git sites/all/modules/pathcache git://git.drupalcode.org/project/pathcache.git 6.x-1.x',
'paypal_donate git sites/all/modules/paypal_donate git://git.drupalcode.org/project/paypal_donate.git 7.x-1.x',
'pixture_reloaded git sites/all/themes/pixture_reloaded git://git.drupalcode.org/project/pixture_reloaded.git 7.x-1.x',
'pockett git sites/all/themes/pockett git://git.drupalcode.org/project/pockett.git 7.x-1.x',
'preset git sites/all/modules/preset git://git.drupalcode.org/project/preset.git 7.x-1.x',
'print git sites/all/modules/print git://git.drupalcode.org/project/print.git master',
'privatemsg git sites/all/modules/privatemsg git://git.drupalcode.org/project/privatemsg.git 7.x-1.x',
'quicktabs git sites/all/modules/quicktabs git://git.drupalcode.org/project/quicktabs.git 7.x-2.x',
'quotes git sites/all/modules/quotes git://git.drupalcode.org/project/quotes.git 7.x-1.x',
'raphael git sites/all/modules/raphael git://git.drupalcode.org/project/raphael.git 7.x-1.x',
'realname git sites/all/modules/realname git://git.drupalcode.org/project/realname.git 7.x-1.x',
'references git sites/all/modules/references git://git.drupalcode.org/project/references.git 7.x-2.x',
'relevant_content git sites/all/modules/relevant_content git://git.drupalcode.org/project/relevant_content.git 7.x-1.x',
'revision_all git sites/all/modules/revision_all git://git.drupalcode.org/project/revision_all.git master',
'revisions_rss git sites/all/modules/revisions_rss git://git.drupalcode.org/project/revisions_rss.git master',
'role_change_notify git sites/all/modules/role_change_notify git://git.drupalcode.org/project/role_change_notify.git master master',
'role_delegation git sites/all/modules/role_delegation git://git.drupalcode.org/project/role_delegation.git master',
'rubik git sites/all/themes/rubik git://git.drupalcode.org/project/rubik.git 7.x-4.x',
'rules git sites/all/modules/rules git://git.drupalcode.org/project/rules.git 7.x-2.x',
'school_administration git sites/all/modules/school_administration git://git.drupalcode.org/project/school_administration.git master',
'search_api git sites/all/modules/search_api git://git.drupalcode.org/project/search_api.git 7.x-1.x',
'search404 git sites/all/modules/search404 git://git.drupalcode.org/project/search404.git 7.x-1.x',
'service_links git sites/all/modules/service_links git://git.drupalcode.org/project/service_links.git 7.x-2.x',
'services git sites/all/modules/services git://git.drupalcode.org/project/services.git 7.x-1.x',
'similarterms git sites/all/modules/similarterms git://git.drupalcode.org/project/similarterms.git master',
'simple_paypal git sites/all/modules/simple_paypal git://git.drupalcode.org/project/simple_paypal.git 7.x-1.x',
'simplenews git sites/all/modules/simplenews git://git.drupalcode.org/project/simplenews.git master',
'simplewiki git sites/all/modules/simplewiki git://git.drupalcode.org/project/simplewiki.git 7.x-1.x',
'simplify_node_add git sites/all/modules/simplify_node_add git://git.drupalcode.org/project/simplify_node_add.git 7.x-1.x',
'site_verify git sites/all/modules/site_verify git://git.drupalcode.org/project/site_verify.git master',
'skinr git sites/all/modules/skinr git://git.drupalcode.org/project/skinr.git master',
'smtp git sites/all/modules/smtp git://git.drupalcode.org/project/smtp.git 7.x-1.x',
'styles git sites/all/modules/styles git://git.drupalcode.org/project/styles.git 7.x-1.x',
'superfish git sites/all/modules/superfish git://git.drupalcode.org/project/superfish.git 7.x-1.x',
'syndication git sites/all/modules/syndication git://git.drupalcode.org/project/syndication.git 7.x-1.x',
'tao git sites/all/themes/tao git://git.drupalcode.org/project/tao.git 7.x-3.x',
'taxonomy_manager git sites/all/modules/taxonomy_manager git://git.drupalcode.org/project/taxonomy_manager.git 7.x-1.x',
'taxonomy_title git sites/all/modules/taxonomy_title git://git.drupalcode.org/project/taxonomy_title.git master',
'term_relations git sites/all/modules/term_relations git://git.drupalcode.org/project/term_relations.git 7.x-1.x',
'textile git sites/all/modules/textile git://git.drupalcode.org/project/textile.git 7.x-2.x master',
'textile svn sites/all/libraries/textile http://textpattern.googlecode.com/svn/development/4.x/textpattern/lib textile',
'textsize git sites/all/modules/textsize git://git.drupalcode.org/project/textsize.git master',
'thrifty404 git sites/all/modules/thrifty404 git://git.drupalcode.org/project/thrifty404.git 7.x-1.x',
'titan git sites/all/themes/titan git://git.drupalcode.org/project/titan.git master',
'token git sites/all/modules/token git://git.drupalcode.org/project/token.git master',
'toolbar_hide git sites/all/modules/toolbar_hide git://git.drupalcode.org/project/toolbar_hide.git 7.x-1.x',
'touch_icons git sites/all/modules/touch_icons git://git.drupalcode.org/project/touch_icons.git 7.x-1.x',
'transliteration git sites/all/modules/transliteration git://git.drupalcode.org/project/transliteration.git master',
'typogrify git sites/all/modules/typogrify git://git.drupalcode.org/project/typogrify.git 7.x-1.x',
'uniform git sites/all/libraries/uniform git://github.com/pixelmatrix/uniform.git master',
'uniform git sites/all/modules/uniform git://git.drupalcode.org/project/uniform.git master',
'unitrack git sites/all/modules/unitrack git://git.drupalcode.org/project/unitrack.git master',
'upload_replace git sites/all/modules/upload_replace git://git.drupalcode.org/project/upload_replace.git 7.x-1.x master',
'url_alter git sites/all/modules/url_alter git://git.drupalcode.org/project/url_alter.git master',
'user_force_term git sites/all/modules/user_force_term git://git.drupalcode.org/project/user_force_term.git 7.x-1.x',
'userprotect git sites/all/modules/userprotect git://git.drupalcode.org/project/userprotect.git master',
'vars git sites/all/modules/vars git://git.drupalcode.org/project/vars.git 7.x-2.x',
'video git sites/all/modules/video git://git.drupalcode.org/project/video.git 7.x-1.x',
'views git sites/all/modules/views git://git.drupalcode.org/project/views.git 7.x-3.x',
'views_bulk_operations git sites/all/modules/views_bulk_operations git://git.drupalcode.org/project/views_bulk_operations.git 7.x-3.x',
'vocabindex git sites/all/modules/vocabindex git://git.drupalcode.org/project/vocabindex.git 7.x-2.x',
'votingapi git sites/all/modules/votingapi git://git.drupalcode.org/project/votingapi.git 7.x-2.x',
'webform git sites/all/modules/webform git://git.drupalcode.org/project/webform.git master',
'wkhtmltopdf tar-xz sites/all/libraries/wkhtmltopdf http://wkhtmltopdf.googlecode.com/files/wkhtmltoimage-0.10.0_rc1-static-... .',
'wysiwyg git sites/all/modules/wysiwyg git://git.drupalcode.org/project/wysiwyg.git master',
'xapian git sites/all/modules/xapian git://git.drupalcode.org/project/xapian.git 7.x-1.x',
'xmlsitemap git sites/all/modules/xmlsitemap git://git.drupalcode.org/project/xmlsitemap.git master',
'yahoopipes git sites/all/modules/yahoopipes git://git.drupalcode.org/project/yahoopipes.git 7.x-1.x',
'zen git sites/all/themes/zen git://git.drupalcode.org/project/zen.git master',
      );
  }

Good stuff. Are you using

brianmercer's picture

Good stuff.

Are you using headers-more-nginx-module for anything interesting?

The "break" lines seem unnecessary.

I don't see any reason to use location ~ ^/ over location /.

headers-more-nginx-module

pillarsdotnet's picture

Are you using headers-more-nginx-module for anything interesting?

Not currently, but IIRC it was required for certain expires header use-cases.

I don't see any reason to use location ~ ^/ over location /.

The first one matches all paths not matched by a previous regex; the second only matches the homepage.

Yes

perusio's picture
  1. The break lines are unecessary after all your locations don't incur the danger of invoking other locations. They're all final. Apart from the fastcgi.

  2. Also you're including the fastcgi_params file in too many locations. You can move that to a higher level context (server or http) and either include the fastcgi_pass wherever is needed or create an upstream and refer to it.

  3. The perl script is nice but drush does that and much more.

  4. Although the thread title states D7 your config wont work with the image in core module, that replaces imagefield and imagecache to a certain extent. Since the locations differ. Also the rewrite for clean URLs is unnecessary.

  5. In D6 the cron.php script is not protected. And in your config you don't constrain the script to be called from a given IP address. Meaning that anyone can invoke the site cron whenever they please.

Good work & thanks for sharing

Thanks.

pillarsdotnet's picture

1. I'll try removing the break lines; thanks.
2. Is there some performance penalty to this? And I don't understand what you mean by "create an upstream and refer to it"I see at least a memory advantage to reducing the parsed ruleset size.
3. The script is a hack that scratches a particular itch. Drush won't install the third-party libraries, nor will it truncate the git history, nor will it bootstrap an entire drupal installation from a single script file.
4. Thanks; I'll look into the image/imagefield/imagecache differences. What do you mean by "the rewrite for clean URLs is unnecessary" ?
5. I'm only using this for D7, not D6, but I suppose it should be constrained to localhost anyway.

So, testing with the following changes...

diff -u fastcgi_drupal~ fastcgi_drupal
--- fastcgi_drupal~     2011-01-07 13:00:36.119111493 -0500
+++ fastcgi_drupal      2011-01-07 12:59:34.823111497 -0500
@@ -23,5 +23,4 @@
fastcgi_param  HOSTNAME           $server_name;

fastcgi_param  REDIRECT_STATUS    200;
-fastcgi_pass unix:/var/tmp/php.socket;
drupal_params
include fastcgi_drupal;

location = / {
  rewrite ^ /index.php;
}

location = /index.php {
  fastcgi_pass unix:/var/tmp/php.socket;
}

#  Disable after installation
location = /install.php {
  fastcgi_pass unix:/var/tmp/php.socket;
}

#  Disable if using Drush for update
location = /update.php {
  fastcgi_pass unix:/var/tmp/php.socket;
}

# Disable if using Drush for cron
location = /cron.php {
# Why bother to compile access_module when rewrite_module does the trick?
  if ($remote_addr != '127.0.0.1') {
    return 403;
  }
  fastcgi_pass unix:/var/tmp/php.socket;
}

# Disable if not using any xmlrpc services
#location = /xmlrpc.php {
#  fastcgi_pass unix:/var/tmp/php.socket;
#}

location ~* ^/.+\.(jpg|jpeg|gif|png|ico|css|js)$ {
  access_log      off;
  expires         45d;
}

location / {
try_files $uri @drupal;
}

location @drupal {
  rewrite ^ /index.php last;
}

can you show me how to

spacereactor's picture

can you show me how to rewrite for folder that use for Private file system path

assuming that

perusio's picture

you have your private files all under sites/default/private or sites/<sitename>/private do this:

# Regular private file serving (i.e. handled by Drupal).
location ~* /system/files/ {
    error_page 404 = @drupal;
}

# Trying to access private files directly returns a 404.
location ~* private {
    internal;
}

Change the location accordingly to your private files directory.

Or location ^~ /system/files/

brianmercer's picture

Or

location ^~ /system/files/ {
  rewrite ^ /index.php;
}

Private file location should really be outside the web root, but I guess if you absolutely can't...

# Trying to access private files directly returns a 404.
location ~* ^/sites/.+/private/.*$ {
  return 404;
}

Well it depends

perusio's picture

how you have your setup. I prefer to let only the sites/[^/]*/files directory be writable by the web server. If you set it to another directory then you have to make writable by the www-data user (or whichever user your PHP processes run as). It's a tradeoff. Yes I'm relying on Nginx doing the right thing.

I like your usage of ^~ it's faster. I'm going to follow the tip. Thanks.

If is Evil

perusio's picture

Dont you know that If Is Evil? It's much cleaner with an access rule IMHO. Furthermore I suspect is faster, since from the little I've managed to grasp so far, an if is implicit location, so in practice is like declaring a new location.

location /cron.php {
    allow 127.0.0.1;
    allow 192.168.1.0/24;
    fastcgi_pass unix:/tmp/php-cgi/php-cgi.socket;
    error_page 403 =404;
    deny all;
}

Benchmark of nginx vs apache performance

ciderpunx's picture

Firstly hello drupal community. Nice to meet you all. I've been running d6 for a couple of years now, mostly for hosting other people rather than doing my own sites. Anyhow, I've managed to get drupal running on nginx/fastcgi php quite happily. In fact, I did a little benchmark of drupal 7 to compare apache Vs nginx performance. There's a video of the bench mark over there.

Anyhow the long and short of it was that I got an extra 50 requests a second with a 3 point lower load (as measured by top) on nginx/fastcgi-php compared to apache/mod_php with ab running 10000 requests on my laptop.

--
Charlie Harvey @ciderpunx

Nginx

Group organizers

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: