Aaron Chamberlain
Aaron Chamberlain

Reputation: 671

Nginx Reverse Proxy Not Matching Hostname

I have a simple API that I currently have in Apache defined by:

<VirtualHost *:80>
ServerName http://exampleapi.org
ServerAlias http://exampleapi.org
ProxyPreserveHost On
ProxyPass /api http://localhost:3000
</VirtualHost>

I needed to migrate it Nginx for various reasons so in /etc/nginx/conf.d/<domain>.confI went with:

server {
  listen 80;
  listen [::]:80;

  server_name http://exampleapi.org;
  # API endpoint
  location = / {
    proxy_pass http://127.0.0.1:4000;
  }
}

The problem appears to be that I have another file/site in /etc/nginx/conf.d/<domain2>.confand it's always matching that, as I can clearly see from the access logs. So where in the other config is it matching everything? (Note the site name like example.com has been obfuscated with <domain>).

server {
  server_name  SITE_URL <domain>;
  server_tokens off;

  access_log  /var/log/nginx/access.log;

  # Max request size
  client_max_body_size 20M;
  large_client_header_buffers 4 256k;

  root /usr/local/learninglocker/current/webapp/ui/dist/public;

  # xAPI endpoints
  location ~* ^/data/xAPI(.*)$ {
    proxy_pass http://127.0.0.1:8081/data/xAPI$1$is_args$args;
  }

  # API endpoints
  location = /api {
    rewrite /api / break;
    proxy_redirect off;
    proxy_pass http://127.0.0.1:8080;
  }

  location ~* ^/api(.*)$ {
    proxy_pass http://127.0.0.1:8080$1$is_args$args;
    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;
  }

  # All other traffic directed to statics or Node server
  location / {
    try_files $uri @node_server;
  }

  # Node UI server
  location @node_server {
    proxy_pass http://localhost:3000;
    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;
  }

  # Load configuration files for the default server block.
  error_page 404 /404.html;
  location = /40x.html {
    root /usr/share/nginx/html;
  }

  error_page 500 502 503 504 /50x.html;
  location = /50x.html {
    root /usr/share/nginx/html;
  }

  # We don't need .ht files with nginx.
  location ~ /\.ht {
    deny all;
  }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = <domain>) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

  listen       80;
  listen       [::]:80;
  server_name  SITE_URL <domain>;
  return 404; # managed by Certbot
}

Upvotes: 0

Views: 1420

Answers (1)

Shawn C.
Shawn C.

Reputation: 6841

The server_name directive is the host header value to be looking for. It does not include the protocol.

server {
    listen 80;
    listen [::]:80;

    server_name exampleapi.org;
    # API endpoint
    location / {
        proxy_pass http://127.0.0.1:4000;
    }
}

Also, note I changed location = / to location / because with the = it would only match that exact path nothing else which I assumed was not the plan.

Upvotes: 3

Related Questions