为了账号安全,请及时绑定邮箱和手机立即绑定

为什么选择Caddy服务器而不是Nginx?

标签:
运维 Nginx

随着 web 技术的发展,围绕 web 服务器配置的工具和实践也在不断演变。多年来,Nginx 一直是开发人员和系统管理员的首选,因其速度、灵活性和健壮性。然而,随着 Caddy 的兴起,许多人开始重新考虑他们的选择。在这次探讨中,我们将深入探讨 Caddy 是什么,它和 Nginx 的对比,其独特的功能,优势,劣势,以及为什么现在可能是时候考虑选择 Caddy 作为你的 web 服务器。

故事标题

什么是Caddy?

Caddy 是一个现代的开源 web 服务器,专注于简单性、安全性及高性能。Caddy 用 Go 语言编写,为 web 开发人员提供了一个易于配置且功能强大的解决方案。它的突出功能是 自动化的 HTTPS ,这自动处理 SSL/TLS 证书,无需手动操作。Caddy 设计为开箱即用,无需繁琐配置,对于想要轻松体验的开发者来说,它是很有吸引力的选择。

Caddy 和 Nginx 对比:
配置简单

Nginx :配置 Nginx 需要深入了解其配置指令。即使是简单的反向代理设置,对于初学者来说,这可能显得极具挑战性。

示例:(Nginx 反向代理):

server {
    listen 监听 80;
    server_name 服务器名称 example.com;

    location 区域 / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host 主机 $host;
        proxy_set_header X-Real-IP 真实IP $remote_addr;
    }
}

Caddy:使用其直观的 Caddyfile 配置文件,设置反向代理或托管静态网站非常简单。

例子:Caddy反向代理

example.com {  
    反向代理 localhost:8080  
}
自动启用 HTTPS 加密

Nginx :需要手动生成并续期 SSL 证书,或与如 Certbot 这样的第三方工具集成。

例子 (Nginx HTTPS):

    server {  
        listen 443 ssl;  
        server_name example.com;  

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  

        location / {  
            proxy_pass http://localhost:8080;  
            proxy_set_header Host $host;  
            proxy_set_header X-Real-IP $remote_addr;  
        }  
    }

Caddy:自动处理 HTTPS,包括通过 Let’s Encrypt 自动生成和续订证书。

比如说 (Caddy HTTPS):

example.com {  
    reverse_proxy 反向代理 本机:8080  
}
  • 自定义 TLS 实例
example.com {  
    TLS /path/to/cert.pem /path/to/key.pem  
    反向代理到 localhost:8080  
}
表演
  • 两个服务器都提供高性能表现,但 Caddy 的现代架构设计通常在 Go 生态系统中更具优势地位。
扩展性(可扩展性)

Nginx:可以通过模块进行扩展,但要添加新功能通常需要重新编译,

  • 示例:比如,要添加类似 Nginx RTMP 的自定义模块,你需要下载源代码并重新编译。

Caddy :支持插件扩展,插件使用 Go 语言编写,可以在无需重新编译的情况下动态加载。

  • 例如:你可以通过 Caddy 的插件注册表轻松添加如 json_configcaddy-l4 这样的插件。
学习曲线:

Nginx:由于其配置文件复杂,学习曲线更陡。

Caddy ,适合新手,简洁易读的配置格式。

社区和生态

Nginx :拥有更大、更活跃的社区,提供丰富的文档和教程。

Caddy : 一个不断增长的社区,拥有活跃的开发但相对较少的资源。

Caddy的主要功能:
1. 简单配置: (Caddyfile)

这里有一个简单的 Caddyfile 配置示例,用于静态网站:

    example.com {  
        root * /var/www/html  
        file_server  
    }

将这与 Nginx 的配置相比,很容易发现为什么许多开发人员更倾向于 Caddy 的简洁。

2. 反向代理

在 Caddy 中设置反向代理如下所示:

example.com {  
    reverse_proxy 本机:8080  
}
3. 自动启用 HTTPS 功能

Caddy 自带的 HTTPS 管理借助 Let's Encrypt 自动获取和续订证书,为开发人员节省了大量宝贵的时间。

4. 自定义 CORS 例子

Caddy 可以灵活配置 CORS 策略。这里举一个使用 @allowed 语法的例子:

example.com {  
    @allowed header Origin *  
    respond 响应 @allowed 200  
}
5. 使用静态的 Auto_Key 进行身份验证

