我的一些容器正在生产中运行Web服务器(PHP,NodeJS)。
如果我们以NodeJS容器为例,这是它的配置
搬运工-compose.yml
version: '2'
services:
webapp:
build: .
volumes_from:
- data
links:
- db:db
- redis:redis
ports:
- '8080:3000'
restart: always
...
使用此配置,我可以通过http://example.com:8080/
访问我的网络应用,但我无法使用
$ curl localhost:8080
(Time-out)
我的主机上有一个 Nginx 服务器,具有以下配置:
example.com.conf
upstream webapp {
server 127.0.0.1:8080;
}
server {
listen 80;
listen [::]:80;
server_name example.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
proxy_pass http://webapp;
}
}
但是加入http://example.com/
会抛出504网关超时。
如果我尝试通过docker-compose.yml
更改'127.0.0.1:8080:3000'
中的端口配置,问题仍然存在,但无法访问http://example.com
(和http://example.com:8080
,但这是我想要的结果)。
这很奇怪,我没有在新服务器上运行我的应用程序的问题。 我正在寻找这个问题的根源。
感谢您的支持。
编辑:
$ netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.11:59712 0.0.0.0:* LISTEN -
udp 0 0 127.0.0.11:33293 0.0.0.0:* -
Web服务器必须在端口3000上侦听,但我有
$ docker-compose logs
webapp_1 | Express server listening on port 3000 in production mode
服务器也正在运行......
$ docker port webapp_1
3000/tcp -> 127.0.0.1:8080
答案 0 :(得分:0)
编辑:这应该与您拥有它的方式类似,您是否尝试更改:
proxy_set_header HOST $http_host;
至
proxy_set_header HOST $host;
在你的nginx配置?
您可以将nginx放入Docker Compose文件中,让Compose使用自己的网络。如果要在其他网络中添加项目,可以指定自定义网络,请参阅:https://docs.docker.com/compose/networking/
否则,您可以在主机上查看ifconfig
等的输出,并查看Compose使用的IP和网络以及主机正在侦听的内容。