我在Ubuntu上运行nginx/1.19.6。
我正在努力使上游模块工作,而不返回404。
我的*.conf文件位于/etc/nginx/conf.d.d/
文件factory_upstream.conf:
upstream factoryserver {
server factory.service.corp.com:443;
}
文件factory_service.conf:
server
{
listen 80;
root /data/www;
proxy_cache factorycache;
proxy_cache_min_uses 1;
proxy_cache_methods GET HEAD POST;
proxy_cache_valid 200 72h;
#proxy_cache_valid any 5m;
location /factory/ {
access_log /var/log/nginx/access-factory.log main;
proxy_set_header x-apikey abcdefgh12345678;
### Works when expressed as a literal.# proxy_pass https://factory.service.corp.com/;
### 404 when using the upstream name.
proxy_pass https://factoryserver/;
}
}
我设置了要调试的错误日志记录,但是在重新加载配置并尝试调用之后,错误日志中没有新的记录。
nginx -t # Scans OK
nginx -s reload # no errors
cat /var/log/nginx/error.log
...
2021/03/16 11:29:52 [notice] 26157#26157: signal process started
2021/03/16 11:38:20 [notice] 27593#27593: signal process started
access-factory.log确实记录了请求:
127.1.2.3 --;[16/Mar/2021:11:38:50 -0400];";GET /factory/api/manifest/get-full-manifest/PID/904227100052 HTTP/1.1" ";/factory/api/manifest/get-full-manifest/PID/904227100052" ;404; - ;/factory/api/manifest/get-full-manifest/PID/904227100052";-" ";ID="c4cfc014e3faa803c8fe136d6eae347d ";-" ";10.8.9.123:443" ";404" ";-"
为了帮助调试,我缓存了404错误,"proxy_cache_valid任意5米;“在上面的示例中注释掉了:当我使用上游名称时,缓存文件包含以下内容:
<@#$ non-printable characters $%^>
KEY: https://factoryserver/api/manifest/get-full-manifest/PID/904227100052
HTTP/1.1 404 Not Found
Server: nginx/1.17.8
Date: Tue, 16 Mar 2021 15:38:50 GMT
...
密钥包含'factoryserver‘的名称,我不知道这是否重要。是吗?服务器版本与我输入命令nginx -v时看到的不同,即: nginx版本: nginx/1.19.6缓存文件和命令行中的版本差异是否表明了什么?
当我切换回proxy_pass中的文字服务器名时,我将得到一个包含所请求的数据的200个响应。然后,缓存文件中的键包含文字上游服务器名称。
<@#$ non-printable characters $%^>
KEY: https://factory.service.corp.com/api/manifest/get-full-manifest/PID/904227100052
HTTP/1.1 200
Server: nginx/1.17.8
Date: Tue, 16 Mar 2021 15:59:30 GMT
...
我将有多个上游服务器,每个服务器提供不同的服务。配置将部署到多个工厂,每个工厂都有自己的上游服务器。我希望部署团队只需更新*_upstream.conf文件,并将*_service.conf文件从部署站点保持为静态。
为什么在使用指定的上游服务器时我会得到404?
发布于 2021-09-14 20:35:58
基于缓存响应中的nginx版本与您在命令行中看到的不匹配,看来404可能来自上游服务器。也就是说,您的代理是工作的,但上游服务器正在返回404。为了进一步排除故障,我将检查上游服务器的nginx日志,以及传入的请求是否符合您的期望。
请注意,在使用proxy_pass时,无论最后是否有/
,都会产生很大的影响。使用尾随斜杠,nginx将其视为它应该向其发送上游请求的URI,并且它不包括由location块(/factory/
)匹配的URI,而如果没有,它将包含完整的URI。
proxy_pass https://factoryserver/
导致https://factory.service.corp.com:443/
proxy_pass https://factoryserver
导致https://factory.service.corp.com:443/factory/
博士:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
因此,在使用上游和指定文字服务器名称之间切换时,您可能无意中与尾随斜杠不一致。这是一个非常容易错过的细节,特别是当你不知道它是重要的时候。
发布于 2021-03-24 04:49:15
请提供有关代理传递请求的服务器配置的更多信息。我现在看到的唯一不同是,您在上游服务器中指定了端口(443)。
https://stackoverflow.com/questions/66659783
复制