用简单的认证方式来保障您的网站安全

example.com {  
    basicauth /admin {  
        admin 自动密钥值(auto_key_value_here)  
    }  
    reverse_proxy 反向代理 localhost:8080  
}
6. 使用 Prometheus 进行日志记录和指标监控

Caddy 提供强大的日志记录和监控功能支持。使用 Prometheus 插件,可以轻松集成指标。

结合 Prometheus 的 Caddy 配置文件:

{
    servers {
        metrics
    }
    admin 0.0.0.0:2019
}

example.com {
    reverse_proxy localhost:8080 // 本地主机反向代理端口8080
}

普罗米修斯配置文件(prometheus.yaml):

global:  
  scrape_interval: 15s # 默认为1分钟  

scrape_configs:  
  - job_name: caddy  
    static_configs:  
      - targets: ['caddy:2019']

现在,Prometheus将从Caddy收集指标数据,提供宝贵的见解,帮助你了解服务器的性能和流量情况。

使用 Caddy 和 Go 进行身份验证示例演示

用Caddy作为反向代理来设置认证,并使用一个Go应用程序处理认证逻辑。

Caddyfile 配置说明
example.com {  
    反向代理服务器 localhost端口8080  
    路由规则 /login* {  
        反向代理服务器 localhost端口8081  
    }  
}。
Go 应用(认证)

这里有一个简单的 Go 代码,用来做认证的:

    package main  

    import (  
        "encoding/json"  
        "net/http"  
    )  

    type Credentials struct {  
        Username string `json:"username"`  
        Password string `json:"password"`  
    }  

    func loginHandler(w http.ResponseWriter, r *http.Request) {  
        if r.Method != http.MethodPost {  
            http.Error(w, "不允许的方法", http.StatusMethodNotAllowed)  
            return  
        }  

        var creds Credentials  
        err := json.NewDecoder(r.Body).Decode(&creds)  
        if err != nil {  
            http.Error(w, "无效的请求内容", http.StatusBadRequest)  
            return  
        }  

        if creds.Username == "admin" && creds.Password == "password" {  
            http.SetCookie(w, &http.Cookie{  
                Name:  "session",  
                Value: "authenticated",  
                Path:  "/",  
            })  
            w.WriteHeader(http.StatusOK)  
            w.Write([]byte("登录成功"))  
        } else {  
            http.Error(w, "无效的凭证", http.StatusUnauthorized)  
        }  
    }  

    func main() {  
        http.HandleFunc("/login", loginHandler)  
        http.ListenAndServe(":8081", nil)  
    }

这个用 Go 编写的程序在 8081 端口监听登录请求信息。结合 Caddy 的路由,这创建了一个无缝的认证流程体验。

身份验证过程示例

Caddy的优势
  1. 简便使用:使用Caddyfile简化配置。
  2. 内置HTTPS:自动管理SSL/TLS证书。
  3. 现代架构:用Go语言编写,使其既轻量又高效。
  4. 扩展性:模块化设计,支持动态加载插件。
  5. 活跃开发状态:定期更新和活跃的社区参与。
Caddy的一些缺点
  1. 较小的生态系统:与Nginx相比,资源和插件较少,生态系统相对较小。
  2. 性能在大规模下:虽然性能良好,但在极高的流量场景中,Nginx通过高级配置可能仍占优势。
  3. 企业功能定价:一些高级功能需要通过商业许可才能使用,因此定价会相应提高。
越南 nginx 会成为过去吗?

Nginx 已经为开发社区服务了二十多年,但其复杂性和过时的范式在现代开发工作流程中常常感觉像是一种负担。像 Caddy 这样的工具的兴起表明,这种转变朝着简单性、自动化和友好的开发解决方案发展。尽管 Nginx 依然是一个强大的工具,但很明显,未来属于优先考虑易用性,同时不牺牲性能或安全性的服务器。

中间件示例

你可以在这里查看我使用Caddy和Prometheus做的度量追踪系统中间件:这里

结尾:

Caddy 代表着 web 服务器技术的一大进步。它的简洁性、现代设计以及内置功能使其在许多场景中成为取代 Nginx 的强有力竞争者。不论是托管静态网站、运行反向代理还是搭建微服务架构,Caddy 都是值得考虑的好选择。它注重简化开发者的操作流程,自动处理繁琐的任务,使得 Caddy 成为 web 服务器领域的游戏规则改变者。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消