nginx须要用哪个版本的PHP?
nginx须要用php-fpm版本,以是在选择PHP的tag时,就要选带有fpm字样的。由于我喜好用alpine作为容器的操作环境,以是肯定还要带有alpine字样啦。详细的tag可以在hub.docker.com中搜索PHP,然后进入官方镜像后,查看里面的tag,巨多。
下面以PHP7.1作为案例。

Docker搭建PHP容器步骤:
1、创建目录,用来保存PHP的配置文件
mkdir -p /data/php/php71
2、创建PHP容器
docker run -d --name php71 -v /data/php/php71/etc:/usr/local/etc -v /data/website:/website --restart=always --network=br0 php:7.1-fpm-alpine
# -d 表示后台运行
# --name php71 是给容器起的名字
# -v xxx:zzz 是挂载目录,这里第一个目录是放php配置的,第二个是网站目录
# --restart=always 容器停滞了要重启吗?要!
# --network=br0 将PHP容器加入到br0网络中,这样就可以与前面的nginx容器进行通信了
# php:7.1-fpm-alpine 这是我选用的php版本
# 这里由于php和nginx都在br0网络里,以是这里无需做本机到容器的端口映射
3、在nginx中配置
vi /data/nginx/conf.d/01.conf
按一下i,然后输入:server {
listen 80; # 监听80端口,也可以监听你自己想要监听的任意端口
server_name www.xxx.com; # 这里填你解析到做事器的域名
root /website/web; # xxx这个网站的根目录
index index.php index.html index.htm; #网址以/结尾时,默认访问的文件名
location /{
try_files $uri $uri/ /index.php?$query_string;
#网址URI以类似/aaa或者/aaa/结尾时,默认就访问/index.php文件并把参数也传过去
}
location ~ \.php {
fastcgi_pass php71:9000;
# php71是容器名,9000是PHP默认监听的端口,这步很主要。
# 实在php71这个名称会自动对应到这个容器的ip地址,但容器的ip地址多数时候是变革的,以是用容器名就不怕ip变来变去的啦
fastcgi_index index.php;
# 访问PHP(/aaa和/aaa/类型URI)时默认的访问文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 我们自己定义了一个变量SCRIPT_FILENAME,内容为文件的路径和名称,形如:/website/web/a/xxx.php 这样,常日大家都会定义这个呢。之以是自定义,还不是由于nginx默认的定义变量中没有嘛
include fastchi_params;
# 还有很多nginx默认定义好的变量,也给传过去。只有这样,PHP通过$_SERVER的时候才能获取这些变量,才好做进一步的判断呢
}
}
4、去建一个最大略的网页
vi /data/website/web/index.php
然后按一下i,写入:
<?php
echo phpinfo();
?>
然后按一下esc键,输入:wq就保存好了。
5、重启nginx容器
docker restart nginx
#也可以docker exec -it nginx nginx -s reload 这个意思是进入nginx容器并重新加载配置
6、访问网页
http://你的域名 看看能否看到很多内容,里面都是PHP的各种信息呢。
玩个花活,同一网站利用多个不同版本的PHP
上面我们创建了PHP7.1的容器,那我们再创建个老版本吧,PHP5.6
1、创建保存PHP配置的目录
mkdir /data/php/php56
2、创建PHP5.6容器
docker run -d --name php56 -v /data/php/php56/etc:/usr/local/etc -v /data/website:/website --restart=always --network=br0 php:5.6-fpm-alpine
3、在上面的01.conf中增加配置
location ~ ^/5/.+\.php {
fastcgi_pass php56:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param OOO hahaha; # 自己随便乱定义了一个变量OOO,内容为hahaha
include fastcgi_params;
}
这样就实现了访问http://xxx/5/yyy这种网址就利用PHP5.6,其他的就利用PHP7.1了。
当然,如果一个做事器上有多个网站,或者多个子域名,也可以将不同的域名指向不同版本的PHP。多个网站,就写多个server{}。
7层网络下的PHP负载均衡
通过nginx的upstream将同一个网站的PHP要求分散到多个不同的PHP容器中,这便是PHP的负载均衡了。好处是,如果某个PHP容器挂掉了,还有别的PHP容器可以连续供应做事,给一个案例配置吧:
http {
upstream php {
ip_hash; # 将相同ip/24分到同一做事器
least_conn; # 将新要求分到负载最小的做事器
server php56:9000; # php5.6的容器名称和端口
server php71:9000; # PHP7.1的容器名称和算口
}
server {
listen 80;
location ~ \.php$ {
fastcgi_pass php;
# fastcgi_pass后面的php是upstream后接的那个名称,表示要求会转到upstream php那里去,由upstream php里面的规则来供应做事
fastcgi_index index.php; # 定义php访问的默认主页
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
这样,一个网站,就会根据用户的ip,随机利用个中一个PHP容器来供应做事啦。
nginx除了将php要求可以分开外,实在还有一个很常用的用法便是做反向代理,大体意思便是有多个相同确当地网站(已建好的那种),然后nginx将用户要求通过分流,来返回任一本地网站内容,这个属于网站级别的反向代理。而上面的案例则是属于后端做事软件级别的反向代理。
说了这么多,整体规则便是:nginx可以将不同的要求分开,那就可以配多个PHP来承接每一个要求。至于nginx按照什么规则来分开要求,这就仁者见仁智者见智了。