Nginx反向代理404上的静态文件

我正在寻找反向代理一个URL /path到端点上的不同端口,代表不同的服务器托pipe自己的Web应用程序。

我有proxy_pass工作,但静态文件失败,因为资源是相对他们的实例。

我有例如 – server_name = myproxy.com:

location /app1/{ proxy_pass: http://192.168.1.1:8080/; proxy_set_header Host 192.168.1.1; } location /app2/{ proxy_pass: http://192.168.1.1:8081/; proxy_set_header Host 192.168.1.2; } location /{ proxy_pass: http://192.168.1.1:8080/; proxy_set_header Host 192.168.1.1; } 

除了与app2关联的静态文件之外,反向代理的function与上述相同。 App1静态文件工作正常,但App2静态文件导致404。这是有道理的,因为App1资源文件位于/assets/app1.css这是因为我有一个redirect的位置/就地解决了回到App1但App2资源文件,完全不同的/assets/app2.css导致404。

那么,有没有办法将/assets/app2.css App2静态请求重写到各自的代理位置? 就像是:

 location /app1/{ proxy_pass: http://192.168.1.1:8080/; proxy_set_header Host 192.168.1.1; } location /app2/{ proxy_pass: http://192.168.1.1:8081/; proxy_set_header Host 192.168.1.2; *rewrite app2 static urls frome /assets/* to /app2/assets/* } location /{ proxy_pass: http://192.168.1.1:8080/; proxy_set_header Host 192.168.1.1; } 

当一个文件/assets/app1.css )通过location /app1/的规则加载,然后通过来自location /的规则加载为/assets/app1.css 。 App2具有相同的行为,但是您为App1 location /配置,而不是App2。

你的配置必须是:

 location /app1/ { proxy_pass: http://192.168.1.1:8080/app1/; } location /app2/ { proxy_pass: http://192.168.1.1:8081/app1/; } 

必需 :在代理和upsteam服务器上别名app1应该是相同的。 在upsteam服务器上,它可能是原始webroot应用程序的符号链接。

或者你可以使用不同的子域或端口….

 server_name app1.localhost; location / { proxy_pass: http://192.168.1.1:8081/; } 

PS

我通过代理探讨了nginx config的许多操作。 Nginx无法正常使用一条规则:

 location /app1/ { proxy_pass: http://192.168.1.1:8080/; } 

例如:css和js文件将被加载 – proxy_server/css ...proxy_server/js ...

从请求proxy_server/app1/index.html ,你会得到404。

你可以添加location /css/规则到配置。 但是你的app2也可以使用这个位置。 你不能检测到上游服务器代理他。 你可以使用reffer来检测upsteam

  server { listen 80; if ($uri ~ app1/) { break; } if ($http_referer ~ app1/ ) { rewrite (.*) /app1/$1 redirect; } location /app1/ { proxy_pass http://192.168.1.1:8080/; } } 

但POST数据将在重定向后被破坏。

如果需要根据位置将配置仅调整到代理服务器,那就太好了。 但这是一个梦想。

当我使用docker容器链接来连接我的容器时,我也遇到了这个问题,就像在一些较旧的文档中一样。 Docker容器联网是使用的东西

无法正确给出404错误的URL上下文

 docker run --name nginx-ss-00.starbug.com --link aai-gunicorn-00:aai-gunicorn-00 -d -p 80:80 -p 443:443 nginx-ss.starbug.com 

但是我终于找到了关于连接多个网站的教程 。 这对我来说是有效的:

 docker network create nginx-proxy docker run --net nginx-proxy --name nginx-ss-00.starbug.com -v /var/run/docker.sock:/tmp/docker.sock -d -p 80:80 -p 443:443 nginx-ss.starbug.com docker run --net nginx-proxy --name aai-gunicorn-00 -d -p 8080:8080 aai-gunicorn 

并在我的nginx conf

 server { server_name www.starbug.com; listen 80; # reverse proxy location / { # TODO Assumes flask container is named aai-gunicorn-00 and running on port 8080 proxy_pass http://aai-gunicorn-00:8080; # Redefine the header fields that NGINX sends to the upstream server proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 5M; } } 

这是运行我的网站www.starbug.com ,其中有完整的示例链接到我的git回购。