Debian12 安装和配置 PHP7.4 + Caddy
之前我用的 Linux 版本一直是 CentOS7,这是一个十年前就已经推出的 CentOS 大版本,因为我运行的 PHP 和 MySQL 都不是新版本,所以一直也没什么影响。
最近需要运行几个 Node 项目,CentOS 的 yum 里的 Node 版本较老,通过官网下载的 Node 和 nvm 安装的 Node 最高只能是 16.x 版本,新版本的 Node 因为依赖库的问题,安装了也无法运行,只能通过编译的方式来安装。
除了 Node 外,很多新版本的软件,比如 Python 之类的,要在 CentOS7 运行也非常麻烦。
传统的 CentOS 系列已经停止维护,CentOS7 在 2014 年就已经停止维护了,为了避免后续的各种折腾,我现在需要把服务器的系统换成其它发行版的 Linux。
综合软件生态和资源占用来看,Debian 是一个不错的选择,Debian 之前我也用过一段时间,所以准备换成 Debian12,以后重装系统或更换服务器也不会再选择 CentOS。
这里简单记录一下我安装 PHP + MySQL + Caddy 的过程,如果要看 CentOS 的可以访问 Linux 安装和配置 Caddy + PHP + MySQL 。
因为 Debian12 的 PHP 和 MySQL 版本较新,要安装老版本会稍微繁琐一些,尤其是 MySQL5.7,只能手动下载软件包安装,内容会稍微有点多,所以把 MySQL5.7 分开写。
这篇文章主要是安装 PHP7.4 和 Caddy,MySQL 可以看 Debian12 安装 MySQL5.7。
安装 PHP
更新缓存:
apt update安装所需工具:
apt install -y ca-certificates apt-transport-https lsb-release wget gnupg2导入 deb.sury.org 的 GPG key:
wget -qO- https://packages.sury.org/php/apt.gpg | gpg --dearmor -o /usr/share/keyrings/php.gpg添加 sury 的 APT 源:
printf "deb [signed-by=/usr/share/keyrings/php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main\n" > /etc/apt/sources.list.d/php.list更新缓存:
apt update安装 PHP7.4 和常用扩展:
apt install -y php7.4 php7.4-fpm php7.4-cli php7.4-bcmath php7.4-gd php7.4-mbstring php7.4-mysql php7.4-sqlite3 php7.4-opcache php7.4-xml php7.4-soap php7.4-snmp php7.4-zip php7.4-curl php7.4-intl php7.4-mongodb php7.4-pgsql php7.4-dba php7.4-imagick php7.4-gmp php7.4-mcrypt php7.4-imap php7.4-yaml php7.4-msgpack安装完成后 PHP-FPM 应该会自动启动,这里让 PHP-FPM 开机自动启动:
systemctl enable --now php7.4-fpm查看一下 PHP 版本:
php -v输出:
PHP 7.4.33 (cli) (built: Jul 3 2025 16:45:48) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies安装 Caddy
Caddy 是一个使用 Go 编写的 Web 服务器,软件没有什么依赖,你可以直接访问 https://caddyserver.com/download?package=github.com%2Fcaddyserver%2Freplace-response%E2%80%8B ,选择 Linux amd64 ,直接下载单文件上传到服务器使用,也可以使用 apt 安装。
这里使用 apt 安装,下面的命令按顺序执行即可:
安装必要的工具:
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl下载 Caddy 仓库的 GPG 公钥并转换为 apt 可用的格式:
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg将 Caddy 仓库的源配置保存到 apt 的源列表文件中:
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list确保 apt 能读取 GPG 密钥文件:
chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg确保 apt 能读取仓库配置文件:
chmod o+r /etc/apt/sources.list.d/caddy-stable.list更新缓存:
apt update安装 Caddy:
apt install -y caddy安装完成后可以查看一下版本:
caddy version配置 PHP-FPM
PHP-FPM 是 PHP 的一个进程管理器,Caddy 收到客户端浏览器的请求后会把请求发给 PHP-FPM,PHP 程序处理完成后会把结果返回给 Caddy,Caddy 再把结果返回给客户端浏览器。
Caddy 和 PHP-FPM 的通信方式包括 TCP Sock 和 UNIX Sock,我这里还是使用 UNIX Sock。
root 用户的权限比较高,下面创建一个 www 用户作为 PHP-FPM 的运行用户:
useradd www下面需要编辑文件,你可以直接使用 Linux 自带的 vi 来编辑,关于 vi 的使用也可以看 Linux VI 编辑器简单使用教程 。
如果你不习惯在命令行编辑的话,也可以使用 Xftp 之类的软件把需要编辑的文件直接下载到本地编辑,编辑完成后再上传替换。
打开 /etc/php/7.4/fpm/pool.d/www.conf ,找到下面两行:
user = www-data
group = www-data把 www-data 改为 PHP-FPM 的运行用户:
user = www
group = www找到 listen ,如果是:
listen = /run/php/php7.4-fpm.sock就保持默认,如果不是就改为上面的 /run/php/php7.4-fpm.sock 。
找到 listen.owner 、listen.group 、listen.mode ,如果前面有 ; 就去除 ; ,按照下面的方式设置:
listen.owner = www
listen.group = www
listen.mode = 0666也就是设置为 PHP-FPM 的运行用户。
配置完成后保存,然后重启 PHP-FPM:
systemctl restart php7.4-fpm看一下 /run/php/php7.4-fpm.sock 是否存在,如果存在说明配置成功。
配置 Caddy
这里把 Caddy 的配置文件和网站放到 /www 目录,下面在根目录创建 www 目录,然后进入 /www 目录:
mkdir /www
cd /www在 /www 目录创建一个 Caddyfile 文件作为 Caddy 的配置文件:
touch Caddyfile打开 Caddyfile 文件开始编辑,下面配置一个简单的 PHP 网站:
# 网站域名
www.misterma.com {
# 网站目录
root * /www/web1
# 启用静态文件服务,否则无法加载 img、CSS、JS
file_server
# 配置 caddy 和 PHP 的通信方式和路径
php_fastcgi unix//run/php/php7.4-fpm.sock
}如果你没有域名或不想设置域名,可以把域名设置为 http://:80 ,其中的 80 就是端口号。
上面配置的存放网站页面的目录是 /www/web1 ,下面创建和进入 /www/web1 目录:
touch /www/web1
cd /www/web1可以在 /www/web1 目录下创建一个 index.php ,在 index.php 中添加代码测试:
<?php
phpinfo();Caddy 安装完成后可能会自动启动,这里先停止 Caddy:
systemctl stop caddy进入 /www 目录:
cd /www直接在 /www 目录运行 Caddy 测试:
caddy run如果启用了防火墙的话,可以开启 80 和 443 端口:
ufw allow 443,80/tcp现在可以在浏览器访问你配置的域名,配置没问题的话,应该可以看到类似下图的页面:

