使用nginx-proxy容器(如前端服务器)访问同一主机上的多个容器时出现错误503

解决scheme在: https : //serverfault.com/questions/880212/error-503-when-using-nginx-proxy-container-like-a-front-end-server-to-access-mul

我希望能够访问包含Web应用程序的同一个主机上的多个容器。

当我想访问主机(通过他的IP地址)或容器(例如通过host_ip_adress /容器1),我得到了来自Nginx的503错误。 我想要的是通过ip_addrress_host / container1访问我的container1。

我在网上find的解决scheme是设置一个nginx代理前端服务器(来源: https : //blog.florianlopes.io/host-multiple-websites-on-single-host-docker/ )

我的docker – 撰写文件:

version: '2' services: nginx-proxy: image: jwilder/nginx-proxy ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock site_a: image: php:7.0-apache expose: - "80" environment: - VIRTUAL_HOST=192.168.12.28/container1 - VIRTUAL_PORT=80 volumes: - ./php:/var/www/html site_b: image: php:7.0-apache expose: - "80" environment: - VIRTUAL_HOST=192.168.12.28/container2 - VIRTUAL_PORT=80 volumes: - ./php:/var/www/html 

我用这个命令运行它:

 docker-compose up 

我在/ etc / hosts文件条目:

 127.0.1.1 container1 127.0.0.1 container2 

我从外面提出要求时看到的日志:

 nginx-proxy_1 | nginx.1 | 192.168.12.28 192.168.12.82 - - [25/Oct/2017:09:46:42 +0000] "GET /container1 HTTP/1.1" 503 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" nginx-proxy_1 | nginx.1 | 192.168.12.28 192.168.12.82 - - [25/Oct/2017:09:46:42 +0000] "GET /favicon.ico HTTP/1.1" 503 615 "http://192.168.12.28/container1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" 

谢谢你的帮助,对不起我英文不好! 🙂

编辑 :我试图把nginx代理容器和我的Web应用程序容器在docker集线器( https://hub.docker.com/r/jwilder/nginx-proxy/ )解释相同的“dockernetworking”,但是当我做 :

 docker-compose up 

我有一个错误:

 ERROR: Service "site_b" uses an undefined network "proxy-nginx" 

编辑2:

这是我在开始时的nginx-proxy容器的日志:

 forego | starting dockergen.1 on port 5000 forego | starting nginx.1 on port 5100 dockergen.1 | 2017/10/25 14:01:53 Generated '/etc/nginx/conf.d/default.conf' from 3 containers dockergen.1 | 2017/10/25 14:01:53 Running 'nginx -s reload' nginx.1 | 2017/10/25 14:01:54 [warn] 30#30: server name "192.168.12.28/container1" has suspicious symbols in /etc/nginx/conf.d/default.conf:60 nginx.1 | 2017/10/25 14:01:54 [warn] 30#30: server name "192.168.12.28/container2" has suspicious symbols in /etc/nginx/conf.d/default.conf:74 dockergen.1 | 2017/10/25 14:01:54 Watching docker events dockergen.1 | 2017/10/25 14:01:54 Contents of /etc/nginx/conf.d/default.conf did not change. Skipping notification 'nginx -s reload' 

编辑3:

所以,现在,我的nginxconfiguration如下所示:

 server { listen 192.168.12.28; server_name 192.168.12.28; access_log /var/log/nginx/host.access.log; location / { proxy_http_version 1.1; proxy_pass http://172.23.0.3:80; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_buffering Off; proxy_cache_bypass $http_upgrade; } location /container1/ { proxy_http_version 1.1; proxy_pass http://172.23.0.3:80; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_buffering Off; proxy_cache_bypass $http_upgrade; } location /container2/ { proxy_http_version 1.1; proxy_pass http://172.23.0.2:80; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_buffering Off; proxy_cache_bypass $http_upgrade; } } 

当我去http://192.168.12.28/container1

我的日志是:

 site_a_1 | 172.23.0.1 - - [26/Oct/2017:09:22:40 +0000] "GET /container1/ HTTP/1.1" 404 449 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" 

当我去http://192.168.12.28/container2

我的日志是:

 site_b_1 | 172.23.0.1 - - [26/Oct/2017:09:22:50 +0000] "GET /container2/ HTTP/1.1" 404 449 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" 

而对于这两个,答复是404没有find。 它看起来像我的容器服务器的“/容器1”或“/容器2”path? 如果这是真的,我可以强迫他照顾/ var / www / html /?

我不知道jwilder的代理可以定制多远,但是我知道VIRTUAL_HOST环境variables是指你尝试连接的整个DNS-Name。

目前,您的nginx被configuration为将stream向http:// container1和http:// container2的stream量重新路由到容器中。 但是由于这些DNS-Alias不太可能被设置,所以会导致503错误。

你需要自己configuration你的nginx,使用一个服务器块和两个/三个位置块。 下面的configuration代理服务器端口80到容器1, http:// your_host /容器1到容器1和http:// your_host /容器2到容器2(我希望)。 您必须将server_name更改为您的主机名称:

 server { listen 80; server_name your_fqdn.domain.com your_shortname; access_log /var/log/nginx/host.access.log main; location / { proxy_http_version 1.1; proxy_pass http://container1:80; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_buffering Off; proxy_cache_bypass $http_upgrade; } location /container1/ { proxy_http_version 1.1; proxy_pass http://container1:80; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_buffering Off; proxy_cache_bypass $http_upgrade; } location /container2/ { proxy_http_version 1.1; proxy_pass http://container2:80; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_buffering Off; proxy_cache_bypass $http_upgrade; } } 

关于编辑和关于dockernetworking的撰写文件:

您不需要指定networking,因为docker-compose会自动为您的所有容器创build一个单独的networking。 如果您想使用现有的networking,或者希望将容器放在不同的networking中,我build议您阅读这些内容