场景介绍:由于我的一个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 |
---|---|
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? phpinfo();"
注意这是在php-fpm那台服务器,如果实际部署,我们的文件是需要挂在到这里。记得修改后要启动或重启php-fpm,
php-fpm7
,alpine里面这个命令有点怪异。
配置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
查看结果
测试thinkphp运行是否正常
- 修改nginx配置,由于thinkphp需要指定运行目录是public,所以location需要修改。
参考:https://www.kancloud.cn/manual/thinkphp5/177576 - 在php-fpm那个服务器下载thinkphp代码
apk add composer #下载composer
cd /etc/share/nginx/html
composer create-project topthink/think=5.0.* ../html --prefer-dist #将代码下载到html文件夹下
- 修改代码
- 查看结果
参考文档:
https://blog.csdn.net/weixin_34551601/article/details/115242284
https://www.cnblogs.com/fansik/p/6635813.html
第一个文档讲了fastcgi_pass参数socket和tcp连接的不同,第二个介绍了nginx和php-fpm不在同一台服务器时的配置。