PHP on NGINX
December 19, 2011
I wanted to set up webmail on a Debian box running nginx, and the webmail software used PHP. To do this I used PHP as a fastcgi daemon and then proxied through to it from nginx.
PHP
First we install php:
apt-get install php5-cgi
We need to run php-fastcgi as a daemon. Here's the init.d script I used to do this:
#!/bin/bash ### BEGIN INIT INFO # Provides: php-fastcgi # Required-Start: $local_fs $syslog # Required-Stop: $local_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: php-fastcgi ### END INIT INFO BIND=127.0.0.1:9099 USER=www-data GROUP=www-data PHP_FCGI_CHILDREN=1 PHP_FCGI_MAX_REQUESTS=1000 PHP_CGI=/usr/bin/php-cgi PHP_CGI_NAME=`basename $PHP_CGI` PHP_CGI_ARGS="- USER=$USER GROUP=$GROUP PATH=/usr/bin" PHP_CGI_ARGS="$PHP_CGI_ARGS PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN" PHP_CGI_ARGS="$PHP_CGI_ARGS PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND" RETVAL=0 start() { echo -n "Starting PHP FastCGI: " start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS RETVAL=$? echo "$PHP_CGI_NAME." } stop() { echo -n "Stopping PHP FastCGI: " killall -q -w -u $USER $PHP_CGI RETVAL=$? echo "$PHP_CGI_NAME." } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Usage: php-fastcgi {start|stop|restart}" exit 1 ;; esac exit $RETVAL
Next we need to proxy to 127.0.0.1:9099 whenever a php request comes in:
server { listen 443 default; server_name domain.co.uk; ssl on; ssl_certificate /path/to/cert.crt; ssl_certificate_key /path/to/cert.key; access_log /home/drumcoder/log/site-access.log; if ($host ~* www\.(.*)) { set $host_without_www $1; rewrite ^(.*)$ http://$host_without_www$1 permanent; } location / { root /home/drumcoder/web/domain.co.uk; index index.html; } location ~ /mailoffset/.+\.php { root /home/drumcoder/web/domain.co.uk; fastcgi_index index.php; include /etc/nginx/fastcgi_params; keepalive_timeout 0; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; fastcgi_pass 127.0.0.1:9099; } }
Note that we only support php for urls that start /mailoffset/
- the rest of the domain does not have php support, for security reasons.