![NGINX双反向代理](https://linux22.com/image/700374/NGINX%E5%8F%8C%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.png)
我的反向代理遇到了一些奇怪的问题。
我的设置如下: 设置
localhost:3000
现在,我内部网络中的主机可以访问服务器上正在运行的应用程序srv1.my.domain.org
,所以我知道配置正在运行。但是,当我尝试从网络外部(通过gateway.my.domain.org
)访问该应用程序时,我只会看到 NGINX 测试页面。我不明白为什么,因为我已经为多个其他应用程序进行了此配置,并且它们正在运行。
注意:server_name
与物理服务器的主机名相同。
配置如下:
网关.my.域名.org
小路:/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.域名.org
小路:/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;
}
}
答案1
我的类似设置的配置略有不同:
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;
}
}
在我的例子中,所有东西都在一个节点上,但适应你的情况应该很简单,只需创建类似的块即可
您还覆盖了 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(从网关)发送请求,该请求具有 Gateway.my.domain.org 的 Host: 标头。srv1 上的虚拟主机配置为响应 srv1.my.domain.org 的 Host 标头 - 因此您的虚拟主机配置未被使用。404 很可能来自 srv1 的默认端口 80 服务器。
修复此问题的一种方法可能是:
proxy_set_header Host $proxy_host;
这也恰好是 Host 字段的默认值(每个https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header)。
这应该很容易测试:将 srv1.my.domain.org 的日志配置为转到默认 nginx 日志文件以外的其他目的地。然后检查您发出的下一个请求是否出现在您的“自定义”日志或默认日志中。
X-Real-IP 的问题在于,在 gateway.my.domain.org 上,$remote_addr 是有意义的,但在 srv1.my.domain.org 上,$remote_addr 是 gateway.my.domain.org 的内部地址。