This is a very easy/simple NginX + PHP-FPM guide.
PHP-FPM configuration
First, download the latest version of PHP (5.3.6 as of this writing) and compile it with the –enable-fpm parameter to allow for the php-fpm binary to be built.
# cd /usr/local/src/ # wget "http://be.php.net/get/php-5.3.6.tar.gz/from/this/mirror" # tar xzf php-5.3.6.tar.gz # rm php-5.3.6.tar.gz # cd php-5.3.6/ # ./configure --enable-fpm --with-mhash --with-mcrypt --with-mysql --with-mysqli --with-pdo-mysql --with-libdir=lib64 # make # make install
A few notes here:
- –enable-fpm: needed to enable the FastCGI Process Manager
- –with-libdir: since I’m running on x64, I need to tell the configure-command to look for libraries in /usr/lib64 instead of the default /usr/lib.
The rest is just the most basic PHP I could imagine, to run a simple website. Yours might need more modules enabled.
Now, copy some config files you’ll need.
# cp sapi/fpm/init.d.php-fpm.in /etc/init.d/php-fpm # chmod 755 /etc/init.d/php-fpm # cp sapi/fpm/php-fpm.conf.in /etc/php-fpm.conf
Edit your /etc/init.d/php-fpm and adjust the following values for your system.
php_fpm_BIN=/usr/local/sbin/php-fpm php_fpm_CONF=/etc/php-fpm.conf php_fpm_PID=/var/run/php-fpm/php-fpm.pid
Make sure the path to the PID file is in a directory where the PHP-FPM user can write to, otherwise you’ll see your php-fpm children start but the init.d script still return failures.
Now edit your /etc/php-fpm.conf the enable at least the following.
[global] pid = /var/run/php-fpm/php-fpm.pid listen = 127.0.0.1:9000 user = php-fpm group = php-fpm pm = dynamic pm.max_children = 50 pm.start_servers = 4 pm.min_spare_servers = 3 pm.max_spare_servers = 35
Note that the path to the PID-file is the same as defined in the init.d script. Make sure you run the php-fpm as an existing user. You’ll probably have to add the php-fpm user first.
# useradd php-fpm # mkdir -p /var/run/php-fpm # chown php-fpm.php-fpm /var/run/php-fpm
You should be able to start php-fpm now, after which it’ll be running on port 9000.
# /etc/init.d/php-fpm start done # lsof -i tcp:9000 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME php-fpm 5140 root 6u IPv4 123964005 TCP localhost.localdomain:cslistener (LISTEN) php-fpm 5142 php-fpm 0u IPv4 123964005 TCP localhost.localdomain:cslistener (LISTEN) php-fpm 5143 php-fpm 0u IPv4 123964005 TCP localhost.localdomain:cslistener (LISTEN) php-fpm 5144 php-fpm 0u IPv4 123964005 TCP localhost.localdomain:cslistener (LISTEN) php-fpm 5145 php-fpm 0u IPv4 123964005 TCP localhost.localdomain:cslistener (LISTEN)
That’s it for the (very basic) PHP-FPM installation. Now, on to Nginx.
NginX configuration
Download and compile nginx for your system.
# cd /usr/local/src/ # wget "http://nginx.org/download/nginx-1.0.0.tar.gz" # tar xzf nginx-1.0.0.tar.gz ; rm nginx-1.0.0.tar.gz # cd nginx-1.0.0/ # ./configure --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module # make && make install
The above will compile NginX without the mail-support for IMAP, POP3 and SMTP since I only want to run it as a webserver, not load balance mail protocols.
Now, have a look at your configuration file for NginX.
vim /usr/local/nginx/conf/nginx.conf
And add something like the following config to it. It has plenty of comments to explain the configuration.
upstream backend_php { server 127.0.0.1:9000; }
The above will create a new “pool” of PHP FastCGI servers. So you can have multiple of them, and have them be “load balanced” (aka: round robin style by default) amongst them.
server { listen 80 default; server_name tryout-hostname; # First look for the index.php, then index.html index index.php index.html; # Where do we log stuff? access_log /var/log/nginx/access.log combined; # buffer=8k; error_log /var/log/nginx/error.log info; # The documentroot of the site. root /var/www/html/; # Want to add a custom header? add_header X-Random-Info "FooBar?"; # Extend this list with other static files you may have location ~* ^.+.(jpg|jpeg)$ { # Static content? Set some expire-headers. expires 30d; # If your site is getting a lot of static request, you may want to # keep them from getting in your access logs. Usually worthless # anyhow. access_log off; } # Is the file ending in the .php extension? location ~\.php$ { # Include the FastCGI parameters as defined by Nginx include fastcgi_params; # Configure the fastCGI fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; if (-f $request_filename) { # Only throw it at PHP-FPM if the file exists (prevents some PHP exploits) fastcgi_pass backend_php; # The upstream determined above } } }
After that, you should be able to start your NginX webserver.
# /usr/local/nginx/sbin/nginx
You can restart it or stop it like so.
# /usr/local/nginx/sbin/nginx -s reload # /usr/local/nginx/sbin/nginx -s stop
Hope this gets you started somewhat, feel free to add additional tips or configuration errors I made in the comments!