使用Caddy搭建Typecho

发布于 2019-03-22  12 次阅读


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

一、写在前面

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

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

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

操作系统为Ubuntu 18.04 LTS

二、Typcho下载

直接上命令,注意路径更改为自己的博客路径

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

1.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

2.Caddy配置文件(Caddyfile)

请直接参考这里官方文档!!!

以下是我的配置,如果你是按照我上面的操作的话,大概只需要更改为自己的路径和域名,以及邮箱

保存为/etc/caddy/Caddyfile

# 改! 域名或者IP
yuk7.com, www.yuk7.com {
    # 改! 域名或者IP
    redir https://www.yuk7.com{url}
}
# 改! 域名或者IP
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 .css1m
         match .js 1m
         match .png1m
         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,随便写点保存后,给权限chown www-data:www-data /var/log/caddy/blog.yuk7.com.log,再systemctl reload caddy.service重载配置文件

3.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`
    returnnum
}

proc_id()                                               # 进程号
{
    pid=`ps -ef | grep proc_name | grep -v grep | awk '{print2}'`
}
# 通过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

手动测试监控是否正常,运行systemctl stop caddy.service后再使用./monitor_caddy.sh,查看restart_caddy.log

接着使用crontab每5分钟运行一次脚本

使用crontab -e加入一行*/5 * * * * /root/monitor_caddy.sh

六、总结

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


一只正在转生画师的技术宅