我是 NGINX 新手,我正在尝试设置反向代理,以便从外部访问多个内部站点。我的目标是使用 https://nginx.company.com/sitea 访问内部 Web 服务器 A,使用 https://nginx.company.com/siteb 访问内部 Web 服务器 B,等等。因此,一个外部主机名和端口可以根据 URL/位置代理多个内部服务。
现在我可以通过 https 访问 Web 服务器 A,没有任何问题(Apache),它完全正常工作(位置 /sitea)。但是,我尝试提供的所有其他内部 Web 服务器(大多数是 IIS,很多是 PHP 和 ASP)都存在问题,大多数都给我一个 404 错误,而有些会显示空白页,但您可以在浏览器中看到网站的源代码,而其他的则只显示部分内容。我遇到过几个有类似问题的帖子,并尝试了许多提供的解决方案,但对我的情况都没有帮助。
我们先来关注一下 404 错误。我的配置文件如下:
server {
server_name nginx.company.com;
listen 443;
ssl_certificate /etc/nginx/cert.pem;
ssl_certificate_key /etc/nginx/key.pem;
ssl on;
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;
location /siteA {
proxy_set_header Host $host;
proxy_pass http://siteA.company.com;
}
location /siteB/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://siteB.company.com/;
}
}
网站 A 运行正常,网站 B 会给我一个 404 错误。原因可以在错误日志中看到:它总是试图访问 /usr/share/nginx/html/ 来获取该内容,但它当然不在 nginx 机器的本地文件夹中。所以错误似乎是它被视为本地 Web 内容而不是需要代理的内容。
当你访问站点 B 的 URL 时,Web 服务器会立即将你引导至特定路径,如 http://siteB.company.com/webapp/something/login.php。错误日志显示 nginx 认为它应该访问 /usr/share/nginx/html/webapp/something/login.php/,但该路径当然不存在。
我尝试过以下方法来修复这个问题:
- 删除 proxy_set_ 选项
- 与站点 A 进行相同配置
- 设置代理设置标头主机为 siteB.compan.com
- 删除位置 /siteB 后的 /
- 删除目标 URL 后的 /
- 输入完整的目标网址
- 在位置前面添加 ^~
- 尝试重写 URL,删除“/siteB”
- 坦白说,我已经忘记了其中的几个片段,也不明白
所有这些都不起作用,我仍然无法代理该网站,而是收到错误 404(来自 nginx,而不是来自 Web 服务器)。我应该如何更改网站 B 的设置才能访问该网站?
顺便说一句,当我在配置中设置一个额外的“服务器”来监听不同的端口并使用位置/它会工作,所以问题在于按 URL 而不是按主机名或端口划分流量。
提前致谢