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

时间:2016-04-25 19:30:18

标签: nginx proxy reverse-proxy

我希望将一个url / path代理转发到端点上的不同端口,这些端点代表托管自己的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关联的静态文件。 App1静态文件工作正常,但App2静态文件导致404.这是有道理的,因为App1资源文件位于/assets/app1.css这是有效的,因为我有一个位置/的重定向,可以解决到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;
}

2 个答案:

答案 0 :(得分:4)

当文件/assets/app1.css(App1)按照location /app1/的规则加载时,/assets/app1.css的规则加载为location /。 App2具有相同的行为,但您{App}配置了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/;      
}

P.S。

我通过代理探索了nginx配置的许多操作。 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来检测上游

 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数据将被销毁。

如果需要按位置仅将配置调整到代理服务器,那将会很棒。但这是一个梦想。

答案 1 :(得分:0)

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

无法正确获取网址上下文给出404错误

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

但我终于找到了this tutorial on connecting multiple web sites。这对我有用:

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 repo的完整示例的链接。