How to tunnel our local server to the public internet with https using Ngrok.
1. Introduction:
It seems to be daunting if we need to test our application locally over Https. Generally, when we need to listen webhook from any other service provider, testing applications locally will be difficult. In this tutorial, I will show how to tunnel the local server into the live one using
ngrok.
Create an account from
ngrok from which we can get tunnel auth token which we will use to get persistent Https URLs even if the outage of the internet until ngrok is running.
2. Install and set up on windows system:
Download ngrok for windows system
here and unzip. After that, you will see the ngrok binary file, to run that file double click it. Make sure the path of ngrok, you will see the command prompt as bellow.
Now you are ready to tunnel your local server port. Simply execute the following command.
ngrok.exe http 80
Here, port 80 is the server port running; you need to use the respective port of your running local server like 8080, 8090 etc.
We have successfully tunnel our local server running at port 80. We can see the two forwarding URLs which are accessible publicly. As we can see the session expires in about 8 hrs which means those URLs will be changes every 8 hrs; here we need an auth token to prevent this. Execute the following command.
ngrok.exe authtoken 5AXFH2DjGMu9NFHntjxZf_73wZyVZiKeCxrA1hwZWqX
Use your own auth token from your account instead. You can see the message in the command prompt.
Authtoken saved to configuration file: C:\Users\yourUser/.ngrok2/ngrok.yml
We will use this file to set up for multiple port tunnels. Now again run your local server port you will see the final tunneling URLs without session expires limit.
Now its time to tunnel more than one port if you need it. For this, we are using ngrok.yml config file as below:
ngrok.yml
tunnels:
backend:
addr: 8080
proto: http
frontend:
addr: 8081
proto: http
Here, I have running two applications on port 8080 and 8081. Now again run the ngrok.exe file and run the following command to start and tunnel all ports.
ngrok.exe start -all
We have successfully tunnel a multi-port server.
Note:
if you get Invalid Host header
error while running that URLs, start tunneling port with the following command instead:
ngrok.exe http 8080 -host-header="localhost:8080"
or
ngrok.exe http --host-header=rewrite 8080
For multiport tunnels
tunnels:
backend:
addr: 8080
proto: http
host_header: "localhost:8080"
frontend:
addr: 8081
proto: http
host_header: "localhost:8081"
3. Install and set up on Linux system:
Download ngrok for the Linux system
here. Go to download path and simply right click and extract the file. You will see the ngrok binary file, we need to make it executable so, copy this file to usr/bin directory.
sudo cp ~/Downloads/ngrok-stable-linux-amd64/ngrok /usr/bin/
Now type ngrok command in the terminal you can see the following output if it is successfully installed.
If it is not installed then go to the ngrok binary file path and open terminal and type command ./ngrok instead of ngrok to run and tunnel your server port.
For the persistent URLs, setup auth token using command:
ngrok authtoken 5AXFH2DjGMu9NFHntjxZf_73wZyVZiKeCxrA1hwZWqX
Use your auth token from your ngrok account, which will configure ngrok config file in your home directory.
Authtoken saved to configuration file: /home/36olearntocode/.ngrok2/ngrok.yml
If you want to tunnel single port then simply run following command and you will see the following output.
ngrok http 80
Use the respective port of your server.
If you want to tunnel multiple ports then set up ngrok config file as:
ngrok.yml
tunnels:
backend:
addr: 8080
proto: http
frontend:
addr: 8081
proto: http
Now again run the command to start:
ngrok start -all
Output:
Note:
if you get Invalid Host header
error while running that URLs, start tunneling port with the following command instead:
ngrok http 8080 -host-header="localhost:8080"
or
ngrok http --host-header=rewrite 8080
For multiport tunnels
tunnels:
backend:
addr: 8080
proto: http
host_header: "localhost:8080"
frontend:
addr: 8081
proto: http
host_header: "localhost:8081"
We have successfully tunnel our two port 8080 and 8081 over https.