NGINX 反向代理因链接 Docker 个容器而失败
NGINX Reverse Proxy failing with Linked Docker Containers
我有以下 docker-compose.yml
:
node1:
build: ./node
links:
- redis
ports:
- "8080"
node2:
build: ./node
links:
- redis
ports:
- "8080"
service1:
build: ./service
links:
- redis
ports:
- "8383"
redis:
image: redis
ports:
- "6379"
nginx:
build: ./nginx
links:
- node1:node1
- node2:node2
- service1:service1
ports:
- "80:80"
执行此操作后 运行 docker ps
我得到以下信息:
080d9d7dc2e0 dockerworkflow_nginx:latest "nginx -g 'daemon of 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp, 443/tcp dockerworkflow_nginx_1
8c25bfdb9d00 dockerworkflow_node1:latest "nodemon /src/index. 6 minutes ago Up 6 minutes 0.0.0.0:33023->8080/tcp dockerworkflow_node1_1
4ae817be2a63 dockerworkflow_service1:latest "nodemon /src/index. 6 minutes ago Up 6 minutes 0.0.0.0:33022->8383/tcp dockerworkflow_service1_1
91ff238fe3f6 dockerworkflow_node2:latest "nodemon /src/index. 6 minutes ago Up 6 minutes 0.0.0.0:33021->8080/tcp dockerworkflow_node2_1
fe0c7e02c860 redis:latest "/entrypoint.sh redi 6 minutes ago Up 6 minutes 0.0.0.0:33020->6379/tcp dockerworkflow_redis_1
到目前为止一切似乎都很好。
我正在使用的 nginx.conf
如下所示:
worker_processes 4;
events { worker_connections 1024; }
http {
server {
listen 80;
location / {
proxy_pass http://node1;
}
location /a/ {
proxy_pass http://node2;
}
location /b/ {
proxy_pass http://service1;
}
}
}
所有这些真正应该做的是:
如果我输入 http://{host-ip}/
然后 node1
容器转发请求。
如果我输入 http://{host-ip}/a/
然后 node2
容器转发请求。
如果我输入 http://{host-ip}/b/
然后 service1
容器转发请求。
现在,如果我尝试任何事情,我都会得到 502 Bad Gateway
。
我认为您应该在每个 proxy_pass
.
中指定端口
worker_processes 4;
events { worker_connections 1024; }
http {
server {
listen 80;
location / {
proxy_pass http://node1:8080;
}
location /a/ {
proxy_pass http://node2:8080;
}
location /b/ {
proxy_pass http://service1:8383;
}
}
}
我能够找出解决方案,但结果是一些愚蠢的东西,没有出现在任何日志中,我很难遇到。
下面是更新后的 nginx.conf
文件。
worker_processes 4;
events { worker_connections 1024; }
http {
upstream node_app {
server node1:8080;
}
upstream service_app {
server service1:8383;
}
server {
listen 80;
location / {
proxy_pass http://node_app/;
include /etc/nginx/proxy_params;
}
location /a/ {
proxy_pass http://node_app/;
include /etc/nginx/proxy_params;
}
location /b/ {
proxy_pass http://service_app/;
include /etc/nginx/proxy_params;
}
}
}
不确定此时是否需要包含,但 proxy_pass
指令末尾的尾随 /
似乎在一天结束时起到了作用。
我有以下 docker-compose.yml
:
node1:
build: ./node
links:
- redis
ports:
- "8080"
node2:
build: ./node
links:
- redis
ports:
- "8080"
service1:
build: ./service
links:
- redis
ports:
- "8383"
redis:
image: redis
ports:
- "6379"
nginx:
build: ./nginx
links:
- node1:node1
- node2:node2
- service1:service1
ports:
- "80:80"
执行此操作后 运行 docker ps
我得到以下信息:
080d9d7dc2e0 dockerworkflow_nginx:latest "nginx -g 'daemon of 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp, 443/tcp dockerworkflow_nginx_1
8c25bfdb9d00 dockerworkflow_node1:latest "nodemon /src/index. 6 minutes ago Up 6 minutes 0.0.0.0:33023->8080/tcp dockerworkflow_node1_1
4ae817be2a63 dockerworkflow_service1:latest "nodemon /src/index. 6 minutes ago Up 6 minutes 0.0.0.0:33022->8383/tcp dockerworkflow_service1_1
91ff238fe3f6 dockerworkflow_node2:latest "nodemon /src/index. 6 minutes ago Up 6 minutes 0.0.0.0:33021->8080/tcp dockerworkflow_node2_1
fe0c7e02c860 redis:latest "/entrypoint.sh redi 6 minutes ago Up 6 minutes 0.0.0.0:33020->6379/tcp dockerworkflow_redis_1
到目前为止一切似乎都很好。
我正在使用的 nginx.conf
如下所示:
worker_processes 4;
events { worker_connections 1024; }
http {
server {
listen 80;
location / {
proxy_pass http://node1;
}
location /a/ {
proxy_pass http://node2;
}
location /b/ {
proxy_pass http://service1;
}
}
}
所有这些真正应该做的是:
如果我输入 http://{host-ip}/
然后 node1
容器转发请求。
如果我输入 http://{host-ip}/a/
然后 node2
容器转发请求。
如果我输入 http://{host-ip}/b/
然后 service1
容器转发请求。
现在,如果我尝试任何事情,我都会得到 502 Bad Gateway
。
我认为您应该在每个 proxy_pass
.
worker_processes 4;
events { worker_connections 1024; }
http {
server {
listen 80;
location / {
proxy_pass http://node1:8080;
}
location /a/ {
proxy_pass http://node2:8080;
}
location /b/ {
proxy_pass http://service1:8383;
}
}
}
我能够找出解决方案,但结果是一些愚蠢的东西,没有出现在任何日志中,我很难遇到。
下面是更新后的 nginx.conf
文件。
worker_processes 4;
events { worker_connections 1024; }
http {
upstream node_app {
server node1:8080;
}
upstream service_app {
server service1:8383;
}
server {
listen 80;
location / {
proxy_pass http://node_app/;
include /etc/nginx/proxy_params;
}
location /a/ {
proxy_pass http://node_app/;
include /etc/nginx/proxy_params;
}
location /b/ {
proxy_pass http://service_app/;
include /etc/nginx/proxy_params;
}
}
}
不确定此时是否需要包含,但 proxy_pass
指令末尾的尾随 /
似乎在一天结束时起到了作用。