The last 1 or 2 years I have been running nginx as reverse proxy in front of Apache2. Now with the release of nginx version 1.2.0 I decided to revamp my installation and use nginx as a standalone server again. This guide explains my installation which uses nginx, PHP via FastCGI connector and SSL running on Ubuntu 10.04.
I want to use the current version of nginx, so I use the PPA repository where current nginx builds can be found:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx
Currently this will install nginx version 1.2.0. Now install the packages required for php:
sudo apt-get install php5-cgi
Now we need to create a start/stop script to start our cgi process. Create a file /etc/init.d/php-fastcgi
with the following contents:
#!/bin/sh
USER=www-data
CHILDREN=3
MAX_REQUESTS=1000
RETVAL=0
start() {
echo -n "Starting PHP FastCGI: "
start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- - USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$CHILDREN PHP_FCGI_MAX_REQUESTS=$MAX_REQUESTS /usr/bin/php-cgi -b 127.0.0.1:9000
RETVAL=$?
echo "OK"
}
stop() {
echo -n "Stopping PHP FastCGI: "
killall -q -w -u $USER /usr/bin/php-cgi
RETVAL=$?
echo "OK"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: php-fastcgi {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
This script will start 3 PHP worker processes which will server up to 1000 requests each. Make the script executable:
sudo chmod a+x /etc/init.d/php-fastcgi
Now you can try to start the php daemon:
sudo /etc/init.d/php-fastcgi start
You should see the daemons in the process list. If everything is running so far, enable autostart for the service:
sudo update-rc.d php-fastcgi defaults
The next step is to create a self signed SSL certificate:
openssl req -new -x509 -days 4312 -nodes -keyout /etc/nginx/web.pem -out /etc/nginx/web.pem
When filling out the certificate details, make sure that you enter your domain name in the field “Common Name”. The above command will create a self signed certificate file.
The last step is to create virtual host configurations for nginx. Here is an example which can act as a boilerplate to setting up a new vhost which will listen on http and https. Let’s say we want to create a vhost for a domain mydomain.com
where the files are located at /srv/www/vhosts/mydomain.com/httpdocs
. Create a new file /etc/nginx/sites-available/mydomain.com
with the following contents:
server {
listen 80;
listen 443 ssl;
server_name mydomain.com www.mydomain.com;
ssl_certificate /etc/nginx/web.pem;
ssl_certificate_key /etc/nginx/web.pem;
access_log /srv/www/vhosts/mydomain.com/logs/access.log combined;
error_log /srv/www/vhosts/mydomain.com/logs/error.log;
root /srv/www/vhosts/mydomain.com/httpdocs;
index index.php;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php {
try_files $uri = 404;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}
If you want to redirect all non-ssl traffic to the https port, add the following lines inside the server block:
if ($ssl_protocol = "") {
rewrite ^ https://$server_name$request_uri? permanent;
}
To activate the vhost, create a symbolic link in the directory /etc/nginx/sites-enabled/
:
ln -s /etc/nginx/sites-available/mydomain.com /etc/nginx/sites-enabled/mydomain.com
And now reload the nginx configuration:
sudo /etc/init.d/nginx reload
Everything should be working by now.
Leave a Reply