2023-01-11,换成了香港服务器,完善重构一下文章,新增了caddy异常监控脚本

写在前面

继重装macOS和Android后,咱终于也把自己最不熟悉的服务器给重装了,服务商和主题也换了,特此记录下,以备不时再用=。=,也希望能帮到各位吧。

一直以来,我都是使用Nginx + Mysql的组合,使用Let’s Encrypt的SSL配合脚本自动续期,每次都要折腾不少时间…

开始之所以去尝试Caddy就是被大佬安利,看上了它操作简单去的,本体更是简单到只有一个文件,用 Go 写的 Web 服务器,配置简洁,能一键开启并续期 HTTPS (Let’s Encrypt),省事多了啊,官网还有不少插件可以安装,分分钟即可搭建好个博客或者文件管理 操作系统为Ubuntu 18.04 LTS

Typcho下载

直接上命令,将路径/var/www/blog.yuk7.com修改即可

mkdir /var/www/blog.yuk7.com && cd /var/www/blog.yuk7.com
# 下载开发版
wget http://typecho.org/build.tar.gz
tar -zxvf build.tar.gz
cd build
mv * ../
sudo chown -R www-data:www-data /var/www

安装PHP7.2和Sqlite 3

#更新系统
apt-get update -y
#安装PHP 7和Sqlite 3
apt-get install php7.2-cgi php7.2-fpm php7.2-curl php7.2-gd php7.2-mbstring php7.2-xml php7.2-sqlite3 sqlite3 -y

Caddy

Caddy下载安装

官网记下你要使用到的插件名字,然后添加到下面的代码末尾运行安装即可 咱这里搭建博客只用到了http.cachehttp.expires插件

curl https://getcaddy.com  bash -s personal

# 例如我要使用到http.cache和http.expires的插件,运行
curl https://getcaddy.com  bash -s personal http.cache,http.expires

# 安装后可以使用caddy -plugins来查看自己已安装的插件列表
# 如果安装后又想加个插件时重新运行以上命令添加新插件名称至末尾

安装完成后,使用which caddy应该就会显示/usr/local/bin/caddy

Caddy配置文件(Caddyfile)

请直接参考这里官方文档!!! 以下是我的配置,如果你是按照我上面的操作的话,大概只需要更改为自己的路径和域名,以及邮箱,保存为/etc/caddy/Caddyfile

yuk7.com, www.yuk7.com {
    redir https://www.yuk7.com{url}
}
https://www.yuk7.com, https://blog.yuk7.com {
    # 如果不需要记录log也可以直接删掉这一行
    log / /var/log/caddy/blog.yuk7.com.log "{remote} {when} {method} {uri} {proto} {status} {size} {>User-Agent} {latency}"
    cache
    gzip {
        level 4
    }
    tls admin@yuk7.com
    header / Strict-Transport-Security "max-age=31536000"
    expires {
         match .css$ 1m
         match .js$ 1m
         match .png$ 1m
         match .jpg$ 1m
    }
    root /var/www/blog.yuk7.com
    fastcgi / /run/php/php7.2-fpm.sock php
    rewrite {
        if {path} not_match ^\/admin
        to {path} {path}/ /index.php?{query}
     }
}

其中使用到的cache需要提前安装好http.cache插件,expires也需要http.expires插件。

log文件操作

vim /var/log/caddy/blog.yuk7.com.log # 新建log文件,vim用shift+z+z即可快速保存退出
chown www-data:www-data /var/log/caddy/blog.yuk7.com.log # 配置权限
systemctl reload caddy.service # 重载

Caddy开机自启

这里我们选择使用systemd实现 先去下载官方提供的caddy.service到/etc/systemd/system/。

sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service

脚本里面用到了几个文件和文件夹需要我们自己手动创建,当然你也可以自己更改目录 /etc/caddy 放 Caddy 的配置文件,/etc/ssl/caddy 放证书,/var/www 是默认的网站目录。

sudo mkdir /etc/caddy /etc/ssl/caddy /var/www
sudo chown -R root:www-data /etc/caddy
sudo chown -R www-data:root /etc/ssl/caddy
sudo chown www-data:www-data /var/www
sudo chmod 0770 /etc/ssl/caddy
sudo touch /etc/caddy/Caddyfile

让 Caddy 开机自启

sudo systemctl daemon-reload
sudo systemctl enable caddy.service

接着可以重启运行ps -ef grep caddy看看是否是否起作用。

如果没有使用systemctl status caddy.service查看报错,一般都是什么文件权限之类的小问题 Caddy的部分到此为止了。

接下来就是紧张刺激的安装Typecho了 然后浏览器打开你的域名/IP,不出意外就会见到Typecho的安装界面了,简单设置几个密码后,博客就搭建好了。

脚本监控caddy

之前遇到过几次caddy挂了的情况,手动重启一下就好了,但是这事还是扔给脚本去做吧~

以下脚本可以直接套用,只要把21行中的域名改成自己的即可

#! /bin/bash

host_dir="/root/"                                       # 当前用户根目录
proc_name="caddy"                                       # 进程名
file_name="restart_caddy.log"                           # 日志文件
pid=0

proc_num()                                              # 计算进程数
{
    num=`ps -ef  grep $proc_name  grep -v grep  wc -l`
    return $num
}

proc_id()                                               # 进程号
{
    pid=`ps -ef  grep $proc_name  grep -v grep  awk '{print $2}'`
}
# 通过curl模拟登录获取http_code,模拟登录参数仅供参考
# 如果只需要判断某页面的状态可使用curl -I -s -w "%{http_code}" -o /dev/null http://www.baidu.com/ 直接获取即可
# http_code=`curl -I -s -w "%{http_code}" -o -d "userKey=admin&pass=c9127e832b41a" /dev/null  http://portal.ly-sky.com/login.do?login=  head -n 1  cut -d$' ' -f2`
http_code=`curl -I -s -w "%{http_code}" -o /dev/null https://www.yuk7.com/`

proc_num
number=$?
if [[ $number -eq 0 ]][[ $http_code -ne 200 ]] # 判断进程是否存在,页面状态是否是200
then
    # nohup ./run.sh>../logs/urp.log 2>&1 &    # 重启进程的命令,请相应修改
    # nohup /usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp -quic &
    systemctl restart caddy.service
    sleep 3                                  #延迟3秒是为了确保进程已正常启动并方便获取pid,否则有可能获取不到pid
    proc_id                                         # 获取新进程号
    echo $pid, `date` >> $host_dir$file_name     # 将新进程号和重启时间记录
fi

修改权限并设置定时运行

chmod 700 monitor_caddy.sh
crontab -e # 加入下面这一行即可
*/5 * * * * /root/monitor_caddy.sh

手动测试监控是否正常

systemctl stop caddy.service
./monitor_caddy.sh
cat restart_caddy.log # 如果有内容则代表脚本正常

总结

Caddy的配置的确很简单,配合PHP 7.2Sqlite 3总共占的内存比使用Nginx+PHP 7.2+Mysql小了不少,性能差距咱也没有感觉有啥差,吹爆~