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;
}
我确信这不是最好的方法。有什么建议或改进吗?
答案 0 :(得分:1)
当你决定扩大规模时,你会遇到很多问题,我建议你切换到更有活力的东西。我会这样做:
要实现这样的目标,你可以:
配置代理。有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个较小容器的关注,这将提高您的堆栈的可维护性和可扩展性(如果在某些时候您决定走遍全球,您可以在全球部署您的资产或仅部署网站容器,而无需部署整个堆栈)