• 比 Nginx 性能更强的下一代 Web 服务器


    0f64a9dc6ef61866a11e0b4f7402caad.gif关注公众号,回复“1024”获取2TB学习资源!

    简介

    Caddy 2 是一个强大的、企业级的、开源的 Web 服务器。是一个 Go 编写的 Web 服务器,类似于 Nginx,Caddy 提供了更加强大的功能。

    4ba992fe39f105f47dac8ad91b5f7ca1.png

    支持 HTTP/2 的 Web 服务端。它使用 Golang 标准库提供 HTTP 功能。Caddy 一个显著的特性是默认启用HTTPS。它是第一个无需额外配置即可提供HTTPS 特性的Web 服务器。

    • 官网:https://caddyserver.com

    • 文档:https://caddyserver.com/docs/

    特性

    • 全自动支持 HTTP/2 协议,无需配置。

    • 全自动变成 HTTPS 站点,无需任何配置。

    • 合理使用多核

    • 支持 IPv6 环境

    • 对 WebSockets 有很好的支持

    • 可以自动把 Markdown 转成 HTML

    • Caddy 对 log 格式的定义很容易

    • 易于部署 ,没有依赖

    • 作为反向代理支持主动和被动健康检查、负载均衡、断路、缓存等功能。

    • 支持 Windows、 Linux、Mac 三大主流系统

    相较于 Nginx 来说使用 Caddy 的优势如下
    af0dc8ac3ac56e89eb85c3e4c1f28cdb.png
    • 自动的 HTTPS 证书申请(ACME HTTP/DNS 挑战)

    • 自动证书续期以及 OCSP stapling 等

    • 更高的安全性包括但不限于 TLS 配置以及内存安全等

    • 友好且强大的配置文件支持

    • 支持 API 动态调整配置(有木有人可以搞个 Dashboard)

    • 支持 HTTP3(QUIC)

    • 支持动态后端,例如连接 Consul、作为 k8s ingress 等

    • 后端多种负载策略以及健康检测等

    • 本身 Go 编写,高度模块化的系统方便扩展(CoreDNS 基于 Caddy1 开发)

    安装

    下载地址:https://caddyserver.com/download

    Fedora/RHEL/CentOS 8
    1. $ dnf install 'dnf-command(copr)'
    2. $ dnf copr enable @caddy/caddy
    3. $ dnf install caddy
    MacOS
    brew install caddy
    RHEL/CentOS 7
    1. $ yum install yum-plugin-copr
    2. $ yum copr enable @caddy/caddy
    3. $ yum install caddy
    Debian/Ubuntu/Raspbian
    1. $ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
    2. $ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
    3. $ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
    4. $ sudo apt update
    5. $ sudo apt install caddy

    安装完成后,在终端命令行下输入 caddy :

    1. $ caddy
    2. Caddy is an extensible server platform.
    3. usage:
    4.   caddy  []
    5. commands:
    6.   adapt           Adapts a configuration to Caddy's native JSON
    7.   build-info      Prints information about this build
    8.   environ         Prints the environment
    9.   file-server     Spins up a production-ready file server
    10.   fmt             Formats a Caddyfile
    11.   hash-password   Hashes a password and writes base64
    12.   help            Shows help for a Caddy subcommand
    13.   list-modules    Lists the installed Caddy modules
    14.   reload          Changes the config of the running Caddy instance
    15.   reverse-proxy   A quick and production-ready reverse proxy
    16.   run             Starts the Caddy process and blocks indefinitely
    17.   start           Starts the Caddy process in the background and then returns
    18.   stop            Gracefully stops a started Caddy process
    19.   trust           Installs a CA certificate into local trust stores
    20.   untrust         Untrusts a locally-trusted CA certificate
    21.   upgrade         Upgrade Caddy (EXPERIMENTAL)
    22.   validate        Tests whether a configuration file is valid
    23.   version         Prints the version
    24. Use 'caddy help ' for more information about a command.
    25. Full documentation is available at:
    常用命令
    1. $ systemctl start[stop|restart] caddy  //启动服务
    2. $ systemctl reload caddy //重新加载配置文件
    3. $ systemctl status caddy //查看运行状态

    配置

    Caddy2 的配置文件核心采用 json,但是 json 可读性不强,所以官方维护了一个转换器,抽象出称之为 Caddyfile 的新配置格式;关于 Caddyfile 的完整语法请查看官方文档。文档地址:https://caddyserver.com/docs/caddyfile

    常用配置
    站点配置
    1. (site_option) {
    2.   encode zstd gzip
    3.   file_server
    4.   handle_errors {
    5.     rewrite * /{http.error.status_code}.html
    6.     file_server
    7.   }
    8.   import acme_https
    9.   import log_file
    10.   root * /www/{host}
    11. }
    多域名配置
    1. 地址 {
    2.     ........
    3. }

    这个地址支持以下几种格式

    1. localhost
    2. example.com
    3. :443
    4. http://example.com
    5. localhost:8080
    6. 127.0.0.1
    7. [::1]:2015
    8. example.com/foo/*
    9. *.example.com
    10. http://
    全局配置选项
    1. {
    2.     # 开启所有的调试输出
    3.     debug    
    4.     # 设定默认的sni
    5.     default_sni domain.com
    6.     # 打开或关闭管理端口
    7.     admin off
    8. }
    错误页面跳转
    1. www.mingongge.com {
    2.     root * /web/mingongge.com/
    3.     file_server
    4.     handle_errors {
    5.         rewrite * /{http.error.status_code}.html
    6.         file_server
    7.     }
    8. }
    Log 日志
    1. (log_file) {
    2.   log {
    3.     format logfmt
    4.     output file /var/log/caddy/{host}.access.log {
    5.       roll_keep 7
    6.     }
    7.   }
    8. }
    Header
    1. www.mingongge.com {
    2.   root * /web/mingongge.com/
    3.   file_server
    4.   header Access-Control-Allow-Origin *
    5.   header Cache-Control max-age=3600
    6.   header /css/* Cache-Control max-age=604800
    7. }
    Cache-Control
    1. (cachecontrol) {
    2.   header /css/* Cache-Control max-age=3600
    3.   header /img/* Cache-Control max-age=3600
    4.   header /js/* Cache-Control max-age=3600
    5. }

    反向代理

    1. https://www.mingongge.com {
    2. gzip
    3. tls admin@mingongge.com
    4. proxy / https://welcome.mingongge.com
    5. }
    快速创建一个站点
    caddy file-server --website ./index --listen :8088 --domain www.mingongge.com

    参数说明

    1. file-server #这是一个文件服务器
    2. --website   #文件服务的根目录
    3. ./index     #首页文件的存储目录(如存放 index.html)
    4. --listen :8088  #定义监听端口
    5. --domain www.mingongge.com  #绑定域名
    配置片段

    Caddyfile 支持类似代码中 function 一样的配置片段,这些配置片段可以在任意位置被 import,同时可以接受参数,以下为配置片断示例:

    1. # 括号内为片段名称,可以自行定义
    2. (TLS) {
    3.     protocols tls1.2 tls1.3
    4.     ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
    5. }
    6. # 在任意位置可以引用此片段从而达到配置复用
    7. import TLS
    配置模块化

    import 指令除了支持引用配置片段以外,还支持引用外部文件,同时支持通配符,有了这个命令以后我们就可以方便的将配置文件进行模块化处理:

    1. # 引用外部的 /etc/caddy/*.caddy
    2. import /etc/caddy/*.caddy

    模块化配置实例

    Caddyfile

    Caddyfile 类似于 nginx 的 nginx.conf 主配置。

    1. (LOG) {
    2.     log {       
    3.         format formatted "[{ts}] {request>remote_addr} {request>proto} {request>method} <- {status} -> {request>host} {request>uri} {request>headers>User-Agent>[0]}"  {
    4.             time_format "iso8601"
    5.         }
    6.         output file "{args.0}" {
    7.             roll_size 100mb
    8.             roll_keep 3
    9.             roll_keep_for 7d
    10.         }
    11.     }
    12. }
    13. (TLS) {
    14.     protocols tls1.2 tls1.3
    15.     ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
    16. }
    17. (HSTS) {
    18.     header / Strict-Transport-Security "max-age=63072000"
    19. }
    20. (ACME_GANDI) {
    21.     # 从环境变量获取 GANDI_API_TOKEN
    22.     dns gandi {$GANDI_API_TOKEN}
    23. }
    24. # 聚合上面的配置片段为新的片段
    25. (COMMON_CONFIG) {
    26.     # 压缩支持
    27.     encode zstd gzip
    28.     # TLS 配置
    29.     tls {
    30.         import TLS
    31.         import ACME_GANDI
    32.     }
    33.     # HSTS
    34.     import HSTS
    35. }
    36. # 开启 HTTP3 实验性支持
    37. {
    38.     servers :443 {
    39.         protocol {
    40.             experimental_http3
    41.         }
    42.     }
    43. }
    44. # 引入其他具体的站点配置
    45. import /etc/caddy/*.caddy
    站点配置
    1. www.mingongge.com {
    2.     # 重定向到 mingongge.com(默认 302)
    3.     redir https://mingongge.com{uri}
    4.     # 日志
    5.     import LOG "/data/logs/mingongge.com.log"
    6.     # TLS、HSTS、ACME 等通用配置
    7.     import COMMON_CONFIG
    8. }
    9. mingongge.com {
    10.     # 路由
    11.     route /* {
    12.         reverse_proxy mingongge_com:80
    13.     }
    14.     # 日志
    15.     import LOG "/data/logs/mingongge.com.log"
    16.     # TLS、HSTS、ACME 等通用配置
    17.     import COMMON_CONFIG
    18. }

    配置完成后,通过 systemctl start caddy 去启动 caddy 服务器。每次配置修改后可以通过 systemctl reload caddy 进行配置重载。这些命令的功能与 Nginx 的命令功能基本一样。

    总结

    Caddy 内置了丰富的插件,例如 “file_server”、内置各种负载均衡策略等,这些插件组合在一起可以实现一些复杂的功能。Caddy 采用 Go 语言编写,相比较而言(Nginx 通过 Lua 或者 C 开发插件),对于后期的开发更容易上手。

    09570af0f75d9ee43b3756d53698faf3.png

    3580b922cae2f6e685dfec9442b33dc6.png

    推荐阅读 点击标题可跳转

    谷歌翻译彻底凉了?手把手教你复活!

    Win7、CentOS 停服!国产操作系统替代方案来了

    连全局负载均衡、CDN这些基础理论都不懂?你算啥运维人

    这么好用的 Windows 新功能!竟然被微软屏蔽了

    CentOS 8 停服!官方却悄悄推出 CentOS 9

    这款开源的 Git 后悔药!用起来真香。。。

    说实话,Jenkins 真得牛逼!只是你不会用而已~

    db2bcfdc537d4e8f27d6adb50da48c71.png

    转发 关注

    点亮下方“在看”图标

    更多人看到

  • 相关阅读:
    简易绘图 DataFrame.plot
    qDebug() 显示行号
    【Verilog 教程】3.1 Verilog 连续赋值
    深度学习(PyTorch)——生成对抗网络(GAN)
    QT动态加载qss和rcc方式
    【翻译论文】Urban land cover classification using airborne LiDAR data: A review(2014)
    Java 数据结构与算法 堆
    SpringBoot项目--如何不停服更新应用?
    Trie字典树
    Flutter FlutterActivity找不到
  • 原文地址:https://blog.csdn.net/mingongge/article/details/127780691