3.6 万颗星!开源 Web 服务器后起之秀,自带免费 HTTPS 开箱即用

Posted HelloGitHub

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.6 万颗星!开源 Web 服务器后起之秀,自带免费 HTTPS 开箱即用相关的知识,希望对你有一定的参考价值。

本文作者:HelloGitHub-Anthony

众所周知,Web 服务器是 Web 开发中不可或缺的基础服务,在开发中经常会用到。耳熟能详的开源 Web 服务器有久负盛名的 Apache、性能强劲的 nginx。而我们今天要介绍的开源项目是采用 Go 编写的 Web 服务端“后起之秀”:Caddy 它拥有下载无需安装就能用、零配置实现 HTTPS 等特点,从而在强者如云的 Web 服务器中占据了一席之地。

在这个 HTTPS 必选的时代,Caddy 凭借无需额外配置自动 HTTPS,分分钟完成 HTTPS 站点搭建,使它成为了中小型 Web 服务的首选服务器。Caddy 深受开源爱好者们的喜爱,2014 年开源至今共收获了 3.6 万颗星。

项目地址:https://github.com/caddyserver/caddy

Caddy 是一个强大的、可扩展的平台,可以为您的站点、服务和应用程序提供服务。

使用 Caddy 可以在 Linux、Mac、Windows 上快速部署 http(s) 站点或反向代理服务。支持:

  • HTTP/1.1 和 HTTP/2
  • 同时接受 HTTPS 自动签发和手动管理
  • 虚拟主机 (多个站点工作在单个端口上)
  • 原生 IPv4 和 IPv6 支持
  • 静态文件分发
  • 平滑重启/重载
  • 反向代理 (HTTP 或 WebSocket)
  • 负载均衡和健康性检查
  • Markdown 渲染
  • 文件浏览服务
  • 等等
  • 与传统的 Nginx 或者 Apache 相比,Caddy 整体只有一个可执行文件,安装便捷不易出现奇怪的依赖问题,配置文件结构清晰语法简单易于上手,依托于模块化架构可以使用 Go 语言快速开发扩展模块

    下面让我们上手把玩一番吧。

    系统环境:Ubuntu 20.04 LTS

    Caddy 可以作为一个系统服务安装,命令:

    sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
    curl -1sLf \'https://dl.cloudsmith.io/public/caddy/stable/gpg.key\' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
    curl -1sLf \'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt\' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
    sudo apt update
    sudo apt install caddy

    注意:这种方式安装完成后会启动服务,开机自动启动。

    还可以下载一个可执行文件使用。

    1. 下载地址:https://caddyserver.com/download
    2. 在网页上方选择自己的操作系统后,点击右侧蓝色的 Download 按钮即可
    3. 下载好的文件不能够直接运行,需要为其添加权限
      命令,出现版本信息:

      v2.4.6 h1:HGkGICFGvyrodcqOOclHKfvJC0qTU7vny/7FhYp9hNw=

      即为安装成功!

      下面将演示如何通过 Caddy 完成 HTTPS 站点。只需要 4 步:

      Tips 例子用的域名为:caddy.hellogithub.com 修改为你的域名即可。

      第一步:安装,采用上面介绍的命令安装

      第二步:设置域名解析地址,在购买域名的网站设置。如下图:

      设置完生效需要几分钟,可通过下面的命令检查是否生效:

      curl 检验效果吧!

      这里将从 Caddy 常用命令开始,再到配置讲解,最后会通过一个实际案例来展示如何用 Caddy 配置网站和上线。

      HG.html 的内容如下:

      配置内容如下:

      # 如果本机没有 wordpress 则注释这一块儿的站点配置
      #:80 # 部署一个 wordpress 站点
      # root * /var/www/wordpress
      # php_fastcgi unix//run/php/php-version-fpm.sock # 配置一个 fastcig 服务
      # file_server # 配置一个文件服务
      #

      http://localhost:3000
      basicauth /public/*
      # 匹配访问 localhost:3000/public/* 的请求,为其加上登陆保护
      HG JDJhJDE0JGEySk9janFMdHlBY2Y0aVdQZklQak9HcmwzNDZhNFg0N3V5Ny9EZkZMZHB1Nkt4ZE5BNGJt
      # 用户名 HG 密码 HelloGitHub,密码使用 caddy hash-passowrd 指令生成


      root * ./ # 设置当前站点根目录为当前文件夹,* 表示匹配所有的 request
      templates
      file_server
      # 配置当前站点为静态文件服务器,可用于博客系统的搭建
      hide .git # 隐藏所有的 .git 文件



      :4000
      reverse_proxy /public/* http://localhost:3000 # 配置反向代理
      # 只会匹配 locahost:4000/public 的请求,转发到 localhost:3000/public/


      在当前目录输入:

      可以看到页面展示 “你好,世界!”

    4. 访问:http://localhost:3000/public/HG.html 提示输入用户名和密码,验证正确后才能看到页面。

    5. 访问:http://localhost:4000 则会自动跳转到端口 3000 的页面

    设置或替换活动配置
  • POST /stop 停止活动配置并退出进程
  • GET /config/[path] 导出指定路径的配置
  • POST /config/[path] 设置或替换对象;追加到数组
  • PUT /config/[path] 创建新对象或插入数组
  • PATCH /config/[path] 替换现有对象或数组元素
  • DELETE /config/[path] 删除指定路径的值
  • 在 JSON 中使用@id 轻松遍历配置结构
  • GET /reverse_proxy/upstreams 返回配置的代理上游的当前状态
  • 由于篇幅问题这里就不再进行演示了,如果您想深入了解可以阅读 Caddy 的官方文档。

    看到这里你应该对 Caddy 有了一些了解,有没有一种相见恨晚的感觉?

    虽然它的性能比不了 Nginx 但如果论上手的难易度,Caddy 甩 Nginx 几条街!主要是默认开启 HTTPS 功能太香了,你什么都不用管就可以免费、快速、轻松开启网站 HTTPS。

    最后,如果你想搭建个静态博客或小站,快去试试 Caddy 吧!香不香只有“吃”过才知道~

    这里是 HelloGitHub 推出的《讲解开源项目》系列,为您叩开开源项目的大门。

    - END -

    浅谈nginx处理事件原理

    nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器,作为HTTP服务器的后起之秀,相比较于web服务器软件老大哥Apache有着很大的改进地方,主要在性能方面NGINX占用的系统资源更少,支持更多的并发连接数(特别是在静态小文件场景下),达到更高的访问效率。在功能上NGINX不但是个优秀的web服务器软件,还具有反向代理负载均衡,相当于LVS,Haproxy。缓存服务器相当于Squid等专业的缓存服务器软件
    Nginx的负载均衡模块采用两种方法:
    轮转法:它处理请求就像纸牌游戏一样从头到尾分发。
    IP哈希法:在众多请求的情况下,它确保来自同一个IP的请求会分发到相同的后端服务器。
    主要介绍nginx提供Web服务是处理事件的原理
    Nginx在启动时会以daemon形式在后台运行,采用多进程+异步非阻塞IO事件模型来处理各种连接请求。多进程模型包括一个master进程,多个worker进程,一个worker进程只有一个主线程(避免线程切换),一般worker进程个数是根据服务器CPU核数来决定的,这里面的原因与nginx的进程模型以及事件处理模型是分不开的 。也可以在配置文件中指定worker进程的数量。master进程负责管理Nginx本身和其他worker进程。
    那么几个worker进程是如何高效的处理上万个事件请求的呢?
    这是因为nginx事件处理机制决定的,多进程模型+异步非阻塞模型才是高效处理的关键。单纯的多进程模型会导致连接并发数量的降低,而采用异步非阻塞IO模型很好的解决了这个问题;并且还因此避免的多线程的上下文切换导致的性能损失。
    master进程
    主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。
    master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。
    我们要控制nginx,只需要通过kill向master进程发送信号就行了。比如kill -HUP pid,则是告诉nginx,从容地重启nginx,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。master进程在接收到HUP信号后是怎么做的呢?
    首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。
    新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。
    当然,直接给master进程发送信号,这是比较老的操作方式,nginx在0.8版本之后,引入了一系列命令行参数,来方便我们管理。比如,./nginx -s reload,就是来重启nginx,./nginx -s stop,就是来停止nginx的运行。如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。
    worker进程:
    而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。
    worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?
    首先master会根据配置文件生成一个监听相应端口的socket,然后再faster出多个worker进程,这样每个worker就可以接受从socket过来的消息(其实这个时候应该是每一个worker都有一个socket,只是这些socket监听的地址是一样的)。一般来说,当一个连接过来的时候,每一个worker都能接收到通知,而只有一个进程可以accept这个连接,其它的则accept失败,这是所谓的惊群现象,为了处理这种现象。nginx提供了一个accept_mutex这个东西,从名字上,我们可以看这是一个加在accept上的一把共享锁。有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样就不会有惊群问题了。accept_mutex是一个可控选项,我们可以显示地关掉,默认是打开的。
    当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。
    我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

    以上是关于3.6 万颗星!开源 Web 服务器后起之秀,自带免费 HTTPS 开箱即用的主要内容,如果未能解决你的问题,请参考以下文章

    Github累积1.6万颗星,这家AI公司的开源项目有望让程序员少加班

    TensorFlow与主流深度学习框架对比

    浅谈nginx处理事件原理

    LNMP平台搭建---Nginx安装篇

    昨晚直播小鱼搞了个开源库之FishProtocol,目前已经两颗星

    SpringCloud Alibaba开篇

    (c)2006-2024 SYSTEM All Rights Reserved IT常识