连接到上游

时间:2016-04-28 18:53:56

标签: web-services nginx docker shiny shiny-server

我使用闪亮的服务器在端口3838上构建一个web-app,当我在我的服务器中使用nginx它运行良好。但是当我在我的服务器上停止nginx并尝试使用docker nginx时,我发现该网站出现'502-Bad Gate Way'错误并且nginx日志显示:

2016/04/28 18:51:15 [error] 8#8: *1 connect() failed (111: Connection refused) while connecting to upstream, ...

我通过此命令安装docker-nginx:

sudo docker pull nginx

我的docker命令行类似于(为了清除我添加一些缩进):

sudo docker run --name docker-nginx -p 80:80 
    -v ~/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf
    -v  /usr/share/nginx/html:/usr/share/nginx/html nginx

我在我的家庭目录中创建了一个文件夹名称'docker-nginx',将我的nginx conf文件移到此文件夹中,然后在etc / nginx目录中删除我原来的conf以防万一。

我的nginx conf文件如下所示:

server {
    listen 80 default_server;
    # listen [::]:80 default_server ipv6only=on;

    root /usr/share/nginx/html;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name localhost;

    location / {
            proxy_pass http://127.0.0.1:3838/;
            proxy_redirect http://127.0.0.1:3838/ $scheme://$host/;
            auth_basic "Username and Password are required";
            auth_basic_user_file /etc/nginx/.htpasswd;
            # enhance the performance
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
    }
}

2 个答案:

答案 0 :(得分:5)

您必须直接定义上游。目前,您的nginx无法代理您的Web应用程序。

http://nginx.org/en/docs/http/ngx_http_upstream_module.html

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

答案 1 :(得分:1)

我的情况是运行3个容器,一个nginx容器和两个容器化服务。我将Nginx容器用作go服务的反向代理。

问题是nginx容器正在其自己的容器环境中寻找微服务端口。当时我没有意识到这一点,那时我也没有使用docker-compose.yml。使用docker-compose.yml文件时,您指定“ depends-on:...”,就是这样

因此,在运行容器时,应使用--net=host。 有关信息:What does --net=host option in Docker command really do?

这对我有用,我希望它可以减轻别人的痛苦:):

docker run --net=host nginx:someTag

docker run --net=host service1:someTag