docker 配置 nginx和php-fpm 跨服务器运行

场景介绍:由于我的一个im应用经常给客户部署,该应用涉及到多个服务(redis、mysql、mongo、nginx),一般都是在宝塔进行部署,但是各种问题层出不穷,所以萌生了使用docker compose制作一个一键部署的脚本,其中nginx和php-fpm不在同一台服务器有坑,这里记录,我这里使用临时的php-fpm + nginx容器来演示两个服务不在同一个服务器上时如何配置,没有涉及到其他的服务(redis、mysql、mongo)同时也介绍了如果在同一台服务器时如何处理。

创建docker网络

如果需要两个容器进行通信,那么必须要让他们在同一个网络中。
docker network create m1

创建nginx服务

docker run -it --rm -p 80:80 --network m1 nginx

创建php-fpm服务

docker run -it --rm -p 9000:9000 --network m1 alpine:3.14

查看容器的ip

由于没有配置name,所以我这里需要查看下配置,用ip来解析,使用docker compose可以通过container_name配置容器名称。docker inspect network m1
docker 配置 nginx和php-fpm 跨服务器运行_第1张图片

主要看containers里面的两个容器信息的ip,对应到下面的docker,这里有一个问题,如果容器重启的话,ip有可能会变动,所以建议使用container_name来进行后面的ip配置(就是用container_name来代理后面的ip,本机可以通过ping container_name来测试是否连通,或者看/etc/hosts文件)。

容器 ip
nginx 172.20.0.3
php-fpm 172.20.0.2

配置php-fpm

如果nginx和php-fpm在同一台服务器这里是不用修改的。

apk add php php-fpm # 添加php-fpm

#修改php-fpm的配置
vi /etc/php7/php-fpm.d/www.conf
主要修改两处
listen=0.0.0.0:9000 #默认是127.0.0.1:9000,只允许本机,如果是本机的nginx不用改这里,此处踩坑了
listen.allowed_clients = 172.20.0.3 # 默认是0.0.0.0 ,不用改也行,留空那么所有主机都可以连接了

添加php文件
mkdir -p /usr/share/nginx/html && echo "

注意这是在php-fpm那台服务器,如果实际部署,我们的文件是需要挂在到这里。记得修改后要启动或重启php-fpm,php-fpm7,alpine里面这个命令有点怪异。

docker 配置 nginx和php-fpm 跨服务器运行_第2张图片

配置nginx

#需要先安装vim
apk update -y
apk add vim
vi /etc/nginx/conf.d/default.conf

完整配置

root@67cef1eb971c:/usr/share/nginx/html# cat /etc/nginx/conf.d/default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    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;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
     #   proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #下面这段配置取消注释
    location ~ \.php$ {
        root           /usr/share/nginx/html;#此处是php-fpm那台服务器的path,注意
        fastcgi_pass   172.20.0.2:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;#此处的默认是scripts/$fastcgi_name
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

修改后记得重启或者重新加载nginx:nginx -t && nginx -s reloat

在这里插入图片描述

查看结果

docker 配置 nginx和php-fpm 跨服务器运行_第3张图片

测试thinkphp运行是否正常

  1. 修改nginx配置,由于thinkphp需要指定运行目录是public,所以location需要修改。
    docker 配置 nginx和php-fpm 跨服务器运行_第4张图片
    参考:https://www.kancloud.cn/manual/thinkphp5/177576
  2. 在php-fpm那个服务器下载thinkphp代码
apk add composer #下载composer
cd /etc/share/nginx/html
composer create-project topthink/think=5.0.* ../html  --prefer-dist #将代码下载到html文件夹下
  1. 修改代码
    docker 配置 nginx和php-fpm 跨服务器运行_第5张图片
  2. 查看结果

docker 配置 nginx和php-fpm 跨服务器运行_第6张图片

参考文档:

https://blog.csdn.net/weixin_34551601/article/details/115242284
https://www.cnblogs.com/fansik/p/6635813.html

第一个文档讲了fastcgi_pass参数socket和tcp连接的不同,第二个介绍了nginx和php-fpm不在同一台服务器时的配置。

你可能感兴趣的:(php,docker,docker,nginx,服务器,php)