0

我在DockerFile下面创建了一个

FROM ubuntu:18.04


MAINTAINER Amin Keshavarz <ak_1596@yahoo.com>

# Add your github access token if needed in composer update as arg or env var.
ARG github_access_token
ENV github_access_token=${github_access_token}


ENV DEBIAN_FRONTEND=noninteractive


# Install dependency packages
RUN apt-get update && apt-get install -yq --no-install-recommends \
    git \
    curl \
    ca-certificates \
#    php \
    php7.2-fpm php7.2-common \
    php7.2-mongodb php-pear php7.2-dev

RUN apt-get install -y build-essential
# Install mongodb driver
RUN pecl install mongodb
#RUN echo "extension=mongodb.so" >> /etc/php/7.2/fpm/php.ini
#RUN echo "extension=mongodb.so" >> /etc/php/7.2/cli/php.ini

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

RUN apt-get install -y php7.2-mbstring \
    php7.2-intl \
    php7.2-soap \
    php7.2-curl \
    php7.2-imap \
    php7.2-zmq \
    php7.2-bcmath \
    php7.2-gd \
    php7.2-zip

# Add working directory and copy files into that.
RUN mkdir /app

VOLUME /app
WORKDIR /app
COPY . /app

# Start application installation by composer update command.
#RUN composer config -g github-oauth.github.com $github_access_token
RUN composer global require fxp/composer-asset-plugin
#RUN composer update -vvv


ENTRYPOINT service php7.2-fpm start && /bin/bash

CMD ["php-fpm"]

EXPOSE 9000

并在下面使用docke-compose.yml

version: "3"
services:
  web:
    build:
      context: .
      dockerfile: ./docker/Dockerfile
    container_name: "crm_web"
    tty: true
    ports:
      - "9000:9000"
    networks:
      - default
    volumes:
      - .:/app
  nginx:
    image: nginx:1.10.3
    container_name: "crm_nginx"
    ports:
      - 8080:80
    restart: always
    volumes:
      - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
      - .:/app
    links:
      - web
    depends_on:
      - web

并且有下面的 nginx.conf

server {
    client_max_body_size 100M;
    set $host_path "/app";
    access_log  /app/log/access.log  main;

    server_name  _ localhost;
    root   $host_path/;
    set $yii_bootstrap "index.php";

    charset utf-8;

    location / {
        index  index.html $yii_bootstrap;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    location ~ ^/(protected|framework|themes/\w+/views) {
        deny  all;
    }

    #avoid processing of calls to unexisting static files by yii
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        try_files $uri =404;
    }

    # pass the PHP scripts to FastCGI server listening on web:9000
    #
    location ~ \.php {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;

        #let yii catch the calls to unexising PHP files
        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
            set $fsn $fastcgi_script_name;
        }

        fastcgi_pass   web:9000;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;

        #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
    }

    # prevent nginx from serving dotfiles (.htaccess, .svn, .git, etc.)
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

但是当我尝试连接我的主机时http://localhost:8080,我在 docker 的控制台中收到以下错误:

crm_nginx | 2018/12/03 14:48:14 [错误] 28#28: *17 recv() 在从上游读取响应标头时失败(104:对等方重置连接),客户端:172.18.0.1,服务器:_,请求: “GET /web/ HTTP/1.1”,上游:“fastcgi://172.18.0.2:9000”,主机:“localhost:8080”

并进入502 Bad Gateway浏览器。

你能帮我解决这个问题吗?我错过了什么?

4

2 回答 2

1

将以下行添加到您的Dockerfile

RUN sed -i "s|;*listen\s*=\s*/run/php/php7.2-fpm.sock|listen = 9000|g" /etc/php/7.2/fpm/pool.d/www.conf && \
    sed -i "s|;*listen\s*=\s*/||g" /etc/php/7.2/fpm/php-fpm.conf

这将告诉 php7.2-fpm9000改为 监听端口/run/php/php7.2-fpm.sock

小心不要在端口之前添加 ip 地址,127.0.0.1:9000因为这会强制 php 同时监听端口和 ip,但你的容器没有 wich ip 地址。

我在这里找到了答案,您可以参考:

https://www.digitalocean.com/community/questions/nginx-error-111-connection-refused

于 2018-12-05T08:16:02.293 回答
0

我今天花了几个小时寻找解决方案。这里发布的没有帮助。我的 nginx 错误日志中有基本相同的消息。所以我会发布我的解决方案,以防其他人有同样的问题。

我的网络服务器的同一个实例确实响应了我的 API 调用,它只是在浏览器中失败了。因此,在附加了 xdebug 之后,我意识到,php 代码确实也开始执行来自浏览器的请求的代码。两者的主要区别是:SESSION。我已经配置 session.save_handler=redis 了但是忘记添加了 session.save_path=tcp://redis:6379 ,反而没有任何价值。php和redis通信失败。

于 2022-02-25T10:18:54.407 回答