前言
作为一名PHPER
,大多人肯定最熟悉的还是LNMP或者LAMP,这里面的N和A分别指的是Nginx
和Apache
,但是在新生代WEB服务器中,Caddy
的使用也越来越被更多人熟知。
本篇文章只是记录这种技术栈的可实现性,个人折腾的探索笔记;在实际生产环境中,我们应该还是优先考虑Nginx
和Apache
,他们经过无数人的验证和踩坑,如果出现问题也可以在第一时间处理,而Caddy
在实际生产应用想和他们争雄还有很长路要走。
环境准备
假设你已经在你的debian11 系统中安装好了caddy2
和php
,如果没有,请看我前面写的两篇记录。
Laravel部署
其实类似的安装教程的一大堆,但基本都是针对Nginx和Apache,并不适用于Caddy,这里先给出一个完整的Caddy配置文件,
后面再解释为什么这样做。
Caddy的逻辑即简单又复杂,简单之处在于能看懂下面的Json配置大概也能明白什么意思,复杂在于可配置项多,而且相关教程很少。
{
"logging": {
"logs": {
"default": {
"writer": {
"output": "file",
"filename": "/var/log/caddy/access.log"
},
"level": "DEBUG"
}
}
},
"apps": {
"http": {
"servers": {
"laravel": {
"listen": [
":80",
":443"
],
"routes": [
{
"match": [
{
"host": [
"www.test.com"
],
"path": [
"/resources/*"
]
}
],
"handle": [
{
"handler": "file_server",
"root": "/www/laravel"
}
]
},
{
"match": [
{
"host": [
"www.test.com"
]
}
],
"handle": [
{
"handler": "rewrite",
"uri": "/index.php?{http.request.uri.query}"
},
{
"handler": "reverse_proxy",
"upstreams": [
{
"dial": "127.0.0.1:9000"
}
],
"transport": {
"protocol": "fastcgi",
"root": "/www/laravel/public",
"split_path": [
".php"
],
"env": {
"PHP_ADMIN_VALUE": "open_basedir=/www/laravel/:/tmp/"
},
"capture_stderr": true
}
}
]
}
]
}
}
}
}
}
伪静态规则
Laravel针对Nginx的伪静态规则原版是:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
转为Caddy就是:
{
"handler": "rewrite",
"uri": "/index.php?{http.request.uri.query}"
}
静态资源
一个完整的项目肯定不全部都是动态请求,还有很多静态资源,所以这部分就需要根据路由做不同的配置。
{
"match": [
{
"host": [
"www.test.com"
],
"path": [
"/resources/*"
]
}
],
"handle": [
{
"handler": "file_server",
"root": "/www/laravel"
}
]
}
FastCGI 对接配置
先保证PHP-FPM已经成功配置且启动,在通过Caddy的FastCGI把请求转发给PHP-FPM处理,同时保证最小权限都是caddy
用户/组,同时设置可访问路径open_basedir
,其实很多东西都是参考Nginx的配置做的对应转换。
PHP-FPM配置:
[global]
pid = /var/run/php-fpm-82.pid
error_log = /var/log/php-fpm-82.log
log_level = debug
[caddy]
listen = 127.0.0.1:9000
listen.backlog = 8192
listen.allowed_clients = 127.0.0.1
listen.owner = caddy
listen.group = caddy
listen.mode = 0666
user = caddy
group = caddy
pm = dynamic
pm.status_path = /phpfpm_82_status
pm.max_children = 150
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30
request_terminate_timeout = 100
request_slowlog_timeout = 30
slowlog = var/log/php-fpm-slow.log
Caddy转发对接:
{
"handler": "reverse_proxy",
"upstreams": [
{
"dial": "127.0.0.1:9000"
}
],
"transport": {
"protocol": "fastcgi",
"root": "/www/laravel/public",
"split_path": [
".php"
],
"env": {
"PHP_ADMIN_VALUE": "open_basedir=/www/laravel/:/tmp/"
},
"capture_stderr": true
}
}