New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Caddy 部署实践 #11

Open
Unknwon opened this Issue Nov 22, 2016 · 12 comments

Comments

5 participants
@Unknwon
Owner

Unknwon commented Nov 22, 2016

日期:2015-11-13
更新:2016-11-21

TL'DR Caddy 就是用 Go 语言实现的一款 Web 服务器

我最早接触到 Caddy 是偶然发现国内某个博客的简单介绍,然后上到 GitHub 一看发现竟然认识作者(一起在 GopherCon 吃过薯片算不算 😂),接着出于对 Go 写的程序的天然好感,于是就一直琢磨着什么时候可以赶个时髦把这货用上。

机缘巧合下,Gogs 项目前段时间得到 DO 的开源项目服务器赞助(顺便吐槽国内各大“云”主机各种无视请求邮件),于是就把我的服务器迁移到 DO 新开的加拿大机房,并且使用 Caddy 来替代 NGINX 作为我的 Web 服务器。踩到一些小坑,但整个过程还是挺满意的。

废话不多说,下面直接切入正题。

下载安装步骤简单粗暴,你可以直接从 官网 直接下载编译好的二进制。

但是我们这里会介绍到如何安装插件,所以还是从源码安装比较合适(这里使用 -d 表示只下载不编译):

$ go get -d github.com/mholt/caddy

接着,安装 Caddy 的插件管理器 caddyext

$ go get github.com/pedronasser/caddyext

我们可以先查看一下内置的插件都有哪些:

$ caddyext stack
Available Caddy directives/extensions:
   (✓) ENABLED | (-) DISABLED

   0. (✓) root (core)
   1. (✓) tls (core)
   2. (✓) bind (core)
   3. (✓) startup (core)
   4. (✓) shutdown (core)
   5. (✓) log (core)
   6. (✓) gzip (core)
   7. (✓) errors (core)
   8. (✓) header (core)
   9. (✓) rewrite (core)
   10. (✓) redir (core)
   11. (✓) ext (core)
   12. (✓) mime (core)
   13. (✓) basicauth (core)
   14. (✓) internal (core)
   15. (✓) proxy (core)
   16. (✓) fastcgi (core)
   17. (✓) websocket (core)
   18. (✓) markdown (core)
   19. (✓) templates (core)
   20. (✓) browse (core)

接下来安装 git 插件(安装 其它插件 的步骤是一样的)。

首先,你需要下载这个插件(🙄 坑了我半天,文档也妈蛋地没说,错误提示更是神乎其神):

$ go get github.com/abiosoft/caddy-git

然后,通过 caddyext 安装插件的语法是 caddyext install <自定义插件名称> <插件导入路径>

$ caddyext install git:github.com/abiosoft/caddy-git

检查一下是否安装成功:

$ caddyext stack
Available Caddy directives/extensions:
   (✓) ENABLED | (-) DISABLED

   ...
   18. (✓) markdown (core)
   19. (✓) templates (core)
   20. (✓) browse (core)
   21. (✓) git

不错,我们看到 git 是排位第 21 的插件。

这个数字表示插件的执行顺序,你可以使用 caddyext move 来改变默认顺序。不过内置插件直接有相互依赖关系,最好不要乱改内置插件的前后顺序。

除此之外,你还可以禁用某个插件等等,这里不做赘述。

此刻,终于可以编译我们的 Caddy 服务器啦!

$ go install github.com/mholt/caddy

如果你已经将 $GOPATH/bin 加入到环境变量 $PATH 中,那么可以直接执行 caddy 启动服务器:

$ caddy
[INFO] Processing certificate renewals...
0.0.0.0:2015

Caddy 的默认端口是 2015(因为作者想要强调这才是 2015 年应该使用的 Web 服务器 💀)。

如果这个时候你访问 http://localhost:2015 ,你会看到无比坑爹的 404 Not Found。连个欢迎页面都没有,简直不能忍。据作者说这是故意的,如果像 NGINX 那样放个欢迎页面就好比脱裤子放屁。。。😳

没事,我忍了,但是个人喜欢 NGINX 那样的提示,可以用来证明 Caddy 在我服务器正常运行。然后,我就利用它自带的功能 hack 一个简陋的欢迎页面。

将下面的内容保存到当前目录(也就是你正在执行 Caddy 的目录)下,命名为 index.html

