linux服务器上的nginx服务、mysql服务和docker里面的php服务配合使用
之前有个老项目是nginx1.22.0+mysql5.7+php5.6的环境在跑,也就是常说的lnmp环境。
但是最近出了一个新的需求,这台服务器上要跑一个php7.3的项目,mysql5.7还可以用,nginx1.22.0也可以用,主要是php的环境要升级到7.3,那么方案应该怎么实施呢,大概有下面几个思路:
1、再独立安装一个php7.3的服务,然后在nginx的项目配置文件里面php脚本执行的时候,指向php7.3的服务,老项目依然使用php5.6跑,互不干扰
2、现在比较流行用docker容器来跑服务,如果我装个docker服务,然后再跑个php7.3服务,感觉是不是档次瞬间就上来了。。。
如果是前几年,果断选择方案1,但是目前的话,我选择方案2,用docker来跑。
那么问题来了,如果用docke同时跑php、mysql、nginx三个服务,那简直是一气呵成,如行云流水般,但是现在的情况是,nginx和mysql是运行在宿主机器上,php运行在docker里面,那么这个组合究竟行不行勒,让咱们来试验一下。
docker服务,我只跑了php7.3服务
nginx是原生的
mysql也是原生的
通过试验,得出如下结论:
1、nginx的项目配置文件, 主要注意2个地方,第一个是root目录,遮起来的是我的项目域名,这里就不给大家看了,第二个是引入php配置文件
2、enable-php-docker.conf配置文件,这个是重点
fastcgi_pass配置docker里面php服务的地址,ip地址和端口,都可以从docker里面获取到
这里还需要配置一次root目录,并且是指向docker容器内php服务启动时候的目录,否则的话访问php文件会报错:Primary script unknown,报错截图为证
我的宿主机的项目目录为:/data/www,docker容器php服务的目录为:/www
那这里有个疑问?php里面重新配置了root目录,那nginx配置文件里面的root目录,还有用吗?结论是有用的,如果你访问非php文件,那么还是走nginx的root目录的哦,你可以加个txt或者html文件试试就知道了
fastcgi-docker.conf配置,我也贴一下
然后再重新加载一下nginx的项目配置文件,测试访问,哇塞,成功了!
到此,nginx + docker(php7.3)就跑通了,然后就是数据库连接的时候,有个地方要注意下,如果你是走公网数据库连接,则不会有这个问题,我这里是走内网连接数据库的模式,所以要注意下。
内网模式下, 我们常用的host地址大多是localhost或者127.0.0.1,但是这里不能这样用 ,这样会链接失败,正确的地址,这里应该用这个:172.16.0.206,输入ifconfig命令,可以看到网卡信息如下:
1、docker0是docker服务的网卡信息,第一个是172.17.0.1,所以php的是172.17.0.2,如果还有别的服务,ip地址会往网面递增172.17.0.(3...)
2、eth0是宿主机的内网网卡地址,172.16.0.206
3、现在是docker服务里面的php要去链接宿主机的myslq服务,相当于跨了网卡,所以直接使用localhost或者127.0.0.1是不行的,这里就要使用宿主机的ip地址了,所以是:172.16.0.206
4、用事实说话,我进入宿主机ping一下宿主机的地址,看是不是通的,结果显然是通的,而且是内网,0.058ms的延迟嘛