使用 Caddy + MariaDB + PHP 架设 LCMP

使用 Caddy + PHP + MariaDB 架设并配置站点。

前言

以前一直使用的是 Hugo + Github + Vercel;即上传本地网站项目到 Github 然后通过 Vercel 进行自动部署以及发布网站。一开始还好,但是到后面就感觉比较麻烦了;每次更新文章或者后期文章有修改的话就需要重新上传部署;所以后面就改成了 Typecho。而最近又开始折腾起了 Caddy,需要搭建 LCMP 环境,所以在这里进行一个记录,避免以后踩坑。


安装及配置

安装Caddy

我使用的是 Debian 10 系统

apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install caddy

安装 MariaDB

可以使用 Oneinstack 自动安装,参考:一键安装 LNMP 及开设站点

这里主要讲讲通过 apt 包管理器安装

首先安装 MariaDB:

apt update
apt install -y mariadb-server mariadb-common mariadb-client

MySQL 或者 MariaDB 都行,看个人选择进行安装,两个差别不大

按照下面简单修改下配置,文件位于 /etc/mysql/mariadb.conf.d/50-server.cnf

[client]
default-character-set = utf8mb4

[mysqld]
innodb_buffer_pool_size = 64M
max_allowed_packet = 500M
net_read_timeout = 3600
net_write_timeout = 3600

[mariadb]
character-set-server = utf8mb4

[client-mariadb]
default-character-set = utf8mb4

启动 MariaDB 并进行安全设置

systemctl start mariadb
mysql_secure_installation

过程如下:

# 输入初始密码,回车即可
Enter current password for root (enter for none): 
OK, successfully used password, moving on...

# 设置密码
Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!

# 移除匿名用户
Remove anonymous users? [Y/n] y
 ... Success!

# 是否禁止非本地登录
Disallow root login remotely? [Y/n] n
 ... skipping.

# 是否移除测试数据
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

# 是否重新刷新权限
Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

Thanks for using MariaDB!

安装 PHP

通过 apt list php* 可以看到 Debian10 下 PHP 版本为 7.3,然后来安装 PHP 及其组件

apt update
apt install -y php7.3 php7.3-bcmath php7.3-bz2 php7.3-cgi php7.3-cli php7.3-common php7.3-curl php7.3-dba php7.3-enchant php7.3-fpm php7.3-gd php7.3-gmp php7.3-imap php7.3-interbase php7.3-intl php7.3-json php7.3-ldap php7.3-mbstring php7.3-mysql php7.3-odbc php7.3-opcache php7.3-pgsql php7.3-phpdbg php7.3-pspell php7.3-readline php7.3-recode php7.3-snmp php7.3-soap php7.3-sqlite3 php7.3-sybase php7.3-tidy php7.3-xml php7.3-xmlrpc php7.3-xsl php7.3-zip

按照下面简单修改下配置文件,位于 /etc/php/7.3/fpm/pool.d/www.conf

user = caddy
group = caddy
listen.owner = caddy
listen.group = caddy
listen.acl_users = caddy
listen.allowed_clients = 127.0.0.1
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/www-slow.log
php_admin_value[error_log] = /var/log/www-error.log
php_admin_flag[log_errors] = on

# 最后添加如下
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache
php_value[opcache.file_cache]   = /var/lib/php/opcache

然后按照下面简单修改下 php.ini,位于 /etc/php/7.3/fpm/php.ini

disable_functions = passthru,exec,shell_exec,system,chroot,chgrp,chown,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore
max_execution_time = 300
max_input_time = 300
post_max_size = 128M
upload_max_filesize = 128M
expose_php = Off
short_open_tag = On
mysqli.default_socket = /run/mysqld/mysqld.sock
pdo_mysql.default_socket = /run/mysqld/mysqld.sock

设置下权限

chown caddy:caddy /var/lib/php/session
chown caddy:caddy /var/lib/php/wsdlcache
chown caddy:caddy /var/lib/php/opcache

Caddy 配置

修改 Caddyfile 配置,拿不准的可以下载下来进行编辑,然后再上传,文件路径为 /etc/caddy/Caddyfile

vim /etc/caddy/Caddyfile

我的配置如下:

example.com {

    # 网站根目录
    root * /var/www/xx

    # Typecho 伪静态,建议安装完程序后写入
    @key1 {
        not file
        path_regexp key1 '(.*)'
    }
    rewrite @key1 /index.php{re.key1.1}

    # 开启 gzip
    encode gzip

    # 错误页面
    handle_errors {
        rewrite * /{err.status_code}.html
        file_server
    }

    # 使用 unix socket 通信
    php_fastcgi /run/php/php7.3-fpm.sock
    file_server

    # 设置 TLS
    tls mail@example.com
}

若使用 Oneinstack 自动安装方式,php_fastcgi 设置为 unix//dev/shm/php-cgi.sock 伪静态可以在网上查找对应程序的伪静态规则,然后通过 伪静态转换工具 进行转换,伪静态规则建议等上传并安装完程序后再写入到配置中

配置完成后使用 caddy adapt 命令进行检查:

caddy adapt --config /etc/caddy/Caddyfile

确认无报错后,重载 Caddyfile :

caddy reload --config /etc/caddy/Caddyfile

重启 Caddy 并添加自启动

systemctl restart caddy
systemctl enable caddy

注意!网站根目录权限应遵循:

文件 644 文件夹 755 权限用户和用户组 caddy ,其余文档 777 权限是不正常的 如出现文件权限问题时,请执行下面 3 条命令:

chown -R caddy:caddy /data/www/
find /data/www/ -type d -exec chmod 755 {} \;
find /data/www/ -type f -exec chmod 644 {} \;