NGINX:使用上游服务器名称



我在Ubuntu上运行nginx/1.19.6。

我正在努力让上游模块在不返回404的情况下工作。

我的*.conf文件位于/etc/nginx/conf.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任意5m"在上面的示例中进行了注释:当我使用上游名称时,缓存文件包含以下内容:

<@#$ 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-version:nginx/1.19.6缓存文件和命令行中的版本差异是否表明了什么?

当我在proxy_pass中切换回文字服务器名称时,我会得到一个包含请求数据的200响应。然后,缓存文件中的Key包含上游服务器名称。

<@#$ 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文件的静态。

  • factory_upstream.conf
  • product_upstream.conf
  • shipping_upstream.conf
  • abc123_upstream.conf

为什么在使用命名的上游服务器时会得到404?

基于缓存响应中的nginx版本与您在命令行上看到的不匹配,似乎404可能来自上游服务器。即,您的代理正在工作,但上游服务器返回404。为了进一步排除故障,我会检查上游服务器的nginx日志,以及传入的请求是否符合您的期望。

请注意,当使用proxy_pass时,末尾是否有/会产生很大的差异。nginx使用尾部斜杠将其视为应向其发送上游请求的URI,并且不包括与位置块(/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/

因此,当在使用上游和指定字面服务器名称之间切换时,可能会无意中与尾部斜杠不一致。这是一个很容易错过的细节,尤其是当你不知道它很重要的时候。

请提供有关代理传递请求的服务器配置的更多信息。我现在看到的唯一区别是您在上游服务器中指定了端口(443(。

最新更新