首页 » SEO优化 » php扩大镜像技巧_为多个PHPFPM容器量身打造单一Nginx镜像

php扩大镜像技巧_为多个PHPFPM容器量身打造单一Nginx镜像

访客 2024-11-28 0

扫一扫用手机浏览

文章目录 [+]

PHP-FPM容器

Nginx容器

php扩大镜像技巧_为多个PHPFPM容器量身打造单一Nginx镜像

假设一个运用运行超过六个PHP微做事,算上你的dev和prod环境,那么终极差不多会产生靠近30个容器。
我决定构建一个单独的Nginx Docker镜像,将PHP-FPM主机名作为环境变量映射到这个镜像里面独特的配置文件中,而不是为每个PHP-FPM微做事的镜像构建独特的Nginx镜像。

php扩大镜像技巧_为多个PHPFPM容器量身打造单一Nginx镜像
(图片来自网络侵删)

在这篇博客文章中,我将概述我从上述方法1到方法2的过程,末了用先容如何利用新定制Nginx Docker镜像的办理方案来结束这篇博客。

我已经将这个镜像开源GitHub[2],以是如果这刚好是您常常碰着的问题,请随时查看。

为什么是Nginx?

PHP-FPM和Nginx一起利用可以产生更好的PHP运用程序性能[3],但缺陷是PHP-FPM Docker镜像默认没有像PHP Apache镜像那样与Nginx捆绑在一起。

如果您想将Nginx容器连接到PHP-FPM后端,则须要将该后真个DNS记录添加到您的Nginx配置中。

例如,如果PHP-FPM容器作为名为php-fpm-api的容器运行,那么您的Nginx配置文件该当这样写:

nginx

location ~ \.php$ {

fastcgi_split_path_info ^(.+\.php)(/.+)$;

# This line passes requests through to the PHP-FPM container

fastcgi_pass php-fpm-api:9000;

fastcgi_index index.php;

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param PATH_INFO $fastcgi_path_info;

}

如果你只做事一个PHP-FPM容器运用,在你的Nginx容器的配置文件中硬编码对应的名字是可以的。
但是,如我上面提到的,每个PHP做事都须要一个对应的Nginx容器,我们就须要运行多个Nginx容器。
创建一个新的Nginx镜像(我们后面必须掩护和升级)将是一件痛楚的事情,由于纵然管理一堆不同的卷,对付变动单个变量名称彷佛也有很多事情要做。

第一个办理方案:利用Docker文档里提到的方法envsubst

起初,我认为这很随意马虎。
在Docker文档中关于如何利用envsubst有一个很好的小章节[4],但不幸的是,这不适用于我的Nginx配置文件:

vhost.conf

nginx

server {

listen 80;

index index.php index.html;

root /var/www/public;

client_max_body_size 32M;

location / {

try_files $uri /index.php?$args;

}

location ~ \.php$ {

fastcgi_split_path_info ^(.+\.php)(/.+)$;

fastcgi_pass ${NGINX_HOST}:9000;

fastcgi_index index.php;

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param PATH_INFO $fastcgi_path_info;

}

}

我的vhost.conf文件用到了好几个Nginx内置的环境变量,结果当我运行Docker文档里提到的如下命令行时,提示缺点:$uri和fastcgi_script_name未定义。

shell

/bin/bash -c \"大众envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'\"大众

这些变量常日由Nginx本身传入[5],以是不随意马虎搞清楚他们是什么和怎么进行参数通报的,而且这会影响容器的动态可配置性。

另一个差点成功的Docker镜像

接下来,我开始搜索不同的Nginx的根本镜像。
找到了两个,但是这两个都是两年没有更新了。
我从martin/nginx[6]开始,考试测验看看能不能得到一个可以事情的原型。

Martin的镜像有点不太一样,由于它哀求特定的文件目录构造。
我先在Dockerfile中添加了:

FROM martin/nginx

接下来,我添加了app/空目录,只包含一个vhost.conf文件的conf/目录。

vhost.conf

