Nginx代理,具有单个域的多个位置

时间:2018-06-14 17:23:34

标签: docker nginx proxy

Nginx在单域配置下使用Node.JS充当2个docker容器的前端(域名:url.domain)

container1 =应该接收来自assets-1目录中的/和资产的所有内容(http://url.domain - > http://container1

container2 =应该接收来自不同网址,fex / login,/ logout等的资源以及来自assets-2目录的资产 (http://url.domain/login - > http://container2/login

通过以下配置,我能够获得正确的页面等,但不能获得资产:

location  / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass_header Set-Cookie;
    proxy_redirect off;
    proxy_read_timeout 30m;
    proxy_connect_timeout 30m;
    proxy_pass http://container1;
}
location ~ ^/(login|logout)(/)?(.*) {
    client_max_body_size 128M;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass_header Set-Cookie;
    proxy_http_version 1.1;
    proxy_read_timeout 30m;
    proxy_connect_timeout 30m;
    proxy_pass http://container2;
}

经过一些更改和尝试后,我能够使用以下配置运行所有内容:

location = / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass_header Set-Cookie;
    proxy_redirect off;
    proxy_read_timeout 30m;
    proxy_connect_timeout 30m;
    proxy_pass http://container1;
}
location  / {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass_header Set-Cookie;
    proxy_redirect off;
    proxy_read_timeout 30m;
    proxy_connect_timeout 30m;
    proxy_pass http://container2;
}
location ^~ /assets-1 {
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass_header Set-Cookie;
    proxy_redirect off;
    proxy_read_timeout 30m;
    proxy_connect_timeout 30m;
    proxy_pass http://container1;
}
location ~ ^/(login|logout)(/)?(.*) {
    client_max_body_size 128M;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass_header Set-Cookie;
    proxy_http_version 1.1;
    proxy_read_timeout 30m;
    proxy_connect_timeout 30m;
    proxy_pass http://container2;
}

我确信这不是最好的方法。有什么建议或改进吗?

1 个答案:

答案 0 :(得分:1)

当你决定扩大规模时,你会遇到很多问题,我建议你切换到更有活力的东西。我会这样做:

  1. 将面向公众的代理NGINX容器绑定到您的本地IP
  2. 内部NGINX容器仅提供仅显示所需端口的资产(assets.domain.com)
  3. 仅为您的网站(domain.com/www.domain.com)提供内部NGINX容器,仅显示所需端口
  4. 要实现这样的目标,你可以:

    第一

    配置代理。有this非常棒的Nginx代理容器支持服务发现(它将检测您是否启动/停止了具有公开暴露端口的容器并为您生成新的代理配置)。简单的例子是这样的:

    version: '2'
    
    services:
      nginx-proxy:
        image: jwilder/nginx-proxy
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /var/run/docker.sock:/tmp/docker.sock:ro
    
      assets:
        image: me/assets
        environment:
          - VIRTUAL_HOST=assets.mydomain.com
          - VIRTUAL_PORT=80
    
      webiste:
        image: me/website
        environment:
          - VIRTUAL_HOST= mydomain.com, www.mydomain.com
          - VIRTUAL_PORT=80
    

    第二

    创建2个不同的容器(一个用于webiste,一个用于资产),具有特定于容器的Web服务器配置(注意:您不必使用NGINX作为下游Web服务器,您可以使用您喜欢的任何内容) 作为奖励,您可以为资产容器创建一些高级缓存机制

    这种方法可以帮助您处理多种情况,例如,如果您希望将webiste服务容器扩展到多个实例,具有集中式日志记录或ssl终止,故障转移,A / B测试等,它还为您提供了拆分的机会您对2个较小容器的关注,这将提高您的堆栈的可维护性和可扩展性(如果在某些时候您决定走遍全球,您可以在全球部署您的资产或仅部署网站容器,而无需部署整个堆栈)