服务器迁移
昨天下午开始做服务器迁移。迁移一个门户网站,包括前端以及一个数据库和php后端,标准的网站架构,要迁移到一台比较干净的服务器。
新服务器除了另外一个人部署的docker、nginx以外,就没有我们需要的东西了,拉好MySQL镜像,迁移好数据库,把前后端代码打包发送到服务器,配置好nginx,准备工作告一段落。
前端部分可以独立于后端,单独运行,先后顺序也就没那么重要,三两下配置结束。
此时,域名已经可以访问,证书一切正常,接下来就是后端部署了,大坑就在眼前。
服务器信息
环境配置:linux CentOS7、docker、mysql5.7、php 7.3.5-fpm、nginx
配置php容器
前面说到数据库已经迁移完毕,通过隧道测试,本地连接正常。接下来直接拉取php镜像
docker pull php:7.3.5-fpm
然后生成容器
docker run -itd -p 19000:9000 -v /home/yomi-customer/im-chat:/var/www/html -v /home/yomi-customer/im-chat/vagrant/im-php:/usr/local/etc/php -d 1b1a57654cda
因为9000端口被占用,所以我映射到19000端口,而此时,php服务已经启动,我事先已经配好nginx,所以可以直接访问接口:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:19000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/im-portal/public$fastcgi_script_name;
include fastcgi_params;
}
然后,接口报错了.....
"file_put_contents(/var/www/html/im-portal/storage/framework/cache/data/11/ff/11ffe826569e3b6f1e296da7924f228bc0c3b482): failed to open stream: No such file or d
但是不慌,意料之中,众所周知laravel有一个目录总需要开启权限,根据提示信息来,哪个没权限开哪个:
sudo chmod -R 777 im-portal/storage/
# 进入容器
sudo docker exec -it im-portal-php /bin/bash
# 进入项目文件夹,在docker内开启权限
chmod -R 777 storage
接下来再试,果然没有刚才的报错了,但是新的问题出现了....
could not find driver (SQL: select * from `packageLinks` where `id` = 1 limit 1)"
不慌,依旧在意料之中,进入php容器,查看php扩展安装情况
# 进入容器
sudo docker exec -it im-portal-php /bin/bash
# 查看扩展
php -m
结果如下:
ctype
curl
date
dom
fileinfo
filter
ftp
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib
熟悉的同学一眼就能看出来,我门缺了连接mysql的关键扩展pdo_mysql,缺啥装啥:
docker-php-ext-install pdo_mysql
docker-php-ext-install pdo_pgsql
docker-php-ext-install pdo_sqlite
如果安装成功,php -m 就能看到新增的扩展名称了,这时候记得重启容器,如果没成功.....
可以看看我的报错:
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20180731/ /usr/local/bin/docker-php-ext-enable: 108: /usr/local/bin/docker-php-ext-enable: cannot create /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent
这边的意思是:PHP 扩展安装脚本无法创建目标目录,这可能是由于目录不存在 。
那么直接在相应的目录下手动创建目录
mkdir -p /usr/local/etc/php/conf.d
之后顺利安装,重启容器,出来一看,emmm,漂亮!还是不行......
php扩展已经没问题了,接下来的问题只能是代码配置的问题了,这是我的部分配置文件:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=13306
DB_DATABASE=*****
DB_USERNAME=root
DB_PASSWORD=********
之前提过,通过隧道连接测试数据库正常,因此再度排除数据库问题,那么就是两个容器间的通讯问题了。
确定了方向后,我尝试直接用容器ip连接——不行,容器名称连接——不行。
到这里,我觉得可能是我没有配置docker网络的原因。因此,我把这两个容器删除重装(幸好数据、配置文件都有映射出来)
docker stop im-portal-php im-portal-mysql
docker rm im-portal-php im-portal-mysql
# 创建自定义网络
docker network create mynetwork
# 重新生成容器
docker run -d --name im-portal-php --network mynetwork -p 19000:9000 im-portal-php
docker run -d --name im-portal-mysql --network mynetwork -p 13306:3306 -e MYSQL_ROOT_PASSWORD=******* mysql:5.7
然后,新的容器,新的报错
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `packageLinks` where `id` = 1 limit 1)
因为我本地通过隧道能够正常访问,所以再次排除数据库的问题,经检查,php必要的扩展也已经就绪,所以.....一时半会我真不知道问题在哪,愣了好久,中间又写了测试脚本测试连接,结果脚本也不行。
过了好久,才反应过来,laravel中,项目访问数据库是通过php去访问的,所以这两个容器之间的连接首先指向必须明确。
比如这个项目,nginx在宿主机,php和mysql在容器内,它们分别映射端口到宿主机,使得宿主机能够通过映射的端口访问对应的服务,因此,一开始的配置设置端口为宿主机的13306端口,是正确的。
但是,该后端项目中需要通过php访问数据库,相当于从php容器内部访问外部的13306端口,而在php容器的创建中我并没有指定php容器的13306端口映射,因此,无法访问。
到这里,问题已经初现端倪,那么修改起来也很简单,php容器增加13306端口映射即可,或者像我一样,直接使用3306端口连接,因为linux系统中类似80、443、9000、3306这些端口默认都是开放的,所以尽管我们没有指定端口映射,但是依旧能够使用3306端口访问,前提是没被占用。
这是修改后的配置:
DB_CONNECTION=mysql
DB_HOST=im-portal-mysql
DB_PORT=3306
DB_DATABASE=*****
DB_USERNAME=root
DB_PASSWORD=********
接口测试一切正常,大功告成。