In the previous article Setting up Nginx on a Debian server as front-end for Apache of the series of articles for Drupal sysadmins we explained Nginx configs that allow it working through static queries while Apache serves dynamic content. This article offers a look at an alternative setup, where Php-fpm takes the place of Apache. The operating principle for our web server will be as follows:
- Nginx receives queries from clients;
- Nginx serves static content itself;
- Nginx passes dynamic content queries to php-fpm, which operates locally at port 9000.
Components installation
First off, we need to update the local packages cache:
apt-get update
Next, we install everything we need:
apt-get install nginx php5-fpm mysql-server php5-gd php5-mysql
Nginx configuration
Nginx configuration in file /etc/nginx/sites-enabled/drupaladmin-example.com.conf we need is as follows:
server {
server_name www.drupaladmin-example.com;
rewrite (.*) http://drupaladmin-example.com$1;
}
server {
listen 80;
server_name drupaladmin-example.com;
root /home/webmaster/domains/drupaladmin-example.com/html;
index index.html index.htm;
access_log /home/webmaster/domains/drupaladmin-example.com/logs/nginx_access.log;
error_log /home/webmaster/domains/drupaladmin-example.com/logs/nginx_error.log;
# serve imagecache files directly or redirect to drupal if they do not exist
location ^~ /sites/default/files/styles/ {
access_log off;
expires 30d;
try_files $uri @rewrite;
}
# serve static files directly
location ~* ^.+\.(gz|jpg|jpeg|gif|css|png|js|ico|html|swf|flv|pdf)$ {
access_log off;
expires 30d;
}
location / {
# Trying to upload the file, switch to Apache in case of failure
try_files $uri @drupal;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location @drupal {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_read_timeout 600;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param QUERY_STRING q=$uri&$args;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
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;
}
}
We leave /etc/nginx/fastcgi_params unchanged.
Php-fpm configuration
We need to introduce the following to /etc/php5/fpm/php-fpm.conf:
syslog.facility = daemon syslog.ident = php-fpm log_level = error emergency_restart_interval = 12h events.mechanism = epoll
Next, we need to set up the pool /etc/php5/fpm/pool.d/www.conf
user = www-data group = www-data pm = dynamic pm.max_requests = 1500 security.limit_extensions = .php php_admin_value[error_log] = /home/webmaster/domains/drupaladmin-example.com/logs/fpm-php.www.error.log php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 256M php_admin_value[upload_tmp_dir] = "/home/webmaster/domains/tmp" php_admin_value[session.save_path] = "/home/webmaster/domains/tmp"
Config file /etc/php5/fpm/php-fpm.conf contains sufficiently detailed descriptions of parameters. You can learn more in the official manuals.
That’s it! You now have an environment for a Drupal-powered website that will work without Аpache.