MENU

caddy2 + laravel 项目简易部署教程

November 1, 2023 • Read: 673 • 随心笔记

前言

作为一名PHPER,大多人肯定最熟悉的还是LNMP或者LAMP,这里面的N和A分别指的是NginxApache,但是在新生代WEB服务器中,Caddy的使用也越来越被更多人熟知。
本篇文章只是记录这种技术栈的可实现性,个人折腾的探索笔记;在实际生产环境中,我们应该还是优先考虑NginxApache,他们经过无数人的验证和踩坑,如果出现问题也可以在第一时间处理,而Caddy在实际生产应用想和他们争雄还有很长路要走。

环境准备

假设你已经在你的debian11 系统中安装好了caddy2php,如果没有,请看我前面写的两篇记录。

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
  }
}

参考