Ngrok not tunneling properly Nginx - nginx

I have my flask application deployed on Nginx over my VM.
Everything is deployed Ok and I can request my apis on http://my.ip.number (I have a public IP)
But when I run Ngrok (I need https and I don't have a domain name to generate a SSL certificate), the URL https//number.ngrok.io shows me the Nginx home page (Welcome to Nginx) instead my webapp.
Why is this happening?
P.D: When I run "curl localhost" I get the Nginx Welcome Page but when I exec "curl -4 localhost" I get my webapp home page
etc/nginx/site-available/myproject
server {
listen 80;
server_name 0.0.0.0;
location / {
include proxy_params;
proxy_pass http://unix:/home/datascience/chatbot-cima/chatbot.sock;
}
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://unix:/home/datascience/chatbot-cima/chatbot.sock;
}
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://unix:/home/datascience/chatbot-cima/chatbot.sock;
}
}
server {
listen 80;
server_name public.ip;
location / {
proxy_pass http://unix:/home/datascience/chatbot-cima/chatbot.sock;
}
}

Any request coming in from ngrok, has the Host header set to the ngrok URL. The behaviour of nginx would be to try and match one of the server blocks in your configuration above, and default to the first one if no server_name matches the Host header.
However, I'm guessing there's another configuration file at /etc/nginx/conf.d/default.conf or /etc/nginx/sites-enabled/0-default which has a listen directive with default_server set. That will be catching these requests and serving the "Welcome to nginx!" page.
I suggest you look for that file, and remove it which should solve the issue.
However you could also simplify the above configuration and simply have:
server {
listen 80;
server_name localhost;
location / {
include proxy_params;
proxy_pass http://unix:/home/datascience/chatbot-cima/chatbot.sock;
}
}
Provided there's not another server block hiding somewhere else in the configuration with a directive like listen 80 default_server; then this should catch all requests.
For more info see: How nginx processes a request

Related

Why is my service throwing a 404 when trying to proxy with NGINX but I can reach it in a shell?

I have the following on my NGINX server...
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /usr/src/app/host.crt;
ssl_certificate_key /usr/src/app/host.key;
...
location /core {
proxy_pass http://auth-example-application-core-1:3000;
}
}
But when I try to access https://localhost/core I get a 404. If I open a shell and access the NGINX container itself I can hit the endpoint and get a response....
curl http://auth-example-application-core-1:3000
{"status":200,"message":"...","hostname":"5f5444c40d5b"}#
So why is it throwing a 404?
I Also tried...
location /core {
rewrite /core/(.*) /$1 break;
proxy_pass http://auth-example-application-core-1:3000;
}
That didn't seem to work either

Changing the NGINX config statement from `listen 80;` to `listen 80 http2;`

Inside NGINX config file:
http {
server {
listen 80;
server_name sample.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8081;
}
}
}
The above config works fine and web browser is able to access websites and show their content.
But, when I change listen 80; statement to listen 80 http2;, the web browser downloads a file rather than showing webpages of sample.com and example.com. Why is that?
Content-Type: text/html should in Response Headers (like below)
Maybe you should config http2's Response Headers

How can I make nginx redirect subdomain to a folder?

How can I make nginx redirect all the requests to my subdomain to a folder?
Example:
http://sub2.sub1.domain.com/
that should indicate that sub2 is a folder in sub1.domain.com/sub2
How can I do this?
The main objective is to hide the folder to the user. So, it should continue as
http://sub2.sub1.domain.com/
My wish is to use a wildcard in sub2.
UPDATE:
I've tried:
server {
listen 80;
listen [::]:80;
server_name ~^(.*)\.sis\..*$;
location / {
proxy_pass http://sis.mydomain.com/$1$request_uri;
}
}
but it also didn't work, any error?
In the nginx directives for sub2.sub1.domain.com you'd put:
server {
listen 80;
server_name sub2.sub1.domain.com;
location / {
proxy_pass https://sub1.domain.com/sub2;
}
}
So any request going to sub2.sub1.domain.com gets proxied to → sub1.domain.com/sub2 (while masked as sub2.sub1.domain.com); no need for a redirect or rewrite this way either.
Wildcard Method
server {
listen 80;
server_name ~^(.*)\.sub1\.domain\.com;
location / {
proxy_pass https://sub1.domain.com/$1;
}
}
*the wildcard method above is untested.

Nginx Reverse Proxy with Multiple Backend Domains

I have a 2 servers :-
Server 1 : NGINX Reverse Proxy.
Server 2 : NGINX with 5-6 websites ( different domains )
So basically, all users will come to Server 1 which will proxy_pass the traffic to Server 2 and get the response back. Server 1 will also do Caching, WAF etc.
Here is my configuration for Server 1 :-
server {
listen 80;
server_name example.com www.example.com;
location ~* {
proxy_pass http://mysite:80;
}
}
server {
listen 80;
server_name server.com www.server.com;
location ~* {
proxy_pass http://mysite:80;
}
}
In my Server 2, in virtual.conf of NGINX, i have the following config :
index index.php index.html;
server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/websites/example/;
include location-php;
}
}
server {
listen 80;
server_name server.com www.server.com;
location / {
root /var/www/websites/server/;
include location-php;
}
}
However whenever i go to http://example.com or http://server.com ( directed via Sever 1 acting as Reverse Proxy ), it shows the Server 2's Default NGINX Page. I am not sure what am I doing wrong. Also is this type of setup a proper way of doing things ?
This is your host problem.
Due to your upstream name is mysite, so the host name in upstream request is mysqsite too.
So the host isn't matched by the backend servers.
You can solve the problem like this by adding the directive before proxy_pass:
proxy_set_header Host server.com

What's wrong with this nginx.conf?

I'm using nginx as a load balancer to 4 internal server instances. The below nginx.conf will work correctly only for www.mydomain.com . But not for mydomain.com or http://mydomain.com.
upstream mydomain{
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
listen 80;
server_name www.mydomain.com;
location / {
proxy_pass http://mydomain;
}
}
It's normal that it doesn't work for mydomain.com because of server_name www.mydomain.com.
I'm not an nginx expert, but try omitting server_name.
I think you can try this:
server {
listen 80;
server_name www.mydomain.com mydoamin.com;
location / {
proxy_pass http://mydomain;
}
}
At least I've found this solution in docs
all webservers will only work for the domain you configure. In this case, the only domain you added is www.mydomain.com, so it is only going to "work" for the address www.mydomain.com.
If you want all subdomain to work, you need a wildcard character in front of mydomain.com as the following:
server {
listen 80;
server_name .mydomain.com;
location / {
proxy_pass http://mydomain;
}
}
Notice the . before mydomain.com.

Resources