Caddy Web Server 自v2.6 版本发布以后,就默认支持 HTTP/3。可以说是最早支持 HTTP/3 的 Web Server,而 Nginx 直到 2023 年 5 月 23 日 1.25.0 版本才开始体验支持。
至于 Apache httpd 也不知道要到猴年马月才支持 HTTP/3 了。
按照本文教程,即可搭建 LCMP (Linux + Caddy2 + MariaDB + PHP) 环境。同时亦可使用本文提供的脚本,快速安装。
LCMP 一键安装脚本
Caddy 全部由 Teddysun Repository 提供。
MariaDB 由 MariaDB Repository 提供。
PHP 的 rpm 由 Remi Repository 提供,deb 由 deb.sury.org 提供。
Caddy 的 rpm 和 deb 全部由本人自行编译。理由如下:
1. 新增以下几个模块:
caddy.adapters.nginx caddy.logging.encoders.formatted caddy.logging.encoders.transform dns.providers.cloudflare http.handlers.forward_proxy http.handlers.replace_response http.handlers.webdav http.reverse_proxy.transport.http_ntlm
2. 使用最新的 Go 1.25.7 来编译,以后也将跟随 Go 语言的最新版本来持续更新。
就是想简单搭建一个 Web 服务器,支持 MariaDB 和 PHP 而已,又对编译安装感到不耐烦?
没关系,来吧,LCMP (Linux + Caddy2 + MariaDB + PHP ) 一把梭,一般 5 – 10 分钟就能搞定环境搭建。
支持系统:
Enterprise Linux 8 / 9 / 10 (CentOS Stream, RHEL, Rocky Linux, AlmaLinux, Oracle Linux)
Debian 11 / 12 / 13
Ubuntu 20.04 / 22.04 / 24.04
支持架构:
x86_64 (amd64)
aarch64 (arm64)
详情:
https://lamp.sh/12.html
https://github.com/teddysun/lcmp
安装完成后浏览器打开的默认页:

