NGINX双反向代理

我正在遇到我的反向代理的一些奇怪的问题。

我的设置看起来像这样: setup

现在,我的内部networking中的主机可以到达服务器srv1.my.domain.org上的localhost:3000上运行的应用程序,所以我知道configuration工作。 但只要我尝试从networking外部访问应用程序(通过gateway.my.domain.org ),我只能看到NGINXtesting页面。 我不明白为什么,因为这个configuration我已经做了多个其他的应用程序,他们正在工作。

注: server_name与物理服务器的主机名相同。

这里是configuration:

gateway.my.domain.org

path: /etc/nginx/conf.d/app.my.domain.org.conf

 upstream srv { server srv1.my.domain.org; } server { listen 443; server_name gateway.my.domain.org; ssl on; ssl_certificate /.../fullchain.pem; ssl_certificate_key /.../privkey.pem; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; ssl_prefer_server_ciphers on; access_log /var/log/nginx/gateway.access.log; error_log /var/log/nginx/gateway.error.log; client_max_body_size 150M; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://srv; proxy_read_timeout 90; } } 

srv1.my.domain.org

path: /etc/nginx/sites-enabled/app

 server { listen 80; server_name srv1.my.domain.org; location / { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://localhost:3000; } } 

我的configuration类似的设置有点不同:

 upstream app_backend { server 127.0.0.1:3000 ; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name HOSTNAME; location / { try_files $uri $uri/ @app; } location @app { #proxy_cache general_cache; proxy_pass http://app_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto http; proxy_redirect off; } } 

在我的情况下,我有一个节点上的所有东西,但适应你的情况应该是创build类似的块简单的事情

您也覆盖了srv1.my.domain.org上的X-Real-IP,我不确定您想要做什么。

编辑来解释评论中的更新:

对 – 我刚刚意识到我错过了某些东西(或没有考虑到它),这与X-Real-IP有关。

我想你可能有一个问题的一部分,因为在gateway.my.domain.org,你有:

proxy_set_header Host $host;

在gateway.my.domain.org上, $host = gateway.my.domain.org

所以你要发送一个请求到srv1.my.domain.org(来自网关),它有一个Host.my.domain.org的Host:头。 srv1上的虚拟主机configuration为响应srv1.my.domain.org的主机头,因此您的虚拟主机configuration没有被使用。 404很可能来自srv1的默认端口80服务器。

解决这个问题的一个方法是:

proxy_set_header Host $proxy_host;

这也恰好是Host字段的默认值(根据https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header )。

这应该足够简单,可以testing:为srv1.my.domain.orgconfiguration日志logging,以便转到默认的nginx日志文件以外的其他目标。 然后检查您的下一个请求是否显示在“自定义”日志中,或默认的。

X-Real-IP的问题是在gateway.my.domain.org上,$ remote_addr是有意义的,但在srv1.my.domain.org上,$ remote_addr是gateway.my.domain.org的内部地址。