有几个问题类似,但最相似的问题没有答案,其余的问题都有混淆因素。之前工作正常的 nginx 的部署是重定向而不是代理。nginx.conf 的相关部分如下所示;
location /timesheets/ {
gzip on;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_proxied any;
gzip_min_length 1000;
gzip_comp_level 2;
gzip_http_version 1.0;
gzip_buffers 16 8k;
gunzip on;
gzip_static on;
# Disable for IE < 6 because there are some known problems
gzip_disable "MSIE [1-6].(?!.*SV1)";
# Add a vary header for downstream proxies to avoid sending cached gzipped files to IE6
gzip_vary on;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://timesheetserver.fqdn.com.au:8216$request_uri;
proxy_intercept_errors on;
}
当通过 server_name 部分的 URL 访问服务器时,timesheetserver 端口 8216 上的内容应该被代理到它们。由于某种原因,它向 proxy_pass 服务器回复 302,并且由于用户无法访问端口 8216,因此它失败了。这是什么原因造成的?
更新:如果 index.html 遗漏在末尾,它会向 proxy_pass 服务器发送 302 错误。如果 index.html 是手动附加的,它会正常工作。我添加了 index index.html; 指令,但它似乎无法处理遗漏的文件 - 我该如何解决?
答案1
- 确认访问http://时间服务器:8216从你的 nginx 反向代理服务器使用 curl、wget 等。
- 如果您想要使用名称(而不是 IP 地址)进行 proxy_pass,请在 http、server、location 块中定义具有有效 ipv6 选项的解析器指令(DNS 服务器)。
- 附加定义 resolver_timeout 指令。
location /timesheets/ {
# http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver
resolver 127.0.0.1 valid=30s ipv6=off;
# http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver_timeout
# give up and response error
resolver_timeout 5s;
### your existing configuration :-)
}
最好使用 FQDN(完全限定域名)进行反向代理timesheetserver
。
参考: http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver