NGINX和Docker的反向代理

时间:2019-01-24 15:07:15

标签: docker nginx reverse-proxy

我有一个在http://localhost:8000上运行的应用程序,它使用的是我制作的docker映像。

现在,我想使用NGINX作为侦听端口80的反向代理,以重定向到localhost:8000。

这是我的nginx.conf文件

#user  nobody;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    server {
        listen 80;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}

这是我的Dockerfile:

FROM nginx

RUN rm /etc/nginx/conf.d/default.conf

COPY index.html /usr/share/nginx/html
COPY nginx.conf /etc/nginx

CMD nginx

要创建图像,请使用命令

docker build --no-cache -t mynginx .

要运行它,我使用

docker run -p 80:80 -d mynginx 

现在,如果我使用curl localhost:8000在本地计算机上进行测试,那么一切正常,但是如果我尝试使用curl localhost,则会收到错误的网关错误。

此外,我尝试提供静态内容并且可以使用,但是使用反向代理设置则无法使用。

2 个答案:

答案 0 :(得分:0)

curl localhost:8000有效=>您的应用程序正在运行

curl localhost返回错误的网关,意味着proxy_pass http://localhost:8000;不起作用。这是因为“ localhost”是相对于其调用方的,在本例中为nginx容器,该容器在端口8000上没有任何运行。

您需要使用proxy_pass http://your_app:8000;将其指向您的应用程序,其中“ your_app”是服务名称(docker-compose)或容器名称或其网络别名。确保它们在同一网络中。

答案 1 :(得分:0)

您的网关出现问题的原因是,在您的nginx容器中,localhost解析为容器本身而不是主机系统。

如果要从反向代理容器访问应用程序容器,则需要将两个容器都放入网络中。

docker network create my-network
docker network connect --alias application my-network <application container id/name>
docker network connect --alias reverse-proxy my-network <reverse proxy container id/name>

--network可以是任意名称,--alias应该是您要解析为容器的主机名。 实际上,如果您已经为容器分配了(主机)名称(docker run --name ...),则无需提供别名。

然后您可以将proxy_pass指令更改为应用程序容器的(别名)名称:

proxy_pass http://application:8000;

另请参阅文档:Container networking