之前我用的 Linux 版本一直是 CentOS7,这是一个十年前就已经推出的 CentOS 大版本,因为我运行的 PHP 和 MySQL 都不是新版本,所以一直也没什么影响。

最近需要运行几个 Node 项目,CentOS 的 yum 里的 Node 版本较老,通过官网下载的 Nodenvm 安装的 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.ownerlisten.grouplisten.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

现在可以在浏览器访问你配置的域名,配置没问题的话,应该可以看到类似下图的页面:

phpinfo信息截图

通过 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-reload

Caddy 的 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-fpm

Caddy

启动 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 服务。