<!DOCTYPE html>
<html>
	<head>
		<title>Welcome to Caddy</title>
	</head>
	<body>
		<h1>Welcome to Caddy</h1>
	</body>
</html>

然后重启 Caddy,再次访问 http://localhost:2015 。哈哈,请给我的机智点 32 个 👍

那么,如果是实际部署在服务器,你需要创建一个 Caddyfile 并输入以下内容让它监听在 80 端口(真的是简洁到爆有木有!):

:80

接下来的我就主要讲一下有关 Pugo.Static 的部署部分(也就是你正在浏览的这个玩意 博客新家已经投奔到 GitHub 了)。

我博客的域名是 wuwen.org,所以完整的 URL 就是 https://wuwen.org

我启动 Pugo.Static 的端口是默认的 9899,所以,我需要像 NGINX 那样,反向代理所有到 https://wuwen.org 的请求转发给 http://localhost:9899

献上我珍藏已久的配置(这里用到了 proxy 插件):

wuwen.org {
    proxy / localhost:9899
}

我要是不说,你可能都已经忘记我们刚才还装了 git 插件 😂 那么我们要怎么用呢?

wuwen.org {
    proxy / localhost:9899
    git https://github.com/Unknwon/wuwen.pugo.git /path/to/blog {
        interval 60
    }
}

意思很简单,每隔 60 秒从地址 https://github.com/Unknwon/wuwen.pugo.git 拉取内容到指定目录 /path/to/blog

好了,如此一来,我的博客不仅可以每分钟自动同步,还有了版本管理,并且自带云备份属性 ——(此处应有掌声 👏👏👏

最后,我们来看一下号称史上第一款、目前仅此一家内置 Let's Encrypt 支持的 Web 服务器,是如何 XXX 的。

没错,还是上面的这个配置,小伙伴们可能已经发现我的域名前面什么协议都没带,这就表示让 Caddy 自动向服务器自动申请 HTTPS 证书,并转发所有 HTTP 到 HTTPS。

那么。。要是证书过期了怎么办?表慌,Caddy 会全自动续期!

Caddy 会在启动后要求你输入申请的邮箱等信息(填错了直接把 ~/.caddy 删了重启)。

然后,嗯,就没有然后了,网站配置 HTTPS 就是这么任性。

然而它就这么赤裸裸地抛弃了传统的 HTTPS?显然没,我也还有用 StartSSL 证书的站点。配置如下:

https://gogs.io {
    tls /path/to/gogs.io.unified.crt /path/to/gogs.io-decrypted.key
    proxy / localhost:5555
}

(全文完)

最后奉上已经捂出汗的 Systemd 配置文件(不用的请绕道!)以供参考:

[Unit]
Description=Caddy Server
After=syslog.target
After=network.target

[Service]
User=root
Group=root
LimitNOFILE=64000
ExecStart=/usr/local/bin/caddy --conf=/path/to/Caddyfile
Restart=always

[Install]
WantedBy=multi-user.target

对性能感兴趣的朋友可以直接去 FAQ 页面查看和 NGINX 以及 Apache 的对比。

@Unknwon Unknwon added the Caddy label Nov 22, 2016

@MeowCold

This comment has been minimized.

Show comment
Hide comment
@MeowCold

MeowCold Feb 27, 2017

那如何301将wuwen.org指向www.wuwen.org?

MeowCold commented Feb 27, 2017

那如何301将wuwen.org指向www.wuwen.org?

@Unknwon

This comment has been minimized.

Show comment
Hide comment
@Unknwon

Unknwon Feb 27, 2017

Owner

@MeowCold

http://wuwen.org {
    redir http://www.wuwen.org{uri} 301
}
Owner

Unknwon commented Feb 27, 2017

@MeowCold

http://wuwen.org {
    redir http://www.wuwen.org{uri} 301
}
@MeowCold

This comment has been minimized.

Show comment
Hide comment
@MeowCold

MeowCold Feb 27, 2017

大神我现在好尴尬
我现在遇到的问题是
我使用了以caddy制作的docker镜像,而不知道怎么用了。虽然是自动给加了https,但不知道怎么修改301和wp的那种固定链接。只会用默认的233,大神有没有什么解决方案 求帮忙
https://github.com/BlackGlory/caddy-proxy

MeowCold commented Feb 27, 2017

