使用的服务器配置很低,而且快要到期了。到时候更换服务器再搭建lnmp,也挺花时间的,所以这里先未雨绸缪一波。
首先使用命令行依次配置nginx/php-fpm/mysql,然后再使用docker-compose重新配置一次。
Nginx:
docker pull nginx //简单的拉取镜像
docker create --name temp_nginx nginx //创建一个容器,以便复制文件
这是项目的树形图:
[root@localhost lnmp]# tree
.
├── conf.d
├── data
├── html
│ ├── index.html
│ └── index.php
└── logs
docker cp temp_nginx:/etc/nginx/conf.d/default.conf ./con.d/ //直接复制基础的配置文件
docker network create lnmp //创建一个网络
docker run --name lnmp_nginx --network lnmp -dp 80:80 -v /root/lnmp/html:/usr/share/nginx/html -v /root/lnmp/conf.d:/etc/nginx/conf.d nginx
//启动nginx镜像,包括别名,端口,配置文件,网页访问根目录,加入网络。
启动以后,直接浏览器访问http://虚拟机IP/index.html,就能看见html目录下的index.html文件了。
后续需要修改nginx的配置文件,直接修改./conf.d/default.conf,然后docker restart lnmp_nginx即可。
或者,docker exec -it lnmp_nginx nginx -s reload也可以。
或者docker exec -it lnmp_nginx /bin/sh //直接进入容器的命令行,再运行 nginx -s reload也可以刷新配置文件。
可以进入容器使用nginx -t 检验配置文件是否出错。
php-fpm
docker pull php:5.6.40-fpm //简单的拉取镜像
docker run --name lnmp_php --network lnmp -dp 9000:9000 -v /root/lnmp/html:/usr/share/nginx/html php:5.6.40-fpm //这样写,在上面的html下面编写php文件就可以执行了
还是加入了同一个网络,这样在nginx配置文件里面就可以直接使用lnmp_php这个别名,而不用IP地址。
当然,非要使用IP地址也可以:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' phpfpm //可能需要自己修改一些东西,我执行起来没问题,并且和我用portainer看见的ip一样。
docker ps,能看见php-fpm在运行就ok。或者自己进入php-fpm的容器,直接php index.php。看看运行有没有出错,就知道路径啥的配置正确没有。
php弄好了,就需要修改nginx的配置文件了。很容易看见conf配置文件里面注释了php的部分,略加修改即可。
大概是改成下面这样
location ~ \.php$ {
root /usr/share/nginx/html; //这里很坑,默认是html,我忘了改。
fastcgi_pass lnmp_php:9000; //加入一个网络,使用重命名也是ok的,否则,使用IP地址也可以
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; //这一行必须修改
include fastcgi_params;
}
[13/Jun/2023:07:34:57 +0000] "GET /index.php HTTP/1.1" 404 27 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.43" "-"
2023/06/13 07:34:57 [error] 79#79: *86 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.133.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://172.19.0.3:9000", host: "192.168.133.129"
好久才发现,原来是nginx对php的路径有问题。root默认是html,我改成/usr/share/nginx/html,就可以正常访问了。
root那个路径不改,就会出现这样的问题。
后来试了一下,新建一个容器,但是不加入lnmp的网络,无论怎样修改nginx配置文件,使用别名也好,使用容器的IP也好,都是不能正常使用php的服务的。也就是实现了容器和网络之间的隔离。
2023/06/13 07:48:13 [error] 91#91: *104 upstream timed out (110: Connection timed out) while connecting to upstream, client: 192.168.133.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://172.17.0.3:9000", host: "192.168.133.129"
mysql
docker pull mysql:5.5.62
docker run --name lnmp_mysql --network lnmp -dp 3306:3306 -v /root/lnmp/data:/var/lib/mysql -v /root/lnmp/logs:/logs -e MYSQL_ROOT_PASSWORD=123456 mysql:5.5.62
mysql没有什么好说的。只是试了下能运行,能进入容器修改配置就ok了。
docker-compose
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
volumes:
- ./html:/usr/share/nginx/html
- ./conf.d:/etc/nginx/conf.d
depends_on:
- php-fpm
restart: always # 设置重启策略为always
networks:
- mylnmp
php-fpm:
image: php:5.6.40-fpm
ports:
- 9000:9000
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- mysql
restart: always # 设置重启策略为always
networks:
- mylnmp
mysql:
image: mysql:5.5.62
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 123456
volumes:
- ./data:/var/lib/mysql
networks:
- mylnmp
restart: always # 设置重启策略为always
networks:
mylnmp:
name: mylnmp # 指定网络名称
和上面的几乎没什么区别,好在这样一个文件,就可以在切换服务器的时候,轻松搭建好环境,我需要做的,也只是提供html文件夹内的文件罢了。
docker-compose up -d //执行即可
还是需要自己修改nginx的配置文件。
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass php-fpm:9000; //使用docker-compose中的服务名称
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; //这里还是要改
include fastcgi_params;
}