我需要将php-fpm和nginx组合在一个dockerfile中用于生产部署。
那么更好的做法是:
(1)使用php:7.1.8-fpm启动dockerfile,然后在其上安装nginx图像层?
(2)或者您是否建议使用nginx镜像,然后使用apt-get安装php-fpm?
PS:我没有用于生产部署的docker-compose构建选项。在我的开发环境中,我已经使用docker-compose并从两个镜像轻松构建多容器应用程序。我们组织的devops不支持基于docker-compose的生产环境部署。
发布于 2018-11-11 18:00:29
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
当然,从最佳实践的角度来看,这不是最好的方法,但我希望这是您问题的答案。
更新:
如果你在entrypoint.sh
文件上得到了权限被拒绝的错误,如果你是在Linux下构建的,请检查这个文件是否有可执行权限,或者如果你是在Windows下,请将RUN chmod +x /etc/entrypoint.sh
添加到copied文件中(所有Windows下的文件都是在没有可执行权限的情况下复制到容器中的)。
如果你在Google Cloud Run下运行,请记住Nginx在PHP之前启动,而且它比PHP快得多。这导致当Cloud Run发出第一个请求时,Nginx已经初始化,但PHP-FPM尚未初始化,Cloud Run请求失败。要解决这个问题,您应该在Nginx之前将您的入口点更改为启动PHP-FPM:
#!/usr/bin/env sh
set -e
php-fpm -D
nginx -g 'daemon off;'
此脚本仅在高山Linux下测试。我猜它也应该适用于其他图像。这个脚本首先在后台运行php-fpm,然后在不退出的情况下运行Nginx。这样,Nginx总是在PHP-FPM初始化后开始监听端口。
发布于 2017-09-21 07:28:03
您应该部署两个容器,一个使用fpm
,另一个使用nginx
,并且应该将它们链接起来。尽管您可以使用supervisor
来监视同一容器中的多个进程,但Docker
的理念是每个容器有一个进程。
类似于:
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/的启发)
https://stackoverflow.com/questions/46332919
复制相似问题