使用具有不同端口的nginx和docker容器实现反向代理

时间:2017-06-20 14:42:40

标签: nginx docker reverse-proxy docker-container

我在不同的端口上有三个docker容器,并希望使用nginx为每个容器实现反向代理,这样我就可以通过传递关键字而不是端口来导航到每个容器。喜欢而不是http://localhost:3000我希望传递http://localhost/app1

我用dockerfile下面创建了nginx图像。

FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY index.html usr/share/nginx/html

和我的nginx conf文件如下所示:

worker_processes 1;


events { worker_connections 1024; }

http {

    sendfile on;

    upstream app1 {
        server localhost:3000;
    }

    upstream app2 {
        server localhost:3001;
    }

    server {
        listen 3000;

        location /app1 {
            proxy_pass         http://localhost:3000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }

    server {
        listen 3001;

        location /app2 {
            proxy_pass         http://localhost:3001;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }
}

但是从图像创建nginx容器之后。我看到了容器的创建。但是当我尝试使用localhost进行访问时,它超时了所以nginx没有运行或者我错过了什么。我无法使用localhost / app1或app2加载容器,甚至localhost也无法正常工作。需要帮助。提前谢谢。

1 个答案:

答案 0 :(得分:1)

启动容器时,您正在暴露端口80和443但我没有看到您在nginx配置中侦听这些端口。

请尝试按listen 3000替换listen 80,然后尝试访问localhost/app1

我还可以看到您在启动docker容器时使用--link。所以我认为您应该使用app1app2代替localhost。如果有什么我错过了,请告诉我,但事实并非如此。您还必须确保可以在这些端口(3000和3001)上访问您的应用程序。

此外,您的2个位置应位于同一服务器块中:

server {
    listen 80;

    location /app1 {
        proxy_pass         http://app1:3000;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }

    location /app2 {
        proxy_pass         http://app2:3001;
        proxy_redirect     off;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
    }
}