使用新一代的Web服务器Caddy代替Nginx

Nginx算是最常用的Web服务器了,不管是作为静态服务器还是逆向代理转发,基本上每台服务器都离不开它,轻量级抗并发的特点让大家对它爱不释手。
然而长江后浪推前浪,Caddy作为新一代的Web服务器已经有了可以代替Nginx的潜质,Caddy使用golang开发,高性能,插件丰富,虽然运行于生产环境的稳定性还有待长时间验证,但是丝毫不影响尝鲜党对它的热爱,相对于Nginx,Caddy的优势:

  • 默认支持HTTPS,自动续订
  • 配置非常简单
  • 插件丰富,可拓展行强
  • 单文件应用,无需安装,开包即用

下载

官网下载 https://caddyserver.com/download
PLATFORM选择对应平台的,PLUGINS只选需要的,这里选择常用的几个hook.service,http.cgi,http.filemanager,http.hugo

可以点击下载按钮下载,也可以使用生成的地址在服务器中用命令行下载

https://caddyserver.com/download/darwin/amd64?plugins=hook.service,http.cgi,http.filemanager,http.hugo&license=personal&telemetry=on

安装

这里说的安装其实就是将caddy配置到path中。

将上一步下载到的caddy可执行文件放入/usr/local/bin文件夹下,并增加执行权限。

或一键下载安装,使用下载并执行脚本代替手动操作。

curl https://getcaddy.com | bash -s personal hook.service,http.cgi,http.filemanager,http.hugo

常用配置

安装完成后,命令行输入caddy即可得到一个默认端口2015的http静态服务,若正常则安装成功。
实际使用中我们肯定不会只使用2015端口,还要配置多域名多端口这些,Caddy需要一个配置文件来配置这些信息,一般情况我们使用一个命名为Caddyfile的文件来作为配置文件,caddy会自动识别该文件。

静态服务

创建一个名为Caddyfile的文件,文件中写入域名

example.com

这里的域名是指能够正常解析到你服务器的域名,若是在本地测试可以使用localhost代替sh

http://localhost

因为caddy默认是支持https的,所以指定域名后就会得到一个http和https并监听了80端口的服务,而指定了http协议的localhost则会只支持http协议。
caddy的静态服务默认是解析到执行命令的当前path的,若在当前目录下创建一个index.html,那么在example.com或localhost就能正常放到这个页面了。 caddy也提供了指定root目录的配置方法。

example.com
root /path/to/root/dir
或
example.com {
 root /path/to/root/dir
}

当然Caddyfile也可以通过命令参数来指定

caddy -conf ../path/to/Caddyfile

多域名配置

上面的静态服务使用了两种格式,而在多个域名配置在同一个Caddyfile中时,只允许使用花括号包裹的格式:

siteA.com {
 root /path/to/siteA/root/dir
}

siteB.com {
 root /path/to/siteB/root/dir
}

blog.siteB.com {
 root /path/to/siteC/root/dir
}

上面的配置分别监听了siteA和siteB两个域名以及一个siteB的子域名,并分别以静态服务解析到三个不同的文件夹。

当多个域名或端口使用同样的配置时可以这样配置:

localhost:8080, https://siteA.com, http://siteB.com, siteC.com, :1313 {
    ...
}

也支持绑定某个固定的子path或者使用通配符进行匹配:

example.com/static, *.example.com {
    ...
}

下面这个是来自官方文档的域名配置说明:

:2015                    # Host: (any), Port: 2015
localhost                # Host: localhost; Port: 2015
localhost:8080           # Host: localhost; Port: 8080
example.com              # Host: example.com; Ports: 80->443
http://example.com       # Host: example.com; Port: 80
https://example.com      # Host: example.com; Ports: 80->443
http://example.com:1234  # Host: example.com; Port: 1234
https://example.com:80   # Error! HTTPS on port 80
*                        # Hosts: *; Port: 2015
*.example.com            # Hosts: *.example.com; Port: 443
*.*.example.com          # Hosts: *.*.example.com; Port: 2015
example.com/foo/         # Host: example.com; Ports: 80, 443; Path: /foo/
/foo/                    # Host: (any), Port: 2015, Path: /foo/

反向代理

caddy的反向代理和nginx的类似,转发来自某个域名的请求到另外一个服务:

siteA.com {
 proxy /api localhost:8080
}

转发/api前缀的请求到本地8080服务。

使用反向代理配置负载均衡

siteA.com {
 proxy / web1.local:80 web2.local:90 web3.local:100
}

随机策略分发来自siteA的请求到三个服务器。

文件管理器插件

caddy提供了文件管理插件,支持文件在线预览、下载、修改、复制、粘贴以及执行shell命令等操作,非常方便。

siteA.com {
 root /path/to/root/dir
 filemanager
}

在域名的配置中加入filemanage即可。

filemanage也支持详细配置,常用的如下:

siteA.com {
 root /path/to/root/dir
 filemanager / ./foo {
    no_auth #是否免密码登录,默认admin/admin
    locale              [en|jp|...] #语言
    allow_commands      [true|false] #允许执行shell命令
    allow_edit          [true|false] #允许编辑
    allow_new           [true|false] #允许创建
    allow_publish       [true|false] #允许发布
    commands            "cmd1 cmd2..." #可使用的shell命令
 }
}

hugo插件

hugo插件是hugo博客的在线编辑插件,不使用hugo的可以跳过。
hugo插件继承自filemanage,增加hugo项目的配置功能,以及大部分,大部分配置属性相同:

siteA.com {
 root /path/to/root/hugodir/public
 hugo /path/to/root/hugodir [/admin] {
    no_auth #是否免密码登录,默认admin/admin
    locale              [en|jp|...] #语言
    allow_commands      [true|false] #允许执行shell命令
    allow_edit          [true|false] #允许编辑
    allow_new           [true|false] #允许创建
    allow_publish       [true|false] #允许发布
    commands            "cmd1 cmd2..." #可使用的shell命令
 }
}

root指定了hugo的发布文件夹,以静态服务运行。
hugo指定hugo项目的根目录,默认情况下以/admin路径在域名后打开。 其余配置属性和filemanage基本一致

fastcgi支持php

caddy支持cgi,可以通过fastcgi配置来支持php

siteA.com {
	fastcgi / 127.0.0.1:9001 php {
		root /var/www/html/siteA
	}
	root /home/ubuntu/DockerPhpRoot/siteA
}

这里通过docker启动了phpcgi,这里不再赘述。
通过配置将所有请求转发到9001端口,两个root地址分别代表宿主机中的项目路径docker中的项目路径,本质上是同一个路径并通过docker容器进行地址映射。

以service运行

目前为止,上面的示例都是以命令行启动caddy,退出shell后服务肯定也就结束了,如何让让caddy在后台保持运行呢?我们可以通过tmux来让caddy进程挂起,当更多情况下我们希望caddy以service的形式来进行后台运行。具体操作如下:

注册服务

caddy -service install -conf /path/to/Caddyfile

启动服务

caddy -service start 

停止服务

caddy -service stop

重启服务

caddy -service restart 

查看服务状态

caddy -service status 

卸载服务

caddy -service uninstall 

鉴于篇幅原因,caddy的更多功能不在这里整理了,可以移步官网。本站也已经从nginx切换到了caddy,使用体验非常舒服。

文章目录
,