使用docker部署PHP项目以及使用NGINX代理时502网关错误

最后更新于:2023-04-11 20:33

对于普通网站开发来说,使用PHP具有开发更快速便捷,部署占用更小的内存等优势。而基于Docker环境的部署,和传统的部署相比,更是简化了环境配置以及维护迁移,占用更少的时间。
如果是一个新的服务器,整个步骤也就三大步即完成:

第一步,准备用于搭建web的docker环境:

yum install -y docker

systemctl start docker

分别是安装,启动docker (linux centos 7+环境)

第二步:安装基于docker的PHP环境:

不加版本号默认会拉取最新版本,可以时候docker search 来查找要拉取的镜像资源。比如我这里使用的版本是7.4-fpm:

docker pull php:7.4-fpm

接着启动PHP容器:

docker run --name mytest  -d  -p 8888 -v /home/php/:/home/php/  php:7.4-fpm

这里php运行时将会从宿主机的/home/php/下获取文件。因为是要使用nginx做代理,所以不需要对外开放端口。
当然也可以不使用nginx,直接对外使用80端口,比如 -p 80:9999 即外网使用80端口映射到对应docker的9999端口上。
因为是测试,为了排除其他干扰项,仅仅验证环境是否正常,在宿主机/home/php/ 文件夹下,新生成一个简单php内容文件:

vim index.php

打入内容:


保存并退出。

第三步,拉取安装Nginx,并配置:

不加版本号默认会拉取最新版本,比如我这里使用Nginx 1.20版本:

docker pull nginx:1.20.0

接着启动nginx容器:

docker run -d -p 80:80 --name nginx20 -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf nginx:1.20.0

-v是容器文件挂载路径。nginx启动时的配置文件会从你宿主机的/home/nginx/nginx.conf获取,所以应在启动前保证有这个文件存在,这个配置文件可以下载个nginx安装包,从中获取。

到这里只剩最后一步,配置nginx的nginx.conf文件。
vim编辑宿主机的nginx.conf文件,增加location配置:

location ~\.php$ {
	root  /home/php/;     #对应主机挂在到php容器中的代码目录
	fastcgi_pass 172.17.0.x:8888;   #此地址为php容器的内网ip
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
	include fastcgi_params;
 }

上面配置中 root是docker内的路径,对应宿主机的也是/home/php/下;
fastcgi_pass 对应用了PHP容器的ip,可以通过docker inspect 容器Id|grep IP 查到。端口是PHP启动时的端口。

然后docker restart nginxId 重启nginx。
浏览器进行访问测试: xxxxx/index.php

docker运行php项目,页面提示 502 bad gateway

页面报错了:Nginx提示: 502 bad gateway
思来想去,觉得配置没有问题。
折腾了半天,问题解决了,自己的经验主义,随机给了PHP端口,以为启动的哪个就能映射到。

解决方法: nginx配置改为9000时,页面能顺利访问到。

location ~\.php$ {
	root  /home/php/;     #对应主机挂在到php容器中的代码目录
	fastcgi_pass 172.17.0.x:9000;   #此地址为php容器的内网ip
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
	include fastcgi_params;
 }

当然了,也可以不用9000,得自己修改PHP的配置文件后才能生效。



相关阅读:

使用docker快速部署wordpress以及常见问题: https://shannote.com/archives/docker-install-wordpress.html

创建于2022-11-20 12:38 542 阅读