我正在尝试使用dockerized版本的nginx作为我的节点(ExpressJS)应用程序的代理服务器。没有任何配置到nginx和发布容器的端口80,我能够看到默认的nginx登陆页面。所以我知道有很多工作要做。
现在我可以挂载包含配置的启用站点的目录 proxy_pass localhost:3000
。我的节点应用程序在本地运行(不在任何Docker容器中),我可以通过端口3000访问它(即 localhost:3000
)。但是,我会假设nginx容器正在运行,映射到端口80,并代理我的localhost:3000,我将能够看到我的 非常 简单(hello world)应用程序。相反,我收到502。
我需要把东西传递给码头工人吗?这可能是nginx配置错误吗?这是我的nginx配置:
server {
listen 0.0.0.0:80;
server_name localhost;
location / {
proxy_pass http://localhost:3000;
}
}
我试过用 这个问题 但它似乎没有帮助。这是除非我做错了。
您可以获得当前的IP地址,如图所示 这里:
ifconfig en0 | grep inet | grep -v inet6 | awk '{print $2}'
然后你可以使用 --add-host
国旗与 docker run
:
docker run --add-host localnode:$(ifconfig en0 | grep inet | grep -v inet6 | awk '{print \$2}') ...
在你的 proxypass
使用 localnode
代替 localhost
。
是。 Docker需要了解您的主机。您可以使用。设置别名 --add-host
开关。在* nix框上创建名称“localbox”的别名,这将是:
docker run my_repo/my_image --add-host=localbox:<host_name>`
在boot2docker上它将是:
docker run my_repo/my_image --add-host=localbox:192.168.59.3`
你应该用什么代替“192.168.59.3” boot2docker ip
回报。
然后,您应该始终通过别名localbox访问您的主机,因此只需将您的nginx配置更改为:
location / {
proxy_pass http://localbox:3000;
}
如果您使用的是docker-for-mac 18.03或更新版本,它会自动创建一个特殊的DNS条目 host.docker.internal
动态绑定到主机inet ip。然后,您可以使用dns名称从容器内部代理在主机上运行的服务作为替代 localhost
。
即一个nginx配置文件:
server {
listen 0.0.0.0:80;
server_name localhost;
location / {
proxy_pass http://host.docker.internal:3000;
}
}
最后,如果您使用Nginx作为多个服务的反向代理,您可以使用docker-compose旋转所有这些。确保仅在Nginx服务上公开端口“80:80”。您可以仅公开服务端口而不映射到底层网络的其他服务,如下所示:
web:
.....
expose:
- 8080
nginx:
.....
port:
- “80:80”
然后使用Nginx配置proxy_pass HTTP://服务名称:端口
您根本不需要上游应用程序部分