![Nginx 位置阻止使用反向代理破坏 Meteor](https://linux22.com/image/711343/Nginx%20%E4%BD%8D%E7%BD%AE%E9%98%BB%E6%AD%A2%E4%BD%BF%E7%94%A8%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E7%A0%B4%E5%9D%8F%20Meteor.png)
我有两台服务器:
- (A)反向 Nginx 代理,将请求路由到内部或 B
- (B)使用 Meteor-up 1.2.11 版本进行 Meteor 部署(Docker 内部的 Nginx)
我有两个上游目的地,每个服务器一个:
upstream remote-app {
server 123.45.67.890:8080;
}
upstream local-app {
server localhost:7000;
}
如果我使用单独的服务器块,一切都正常运行。
server {
listen 80;
server_name local.* local.myapp.com;
access_log /var/log/nginx/local.myapp.access.log;
error_log /var/log/nginx/local.myapp.error.log debug;
error_page 404 /4xx.html;
error_page 500 502 503 504 /5xx.html;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://local-app;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
server {
listen 80;
server_name remote.* remote.myapp.com;
access_log /var/log/nginx/remote.myapp.access.log trace;
error_log /var/log/nginx/remote.myapp.error.log debug;
error_page 404 /4xx.html;
error_page 500 502 503 504 /5xx.html;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://remote-app;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
add_header Cache-Control no-cache;
}
}
但我需要根据路径(而不仅仅是子域)有条件地进行路由。因此,我尝试添加一个位置块,将部分本地流量重定向到远程服务器。
server {
listen 80;
server_name local.* local.myapp.com;
access_log /var/log/nginx/local.myapp.access.log;
error_log /var/log/nginx/local.myapp.error.log debug;
error_page 404 /4xx.html;
error_page 500 502 503 504 /5xx.html;
location = /broken {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://remote-app;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://local-app;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
现在,当我访问时http://local.myapp.com/broken
,我得到一个空白的屏幕,上面有大量的控制台错误:
似乎SyntaxError: Unexpected token <
是浏览器试图从 html 文件中读取 javascript。
我不知道如何调试它。我readv() not ready (11: Resource temporarily unavailable)
在服务器 A 的 Nginx 错误日志中看到了,但我不知道这是否相关。我不知道如何在服务器 B 上跟踪请求,因为部署在 Docker 容器中。有什么建议吗?
答案1
在接受一些指导后@zodern,我意识到对的初始请求/broken
已正确处理,但 Meteor 并未提供包含所有 js 和 css 的单个响应。它提供一个 html 文件,然后导致其他 90 个请求返回到服务器 A。处理所有这些请求的位置块是没有修饰符和根路径的块/
,它将所有内容发送到本地上游应用程序。因此,我不确定是否可以根据请求的路径在不同的服务器上运行两个不同的 Meteor 应用程序。