nginx和php-fpm服务部署在两台服务器上

用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了。

写在最后

  1. 这里部署nginx服务用的是Ubuntu的Docker镜像,而不是nginx的镜像。一是因为nginx的镜像太轻量,缺乏必要的软件支持,二是文件目录跟标准安装的nginx不太一样,三是配置一不小心改错了,容器就启动不了,对新手不友好。
  2. 考虑到静态文件的访问,按照这种部署方式,在nginx和php-fpm容器中都要有一份完整的程序拷贝,略显冗余,实际部署中可以使用目录映射。
  3. 实际上nginx+php-fpm这种运行方式已经严重过时了,本文更多的是出于测试目的,同时也是考虑到一些老项目或许会需要这么部署,当然可能性非常小。

Leave a Comment

豫ICP备19001387号-1