Here’s how you can setup nginx and php-fpm for use with wordpress. It is assumed you have nginx and and php-fpm installed.
Goals / Environment
- Domain mycooldomain1.com pointing to (http only)
- wordpress installed on /usr/share/mycooldomain1.com_wordpress
- php-fpm listening on localhost port 9000
On your nginx.conf (typically located at /etc/nginx/nginx.conf), add following server element somewhere down the inner-bottom of http:
http {
...
server {
listen 80;
server_name mycooldomain1.com;
access_log /var/log/nginx/mycooldomain1.com.access.log main;
error_log /var/log/nginx/mycooldomain1.com.error.log;
root /usr/share/mycooldomain1.com_wordpress;
index index.php index.html index.htm;
# This location block matches everything, but subsequently the first matching
# regex location block (the ones starting with ~) will be used instead if any.
# The try_files statement below will check if the request matches any file or
# directory and serve it directly, otherwise it will redirect into /index.php
# for nice permalink URLs processing
location / {
try_files $uri $uri/ /index.php?$args;
}
# Avoid logging these extensions and set maximum cache expiry. This is as
# recommended by http://codex.wordpress.org/Nginx
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off; log_not_found off; expires max;
}
# Any requests ending with .php will be processed using this block instead of above,
# including request to root (http://mycooldomain1.com/). This is true because we've set
# index.php to be one of the index file searched above
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass localhost:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
The directive include fastcgi_params imported directives from external file. fastcgi_params is a default file which comes with nginx / php-fpm installation, in case you don’t have it here’s the default fastcgi_params I have on my box.
Restart both nginx and php-fpm once you’ve updated the config:
sudo service nginx restart
sudo service php-fpm restart
And yes nginx config is pretty mundane to learn and debug. I’ve spent few hours reading the official doc as well as various posts to make it work. One most important paragraph of the official doc is probably this (from http_core_module location directive)
A location can either be defined by a prefix string, or by a regular expression. Regular expressions are specified with the preceding “~*” modifier (for case-insensitive matching), or the “~” modifier (for case-sensitive matching). To find location matching a given request, nginx first checks locations defined using the prefix strings (prefix locations). Among them, the location with the longest matching prefix is selected and remembered. Then regular expressions are checked, in the order of their appearance in the configuration file. The search of regular expressions terminates on the first match, and the corresponding configuration is used. If no match with a regular expression is found then the configuration of the prefix location remembered earlier is used.
Enjoy!