用PHP开发网站时,传统的部署方式是将Nginx和php-fpm服务部署在同一台服务器上,在Docker大行其道的今天,是否可以将它们使用Docker分别部署呢?
答案是可以!
准备容器
这里我们使用官方的ubuntu和php镜像先创建两个容器
docker run -it --name nginx-app -p 180:80 -d ubuntu:20.04 /bin/bash
docker run -it --name php-fpm-app -d php:7.4-fpm
其中nginx-app容器的80端口映射到了主机的180端口。
先可以先创建一个桥接网络,将两个容器都部署在这个网络下,总之要确保它俩在同一网络下可互相访问。
安装必要的软件
由于需要用到vim编辑器,两台服务器都要安装它
apt update
apt install -y vim procps lsof iputils-ping curl
修改nginx配置
接下来,修改nginx的配置
先进入nginx容器
docker exec -it nginx-app /bin/bash
vi /etc/nginx/conf.d/default.conf
这个文件是新增的,编辑内容如下
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/host.access.log;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /var/www/html;
fastcgi_pass php-fpm-app:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
php的相关配置中php-fpm-app:9000
是php-fpm-app容器中php-fpm服务的监听地址,而root /var/www/html
目录也是php-fpm-app容器中的,而不是nginx-app容器的,这一点尤其重要,不能搞错!
修改完后重启nginx
服务。
ps -ef | grep nginx | awk '{print $2}' | xargs kill
nginx
添加php脚本
进入php-fpm-app
容器并在/var/www/html
创建一个php文件
docker exec -it php-fpm-app /bin/bash
cd /var/www/html
vi i.php
内容可以填
<?php
phpinfo();
访问php脚本
最后访问 http://localhost:180/i.php
就可以看到phpinfo
了。
写在最后
- 这里部署nginx服务用的是Ubuntu的Docker镜像,而不是nginx的镜像。一是因为nginx的镜像太轻量,缺乏必要的软件支持,二是文件目录跟标准安装的nginx不太一样,三是配置一不小心改错了,容器就启动不了,对新手不友好。
- 考虑到静态文件的访问,按照这种部署方式,在nginx和php-fpm容器中都要有一份完整的程序拷贝,略显冗余,实际部署中可以使用目录映射。
- 实际上nginx+php-fpm这种运行方式已经严重过时了,本文更多的是出于测试目的,同时也是考虑到一些老项目或许会需要这么部署,当然可能性非常小。