nginx

server {

listen 80;

index index.php index.html;

root /var/www/public;

client_max_body_size 32M;

location / {

try_files $uri /index.php?$args;

}

location ~ \.php$ {

fastcgi_split_path_info ^(.+\.php)(/.+)$;

fastcgi_pass $ENV{\"大众NGINX_HOST\"大众}:9000;

fastcgi_index index.php;

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param PATH_INFO $fastcgi_path_info;

}

}

这个跟我原始的配置文件差不多,只修正了一行:fastcgi_pass $ENV{\"大众NGINX_HOST\"大众}:9000;。
现在当我想要启动一个Nginx容器和一个叫php-fpm-api的PHP容器的时候,我可以先编译一个新的镜像,然后在它运行的时候通报给它对应的环境变量:

shell

docker build -t shiphp/nginx-env:test .

docker run -it --rm -e NGINX_HOST=php-fpm-api shiphp/nginx-env:test

成功了!
但是,这个方法有两个问题困扰着我:

根本镜像版本迂腐,两年多没更新了。
这可能会造成安全和性能风险。

哀求一个app的空目录彷佛没啥必要,再加上我的文件放在不同的目录。

终极办理方案

我以为Martin的镜像是个不错的自定义方案选择。
以是,我fork了他的仓库并构建了一个新的并办理了以上两个问题的Nginx根本镜像。
现在,如果你想运行一个伴随着nginx容器的动态命名后端运用,你只须要大略地这么做:

shell

# Pull down the latest from Docker Hub

docker pull shiphp/nginx-env:latest

# Run a PHP container named \"大众php-fpm-api\"大众

docker run --name php-fpm-api -v $(pwd):/var/www php:fpm

# Start this NGinx container linked to the PHP-FPM container

docker run --link php-fpm-api -e NGINX_HOST=php-fpm-api shiphp/nginx-env

如果你想自定义这个镜像,添加你自己的文件或者Nginx配置文件,只须要像下面这样扩展你的Dockerfile:

FROM shiphp/nginx-env

ONBUILD ADD <PATH_TO_YOUR_CONFIGS> /etc/nginx/conf.d/

现在我所有的PHP-FPM容器都利用单个Nginx镜像的实例,当我须要升级Nginx、修正权限或者配置一些东西的时候,这让我的生活变得大略多了。

所有的代码都放在GitHub[2]上面了。
如果您创造任何问题或想要提出改进建议,请随时创建issue。
如果您对这个问题或Docker干系的任何问题,可以在Twitter[7]上找我一起谈论。

标签:

相关文章

IT运维的精细化划分与未来发展趋势

随着信息技术的飞速发展,企业对于IT运维的要求日益提高。IT运维不再仅仅是简单的设备维护和故障排除,而是涵盖了从系统规划、部署、运...

SEO优化 2024-12-28 阅读0 评论0

IT运维质量,企业数字化转型的重要基石

随着信息技术的飞速发展,企业数字化转型已成为必然趋势。而IT运维质量作为企业信息化建设的重要组成部分,其重要性不言而喻。本文将从I...

SEO优化 2024-12-28 阅读0 评论0

繁体字文化的传承与发展_以台湾为例

繁体字,作为中华文明的重要载体,承载着中华民族悠久的历史文化。近年来,随着简体字的普及,繁体字的使用范围逐渐缩小。在台湾,繁体字依...

SEO优化 2024-12-28 阅读0 评论0

红包协议解密,介绍数字货币红包的奥秘

随着互联网技术的飞速发展,数字货币红包作为一种新兴的支付方式,已经逐渐渗透到了我们的日常生活中。红包协议作为一种加密技术,为数字货...

SEO优化 2024-12-28 阅读0 评论0

箱函数在R语言中的应用及其优势

箱函数,作为一种强大的数据分析工具,在R语言中有着广泛的应用。箱函数能够有效地展示数据的分布情况,对异常值进行识别和剔除,从而为后...

SEO优化 2024-12-28 阅读0 评论0