• 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
    在这里插入图片描述

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

    容器ip
    nginx172.20.0.3
    php-fpm172.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 ,不用改也行,留空那么所有主机都可以连接了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    添加php文件
    mkdir -p /usr/share/nginx/html && echo "<php? phpinfo();"

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

    在这里插入图片描述

    配置nginx

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

    完整配置

    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;
        #}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

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

    在这里插入图片描述

    查看结果

    在这里插入图片描述

    测试thinkphp运行是否正常

    1. 修改nginx配置,由于thinkphp需要指定运行目录是public,所以location需要修改。
      在这里插入图片描述
      参考: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
    • 2
    • 3
    1. 修改代码
      在这里插入图片描述
    2. 查看结果

    在这里插入图片描述

    参考文档:

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

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

  • 相关阅读:
    谷粒商城(三)
    【11.2】【VP】Codeforces Round #728 (Div. 2)
    Vue常见指令补充(附加案例)
    Webmin--一个用于Linux基于Web的系统管理工具
    解决端口占用问题 Port xxxx was already in use
    Redis:高性能的开源缓存数据库
    微信小程序入门
    SmartIDE v1.0.23 一个非常不敏捷的发布
    数据可视化:理论与技术
    mysql 字段用了关键字, 无法插入更新数据
  • 原文地址:https://blog.csdn.net/smile14174/article/details/125457808