我需要一些帮助,因为我在将 nginx 实现为 Windows 服务器上的反向代理时遇到了一些问题。我使用了在其他地方可以正常工作的配置,但我发现失败请求 (404) 和 nginx 特定的错误代码 499 的问题更多。
使用设置时,我们在 nginx 日志中看到大约 200 个 404 错误,而在针对 IIS 运行时,只有大约 100 个相同的错误。大多数情况下,文件都在那里,当直接在 Windows 服务器上运行时,相同的(无论如何获取请求)工作正常。
我的第一个感受是,我的设置在使用通过 nginx 的 post 请求时出现了问题,但这只是很小的比例,所以不要认为 nginx post 设置存在根本错误。
499 状态代码,客户端关闭连接似乎有点奇怪。我可以看到 20k 个请求中有大约 150-300 个 499 请求。可能这些请求本来就存在,只是我们没有在 IIS 中看到它们被报告。
这是我的 nginx 站点配置:
server {
listen 80;
server_name www.mydomain.com;
access_log /var/log/nginx/www.mydomain.com/mydomain.com.log main_ext;
location / {
proxy_pass http://mydomain;
health_check;
}
}
upstream myupsteam {
zone myupsteam 64k;
sticky cookie srv_id expires=1h domain=.mydomain.com path=/;
server IP;
}
确实需要开始通过这些服务器推动流量,因为 IIS 服务器正在努力应对负载,但在我们签署切换之前,只需要找出错误的根源。
我尝试将代理超时设置、代理绑定地址更改为私有 NIC。
有人有什么想法吗?
答案1
这本来是一条评论,但由于我在 ServerFault 上名气不大,所以我不得不将其写成答案。如有不一致之处,请谅解。
到目前为止,我所遇到的 NGINXHTTP 499
错误(友好地称为Client Connection Closed
或Failed to load: Connection reset by peer
)是由于 下的错误权限引起的/var/lib/nginx
。
由于我已经使用 Docker 切换到容器化的 Web 服务器环境,因此我们选择 NGINX 作为容器的反向代理,而不必在每个容器中映射主机端口。
在我们的环境中回收主容器的过程中proxy
,权限/var/lib/nginx
变得混乱,这是 NGINX 用来存储/检索通过指令发送的请求的临时文件夹proxy_pass
。
通过该目录正确地chown
递归到user:group
映射到 nginx 进程,并在必要时修复权限,这775
是解决在加载我们的应用程序时神秘关闭连接的问题的解决方案。
我们还需要代理 HTTP 标头,以便我们的应用程序正确识别(而不是丢弃/中止连接)它们已被合法代理请求,同时也为我们的应用程序提供足够的信息以正确地返回信息。
从我们的舞台来看/etc/nginx/snippets/proxy-headers.conf
:
proxy_set_header 主机 $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-验证成功; proxy_set_header X
-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header 升级 $http_upgrade;
proxy_set_header 连接 "升级";
proxy_pass_header Set-Cookie;
proxy_http_version 1.1;
proxy_read_timeout 900s;
您的需求可能会(也可能会)有所不同。如果需要,请调整并使用它们作为起点。我们还尝试使用代码片段改进我们的虚拟主机配置,以将更改分散到需要共享相同标头、SSL 参数(例如允许的密码)等的所有配置中...
为了使用这样的代码片段,只需将其包含到您的虚拟主机中,考虑上面的代码片段和路径:
包括/etc/nginx/snippets/proxy-headers.conf;
PS:上面的 proxy-header.conf 代码片段来自启用 SSL 的虚拟主机。如果您使用纯 HTTP 进行通信,则绝对不需要 SSL 标头