本教程采用docker自建镜像来搭建php-fpm服务
一,制做Docker基础镜像
主要是解决,通过dockerFile文件拉取基础Linux镜像慢或者拉不到的问题。使用alpine Linux来做基础镜像。
1. 先到官网下载镜像文件。下载【MINI ROOT FILESYSTEM】
https://dl-cdn.alpinelinux.org/alpine/v3.20/releases/x86_64/alpine-minirootfs-3.20.3-x86_64.tar.gz
2. 使用docker将文件导入做为基础docker Linux镜像
docker import alpine-minirootfs-3.20.3-x86_64.tar.gz alpine:3.20.3
二,在docker alpine Linux中编译php,并启用php-fpm扩展
1. 启动alpine Linux并下载php源码文件
docker run --name php-build -d -it alpine:3.20.3 /bin/sh
wget https://www.php.net/distributions/php-8.3.13.tar.gz
tar -zxvf php-8.3.13.tar.gz
2. 修改alpine软件包仓库地址
vim /etc/apk/repositories
# 替换成如下地址
http://mirrors.cloud.tencent.com/alpine/v3.20/main
http://mirrors.cloud.tencent.com/alpine/v3.20/community
3. 安装编译php的必须的软件包
apk add build-base pkgconfig libxml2-dev openssl-dev sqlite-dev curl-dev
4. 编译php,并启用php-fpm扩展
# 检测配置
./configure --prefix=/home/soft/php8.3.13 --with-mysqli --enable-fpm --with-zlib --with-openssl --with-curl
# 编译
make -j4
# 安装
make install
5. 从容器里把编译好的php环境复制到宿主机上
# 将编译好的文件进行打包
tar -czvf php8.3.13.tar.gz php8.3.13/
# 单独开个shell从容器中复制出编译好的php(路径与文件名自己要修改一下)
docker cp build-php:/home/soft/php8.3.13.tar.gz .
三,构建php-fpm镜像
DockerFile文件内容如下:
FROM alpine:1.0
WORKDIR /opt
ADD php8.3.13.tar.gz .
COPY repositories /etc/apk/repositories
RUN apk update && apk add libxml2 sqlite-libs libcurl
EXPOSE 9000
CMD ["/opt/php8.3.13/sbin/php-fpm", "-F","-O", "-y", "/opt/php-fpm.conf"]
repositories文件如下:
http://mirrors.cloud.tencent.com/alpine/v3.20/main
http://mirrors.cloud.tencent.com/alpine/v3.20/community
构建镜像的命令:
docker build -t php-fpm:demo .
四,启动php-fpm服务
php-fpm.conf文件内容如下,
其中重要的部分是listen.allowed_clients这个配置,修改成访问这个fpm服务的IP地址
[global]
pid = /var/run/php-fpm.pid
log_level = error
error_log = /var/log/php-fpm-error.log
[www]
user = nobody
group = nobody
listen = 0.0.0.0:9000
listen.backlog = -1
listen.allowed_clients = 172.18.0.3
listen.owner = nobody
listen.group = nobody
listen.mode = 0666
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.process_idle_timeout = 10s
pm.max_requests = 1024
pm.status_path = /status
slowlog = /var/log/php/php-fpm-slow.log
rlimit_files = 1024
rlimit_core = unlimited
chroot = /
php_admin_flag[log_errors] = 0
php_admin_flag[log_errors_max_len] = true
php_admin_value[error_log] = /var/log/php/php-fpm.log
php_admin_value[session.save_handler] = files
php_admin_value[session.save_path] = /var/lib/php/session
php_admin_value[session.gc_maxlifetime] = 1440
php_admin_value[session.gc_probability] = 1
php_admin_value[session.gc_divisor] = 100
php_admin_value[session.upload_progress.enabled] = 1
php_admin_value[session.upload_progress.cleanup] = 1
php_admin_value[session.upload_progress.name] = "PHP_SESSION_UPLOAD_PROGRESS"
php_admin_value[session.upload_progress.freq] = 1
php_admin_value[session.upload_progress.min_freq] = 1
构建容器的命令如下:
docker run --name fpm -v /opt/docker/php/d_v5/php-fpm.conf:/opt/php-fpm.conf -v /data/nginx/website/wordpress:/etc/nginx/website/wordpress -d --network blog-net php-fpm:demo
命令解析:
-v /opt/docker/php/d_v5/php-fpm.conf:/opt/php-fpm.conf:将宿主机的配置文件映射到窗口里
-v /data/nginx/website/wordpress:/etc/nginx/website/wordpress:映射wordPress文件,这里的配置要与nginx里的配置保持一样,不然访问不到相关页面。
–network blog-net:将此容器加入到一个docker的网络中,在网络中只需要使用容器名来访问就可以了,不过php-fpm.conf里的 listen.allowed_clients 还是要使用IP的,这个配置是允许访问的客户端ID,目前是nginx。
五,nginx的配置
upstream fpmserver {
server fpm:9000;
}
server {
listen 80;
server_name xxxx.site;
root /etc/nginx/website/wordpress;
client_max_body_size 2M;
index index.html index.php;
location ~ \.php$ {
root /etc/nginx/website/wordpress;
fastcgi_pass fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
}