This “how to” guide will step you through the process of setting up Nginx, PHP, and MySQL on Ubuntu 13.04.
Nginx (pronounced Engine-X) is a fast & lightweight HTTP and HTTPS web server (it can also act as a reverse proxy, and perform load balancing).
Its small memory footprint requirements make it great for systems with small amounts of memory, such as low end cloud servers. Nginx is great for serving static files to users, and is cable of handling more than 10,000 simultaneous connections, but it lacks the embedded module support for PHP as Apache does.
Nginx can’t process PHP files directly, so Nginx essentially offloads processing of .php files to the PHP FPM package, which in turn passes the interpreted script information back to Nginx, to return back to the end user.
On some previous versions of Ubuntu, there were no pre-compiled PHP-FPM packages that you could install out of the box (without adding additional repositories). Thankfully on Ubuntu 13.04, the PHP-FPM binaries are available in the default Ubuntu repositories.
The how to article below describes installing the usual components for the LAMP stack (Linux, Apache, MySQL, and PHP), however the Apache part is exchanged for Nginx.
Prerequisites
Make sure the apt sources are up to date before installing:
$ sudo apt-get update
Install MySQL
Install MySQL using the following command:
$ sudo apt-get install -y mysql-server mysql-client
You will be asked to enter a “root” password for the MySQL server. Generate a strong password, type it in, and keep note of it for future reference.
Run through the “mysql_secure_installation” script to lock down the MySQL installation.
$ mysql_secure_installation
You will need the password you set when you installed the MySQL server in the previous step. Enter this in when prompted.
You will generally want to answer the prompts with “y”, apart from the first, asking if you want to change the root MySQL password. Assuming you set a strong password in the previous step, you can select “n” for this question.
Install Nginx
Nginx is available in the standard Ubuntu 13.04 repositories, so installing it is simply a matter of running the following command:
$ sudo apt-get install -y nginx
The configuration of Nginx will be done at a later stage.
Install PHP FPM
To use PHP with Nginx, you require the PHP FPM package. Thankfully this is included in the Ubuntu 13.04 repositories.
Install PHP and any other modules that you may require:
$ sudo apt-get -y install php5-fpm php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick \ php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode \ php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-common
Note: You can modify the above command to add/remove individual PHP packages if needed. The php5-fpm package is however required when used with Nginx.
Configure Nginx to Pass PHP Files to PHP-FPM
Edit the Nginx configuration file so that it knows what to do with .PHP files:
$ sudo nano /etc/nginx/sites-available/default
There will be a section with the heading starting with “# pass the PHP scripts to FastCGI server” as seen below:
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # fastcgi_split_path_info ^(.+\.php)(/.+)$; # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: # fastcgi_pass unix:/var/run/php5-fpm.sock; # fastcgi_index index.php; # include fastcgi_params; #}
Un-comment the lines as shown below, and also add in the “try_files” line as noted in the config example below:
location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; # add the following line in for added security. try_files $uri =403; }
Save the file and exit the editor.
Restart PHP FPM
Restart PHP FPM using the following command, to make sure the changes take effect:
$ sudo /etc/init.d/php5-fpm restart
Restart Nginx
Restart the Nginx web server using the following command:
$ sudo service nginx restart
Testing
To test to make sure you have set it all up correctly, create a .php file containing the following PHP code and save it in your website folder and call it test.php (/usr/share/nginx/html/test.php in my example.):
<?PHP phpinfo(); ?>
Load up your site in a browser, and add the file /test.php to the url, and make sure it comes up with the usual PHP information page, and not just the source code for the .php file you created.
You should now have a working Nginx, PHP, and MySQL stack. Read the Nginx documentation for more detailed configuration options.
The Nginx documentation can be found on the Nginx website at http://nginx.org/