介绍
我们应用中往往会需要不同的应用服务器环境,如果服务器中已经有应用程序在运行了,如果用原有的环境可能不能满足需求,如果覆盖安装新环境,会影响服务器原有程序正常运行。比如我要新建一个php7.3的应用,而现在环境是7.1。比较好的方式是使用docker重新搭建,我们常见nginx,nginx本身不能解析php,需要再安装新的php,做好fastcgi的对应php解析,才能正常运行php程序。下面我们用docker来搭建一下这个环境。
参考
https://blog.youkuaiyun.com/ootiantong/article/details/109054285
安装
安装docker
参考本人的《docker入门及技术指南》文档
方案1(分离部署nginx、php)
安装php
//查找容器版本
# docker search php
//拉取镜像
# docker pull phpdockerio/php73-fpm
//生成容器
# docker run -p 9000:9000 -d --name php73-fpm -v /docker/nginx/www:/usr/share/nginx/html phpdockerio/php73-fpm
//查看容器状态
# docker ps
//查看php的9000是否运行
# netstat -tunlp |grep 9000
//查看启动php容器ip
# docker inspect php73-fpm | grep IPAddress
ip为172.17.0.6 记住这个地址,后面需要配置nginx。或者不用它,使用nginx容器关联php容器也可以。看下面
安装ngnix
建立本机目录
www目录下放一个测试的php文件test.php
<?php
echo "docker 部署 ngnix+php 成功。\n";
?>
//拉取镜像
# docker pull nginx
//生成容器
# docker run --privileged=true --name mynginx -p 8001:8001 -v /docker/nginx/www:/usr/share/nginx/html -v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /docker/nginx/log:/var/log/nginx -d --link php73-fpm:php nginx
注:这里“--link php73-fpm:php”,php73-fpm是前面配置的php容器名,后面php是起了一个容器间关联映射的名字,后面nginx配置会用到
//查看容器状态
# docker ps
进入容器
# docker exec -it mynginx bash
//容器内启动ngnix
/# service nginx reload
配置nginx.conf
user nginx;
worker_processes 1;
...
http {
server {
listen 8001;
server_name 1.1.1.1:8001;
charset utf-8;
keepalive_timeout 15;
#real_ip_header X-Forwarded-For;
#set_real_ip_from 172.17.0.0/16;
root /usr/share/nginx/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location ~ \.php$ {
fastcgi_pass php:9000; # 这里也可以用php容器的ip:172.17.0.6
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
}
注意上述的 fastcgi_pass 配置的是php容器的ip:port。
我们测试是否部署成功,可以先在内网测,内网测试成功后,外网访问基本也就差不多成功了。
我们使用linux的curl访问 :# curl http://127.0.0.1:8001/test.php
这样说明已经成功调用了php文件,nginx已经能够调用到正常解析的php文件了。
方案2(合成部署nginx+php)
【方案1】在有些系统的docker安装时,有时nginx和php不能很好配合工作,会出现502错误。本方案可以比较快捷的搭建nginx+php合成环境。
建立目录
在www下建立一个测试文件test.php
<?php
echo "this is webdevops/php-nginx \n";
?>
//拉取镜像
# docker pull webdevops/php-nginx
//生成容器
# docker run -itd --name php-ngins-1 -p 8002:80 -v /docker/php-nginx/www/:/app/ webdevops/php-nginx
//查看容器状态
# docker ps
//进入容器
# docker exec -it php-ngins-1 bash
测试访问 :
测试成功。
//补充
1. 容器内的几个配置
//配置nginx
# vi /opt/docker/etc/nginx/vhost.conf
# vi /opt/docker/etc/nginx/vhost.common.d/10-location-root.conf
//重新载入nginx
# nginx -s reload
2. 如果有些php框架应用根root不在当前路径,而是二级路径(如laravel),需要生成容器时映射顶层路径,然后在容器内配置root路径。下面以laravel为例
//生成容器
# docker run -itd --name php-ngins-1 -p 8002:80 -v /docker/php-nginx/www/:/app/ webdevops/php-nginx
//容器内配置nginx
# vi /opt/docker/etc/nginx/vhost.conf
修改
server {
...
root "/app/public";
...
}
# nginx -s reload
重启后生效,才能正常访问laravel框架
方案2-1(合成部署nginx+php,选取合适版本php >7.3)
如果【方案2】不能满足需要,如php7.2版本有点低,可以再选择其他版本,我们还是推荐从docker中找到合适的镜像去生成安装
# docker run --privileged=true -itd --name phppm_nginx -p 8004:80 -v /docker/phppm_nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /mnt/study/laravel/laravel8:/var/www phppm/nginx
# docker exec -it phppm_nginx bash
# docker cp phppm_nginx:/etc/nginx/nginx.cnf /docker/phppm_nginx/conf/nginx.cnf
# curl http://127.0.0.1:8004/test.php