大神我现在好尴尬
我现在遇到的问题是
我使用了以caddy制作的docker镜像,而不知道怎么用了。虽然是自动给加了https,但不知道怎么修改301和wp的那种固定链接。只会用默认的233,大神有没有什么解决方案 求帮忙
https://github.com/BlackGlory/caddy-proxy

@Unknwon

This comment has been minimized.

Show comment
Hide comment
@Unknwon

Unknwon Feb 27, 2017

Owner

讲真。。在 Docker 里用 Caddy 是给自己找蛋疼。。一个二进制就解决的事情。。过度设计。。

Owner

Unknwon commented Feb 27, 2017

讲真。。在 Docker 里用 Caddy 是给自己找蛋疼。。一个二进制就解决的事情。。过度设计。。

@MeowCold

This comment has been minimized.

Show comment
Hide comment
@MeowCold

MeowCold Feb 27, 2017

那如果拆出来 caddy在容器外运行 代理多个容器 端口转网址 301 和 固定链接怎么样
现在就三个容器 caddy-proxy,ghost,php

MeowCold commented Feb 27, 2017

那如果拆出来 caddy在容器外运行 代理多个容器 端口转网址 301 和 固定链接怎么样
现在就三个容器 caddy-proxy,ghost,php

@Unknwon

This comment has been minimized.

Show comment
Hide comment
@Unknwon

Unknwon Feb 27, 2017

Owner

。。。我不知道你在说什么。。你缺失的基础知识好像有点多。https://caddyserver.com/docs/proxy

Owner

Unknwon commented Feb 27, 2017

。。。我不知道你在说什么。。你缺失的基础知识好像有点多。https://caddyserver.com/docs/proxy

@MeowCold

This comment has been minimized.

Show comment
Hide comment
@MeowCold

MeowCold Feb 27, 2017

嗯 才接触几天 233

MeowCold commented Feb 27, 2017

嗯 才接触几天 233

@qiancy

This comment has been minimized.

Show comment
Hide comment
@qiancy

qiancy May 3, 2017

wuwen.org www.wuwen.org {
    proxy / localhost:9899
}

http://wuwen.org http://www.wuwen.org https://wuwen.org https://www.wuwen.org
worked

qiancy commented May 3, 2017

wuwen.org www.wuwen.org {
    proxy / localhost:9899
}

http://wuwen.org http://www.wuwen.org https://wuwen.org https://www.wuwen.org
worked

@Kevinl7

This comment has been minimized.

Show comment
Hide comment
@Kevinl7

Kevinl7 Apr 25, 2018

你好, caddy默认 是监听2015端口,
我Caddyfile 里设置
ojbk.fun { root /var/www gzip }
这样无法访问到。。。 现在必须每次这样操作 caddy -port 2015才可以正常访问
root@iZbp16z10dzvv6jyd1i6wrZ:/etc/caddy# caddy -port 2015 Activating privacy features... done. https://ojbk.fun http://ojbk.fun
但是 前段时间都好好的,想问下怎么解决。。。怎么加上那个80端口

Kevinl7 commented Apr 25, 2018

你好, caddy默认 是监听2015端口,
我Caddyfile 里设置
ojbk.fun { root /var/www gzip }
这样无法访问到。。。 现在必须每次这样操作 caddy -port 2015才可以正常访问
root@iZbp16z10dzvv6jyd1i6wrZ:/etc/caddy# caddy -port 2015 Activating privacy features... done. https://ojbk.fun http://ojbk.fun
但是 前段时间都好好的,想问下怎么解决。。。怎么加上那个80端口

@Unknwon

This comment has been minimized.

Show comment
Hide comment
@Unknwon

Unknwon Apr 25, 2018

Owner

@Kevinl7 因为你用了https 是 443 端口啊。。2015 能干嘛?你的配置也没有任何站点需要使用到 2015 啊。。所以可能干脆不监听了吧。我的猜测是这样

Owner

Unknwon commented Apr 25, 2018

@Kevinl7 因为你用了https 是 443 端口啊。。2015 能干嘛?你的配置也没有任何站点需要使用到 2015 啊。。所以可能干脆不监听了吧。我的猜测是这样

@zgjsntsm

This comment has been minimized.

Show comment
Hide comment
@zgjsntsm

zgjsntsm Apr 29, 2018

怎么结合php使用呢

zgjsntsm commented Apr 29, 2018

怎么结合php使用呢

@Unknwon

This comment has been minimized.

Show comment
Hide comment
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment