Docker 容器中的 Nginx 出现“连接重置”错误,但在没有容器的情况下工作正常

Posted

技术标签:

【中文标题】Docker 容器中的 Nginx 出现“连接重置”错误,但在没有容器的情况下工作正常【英文标题】:Nginx in Docker container gets `connection reset` error, but works fine without a container 【发布时间】:2016-07-28 08:30:04 【问题描述】:

我有 3 个组件的简单设置,我已将它们包装到 docker 容器中:

PostgreSQL 数据库,容器名为 workflows-db Django + uWSGI 8000 端口上的 Web 服务器,名为 workflows-django 的容器 nginx 反向代理,容器名为workflows-nginx

我将 Postgres 和 Django 作为容器运行,它们运行良好。现在,我想添加 Nginx。如果我只是在主机上本地安装 Nginx(没有 Docker)并运行它,我的设置工作正常。

但如果我将完全相同的 Nginx 配置放入一个单独的 docker 容器中,它无法 100% 响应 https:// 请求:

This site can’t be reached

The connection was reset.
ERR_CONNECTION_RESET

这是我的配置mysite.conf,放入/etc/nginx/sites-available/mysite.conf/etc/nginx/sites-enabled/mysite.conf

upstream django 
    server workflows-django:8000;


server 
    listen 80;
    server_name workflows.devbg.us;
    return 301 https://$server_name$request_uri;


server 
    listen 443 ssl;

    server_name workflows.devbg.us;
    ssl_certificate /etc/ssl/private/bostongene.crt;
    ssl_certificate_key /etc/ssl/private/bostongene.key;
    charset utf-8;

    client_max_body_size 75M;

    location /media 
        alias /srv/workflows/media;
    

    location /static 
        alias /srv/workflows/static;
    

    location / 
        # We can talk to upstream django either via uwsgi or just http proxy

        # uwsgi:
        uwsgi_pass django;
        include /etc/nginx/uwsgi_params;


        # http proxy:
        #proxy_set_header Host $host;
        #proxy_pass http://django

    

我使用以下参数在 django 和 postgres 容器之后运行 nginx 容器:

docker run --name workflows-nginx --volumes-from workflows-db --volumes-from workflows-django --link workflows-django:workflows-django -p 80:80 -p 443:443 -d workflows-nginx

我的主机上的文件/etc/hosts 如下所示:

127.0.0.1   localhost
127.0.0.1   workflows-db
127.0.0.1   workflows-django
127.0.0.1   workflows-nginx
127.0.0.1   workflows.devbg.us

您对如何解决此问题有任何想法吗? Nginx error.log 不包含这些错误。

【问题讨论】:

【参考方案1】:

docker hub 上的official docker image 似乎被剥夺了 nginx uwsgi 适配器。

所以,我只是从 debian:jessie 手动创建了我自己的 Nginx Dockerfile,瞧。似乎 uwsgi 适配器在 nginx-commonnginx-full Debian 软件包中的某处可用。

我的 Dockerfile:

FROM debian:jessie

RUN apt-get update && apt-get install -y nginx \
                        ca-certificates \
                        gettext-base

COPY yoursite.conf /etc/nginx/sites-available/yoursite.conf
COPY yoursite.conf /etc/nginx/sites-enabled/yoursite.conf
COPY yoursite.crt /etc/ssl/private/
COPY yoursite.key /etc/ssl/private/

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

EXPOSE 80 443

CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

【讨论】:

以上是关于Docker 容器中的 Nginx 出现“连接重置”错误,但在没有容器的情况下工作正常的主要内容,如果未能解决你的问题,请参考以下文章

部署在 docker 容器中的 Nginx 不会暴露部署在另一个 docker 容器中的 nuxtjs(502 Bad Gateway)

访问docker中的nginx容器部署

docker容器中的django + nginx:无法上传任何带有表单的文件

如何修改docker的nginx容器的配置

Centos7上运行Docker容器

Docker:与其他容器处于同一级别的nginx容器 - 是否足够?