A reverse proxy is a server that takes the requests made through web i.e. http & https, then sends them to backend server (or servers). A Backend server can be a single or group of application server like Tomcat, wildfly or Jenkins etc or it can even be another web server like Apache etc.
We have already discussed how we can configure a simple http reverse proxy with Nginx. In this tutorial, we will discuss how we can configure a Nginx reverse proxy with SSL. So let’s start with the procedure to configure Nginx reverse proxy with SSL,
Recommended Read : The (in)complete Guide To DOCKER FOR LINUX
Also Read : Beginner’s guide to SELinux
Pre-requisites
- A backend server: For purpose of this tutorial we are using an tomcat server running on localhost at port 8080. If want to learn how to setup a apache tomcat server, please read this tutorial.
Note:- Make sure that application server is up when you start proxying the requests.
- SSL cert : We would also need an SSL certificate to configure on the server. We can use let’s encrypt certificate, you can get one using the procedure mentioned HERE. But for this tutorial, we will using a self signed certificates, which can be created by running the following command from terminal,
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/certs/cert.key -out /etc/nginx/certs/cert.crt
You can also read more about self signed certificates HERE.
Next step on configuring nginx reverse proxy with ssl will be nginx installation,
Install Nginx
Ubuntu
Nginx is available with default Ubuntu Repositories. So simple install it using the following command,
$ sudo apt-get update && sudo apt-get install nginx
CentOS/RHEL
We need to add some repos for installing nginx on CentOS & we have created a detailed ARTICLE HERE for nginx installation on CentOS/RHEL.
Now start the services & enable it for boot,
# systemctl start nginx
# systemctl enable nginx
Now to check the nginx installation, we can open web browser & enter the system ip as url to get a default nginx webpage, which confirms that nginx is working fine.
Configuring Nginx reverse proxy with SSL
Now we have all the things we need to configure nginx reverse proxy with ssl. We need to make configurations in nginx now, we will using the default nginx configuration file i.e. ‘/etc/nginx/conf.d/default.conf’.
Assuming this is the first time we are making any changes to configuration, open the file & delete or comment all the old file content, then make the following entries into the file,
# vi /etc/nginx/conf.d/default.conf
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443;
server_name linuxtechlab.com;
ssl_certificate /etc/nginx/ssl/cert.crt;
ssl_certificate_key /etc/nginx/ssl/cert.key;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:8080;
proxy_read_timeout 90;
proxy_redirect http://localhost:8080 https://linuxtechlab.com;
}
}
Once all the changes have been made, save the file & exit. Now before we restart the nginx service to implement the changes made, we will discuss the configuration that we have made , section by section,
Section 1
server {
listen 80;
return 301 https://$host$request_uri;
}
here, we have told that we are to listen to any request made to port 80 & then redirect it to https,
Section 2
listen 443;
server_name linuxtechlab.com;
ssl_certificate /etc/nginx/ssl/cert.crt;
ssl_certificate_key /etc/nginx/ssl/cert.key;
ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
Now these are some of the default nginx ssl options that we are using, which tells what kind of protocol version, SSL ciphers to support by nginx web server,
Section 3
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:8080;
proxy_read_timeout 90;
proxy_redirect http://localhost:8080 https://linuxtechlab.com;
}
}
Now this section tells about proxy & where the incoming requests are sent once they come in. Now that we have discussed all the configurations, we will check & then restart the nginx service,
To check the nginx , run the following command,
# nginx -t
Once we have configuration file as OKAY, we will restart the nginx service,
# systemctl restart nginx
That’s it, our nginx reverse proxy with ssl is now ready. Now to test the setup, all you have to do is to open web browser & enter the URL. We should now be redirected to the apache tomcat webpage.
This completes our tutorial on how we can configure nginx reverse proxy with ssl, please do send in any questions or queries regarding this tutorial using the comment box below.
If you think we have helped you or just want to support us, please consider these :-
Connect to us: Facebook | Twitter | Google Plus
Donate us some of your hard earned money: [paypal-donation]
Linux TechLab is thankful for your continued support.
Worked like a charm. Your cert location command line writes the certs to ‘certs’ folder but the nginx config has it reference ‘ssl’ – other than that it all worked out of the box.
Seems this is irrelevant
proxy_redirect http://localhost:8080 https://linuxtechlab.com;
Nice Post. But if I have got 2 different backend web servers ? is it possible to configure nginx in order to have this schema ? reverse proxy published with only one public IP. Client call https site1.com –> reverse proxy ngingx –> redirect to https web server site1, client call https site2.com –> reverse proxy ngingx –> redirect to https web server site2. in other words can ngingx do reverse proxy from public https to private https ? thanks
What you can do is to configure HAproxy at some other port, ex port 83 & then configure load balancing for the two servers. Next you can use Nginx for reverse proxy & configure the haproxy url like localhost:83 as your backend server.
Its quite simple setup & both can be configured on same server
Do you need the certs on the NGINX Proxy Host if you already have certs on the backend web server? Is it possible to have NGINX just reverse proxy the https traffic to the relevant back end web server based on the requested hostname without applying certs on the NGINX host itself?
You would need ssl cert on nginx as on frontend, ngnix will be handling the web requests.
Is it necessary to put also ssl on the backend servers?
not at all, you can use plain simple HTTP connection or using any other TCP port.