Nginx server name without www pointing to wrong virtual host - nginx

I have a Rails app and a Ghost blog installed on my server with Nginx as the web server.
I want blog.example.com to point to my blog and everything else to point to main App.
My nginx.conf looks like this:
server {
listen 80;
server_name blog.example.com;
root /root/ghost;
location / {
...blah
}
}
server {
listen 80;
server_name example.com, *.example.com;
root /home/example/current/public/;
gzip_static on;
location / {
...blah
}
}
However if I omit the www in the domain, it goes to the blog instead of app.
What am I doing wrong?

server_name is space-separated, not comma-separated. It should be server_name example.com *.example.com;.

Related

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.

Ngrok not tunneling properly 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

NGINX multiple proxy_pass configuration

I would like to use NGIX as a reverse proxy to display different URLs, pointing on the same server, but on different subfolders... The web server is different than the one on which NGIX is running.
here is my web tree, server on the same LAN (192.168.1.10 let's say, port 80...)
/www
|- site1
|- css
|- js
|- site2
|- site3
I want to setup NGIX so when I type www.site1.com on my browser, it shows 192.168.1.10/www/site1
Is that possible ?
here is what I've done, but it didn't work :
server {
listen 80;
server_name www.site1.com;
root /www/site1;
location / {
proxy_pass http://192.168.1.10;
}
}
on the nginx server (A) you can add below configuration on same configuration(V-host) file or you can create different configuration files for each server tags under /etc/nginx/conf.d/
I have consider webserver ip is 192.168.1.10 and running port is 80
server {
listen 80;
server_name www.site1.com;
location / {
proxy_pass http://192.168.1.10;
root /www/site1;
}
}
server {
listen 80;
server_name www.site2.com;
location / {
proxy_pass http://192.168.1.10;
root /www/site2;
}
}
server {
listen 80;
server_name www.site3.com;
location / {
proxy_pass http://192.168.1.10;
root /www/site3;
}
}
If I understood correctly, you need to make the change in the web server (let's say server A). Not in the server where Nginx is running (server B).
'root' directive you have mentioned refers to server B. Nginx will simply pass all requests coming to www.site1.com to server A. There you have to configure the server to deliver content based on host name.
If server A is also running Nginx, you can have a configuration like below in server A.
server {
listen 80;
server_name www.site1.com;
root /www/site1;
}
server {
listen 80;
server_name www.site2.com;
root /www/site2;
}
server {
listen 80;
server_name www.site3.com;
root /www/site3;
}

how can I have nginx require HTTPS for one location, while having it be optional for all others?

Currently I have nginx configured with a single site that serves both HTTP and HTTPS, using two listen directives:
listen 80 default_server;
listen 443 ssl;
I'd like to use this configuration for all locations within the site; however there is only location where I would like to require HTTPS.
location / {
// Both HTTP and HTTPS
}
location /admin {
// Require HTTPS
}
How would I go about doing this? Are seperate HTTP and HTTPS server configs required?
I'd split those to 2 servers
server {
listen 80;
server_name example.com www.example.com;
location / {
#normal config
}
location /admin {
return 301 https://$http_host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.com www.example.com;
location / {
#normal config for frontend
}
location /admin {
#admin settings
}
}
You can split the common config into a separate file and include them in both servers instead of rewriting both every time you change any thing

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