【问题标题】:Docker, Nginx, PHP-FPM : problems with connectionDocker、Nginx、PHP-FPM:连接问题
【发布时间】:2018-08-16 14:54:10
【问题描述】:

我接手了一个基于 Docker 容器构建的项目,我正在让它顺利运行。

我的容器构建成功,但是当我尝试访问网站时,nginx 在日志中给了我一个 502 错误:

connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://172.17.0.6:9000", host: "localhost:2000"

根据我的阅读,这可能是我的两个容器之间的链接存在问题。

我尝试将 php-fpm 的 listen 参数直接更改为 0.0.0.0:9000,如 Nginx+PHP-FPM: connection refused while connecting to upstream (502) 所示,但这引发了一个我也不完全理解的新错误:

*11 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.17.0.1, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://172.17.0.6:9000", host: "localhost:2000"

有人知道什么是失败以及如何解决它吗?

关于这两个服务的 docker-compose 部分是:

elinoi-webserver:
  build: .
  dockerfile: docker/Dockerfile.nginx.conf
  container_name: elinoi-webserver
  volumes:
      - .:/var/www/elinoi.com
  ports:
   - "2000:80"
  links:
   - elinoi-php-fpm

elinoi-php-fpm:
  build: .
  dockerfile: docker/Dockerfile.php-fpm.conf
  container_name: elinoi-php-fpm
  volumes:
    - .:/var/www/elinoi.com
    - /var/docker_volumes/elinoi.com/shared:/var/www/elinoi.com/shared
  ports:
   - "22001:22"
  links:
    - elinoi-mailhog
    - elinoi-memcached
    - elinoi-mysql
    - elinoi-redis

nginx的配置文件是:

server {
    listen 80 default;

    root /var/www/elinoi.com/current/web;

    rewrite ^/app\.php/?(.*)$ /$1 permanent;

    try_files $uri @rewriteapp;

    location @rewriteapp {
        rewrite ^(.*)$ /app.php/$1 last;
    }

    # Deny all . files
    location ~ /\. {
        deny all;
    }

    location ~ ^/(app|app_dev)\.php(/|$) {
        fastcgi_pass elinoi-php-fpm:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index app.php;
        send_timeout 1800;
        fastcgi_read_timeout 1800;
    }

    # Statics
        location /(bundles|media) {
        access_log off;
        expires 30d;
        try_files $uri @rewriteapp;
    }

}

elinoi-php-fpm 服务的 Dockerfile 是:

FROM phpdockerio/php7-fpm:latest
# Install selected extensions
RUN apt-get update \
    && apt-get -y --no-install-recommends install php7.0-memcached php7.0-mysql php7.0-redis php7.0-gd php7.0-imagick php7.0-intl php7.0-xdebug php7.0-mbstring \
    && apt-get -y --no-install-recommends install nodejs npm nodejs-legacy vim ruby-full git build-essential libffi-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN npm install -g bower
RUN npm install -g less
RUN gem install sass

# If you're using symfony and the vagranted environment, I strongly recommend you change your AppKernel to use the following temporary folders
# for cache, logs and sessions, otherwise application performance may suffer due to these being shared over NFS back to the host
RUN mkdir -p "/tmp/elinoi/cache" \
    && mkdir -p "/tmp/elinoi/logs" \
    && mkdir -p "/tmp/elinoi/sessions" \
    && chown www-data:www-data -R "/tmp/elinoi"

RUN apt-get update \
    && apt-get -y --no-install-recommends install openssh-server \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
ADD docker/.ssh /root/.ssh
RUN chmod 700 /root/.ssh/authorized_keys

CMD ["/usr/sbin/sshd", "-D"]

WORKDIR "/var/www/elinoi.com"

elinoi-webserver 的 Dockerfile 是:

FROM smebberson/alpine-nginx:latest

COPY /docker/nginx.conf /etc/nginx/conf.d/default.conf

WORKDIR "/var/www/elinoi.com"

【问题讨论】:

    标签: php docker nginx


    【解决方案1】:

    一个 Dockerfile 中只能有一个 CMD 指令。如果你列出 多个 CMD 则只有最后一个 CMD 生效。

    原来的Dockerfile结尾是:

    CMD /usr/bin/php-fpm
    

    而elinoi-php-fpm服务的Dockerfile以下面的CMD层结束:

    CMD ["/usr/sbin/sshd", "-D"]
    

    因此,只有sshd 在容器创建后启动。 php-fpm 没有从那里开始。

    这就是为什么 nginx 经常返回 502 错误,因为 php 后端根本不工作。

    您可以通过以下方式解决您的问题:

    1. Docker Alpine linux running 2 programs

    2. 只需从elinoi-php-fpm 服务中删除sshd 部分。

    【讨论】:

    • 谢谢 Nickolay,我开始放弃这个问题了。你是对的,删除这条线解决了问题(导致另一个但我更熟悉的问题,所以我会深入研究它;))。如果我认为我需要实际使用 sshd,我会查看您的文档链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多