Cha*_*oly 5 nginx reverse-proxy
我的反向代理遇到一些奇怪的问题。
我的设置如下所示: 设置
localhost:3000
现在,我的内部网络内的主机可以访问服务器上运行的应用程序srv1.my.domain.org
,因此我知道配置正在运行。但是,一旦我尝试从网络外部(通过gateway.my.domain.org
)访问该应用程序,我就会看到 NGINX 测试页面。我不明白为什么,因为我已经为多个其他应用程序完成了这个配置,并且它们正在工作。
注意:server_name
与物理服务器的主机名相同。
以下是配置:
gateway.my.domain.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;
}
}
Run Code Online (Sandbox Code Playgroud)
srv1.my.domain.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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的类似设置的配置略有不同:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
就我而言,我在一个节点上拥有所有内容,但是适应您的情况应该是创建类似块的简单问题
您还覆盖了 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 的主机标头 - 因此您的虚拟主机配置未被使用。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 的内部地址。
归档时间: |
|
查看次数: |
16035 次 |
最近记录: |