Using Nginx as Reverse Proxy for Apache in Ubuntu 14.04

For sure Apache is a cool Web Server because of mods being available to tweak to anything you want as long as you provide it’s food which is memory! But the evolving of Nginx seem to start knocking of Apache because it’s less memory consuming and faster, what if your site already run Apache and you still wanna keep Apache but you really need that Nginx to reduce your memory consumption. It’s easy, just place Nginx in front of Apache i.e. using Nginx as a reverse proxy for Apache since Nginx is good and fast in serving static files like client side files, we now tell Nginx to process all other files but send PHP to Apache, pretty cool ye? Now let’s do it 🙂

In this post I assume you are already have Apache and PHP set up, if not please read here

Now let’s install Nginx

sudo apt-get update && sudo apt-get install nginx

With a successful installation, we now move to configuration of the virtual host to process user’s request. Create this file

sudo nano /etc/nginx/sites-available/testing

then paste these into it

#lets start configuration
server {
#Set Nginx to listen to 80 which is the default webserver port
listen 80;

#Root directory for serving
root /var/www/html;

#Index files
index index.php index.html index.htm index.xhtml;

#Server name

#Let Nginx server files requested by client
location / {
try_files $uri $uri/ /index.php;

#Pass PHP which is a dynamic page and can also be interpreted to Apache
location ~\.php$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
#Finally pass the file to Apache on 8080

location ~/\.ht {
deny all;

Explanation was done inside the config file, now save and activate by creating a symbolic link of it in sites-enabled by running

sudo ln -s /etc/nginx/sites-available/testing /etc/nginx/sites-enabled/testing

Configuring Apache

Since Nginx is listening to 80 and we told it to pass the proxy to 8080 which should be where Apache is listening to receive a request. Let’s tell Apache to listen to 8080 and leave 80 for Nginx

sudo nano /etc/apache2/ports.conf

then change Listen 80 to Listen 8080 then save

Restart Apache and Nginx

sudo service apache2 restart && sudo service nginx restart


curl -I

Should return something similar to this

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Wed, 18 Feb 2015 21:35:42 GMT
Content-Type: text/html
Content-Length: 11510
Last-Modified: Wed, 18 Feb 2015 21:10:06 GMT
Connection: keep-alive
ETag: "54e4ffae-2cf6"
Accept-Ranges: bytes

Having Server as nginx/1.4.6 (Ubuntu) I hope this helps.

If you wish to manage port access or not making it publicly available, read up Configuring Simple Firewalls in Ubuntu 14.04 Using UFW