docker搭建ngnix+php

介绍

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

参考

https://blog.csdn.net/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

 

Guess you like

Origin blog.csdn.net/yan_dk/article/details/117669108