VPS

Running Nginx With Apache, With Reverse Proxy

When I migrate my wordpress-es to VPS, Apache was the default setup.

Problem: I wanted to run some Node.js apps in the same VPS, but node requires nginx.

Hence, I configured my VPS to run both Apache and Nginx.

That’s possible, when you make nginx a reverse proxy server.

The plan is as such:

  • nginx listens to port 80
  • nginx 1st server block is configured for node app at port 8021
  • nginx 2nd server block is configured to proxy to apache at port 8011
  • apache listen to port 8011
  • apache’s virtual hosts listen to port 8011

The details and a sample of the .conf files as follows. My scenario is using nginxapp.com and apacheapp.com

Nginx

There are 2 server blocks, which I put in 2 seperate conf files: nginxapp.com.conf and apache-proxy.conf.

/etc/nginx/sites-available/nginxapp.com.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Node server block
server {
        listen  80;

        root  /var/www/nginxapp.com/;
        index   index.html index.htm;

        server_name   nginxapp.com;

        # temp for serving static
        location / {
          try_files $uri $uri/ /index.php;
        }

        # Proxy to node app
        # Uncomment and remove the temp above if your node app is setup at port 8021
        #location / {
        #  proxy_pass http://localhost:8021;
        #  proxy_http_version 1.1;
        #  proxy_set_header Upgrade $http_upgrade;
        #  proxy_set_header Connection 'upgrade';
        #  proxy_set_header Host $host;
        #  proxy_cache_bypass $http_upgrade;
        #}
}

Note: You should setup your node app and listen on 8021. In the meanwhile (testing), you can put a dummy index.html in /var/www/nginxapp.com/.

/etc/nginx/sites-available/apache-proxy.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Apache server block
# Proxy to 8011 which Apache is listening to
server {
        listen  80 default_server;

        location / {

                proxy_set_header X-Real-IP  $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header Host $host;
                proxy_pass http://localhost:8011;

         }

         location ~ /\.ht {
                deny all;
        }
}

Enable the nginx conf with these commands:

1
2
sudo ln -s /etc/nginx/sites-available/nginxapp.com.conf /etc/nginx/sites-enabled/nginxapp.com.conf
sudo ln -s /etc/nginx/sites-available/apache-proxy.conf /etc/nginx/sites-enabled/apache-proxy.conf

Apache

For apache, you need to change the port file to listen to 8011.

/etc/apache2/ports.conf
1
2
3
Listen 8011

# As per default configuration

Below is a sample of a virtual host file. You need to change for all. The change is again on the listening port.

/etc/apache2/sites-available/awesome.com.conf
1
2
3
<VirtualHost *:8011>
    # as per your configuration
</VirtualHost>

Restart

With that, restart each service with apache first, then nginx.

1
2
sudo service apache restart
sudo service nginx restart

Now, you if you go to http://apacheapp.com, it should work, and it is because nginx is proxying nicely to apache.

You can also go to http://apacheapp.com:8011, which is directly to apache.

And of course, you can now write your node app at http://nodeapp.com.

Other guides

I referenced from some of Digital Ocean guides:

Comments