Combining PHP-fpm with nginx in one dockerfile

前端 未结 2 861
醉酒成梦
醉酒成梦 2020-12-25 14:06

I have a need to combine the php-fpm with nginx in one dockerfile for production deployment.

So is it better to :

(1) Start the dockerfile using php:7.1.8-f

相关标签:
2条回答
  • 2020-12-25 14:36

    You should deploy two container, one with fpm, the other with nginx, and you should link them. Even though you can use supervisor in order to monitore multiple processes within the same container, Docker philosophy is to have one process per container.

    Something like:

    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
    

    With site.conf with

    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;
        }
    }
    

    (Shamefully inspired by http://geekyplatypus.com/dockerise-your-php-application-with-nginx-and-php7-fpm/)

    0 讨论(0)
  • 2020-12-25 14:43

    Nginx installation is much easier than PHP so it should be easier for you to install Nginx into ready-to-use official PHP image. Here is the example Dockerfile showing how your goal can be reached with example of installing few PHP extensions:

    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"]
    

    The nginx-site.conf file contain your nginx http host configuration. The example below is for Symfony app:

    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;
        }
    }
    

    The entrypoint.sh will run nginx and php-fpm on container startup (otherwise only php-fpm will be started as the default action of the official PHP image):

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

    Of course this is not a best way from the best practice perspective, but I hope this is the answer for your question.

    0 讨论(0)
提交回复
热议问题