Nginx反向代理不匹配主机名

时间:2019-09-26 13:54:56

标签: node.js nginx reverse-proxy

我有一个目前在Apache中定义的简单API,其定义如下:

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

出于各种原因,我需要迁移Nginx,因此在/etc/nginx/conf.d/<domain>.conf中,我选择了:

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

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

问题似乎是我在/etc/nginx/conf.d/<domain2>.conf中有另一个文件/站点,并且它总是与之匹配,正如我从访问日志中清楚看到的那样。那么它在其他配置中与所有内容匹配吗? (请注意,example.com等站点名称已被<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
}

1 个答案:

答案 0 :(得分:3)

server_name指令是要查找的主机头值。它不包含协议。

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

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

另外,请注意,我将location = /更改为location /,因为使用=只会匹配确切的路径,我认为这不是计划。