目录
原因
很多情况下,使用LNMP可以直接下载lnmp的容器,不过这些容器个头都太大,基本有2G左右,如果想做个集群测试,那是非常痛苦的,所以需要一个比较精简,安装方便的容器来实现Nginx+php-fpm,所以就有了本文墂的目标
初步安装容器中的模块
下载nginx镜像
# docker pull nginx
# docker run --name 容器名称 docker.io/nginx
安装相关问题
Docker的Debian容器不支持汉字的问题
VIM配色方案
docker.io/nginx 修改apt源后提示Certificate verification failed: The certificate is NOT trusted
安装php相关模块
# apt-get install php php-fpm php-mysql
检查一下php-fpm服务是否可以启动
# service php7.3-fpm start
# service php7.3-fpm status
[ ok ] php-fpm7.3 is running.
从返回结果上看,php-fpm可以启动了
使用一个相对复杂的办法配置服务启动
一个不好的现象
# service nginx stop
这时运行这个命令会导致容器关闭,对于需要调试程序,经常修改配置的情况下,使用非常不方便,下面介绍一个办法来配置服务的启动,虽然相对复杂,但是对于将来的工作来说提供了长期的方便,还是值得的,下面来继续操作,检查镜像的配置
# docker image inspect docker.io/nginx
......
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
],
......
注意到这一段,找到文章
docker运行nginx为什么要使用 daemon off,了解到是因为容器是把nginx启动为PID=1的进程,所以nginx退出,容器便退出。
解决方案1
Docker(十七)-修改Docker容器启动配置参数
这个方法在测试的时候非常麻烦,docker服务会定时自动更新配置文件,刚做完修改,文件就会被改变,容易引起问题,因此要修改配置文件之前,需要关闭docker服务,改完后再重启docker服务,在测试的过程中需要频繁启动关闭docker服务,操作上非常不方便,因此很不推荐这种方式
解决方案2
把容器保存为镜像,通过修改镜像脚本,来实现调整服务的目的,创建自己的镜像,在镜像脚本中设置php-fpm、nginx协同启动
保存临时镜像
# docker commit 容器名称 新镜像文件名称(mytmp1)
创建Dockerfile
# vi Dockerfile
FROM mytmp1
ENTRYPOINT service php7.3-fpm start && service nginx start && bash
创建工作镜像
# docker build -t docker.io/nginx/mywork1 .
注意标点符号哦
用新的镜像完成最后的配置工作
启动镜像
docker run \
-v /root/work:/root/work \
-v /var/www:/var/www \
--name myWork1 \
-p 80:80 \
-p 433:433 \
-dt docker.io/nginx/mywork1
适当给启动的新容器添加端口,映射些主机目录,方便容器将来的使用,避免把文件拷贝来拷贝去的
检查服务启动状态
# service nginx status
[ ok ] nginx is running.
# service php7.3-fpm status
[ ok ] php-fpm7.3 is running.
从这里看,服务启动正常了
修改php-fpm配置文件
# vi /etc/php/7.3/fpm/pool.d/www.conf
listen = /run/php/php7.3-fpm.sock
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
本文只关注这些项,其他项的值请保留哦,这里的要点:nginx的权限与php-fpm启动的权限一致时,才能正确连接
修改nginx配置
# vi /etc/nginx/conf.d/default.conf
location ~ \.php$ {
root /var/www/html;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
要注意检查端口号和网站的根目录,最好与php的根目录一致
listen 80;
location / {
root /var/www/html;
index index.html index.htm;
}
做测试文件检查php
# vi /var/www/html/info.php
<?php
phpinfo();
用浏览器查看,页面返回错误信息
由此可见,nginx并未正确连接上php-fpm
检查错误并处理
## ls -l /var/log/nginx/
total 0
lrwxrwxrwx 1 root root 11 May 15 20:15 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 May 15 20:15 error.log -> /dev/stderr
错误信息是输出到输出设备的,那如何查看呢?这时要返回主机
查看错误信息
# docker logs myWork1 --tail 20
173.154.216.1, server: localhost, request: "GET /i.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.3-fpm.sock:", host: "173.154.216.147"
173.154.216.1 - - [19/May/2020:14:04:49 +0000] "GET /i.php HTTP/1.1" 502 494 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0" "-"
处理错误
每个人的情况都不一样,根据错误信息就可以去处理错误了,顺利的话,PHP就正常运行了