通过 caddy run 会直接在前台启动 Caddy,可以直接按 Ctrl + c 退出。
Caddy 安装完成后会自动创建 systemctl 的配置文件,但是默认不会使用 /www/Caddyfile 文件启动,下面让 systemctl caddy 使用 /www/Caddyfile 配置启动。
用于 Typecho 的 Caddy 配置
我的博客使用的就是 Typecho,如果你需要开启 Typecho 的地址重写功能可以使用下面的 Caddy 配置:
# 网站域名
www.misterma.com {
# 网站目录
root * /www/typecho
# 静态文件服务
file_server
# PHP 服务
php_fastcgi unix//run/php/php7.4-fpm.sock
# 压缩
encode gzip
# Typecho 的伪静态
handle_path / {
try_files {path} {path}/ /index.php/{uri}
}
# 禁止访问 .db 后缀的文件
@forbidden {
path *.db
}
respond @forbidden 404
# 日志
log {
output file /www/log/misterma.com.log {
roll_size 100mb
roll_keep 3
roll_keep_for 7d
}
}
}调整 Caddy 服务的启动配置
Caddy 安装完成后就会自动配置 service,但是 Caddy 配置的 service 使用的 Caddyfile 路径可能不是我们想要的路径,下面让 Caddy 的 service 使用指定的 Caddyfile 启动。
创建 /etc/systemd/system/caddy.service.d 目录:
mkdir /etc/systemd/system/caddy.service.d
cd /etc/systemd/system/caddy.service.d在 /etc/systemd/system/caddy.service.d 目录创建一个 override.conf 文件:
touch override.conf在 override.conf 文件中加入下面的内容:
[Service]
# 先清空原有的 ExecStart(systemd 覆盖 ExecStart 需要先置空)
ExecStart=
# 使用 /www/Caddyfile 启动
ExecStart=/usr/bin/caddy run --environ --config /www/Caddyfile
# 使用 /www/Caddyfile 重载
ExecReload=/usr/bin/caddy reload --config /www/Caddyfile上面的 /www/Caddyfile 就是指定使用的 Caddyfile。
配置完成后重新加载 systemd:
systemctl daemon-reloadCaddy 的 caddy.service 文件在 /etc/systemd/system/multi-user.target.wants/caddy.service ,你也可以直接改这个文件。
禁用 PHP 的一些危险函数
打开 /etc/php/7.4/fpm/php.ini ,找到 disable_functions ,如果前面有 ; 就去除 ; ,在 = 后面加入你需要禁用的函数,函数之间用英文逗号分隔。
下面是一些推荐禁用的函数:
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,eval,create_function,exec,shell_exec,system,passthru,proc_open,popen,proc_close,proc_get_status,proc_nice,proc_terminate,phpinfo,show_source,dl设置完成后保存,然后重启 PHP-FPM。
上面的 disable_functions 设置是我使用的设置,你也可以根据实际需求来调整。
/etc/php/7.4/fpm/php.ini 的设置只会影响 PHP-FPM,不会影响 PHP-CLI,也就是只会影响网站,在命令行直接通过 php 运行 PHP 文件不受影响。
常用命令
通过 apt 安装的 PHP 和 Caddy 安装完成后会自动配置 service,可以很方便的通过 systemctl 来操作。
PHP-FPM
启动 PHP-FPM:
systemctl start php7.4-fpm停止 PHP-FPM:
systemctl stop php7.4-fpm重启 PHP-FPM:
systemctl restart php7.4-fpm查看 PHP-FPM 运行状态:
systemctl status php7.4-fpmCaddy
启动 Caddy:
systemctl start caddy停止 Caddy:
systemctl stop caddy重启 Caddy:
systemctl restart caddy查看 Caddy 运行状态:
systemctl status caddy直接使用当前目录的 Caddyfile 配置启动 Caddy:
caddy run使用 caddy run 启动 Caddy 之前需要先停止 systemctl 的 Caddy 服务。
版权声明:本文为原创文章,版权归 Changbin's Blog 所有,转载请联系博主获得授权。
本文地址:https://www.misterma.com/archives/959/
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。