2019独角兽企业重金招聘Python工程师标准>>>

最近发现了一个 golang 开发的 HTTP server,叫做 Caddy,它配置起来十分简便,甚至可以 28 秒配置好一个支持 http2 的 server ,而且对各种 http 新特性都支持的比较早(比如 http2、quic都有支持)。

安装

用过 golang 的应该都知道,golang 程序基本上不会有各种依赖,都是光秃秃一个可执行程序,cp 到 /usr/local/bin就算安装完成了,所以说安装 caddy 是很简单的,我给出三种方法。

脚本安装" data-anchor-id="vca7">

脚本安装
curl -s https://getcaddy.com | bash

caddy 官方给出了一个安装脚本,执行上面的命令就可以一键安装 caddy,等执行结束后,使用 which caddy,可以看到 caddy 已经被安装到了 /usr/local/bin/caddy

手动安装

https://caddyserver.com/download 点这个链接进入到 caddy 官网的下载界面,网页左侧可以选择平台和插件,如果在 Linux 服务器上使用的话,platform 选择 Linux 64-bit 就可以了,plugins 如果暂时不需要的话,可以不选。然后点击下面的 DOWNLOAD 按钮,就下载到 caddy 了。同理,解压之后用 cp 命令放到 /usr/local/bin/caddy 就完成了安装。

源码安装
go get github.com/mholt/caddy/caddy

对于安装了 golang 编译器的同学,只需要执行 go get 就能到 $GOPATH/bin 里,是否 cp 到 /usr/local/bin 里就看心情了。使用源码安装可以安装到最新版本的 caddy,功能上一般是最新的,而且因为是本地编译,性能可能会稍微高一些,但是可能会存在不稳定的现象。

配置
临时文件服务器

Caddy 的配置文件叫做 Caddyfile,Caddy 不强制你把配置文件放到哪个特定文件夹,默认情况下,把 Caddyfile 放到当前目录就可以跑起来了,如下:

echo 'localhost:8888' >> Caddyfile
echo 'gzip' >> Caddyfile
echo 'browse' >> Caddyfile
caddy

在随便一个目录里执行上面代码,然后在浏览器里打开 http://localhost:8888 发现 caddy 已经启动了一个文件服务器。当临时需要一个 fileserver 的时候(比如共享文件),使用 caddy 会很方便。

生产环境使用

当然了,在生产环境使用的时候就不能这么草率的把配置文件放到当前目录了,一般情况下会放到 /etc/caddy 里。

sudo mkdir /etc/caddy
sudo touch /etc/caddy/Caddyfile
sudo chown -R root:www-data /etc/caddy

除了配置文件,caddy 会自动生成 ssl 证书,需要一个文件夹放置 ssl 证书。

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

因为 ssl 文件夹里会放置私钥,所以权限设置成 770 禁止其他用户访问。

最后,创建一下放置网站文件的目录,如果已经有了,就不需要创建了。

sudo mkdir /var/www
sudo chown www-data:www-data /var/www

创建好这些文件和目录了之后,我们需要把 caddy 配置成一个服务,这样就可以开机自动运行,并且管理起来也方便。因为目前大多数发行版都使用 systemd 了,所以这里只讲一下如何配置 systemd,不过 caddy 也支持配置成原始的 sysvinit 服务,具体方法看这里。

sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service # 从 github 下载 systemd 配置文件sudo systemctl daemon-reload # 重新加载 systemd 配置sudo systemctl enable caddy.service # 设置 caddy 服务自启动sudo systemctl status caddy.service # 查看 caddy 状态
Caddyfile

基本的安装配置搞定之后,最重要的就是如何写 Caddyfile了。可以直接 vim /etc/caddy/Caddyfile 来修改 Caddyfile,也可以再自己电脑上改好然后 rsync 到服务器上。如果修改了 Caddyfile 发现没有生效,是需要执行一下 sudo systemctl restart caddy.service 来重启 caddy 的。

Caddyfile 的格式

Caddfile的格式还是比较简单的,首先第一行必须是网站的地址,例如:

localhost:8080或lengzzz.com

地址可以带一个端口号,那么 caddy 只会在这个端口上开启 http 服务,而不会开启 https,如果不写端口号的话,caddy 会默认绑定 80 和 443 端口,同时启动 http 和 https 服务。

