使用Caddy替换Nginx运行网站

使用Caddy替换Nginx运行网站

Caddy的使用真的太傻瓜了!

参考文章:

本博客基于Caddy中文文档,结合其他文章进行介绍,上接本博客博文把hexo博客部署到VPS服务器,请注意,这次我们需要一个域名。

介绍

为什么要用 Caddy 替换掉 Nginx ?最主要的原因是 Caddy 能让网站自动支持 HTTPS。同样是使用 Let’s Encrypt,换成 Nginx 我们就必须手工操作,并且还需要设置三个月更新证书的计划任务。Caddy默认支持 http/2,很多东西都不需要我们配置了。另外它的配置文件也比 Nginx 的要简单很多,几十行的 Nginx 配置文件 Caddy 仅需要几行就可以搞定了。关于能否将Caddy用作正式的生产环境,目前来看还是有待商榷的,但是Caddy用为简单的Http服务器是没有问题的。

先决条件

  • 一个搭载CentOS 7 x64的VPS服务器
  • 一个域名example.com已被配置为指向VPS IP,具体方法参见把hexo博客部署到VPS服务器 域名部分
  • 已经利用git把hexo博客部署到VPS的/var/www/blog文件夹
  • 如果已经运行nginx的,需要nging -s stop关闭

安装

我们使用Caddy官方的一键安装脚本

大部分caddy的第三方一键脚本对于centOS都仅支持6.87.2版本(查看Linux版本方法cat /etc/centos-release)

在Linux,Mac或BSD操作系统上,使用以下命令安装Caddy最新稳定的系统特定版本:

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

Caddy二进制文件将被安装到该/usr/local/bin目录。使用以下命令确认:

1
which caddy

为了安全起见,切勿以root身份运行Caddy二进制文件。为了让Caddy能够以非root用户的身份绑定到特权端口(例如80,443),需要setcap。按如下所示运行该命令:

1
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

测试

默认情况下,Caddy使用当前目录(执行命令的目录,而不是caddy二进制文件所在目录)作为网站根目录,因此运行本地站点非常方便。

使用终端或者命令行,切换到站点目录所在:

1
2
cd path/to/my/site		# 在我们的服务器上是/var/www/blog
caddy

浏览器打开http://localhost:2015/,如果出现404页面,说明caddy运行正常。使用`Ctrl+C`退出,caddy将尽可能优雅中断。

配置

方案1:来自Caddy官方文档的快速开始

如果服务器设置了防火墙,则打开80和443端口

1
2
3
sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

请确保你的域名能解析到你的服务器,具体方法参见把hexo博客部署到VPS服务器 最后一部分

1
sudo caddy -host example.com

当第一次使用一个真正的域名(不是localhost)运行Caddy时,会出现提示要求输入你的email地址。这是因为Caddy需要验证你的域名,并将验证信息安全地存储在硬盘上。

Caddy必须将40和443端口绑定到一个真正的站点,这需要root或者Administrator的权限

现在我们的网站已经按照在运行了!

<全文完>


<其实并不,Caddy可以很简单的开始,但总有高阶玩家可以把简单的事情变得更复杂,当然,也更安全>

方案2:从Caddyfile开始

创建一个专门的系统用户:caddy 和一组同名的Caddy:

1
sudo useradd -r -d /var/www -M -s /sbin/nologin caddy

注意此处创建**的用户caddy只能用于管理Caddy服务,不能用于登录。

/var/www为Caddy Web服务器创建主目录,并/var/www/blog为您的站点创建主目录:

1
2
sudo mkdir -p /var/www/blog
sudo chown -R caddy:caddy /var/www

创建一个目录来存储SSL证书:

1
2
3
sudo mkdir /etc/ssl/caddy
sudo chown -R caddy:root /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy

创建专用目录来存储Caddy配置文件Caddyfile

1
2
sudo mkdir /etc/caddy
sudo chown -R root:caddy /etc/caddy

创建名为的Caddy配置文件Caddyfile 以下仅是一个普通配置,详细的配置参见本文Caddyfile部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sudo touch /etc/caddy/Caddyfile
sudo chown caddy:caddy /etc/caddy/Caddyfile
sudo chmod 444 /etc/caddy/Caddyfile
cat <<EOF | sudo tee -a /etc/caddy/Caddyfile
www.example.com {
redir https://example.com{uri}
}
example.com {
root /var/www/blog
gzip
tls example@outlook.com
header / Strict-Transport-Security "max-age=31536000"
gzip
errors {
404 404.html
403 403.html
}
}
EOF

