Running Drupal 7.7 On Nginx (LEMP) On Debian Squeeze/Ubuntu 11.04 - Page 3

4 Installing And Configuring Boost

Go to http://drupal.org/project/boost and download the Boost module (http://ftp.drupal.org/files/projects/boost-7.x-1.x-dev.tar.gz) to your computer.

Then log into Drupal as the admin user and go to the Modules section (http://www.example.com/admin/modules/install). Select the Boost module from your computer's hard drive by clicking on the Browse... button and then click on the Install button:

After the successful installation you will see this screen. Click on the Enable newly added modules link to enable Boost:

This will bring you to the list of modules (http://www.example.com/admin/modules). Scroll down to the Boost module, check it and click on Save configuration:

Afterwards, you should find a Configure link behind the Boost module. Click on that link to start the Boost configuration:

Now in the Boost configuration (http://www.example.com/admin/config/system/boost), you should find yourself on the BOOST SETTINGS tab. It is ok to accept the default values - click on Save configuration:

Go to the CACHE EXPIRATION tab. Again, the default settings should be ok, so click on Save configuration again:

Next go to the FILE SYSTEM tab. Make sure you have cache in the Root cache directory field (that should be the default value) - this translates to our cache directory /var/www/www.example.com/web/cache. The other default values are ok as well, so click on Save configuration:

You can ignore the .HTACCESS tab because it generates rewrite rules for Apache, but we are on nginx.

Now we must reconfigure our nginx vhost.

Open /etc/nginx/sites-available/www.example.com.vhost...

vi /etc/nginx/sites-available/www.example.com.vhost

... and replace

[...]
       location / {
                try_files $uri $uri/ /index.php?$args;
       }
[...]

... with:

[...]
       location @nocache {
                try_files $uri $uri/ /index.php?$args;
       }
[...]

Then add the following new location / { } section:

[...]
       location / {
                if ($query_string ~ ".+") {
                        return 405;
                }
                # pass requests from logged-in users to Apache
                if ($http_cookie ~ "DRUPAL_UID" ) {
                        return 405;
                } # pass POST requests to Apache
                if ($request_method !~ ^(GET|HEAD)$ ) {
                        return 405;
                }
                error_page 405 = @nocache;
                # do not allow browsers to cache HTML
                add_header Expires "Sun, 19 Nov 1978 05:00:00 GMT";
                add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
                # serve requested content from the cache if available, otherwise pass the request to Apache
                try_files /cache/normal/$host/${uri}_.html /cache/perm/$host/${uri}_.css /cache/perm/$host/${uri}_.js /cache/$host/0$uri.html /cache/$host/0${uri}/index.html @nocache;
       }
[...]

The complete file looks as follows:

server {
       listen 80;
       server_name www.example.com example.com;
       root /var/www/www.example.com/web;
       if ($http_host != "www.example.com") {
                 rewrite ^ http://www.example.com$request_uri permanent;
       }
       index index.php index.html;
       location = /favicon.ico {
                log_not_found off;
                access_log off;
       }
       location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
       }
       # Make sure files with the following extensions do not get loaded by nginx because nginx would display the source code, and these files can contain PASSWORDS!
        location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
                deny all;
        }
       # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
       location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
       }
       location / {
                if ($query_string ~ ".+") {
                        return 405;
                }
                # pass requests from logged-in users to Apache
                if ($http_cookie ~ "DRUPAL_UID" ) {
                        return 405;
                } # pass POST requests to Apache
                if ($request_method !~ ^(GET|HEAD)$ ) {
                        return 405;
                }
                error_page 405 = @nocache;
                # do not allow browsers to cache HTML
                add_header Expires "Sun, 19 Nov 1978 05:00:00 GMT";
                add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
                # serve requested content from the cache if available, otherwise pass the request to Apache
                try_files /cache/normal/$host/${uri}_.html /cache/perm/$host/${uri}_.css /cache/perm/$host/${uri}_.js /cache/$host/0$uri.html /cache/$host/0${uri}/index.html @nocache;
       }
       location @nocache {
                try_files $uri $uri/ /index.php?$args;
       }
       location ~*  \.(jpg|jpeg|png|gif|css|js|ico)$ {
                expires max;
                log_not_found off;
       }
       location ~ \.php$ {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       }
}

Then reload nginx:

/etc/init.d/nginx reload

That's it. Now after the first anonymous users have visited your site, you should see your cache directory fill:

ls -l /var/www/www.example.com/web/cache/normal/www.example.com/
root@server1:~# ls -l /var/www/www.example.com/web/cache/normal/www.example.com/
total 36
-rw-rw-r-- 1 www-data www-data 11465 Aug 10 11:59 _.html
-rw-rw-r-- 1 www-data www-data  9619 Aug 10 11:59 nginx-413-request-entity-too-large_.html
-rw-rw-r-- 1 www-data www-data  9628 Aug 10 12:00 postfix-mail-loops-back-to-myself_.html
root@server1:~#

Browse your site as an anonymous user and take a look at the source code. For pages that are served from the cache, you should see a comment at the end of the source code saying <!-- Page cached by Boost -->.

Drupal's cron will take care of cleaning up the cache directory, i.e., if you have told Boost to cache for one hour, cached files older than one hour will be deleted from the cache. Also, if you update your site (insert or update a page or add a comment), the cache will be cleaned as well to make sure users don't see outdated content.

You can now use a tool like Apache Benchmark (ab) to test your site's performance, and you should see that it is able to handle much more requests per second than before.

 

 

About The Author

Falko Timme is the owner of Boost Your Site mit Timme Hosting - ultra-schnelles nginx-WebhostingTimme Hosting (ultra-fast nginx web hosting). He is the lead maintainer of HowtoForge (since 2005) and one of the core developers of ISPConfig (since 2000). He has also contributed to the O'Reilly book "Linux System Administration".

Share this page:

1 Comment(s)