地址后面可以再跟一大堆指令(directive)。Caddyfile 的基本格式就是这样,由一个网站地址和指令组成,是不是很简单。

指令

指令的作用是为网站开启某些功能。指令的格式有三种,先说一下最简单的不带参数的指令比如:

railgun.moe # 没错,moe后缀的域名也可以哦 gzip

第二行的 gzip 就是一个指令,它表示打开 gzip 压缩功能,这样网站在传输网页是可以降低流量。

第二种指令的格式是带简单参数的指令:

railgun.moe gzip log /var/log/caddy/access.log tls lengz@lengzzz.com root /var/www/

第三行,log 指令会为网站开启 log 功能,log 指令后的参数告诉 caddy log 文件存放的位置。第四行的 tls 指令告诉 caddy 为网站开启 https 并自动申请证书,后面的 email 参数是告知 CA 申请人的邮箱。(caddy 会默认使用 let's encrypt 申请证书并续约,很方便吧)

另外,简单参数也可能不只一个,比如 redir 指令:

railgun.moe
gzip
log /var/log/caddy/access.log
tls /etc/ssl/cert.pem /etc/ssl/key.pem
root /var/www/
redir / https://lengzzz.com/archive/{uri} 301

上面的 redir 指令带了三个参数,意思是把所有的请求使用 301 重定向到 https://lengzzz.com/archive/xxx,这个指令在给网站换域名的时候很有用。另外 tls 指令变了,不单单传 email一个参数, 而是分别传了证书和私钥的路径,这样的话 caddy 就不会去自动申请证书,而是使用路径给出的证书了。

在这个例子里还使用了 {uri} 这样的占位符(placeholder),详细的列表可以在这里查询到:https://caddyserver.com/docs/placeholders。

最后一种指令是带复杂参数的,这种指令包含可能很多参数,所以需要用一对花括号包起来,比如 header 指令:

railgun.moe
gzip
log /var/log/caddy/access.log
tls lengz@lengzzz.com
root /var/www/
header /api { Access-Control-Allow-Origin *
Access-Control-Allow-Methods "GET, POST, OPTIONS"
-Server
}
fastcgi / 127.0.0.1:9000 php {
index index.php
}
rewrite {
to {path} {path}/ /index.php?{query}
}

6-10 行的 header 指令代表为所有的 /api/xxx 的请求加上 Access-Control-Allow-Origin 和 Access-Control-Allow-Methods 这两个 header,从而能支持 javascript 跨域访问 ,第 9 行代表删除 Server header,防止别人看到服务器类型。

11-13 行使用了 fastcgi 指令,代表把请求通过 fastcgi 传给 php,ruby 等后端程序。

14-15 行,使用了 rewrite 指令,这个指令的作用是 服务器内部重定向 在下面的参数 to 后面,又跟了三个参数,这个功能上有点类似 nginx 的 try_files 。告诉 caddy 需要先查看网址根目录 /var/www 里有没有 {path} 对应的文件,如果没有再查看有没有 {path} 对应的目录,如果都没有,则转发给 index.php 入口文件。这个功能一般会用在 PHP 的 MVC 框架上使用。

随着一步步完善这个 Caddyfile,目前这个版本的 Caddyfaile 已经可以直接在网站中使用了。

多 HOST 网站

刚才说的一直都是单个域名的网址,那么如果在同一个服务器上部署多个域名的网站呢?很简单,只需要在域名后面跟一个花括号扩起来就可以了,如下:

railgun.moe {
gzip
log /var/log/caddy/railgun_moe.log
tls lengz@lengzzz.com
root /var/www/
header /api {
Access-Control-Allow-Origin *
Access-Control-Allow-Methods "GET, POST, OPTIONS"
-Server
}
fastcgi / 127.0.0.1:9000 php {
index index.php
}
rewrite {
to {path} {path}/ /index.php?{query}
}
}
lengzzz.com { tls lengz@lengzzz.com
log /var/log/caddy/lengzzz_com.log
redir / https://railgun.moe/{uri} 301
}

好了,基本的 caddy 配置就这些,详细的内容可以去官网上看文档学习。

转载于:https://my.oschina.net/xiangyunyan/blog/3033328

Caddy – 方便够用的 HTTPS server 新手教程相关推荐

  1. 配置服务器证书,Windows Server 2008 R2 下配置证书服务器和HTTPS的图文教程

    前言 2017年1月1日起App Store上的所有App应用将强制开启ATS功能. 苹果的ATS(App Transport Security)对服务器硬性3点要求: ① ATS要求TLS1.2或者 ...

  2. hibernate官方新手教程 (转载)

    hibernate官方新手教程第一部分 - 第一个Hibernate程序 首先我们将创建一个简单的控制台(console-based)Hibernate程序.我们使用内置数据库(in-memory d ...

  3. Android基础新手教程——1.5.2 Git之使用GitHub搭建远程仓库

    Android基础新手教程--1.5.2 Git之使用GitHub搭建远程仓库 标签(空格分隔): Android基础新手教程 本节引言: 在上一节中.我们学习了怎样使用Git.构建我们的本地仓库.轻 ...

  4. 微信公众平台开发新手教程(图文具体解释)

    因为微信的大热.为了更好的方便使用微信的用户查询一些信息.这篇文章是入门级的微信公众平台开发教程,须要的朋友能够參考下 在这篇新手教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络 ...

  5. 妄想性仮想人格障害 新手教程 +改动器

    记得上次 HM 教程以后 我如今 继续写 Teatime 新作新手教程 首先我说下 此游戏 模式 =AI2+机械迷城 一共同拥有5关,结局从文本分析应该至少有两个 本文不是教你怎么玩通结局 安装没什么 ...

  6. Groovy新手教程

    Groovy新手教程 kmyhy@126.com  2009-5-13 一.groovy是什么 简单地说,Groovy 是下一代的java语言,跟java一样,它也执行在 JVM 中. 作为跑在JVM ...

  7. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放...

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  8. 【OpenCV新手教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...

  9. 新手教程:建立网站的全套流程与详细解释

    新手教程:建立网站的全套流程与详细解释 你要是 Baidu 这个话题,得到的结果八成都是广告--他们都会告诉你,"嘿,我(或某公司)这里可以建网站,傻瓜式的哟,快来投奔我吧!" 新 ...

最新文章

  1. python教程是什么-Python基础教程_Python入门知识
  2. 201671010103 2016-2017-2 《Java程序设计》第十二周学习心得
  3. 智能安防 回家开门进入“看脸”时代
  4. Zookeeper在yarn框架中如何实现避免脑裂的?
  5. [BZOJ2326] [HNOI2011] 数学作业 (矩阵乘法)
  6. ZeroMQ全面介绍
  7. 使用 PDB 避免 Kubernetes 集群中断
  8. html数字自动滚动代码怎么写,你可能需要这样的大屏数字滚动效果
  9. 「大数据+」依然火热!BDTC首日爆点有点多!
  10. c++ 的 stl模板库_C ++中的标准模板库(STL)
  11. 查看IIS进程所对应的应用程序池名称
  12. ubuntu启动时的初始化信息二
  13. 桌面计算机打不开win8.1,Win8.1怎么进桌面 2种Win8.1开机直接进桌面方法
  14. dojo实现省份地市级联---省份数据源
  15. python双色球代码_python实现双色球随机选号
  16. C++ Socket服务器简单代码示例
  17. PHP执行底层机制-zend详解
  18. 鸿蒙之初彩蛋攻略,鸿蒙圣女 热血精灵派鸿蒙灵帝解析
  19. 用python暴力破解压缩包密码
  20. 迅雷极速版阻止自动更新(亲自摸索出来,可用)

热门文章

  1. 编译fastdfs报错Makefile:59: recipe for target 'fdfs_monitor' failed
  2. Linux禁止ping以及开启ping的方法
  3. linux shell使用tar 备份时间命名的文件 ( tar命令)
  4. spring 中scope的singleton和prototype区别
  5. 【PostgreSQL-9.6.3】设置log参数
  6. safari无法调试iphone提示“无可检查的应用程序”的解决方法
  7. git HEAD detached from origin 问题的解决
  8. 【问题解决】解决创建Android模拟器时提示“No system images installed for this target“的问题
  9. Python:检查‘Dictionary‘是否为空似乎不起作用
  10. 如何列出引用SQL Server中给定表的所有外键?