使用caddy -conf /etc/caddy/Caddyfile 按照配置文件运行caddy。第一次运行会验证邮箱,并进行ssh申请等,等待后将网页浏览器指向http://example.comhttps://example.com。可看到网站运行的样子

关于Caddyfile的书写解释,可见本文Caddyfile部分

方案3:使用caddy.service(此部分有缺陷,未解决)

github: systemd Service Unit for Caddy

这部分目前我遇到的问题

  • 使用systemctl status caddy.service提示用户错误。错误的原因一个是systemd version太低,虽然caddy.service要求是219即可,实际上大概是需要229以上才行;
  • 文件夹权限的问题,涉及到用户和用户组,不太熟,如果把自己搞得ssh拒绝登录就傻了;

等有时间的时候再回头修这个吧😑

为了方便Caddy的操作,我们可以使用systemd为Caddy 设置一个单元文件,然后用它systemd`来管理Caddy。

1
2
3
curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service  # 从 github 下载 systemd 配置文件
chown root:root /etc/systemd/system/caddy.service # 配置权限
chmod 744 /etc/systemd/system/caddy.service

启动Caddy服务并使其在系统引导时自动启动:

1
2
3
4
5
6
7
8
# 重启systemd使服务生效
sudo systemctl daemon-reload
# 开始运行caddy服务
sudo systemctl start caddy.service
# 设置开机自启动
sudo systemctl enable caddy.service
# 查看caddy服务运行状态
sudo systemctl status caddy.service

最后,将网页浏览器指向http://example.comhttps://example.com。可看到网站运行的样子。

Caddyfile

**Caddyfile**用来告诉Caddy如何提供服务的文本文件。他通常和网站放在一起。
1
2
cd path/to/site
vim Caddyfile

Caddy的一般结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
www.mysite.com {
redir https://mysite.com{uri}
}
mysite.com {
root /var/www/blog
log / /var/log/caddy/mysite.log "{remote} {when} {method} {uri} {proto} {status} {size} {>User-Agent} {latency}"
tls 邮箱账号
header / Strict-Transport-Security "max-age=31536000"
gzip
errors {
404 404.html
403 403.html
}
expires {
match .css$ 1m
match .js$ 1m
match .png$ 1m
match .jpg$ 1m
}
ipfilter / {
rule block
blockpage /var/www/liuzhichao.com/403.html
ip 148.251.8.250 136.243.37.219 144.76.38.40 69.197.177.50 199.58.86.211 5.9.97.200 144.76.91.79
}

rewrite {
if {>User-agent} has "MJ12bot"
to /forbidden
}
status 403 /forbidden
}

说明:

1
2
3
www.mysite.com {
redir https://mysite.com{uri}
}

是将 www 跳转到非 www 的域名。

1
tls mail@mysite.com

tls后面改为你的邮箱地址,会自动配置 https。

1
header / Strict-Transport-Security "max-age=31536000"

是一条 https 的优化配置,加上之后,在SSLLabs上测试评分可以拿到A+,想想之前使用 Nginx 的时候,网络上找了各种配置参考都只优化到了 A,所以 Caddy 的自动 Https 功能确实还是很方便的。

1
2
3
4
errors {
404 404.html
403 403.html
}

是自定义错误页面配置。确保你网站的根目录有相应的文件,不然启动服务会报错。

1
2
3
4
5
6
expires {
match .css$ 1m
match .js$ 1m
match .png$ 1m
match .jpg$ 1m
}

expires 是控制页面的缓存,上面的配置是将 css,js,png,jpg 这样的静态资源缓存1个月。此配置依赖http.expires这个插件,如果你没有安装,配置后启动 caddy 会出错。

1
2
3
4
5
ipfilter / {
rule block
blockpage /var/www/liuzhichao.com/403.html
ip 148.251.8.250 136.243.37.219 144.76.38.40 69.197.177.50 199.58.86.211 5.9.97.200 144.76.91.79
}

ipfilter是根据配置过滤到一些非正常的 IP,可以查看访问log,经常会有一些爬虫频繁的访问网站,没有任何用处反而加大服务器的负载,对于这样的 IP 可以直接过滤掉。blockpage是配置这些 IP 访问网址时显示的页面,依赖http.ipfilter插件。

1
2
3
4
5
rewrite {
if {>User-agent} has "MJ12bot"
to /forbidden
}
status 403 /forbidden

与上面的ipfilter功能类似,都是过滤掉一些非正常的访问用户,不同的是ipfilter是屏蔽 IP,这段配置则是根据User-agent block掉一些爬虫。

title:使用Caddy替换Nginx运行网站

author:Anne416wu

link:https://www.annewqx.top/posts/2210/

publish time:2020-03-01

update time:2020-03-23


 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×