记录一次Docker+PHP迁移而遇到的问题
在一个风和日丽的下午,被告知有个服务器不续费了…………
然后就开始了我为期一周左右的服务迁移。
背景
- 此文章仅针对一个Docker+php+mysql+宿主机nginx。
- 使用的PHP的端口通信形式,不是socket
- 已将域名解析指向使用的服务器。
- 已将nginx安装,并且测试访问成功,然后将之前的配置文件scp过来,查看配置文件的目录结构,在新机器上配置相同的目录结构。
实验过程
首先,跑的都是小服务,感谢之前的运维大佬,将服务弄成了容器运行,访问的PHP代码是挂载的voulum,我将容器commit打包成镜像,生成镜像包,scp传过去,再载入就好了,然后将迁移机器上的目录结构完全copy过来,启动容器应该就可以了!但是,应该只是应该,就出问题了…………
问题描述
访问域名出现502 Bad Gateway
查看nginx报错:
failed (104: Connection reset by peer) while reading response header from upstream
………… failed (104: Connection reset by peer) while reading response header from upstream …………
容器正常启动,端口也存在,进入容器发现PHP、MySQL正常运行,并没有报错,查看相关error.log也木带问题,巨坑的报错啊!!!
解决过程
- 首先观察nginx配置文件指向的根目录,发现目录权限为root
修改目录权限
chown -R www.www /data/
- 发现打包容器之后,并没有将内部安装的mysql数据库数据打包过来,巨坑啊!
导入数据库,本人启动时候,将宿主机的3307映射到容器的3306
mysql -root -P3307 -h127.0.0.1 -p'密码' < mysql.sql
-
第三点,也是最坑的一点,网页代码就一直不能访问,PHP、mysql、nginx指向的端口本机的9000端口(启动容器时候9000端口映射到此容器)。
先讲决办法!!!:
经过自己好久的实验,终于解决问题,将容器的监听端口由127.0.0.1:9000改为0.0.0.0:9000
;listen = 127.0.0.1:9000
listen = 0.0.0.0:9000
测试PHP能否简单访问,
nginx配置文件:
……
root /data/html/test/;
index index.html index.php;
……
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
……
测试网页:
vim /data/html/index.php
<html>
<head>
<title>PHP 测试</title>
</head>
<body>
<?php echo '<p>Hello World,This is a test!</p>'; ?>
</body>
</html>
访问该nginx域名,显示为:
Hello World,This is a test!
- 未修改监听ip的时候,显示的还是502错误
最开始走过的艰辛路
刚开始查看nginx错误日志:
failed (104: Connection reset by peer) while reading response header from upstream,
以为是nginx和PHP通信出现了问题,因为是迁移过来的,另一个服务器上能完美运行,这里应是也可以的啊,去网上寻找解决办法,就是需要修改nginx配置文件、PHP配置文件。
修改了nginx的fastcgi的配置、又去容器内部修改了PHP的配置文件php-fpm.conf
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 15
pm.max_spare_servers = 80
pm.max_requests = 500
我设置了测试网页,访问网页看F12,发现访问解析到了我的服务器,但是访问不到测试的内容,所以nginx应该是没有问题的,果然还是PHP的问题,所以再去查找资料,发现有的大佬说容器内的PHP的监听端口ip有可能会有影响,修改成0.0.0.0之后,就解决了问题。
总结
最无奈的就是错误日志,是有错,但是提示的错误七八成都不能解决问题,还是自己慢慢找,哎,这也是做这个工作的无奈之处吧,但也是积累了很大的经验,共勉学习!!!