感谢一位朋友(osn)帮助建立了多版本php环境(php5-fpm和php7-fpm共存),centos7+nginx+php-fpm7.1。这个环境下需要用到5.6版本的PHP。直接用yum装5.6版,会和之前装的7.1冲突。所以只好让PHP5跑在docker里了。下面是配置说明。
参考这个说明,如果系统跑php5.6,docker中跑php7,也可以。
或者用docker跑多个版本的php也行。
centos7安装后,用epel源安装nginx1.12,然后用webtatic源装php71w-fpm和php71w-cli。然后装了很多php71w-gd,php71w-pdo,…..的php支持。
php7在nginx的配置,支持PATH_INFO:
创建文件:/etc/nginx/default.d/php71w-fpm.conf
————–
location ~ \.php($|/) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+?\.php)(/.*)$; # 非贪婪匹配
if (!-e $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info if_not_empty;
include fastcgi_params;
}
————–
docker是用自带源(extras) yum安装的。
php的docker镜像有很多。选择了bitnami/php-fpm。因为他的images体积小,才200多MB,版本齐,5.6, 7.0, 7.1, 7.2都有。
这个镜像的说明:
https://store.docker.com/community/images/bitnami/php-fpm
拉取镜像,指定php5.6版本,执行:
docker pull bitnami/php-fpm:5.6
测试容器,先启动起来看看,9000已经被7.1占用,5.6映射到9001:
docker run -d –name phpfpm56 -v /data/web/php5:/app/web/php5 -p 127.0.0.1:9001:9000 bitnami/php-fpm:5.6
我的nginx网站的 root是 /data/web
修改nginx的配置,增加php5.6在目录/data/web/php5/的支持。
在server{ }中添加一个location{ }。这个配置是支持php的PATH_INFO的。
我把配置写在独立文件中了,然后在nginx配置中 include 进去。
我的例子:server {
listen ….
server_name ….
root …..
include /data/config/nginx/phpfpm56.conf; <—-加了这行
…….
}
我的独立配置文件为 /data/config/nginx/phpfpm56.conf 内容如下。
————–
location /php5/ {
location ~ \.php($|/) {
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+?\.php)(/.*)$; # 非贪婪匹配
if (!-e $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_param SCRIPT_FILENAME /app/web$fastcgi_script_name;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info if_not_empty;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT /app/web;
}
}
————–
建个文件 /data/web/php5/info.php 内容为 <?php phpinfo(); ?>
浏览器访问 http://你的站/php5/info.php ,如果看到,说明成功了。
—————-
正式配置php-fpm5.6:
把php-fpm56 的配置文件copy到宿主机上,方便修改配置。
之前测试,启动的phpfpm56的容器,先别关。
cd /data/config/phpfpm56/ # 这个目录是宿主机上的目录,把配置文件copy出来。
docker cp phpfpm56:/opt/bitnami/php/etc/php-fpm.conf .
docker cp phpfpm56:/opt/bitnami/php/etc/environment.conf .
docker cp phpfpm56:/opt/bitnami/php/etc/common.conf .
docker cp phpfpm56:/opt/bitnami/php/etc/php.ini .
——–
如果以后需要进入容器,以apache的身份执行命令(因为容器里头没有sudo),则做,否则跳过。
docker cp phpfpm56:/etc/passwd .
#增加一行, apache:x:48:48:apache:/app:/bin/bash
docker cp passwd phpfpm56:/etc/passwd
# 就可以在container中su apache 了
——–
#host机上的配置文件,刚才从容器中copy出来的。
/data/config/phpfpm56/common.conf
/data/config/phpfpm56/environment.conf
/data/config/phpfpm56/php-fpm.conf
/data/config/phpfpm56/www.conf #如果需要,自行创建
/opt/bitnami/php/etc/php.ini
# 以上配置文件中,对log的配置(我在php-fpm.conf中配置了log输出,具体配置不贴出来了)
/opt/bitnami/php/logs/phpfpm56-error.log
/opt/bitnami/php/logs/phpfpm56-www-slow.log
/opt/bitnami/php/logs/phpfpm56-www.log
—————
## 未使用的配置
# common.conf 中就是 user=48 group=48 两行。一般php-fpm都以apache身份运行。
-v /data/config/phpfpm56/common.conf:/opt/bitnami/php/etc/common.conf \ # 抛弃。因内容直接写入 www.conf 或 php-fpm.conf 了
# 这个www.conf 我没用到。
-v /data/config/phpfpm56/www.conf:/opt/bitnami/php/etc/www.conf:ro \
# 这个配置应该可以获取到宿主机的IP。但失败了,不知道为什么。所以没用它。直接把IP写参数里了。
$(docker network inspect –format='{{range .IPAM.Config}}{{.Gateway}}{{end}}’ bridge)
—————
docker container stop phpfpm56 # 停止container
docker rm phpfpm56 # 删除container
# 重建container
docker run -d –name phpfpm56 \
–add-host=mainhost:172.17.0.1 \ <—-宿主机的机器名, IP.
–restart always \
-v /data/config/phpfpm56/php-fpm.conf:/opt/bitnami/php/etc/php-fpm.conf:ro \
-v /data/config/phpfpm56/php.ini:/opt/bitnami/php/etc/php.ini:ro \
-v /var/log/phpfpm56:/opt/bitnami/php/logs \
-v /data/web:/app/web \ <—-直接把网站的root映射到容器中。
-p 127.0.0.1:9001:9000 bitnami/php-fpm:5.6
# 设置容器开机自动启动。
docker update –restart always phpfpm56
# 检查 iptables 规则,允许container访问mysql, 检查mysql用户可以从 172.17.0.% 登陆和访问数据库。
# 下面这句,是用来进入容器执行命令的。
docker container exec -it phpfpm56 /bin/bash
—————
增加php5.6的工作目录, 比如 /data/web/newphp56
1. 修改 /data/config/nginx/phpfpm56.conf , 增加一个 location /newphp56/ { } 配置, 内容copy前一个location的。
2. service nginx reload
注: php5.6-docker 中访问主机的MySQL,使用机器名, mysql-hostname:’mainhost’,
比如: $db=new mysqli(‘mainhost’,’用户名’,’密码’,’db name’);
或(不建议直接用IP): $db=new mysqli(‘172.17.0.1′,’用户名’,’密码’,’db name’);
因为如果容器迁移,宿主机的IP有可能会改变。
—————
或者把location 中的关于php5.6的配置,单独写到一个文件中。比如 /xxx/handlephp56.conf
需要增加那个目录 就写:
location /xxxx/ {
include /xxx/handlephp56.conf;
}
重启nginx,就行了。
—————