使用上述 LCMP 一键安装脚本安装,则可以跳过下文第 1 至 5 的安装和设置过程,最后第 6 步的升级则需要注意。
1. 事前准备
禁用 SElinux
cat /etc/selinux/config
如果没有发现 SELINUX=disabled 这一行,则需要禁用。
sed -i 's@^SELINUX.*@SELINUX=disabled@g' /etc/selinux/config setenforce 0
如果系统是 Enterprise Linux 9 / 10,则需要用如下方法禁用。
grubby --update-kernel ALL --args selinux=0
然后执行 reboot 重启系统。待到重启完成即禁用了 SElinux。
设置防火墙 firewall
firewall-cmd --state
如果显示是 running 状态,则需要放行 80 和 443 端口,也就是 http 和 https 服务。
default_zone=$(firewall-cmd --get-default-zone)
firewall-cmd --permanent --add-service=https --zone=${default_zone}
firewall-cmd --permanent --add-service=http --zone=${default_zone}
firewall-cmd --permanent --add-port=443/udp --zone=${default_zone}
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
firewall-cmd --list-all
2. 安装和设置 Caddy Web Server
执行以下命令安装 Teddysun Linux Repository:
适用于 Enterprise Linux 8 (CentOS Stream 8, RHEL 8, Rocky Linux 8, AlmaLinux 8, Oracle Linux 8) 的安装命令
dnf install -y https://dl.lamp.sh/linux/rhel/el8/x86_64/teddysun-release-1.0-1.el8.noarch.rpm
适用于 Enterprise Linux 9 (CentOS Stream 9, RHEL 9, Rocky Linux 9, AlmaLinux 9, Oracle Linux 9) 的安装命令
dnf install -y https://dl.lamp.sh/linux/rhel/el9/x86_64/teddysun-release-1.0-1.el9.noarch.rpm
适用于 Enterprise Linux 10 (CentOS Stream 10, RHEL 10, Rocky Linux 10, AlmaLinux 10, Oracle Linux 10) 的安装命令
dnf install -y https://dl.lamp.sh/linux/rhel/el10/x86_64/teddysun-release-1.0-1.el10.noarch.rpm
安装 Caddy,显示版本号
dnf makecache dnf install -y caddy && caddy version
创建必要的目录,设置目录权限
mkdir -p /data/www/default mkdir -p /var/log/caddy/ mkdir -p /etc/caddy/conf.d/ chown -R caddy.caddy /data/www/default chown -R caddy.caddy /var/log/caddy/
网站的根目录为 /data/www/default,等全部的安装过程结束后,便可将应用程序放到该目录下运行了。
编辑 caddy 默认配置文件 /etc/caddy/Caddyfile
{
admin off
}
:80 {
# Set this path to your site's directory.
root * /data/www/default
encode gzip
# Enable the static file server.
file_server {
index index.html
}
# Serve a PHP site through php-fpm:
php_fastcgi unix//run/php-fpm/www.sock
log {
output file /var/log/caddy/access.log
}
}
import /etc/caddy/conf.d/*.conf
caddy 默认只开启了 80 端口,如果想要搭建自己的网站,则需要手动创建配置文件并重启 caddy 服务。
创建网站,以 www.example.com 为例。
创建 /etc/caddy/conf.d/www.example.com.conf 配置文件,内容如下:
www.example.com {
header {
Strict-Transport-Security "max-age=31536000; preload"
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
}
# Set this path to your site's directory.
root * /data/www/default
encode gzip
# Serve a PHP site through php-fpm:
php_fastcgi unix//run/php-fpm/www.sock
# Enable the static file server.
file_server {
index index.html
}
log {
output file /var/log/caddy/ssl_access.log {
roll_size 100mb
roll_keep 3
roll_keep_for 7d
}
}
}
3. 安装和设置 MariaDB
引入 MariaDB repo 以及安装 MariaDB
wget -qO mariadb_repo_setup.sh https://downloads.mariadb.com/MariaDB/mariadb_repo_setup chmod +x mariadb_repo_setup.sh
当前 MariaDB 的长期支持版本为 10.6, 10.11, 11.4, 11.8,选择 11.4 即可。
./mariadb_repo_setup.sh --mariadb-server-version=mariadb-11.4
上述脚本执行完毕后,即引入 MariaDB repo,下面开始安装 MariaDB。
dnf install -y MariaDB-common MariaDB-server MariaDB-client MariaDB-shared MariaDB-backup
安装完毕后,编辑 /etc/my.cnf.d/server.cnf,使其默认编码为 utf8mb4
lnum=$(sed -n '/\[mariadb\]/=' /etc/my.cnf.d/server.cnf)
sed -i "${lnum}acharacter-set-server = utf8mb4\n\n\[client-mariadb\]\ndefault-character-set = utf8mb4" /etc/my.cnf.d/server.cnf
启动 MariaDB
systemctl start mariadb
修改用户 root 的密码,删除 test 数据库及不必要的用户名。
db_pass="Thisisdbrootpassword"
mysql -e "grant all privileges on *.* to root@'127.0.0.1' identified by \"${db_pass}\" with grant option;"
mysql -e "grant all privileges on *.* to root@'localhost' identified by \"${db_pass}\" with grant option;"
mysql -uroot -p${db_pass} 2>/dev/null <<EOF
drop database if exists test;
delete from mysql.db where user='';
delete from mysql.db where user='PUBLIC';
delete from mysql.user where user='';
delete from mysql.user where user='mysql';
delete from mysql.user where user='PUBLIC';
flush privileges;
exit
EOF
4. 安装和设置 PHP
引入 PHP repo
如果系统是 Enterprise Linux 9 (CentOS 9, RHEL 9, Rocky Linux 9, AlmaLinux 9) x86_64 aarch64
dnf config-manager --set-enabled crb dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
如果系统是 Enterprise Linux 8 (CentOS 8, RHEL 8, Rocky Linux 8, AlmaLinux 8) x86_64
dnf config-manager --set-enabled powertools dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
安装 PHP
如果系统是 Enterprise Linux 9 (CentOS 9, RHEL 9, Rocky Linux 9, AlmaLinux 9), Enterprise Linux 8 (CentOS 8, RHEL 8, Rocky Linux 8, AlmaLinux 8)
dnf module reset -y php dnf module install -y php:remi-8.2
接着安装 PHP 其他必要的组件。
dnf install -y php-cli php-bcmath php-embedded php-gd php-imap php-mysqlnd php-dba php-pdo php-pdo-dblib php-pgsql php-odbc php-enchant php-gmp php-intl php-ldap php-snmp php-soap php-tidy php-opcache php-process php-pspell php-shmop php-sodium php-ffi php-brotli php-lz4 php-xz php-zstd dnf install -y php-pecl-imagick-im7 php-pecl-zip php-pecl-mongodb php-pecl-swoole5 php-pecl-grpc php-pecl-yaml php-pecl-uuid
确认安装 PHP 版本及模块。
php -v php -m
编辑 PHP 的 php-fpm 配置文件 /etc/php-fpm.d/www.conf,使其支持 caddy
sed -i "s@^user.*@user = caddy@" /etc/php-fpm.d/www.conf sed -i "s@^group.*@group = caddy@" /etc/php-fpm.d/www.conf sed -i "s@^listen.acl_users.*@listen.acl_users = apache,nginx,caddy@" /etc/php-fpm.d/www.conf sed -i "s@^;php_value\[opcache.file_cache\].*@php_value\[opcache.file_cache\] = /var/lib/php/opcache@" /etc/php-fpm.d/www.conf
更改 PHP 的目录权限,使其支持 caddy
chown root:caddy /var/lib/php/{session,wsdlcache,opcache}
编辑 PHP 的配置文件 /etc/php.ini,使其更加符合生产环境,以及支持 MariaDB 连接
sed -i "s@^disable_functions.*@disable_functions = passthru,exec,shell_exec,system,chroot,chgrp,chown,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore@" /etc/php.ini
sed -i "s@^max_execution_time.*@max_execution_time = 300@" /etc/php.ini
sed -i "s@^max_input_time.*@max_input_time = 300@" /etc/php.ini
sed -i "s@^post_max_size.*@post_max_size = 50M@" /etc/php.ini
sed -i "s@^upload_max_filesize.*@upload_max_filesize = 50M@" /etc/php.ini
sed -i "s@^expose_php.*@expose_php = Off@" /etc/php.ini
sed -i "s@^short_open_tag.*@short_open_tag = On@" /etc/php.ini
sock_location="/var/lib/mysql/mysql.sock"
sed -i "s#mysqli.default_socket.*#mysqli.default_socket = ${sock_location}#" /etc/php.ini
sed -i "s#pdo_mysql.default_socket.*#pdo_mysql.default_socket = ${sock_location}#" /etc/php.ini
5. 启动 PHP 和 caddy 服务
启动 PHP 的 php-fpm 服务
systemctl start php-fpm
启动 caddy 服务
systemctl start caddy
允许 mariadb, php-fpm, caddy 服务开机自启动
systemctl enable mariadb systemctl enable php-fpm systemctl enable caddy
确认 mariadb, php-fpm, caddy 服务状态
systemctl status mariadb systemctl status php-fpm systemctl status caddy
确认 mariadb, php-fpm, caddy 服务的进程
ps -ef | grep -v grep | grep "/usr/bin/caddy" ps -ef | grep -v grep | grep php-fpm ps -ef | grep -v grep | grep mariadbd
6. 升级 PHP 版本的注意事项
当 PHP 有新版本需要升级时,只需执行以下命令即可。
dnf update -y php-*
需要注意的是,升级 PHP 后,会覆盖掉之前更改过的 PHP 目录权限,所以还需要将下列目录权限再次修改一下(该注意事项仅针对安装 rpm 包的系统)。
chown root:caddy /var/lib/php/{session,wsdlcache,opcache}
当 MariaDB 有新版本需要升级时,只需执行以下命令即可。
dnf update -y MariaDB-*
当 Caddy 有新版本需要升级时,只需执行以下命令即可。
dnf update -y caddy
安装了 phpmyAdmin 后,其配置信息如下图:

写在最后
请关注我的 Telegram 频道:https://t.me/qiushuiyibing
我会在此不定期发布一些杂七杂八的作品。
同时也欢迎加入交流群:https://t.me/qiushui2018


/etc/caddy/conf.d/下创建另外一个 conf 文件,比如www.example2.com.conf,然后重启 Caddy 服务(systemctl restart caddy)即可。