首页 文章

在一个dockerfile中结合PHP-fpm和nginx

提问于
浏览
3

我需要将php-fpm和nginx结合在一个dockerfile中进行 生产环境 部署 .

所以最好是:

(1)使用php启动dockerfile:7.1.8-fpm然后在它上面安装nginx图像层?

(2)或者你建议使用nginx图像,然后使用apt-get安装php-fpm?

PS:我没有用于 生产环境 部署的docker-compose构建选项 . 在我的开发环境中,我已经使用docker-compose并从两个图像轻松构建多容器应用程序 . 我们的组织devop不支持基于docker-compose的prod环境部署 .

2 回答

  • 0

    Nginx安装比PHP容易得多,因此您可以更轻松地将Nginx安装到即用型官方PHP映像中 . 下面是示例Dockerfile,显示如何通过安装几个PHP扩展来达到目标:

    FROM php:7.2-fpm
    
    RUN apt-get update -y \
        && apt-get install -y nginx
    
    # PHP_CPPFLAGS are used by the docker-php-ext-* scripts
    ENV PHP_CPPFLAGS="$PHP_CPPFLAGS -std=c++11"
    
    RUN docker-php-ext-install pdo_mysql \
        && docker-php-ext-install opcache \
        && apt-get install libicu-dev -y \
        && docker-php-ext-configure intl \
        && docker-php-ext-install intl \
        && apt-get remove libicu-dev icu-devtools -y
    RUN { \
            echo 'opcache.memory_consumption=128'; \
            echo 'opcache.interned_strings_buffer=8'; \
            echo 'opcache.max_accelerated_files=4000'; \
            echo 'opcache.revalidate_freq=2'; \
            echo 'opcache.fast_shutdown=1'; \
            echo 'opcache.enable_cli=1'; \
        } > /usr/local/etc/php/conf.d/php-opocache-cfg.ini
    
    COPY nginx-site.conf /etc/nginx/sites-enabled/default
    COPY entrypoint.sh /etc/entrypoint.sh
    
    COPY --chown=www-data:www-data . /var/www/mysite
    
    WORKDIR /var/www/mysite
    
    EXPOSE 80 443
    
    ENTRYPOINT ["/etc/entrypoint.sh"]
    

    nginx-site.conf 文件包含您的nginx http主机配置 . 以下示例适用于Symfony应用程序:

    server {
        root    /var/www/mysite/web;
    
        include /etc/nginx/default.d/*.conf;
    
        index app.php index.php index.html index.htm;
    
        client_max_body_size 30m;
    
        location / {
            try_files $uri $uri/ /app.php$is_args$args;
        }
    
        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            # Mitigate https://httpoxy.org/ vulnerabilities
            fastcgi_param HTTP_PROXY "";
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index app.php;
            include fastcgi.conf;
        }
    }
    

    entrypoint.sh 将在容器启动时运行nginx和php-fpm(否则只有php-fpm将作为官方PHP映像的默认操作启动):

    #!/usr/bin/env bash
    service nginx start
    php-fpm
    

    当然,这不是最佳实践的最佳方式,但我希望这是你的问题的答案 .

  • -1

    你应该部署两个容器,一个用 fpm ,另一个用 nginx ,你应该链接它们 . 即使您可以使用 supervisor 来监视同一容器中的多个进程, Docker philosophy也是每个容器有一个进程 .

    就像是:

    docker run --name php -v ./code:/code php:7-fpm
    docker run --name nginx -v ./code:/code -v site.conf:/etc/nginx/conf.d/site.conf --link php nginx:latest
    

    使用 site.conf

    server {
        index index.php index.html;
        server_name php-docker.local;
        error_log  /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;
        root /code;
    
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
    

    (由http://geekyplatypus.com/dockerise-your-php-application-with-nginx-and-php7-fpm/羞耻地启发)

相关问题