介绍

           我们应用中往往会需要不同的应用服务器环境,如果服务器中已经有应用程序在运行了,如果用原有的环境可能不能满足需求,如果覆盖安装新环境,会影响服务器原有程序正常运行。比如我要新建一个php7.3的应用,而现在环境是7.1。比较好的方式是使用docker重新搭建,我们常见nginx,nginx本身不能解析php,需要再安装新的php,做好fastcgi的对应php解析,才能正常运行php程序。下面我们用docker来搭建一下这个环境。


安装

安装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

docker部署nginx需要配置哪些文件 docker部署nginx和php_php

ip为172.17.0.6   记住这个地址,后面需要配置nginx。或者不用它,使用nginx容器关联php容器也可以。看下面

安装ngnix

建立本机目录

docker部署nginx需要配置哪些文件 docker部署nginx和php_nginx_02

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

注:这里“--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

docker部署nginx需要配置哪些文件 docker部署nginx和php_nginx_03

这样说明已经成功调用了php文件,nginx已经能够调用到正常解析的php文件了。

方案2(合成部署nginx+php)

【方案1】在有些系统的docker安装时,有时nginx和php不能很好配合工作,会出现502错误。本方案可以比较快捷的搭建nginx+php合成环境。

建立目录

docker部署nginx需要配置哪些文件 docker部署nginx和php_nginx_04


在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

测试访问 :

docker部署nginx需要配置哪些文件 docker部署nginx和php_nginx_05

测试成功。

//补充

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