比较最好的网络服务器——Caddy、Apache和Nginx

3,918 阅读5分钟

网络服务器是一个软件,它接受来自用户代理(通常是网络浏览器)的网络请求,并返回该请求的适当响应或错误信息。今天HTTP服务器的两个主流解决方案是Apache和Nginx。然而,该领域的一个新的参与者--Caddy Web服务器,因其易于使用而获得青睐。

在这篇文章中,我们将研究每种网络服务器,比较每种服务器的性能、可定制性和架构。在本教程结束时,你应该熟悉每一种网络服务器的优势,并更好地掌握哪一种最适合你的项目。

让我们开始吧!

Apache HTTP服务器

由Apache软件基金会维护的Apache HTTP服务器于1995年发布,迅速成为世界上最受欢迎的网络服务器。最常被用作LAMP堆栈(Linux、Apache、MySQL和PHP)的一部分,Apache可用于Unix和Windows操作系统。

性能

Apache是开源的,用C语言编写,它基于一个模块化的架构,允许系统管理员在编译时或运行时选择应用哪些模块,轻松配置服务器应该如何运行。因此,Apache可以满足广泛的使用情况,从服务动态内容到充当支持HTTP和WebSockets等协议的负载平衡器。

Apache的核心功能包括与机器上的端口绑定以及接受和处理请求。然而,这些任务在默认情况下是通过软件包中包含的一组多处理模块(MPM)来隔离的。

MPM架构提供了更多的定制选项,这取决于特定站点的需求和机器的能力。例如,工人或事件MPM可以取代老式的prefork MPM,后者每个连接使用一个线程,在需要并发时不能很好地扩展。

除了作为服务器发行版一部分的模块外,还有大量的Apache第三方模块,你可以用它们来扩展其功能。

配置

你可以在一个.conf 文件中找到Apache的主要配置:/etc/apache2/apache2.conf 在基于Debian的Linux发行版上,/etc/httpd/httpd.conf 在Fedora和Red Hat Enterprise Linux上。

然而,为了指定一个替代的配置文件并实现所需的行为,你可以使用-f 标志和任何可用的指令。将服务器配置分成几个.conf 文件,并使用Include 指令添加它们。请记住,Apache可能只有在重新启动后才能识别对主配置文件的更改。

你也可以使用.htaccess 文件在目录级别改变服务器配置,允许你在不改变主配置的情况下为单个网站定制行为。然而,.htaccess 文件会增加TTFB和CPU的使用,降低性能。在可能的情况下,应该避免使用.htaccess 文件,并且可以通过将AllowOverride 指令设置为none 来完全禁用它们。

Nginx

Nginx的起源可以追溯到C10K问题C10K指的是网络服务器无法支持超过10,000个并发用户,Nginx在开发时考虑到了性能。它最初的目标之一是关注速度,这也是Apache被认为缺乏的领域。

2004年,Nginx作为一个开源软件首次公开出现在2条款BSD许可证下,2011年,Nginx扩展到企业的商业版本,称为Nginx Plus。

目前,超过40% 的前10,000个网站使用Nginx。如果你考虑到Cloudflare服务器也利用Nginx进行内容传输,这个数字甚至更高。

Web Server Usage Statistics W3 Tech

配置

推荐的默认配置是将worker_processes 指令设置为auto 。为了有效地利用硬件资源,每个CPU会创建一个工作进程。

在Unix操作系统中,Nginx的配置文件位于/etc/nginx/ 目录下,其中nginx.conf 是主配置文件。Nginx使用指令进行配置,这些指令被分组为块或上下文。配置文件的骨架如下所示。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
  . . .
}

http {
  . . .
}

性能

当高性能和可扩展性是关键要求时,Nginx经常是首选的Web服务器。Nginx使用一个异步的、事件驱动的、非阻塞的架构。它遵循一个多进程模型,其中一个主进程创建了许多工作进程来处理所有网络事件。

$ ps aux -P | grep nginx
root     19199  0.0  0.0  55284  1484 ?        Ss   13:02   0:00 nginx: master process /usr/sbin/nginx
www-data 19200  0.0  0.0  55848  5140 ?        S    13:02   0:00 nginx: worker process
www-data 19201  0.0  0.0  55848  5140 ?        S    13:02   0:00 nginx: worker process
www-data 19202  0.0  0.0  55848  5140 ?        S    13:02   0:00 nginx: worker process
www-data 19203  0.0  0.0  55848  5140 ?        S    13:02   0:00 nginx: worker process

主进程控制工人的行为,并执行特权操作,如绑定网络端口和应用配置,允许Nginx支持每个工人进程的数千个传入网络连接。而不是为每个连接创建新的线程或进程,你只需要一个新的文件描述符和少量的额外内存。

Caddy

Caddy是一个开源的网络服务器平台,设计简单,易于使用,并且安全。Caddy用Go语言编写,没有任何依赖性,很容易下载,几乎可以在所有Go编译的平台上运行。

默认情况下,Caddy支持自动HTTPS,通过Let's Encrypt配置和更新证书。在我们审查的三个网络服务器中,Caddy是唯一一个开箱就提供这些功能的,而且它还带有自动将HTTP流量重定向到HTTPS的功能。

与Apache和Nginx相比,Caddy的配置文件要小得多。此外,Caddy运行在TLS 1.3上,这是传输安全的最新标准。

安装Caddy是非常简单的。只需在GitHub上为你的首选平台下载静态二进制文件,或按照安装文件上的说明进行安装。要启动Caddy服务器守护程序,在终端运行caddy run 。然而,如果没有配置文件,什么都不会发生。

配置

Caddy使用JSON进行配置,但也支持几个配置适配器。
,设置配置的标准是通过Caddy文件。下面是一个简单的 "Hello World "配置,它与port 3000 绑定。

:3000 {
    respond "Hello, world!"
}

为了使变化生效,你需要按Ctrl+C ,停止服务器,然后用caddy run ,重新启动它。另外,你也可以通过在一个单独的终端执行caddy reload ,将新的配置应用到正在运行的服务器上。后一种方法更可取,以避免停机。

在这一点上,访问 [http://localhost:3000](http://localhost:3000)应该会产生预期的 "Hello, world!"信息,这时在浏览器中或通过curl

$ curl http://localhost:3000
Hello, world!

Caddy提供以下指令:

  • file_server: 实现一个静态文件服务器
  • php_fastcgi :代理请求到一个PHP FastCGI
  • reverse_proxy :将传入的流量引导到一个或多个后端,并带有负载平衡、健康检查和自动重试功能。

性能方面

在性能方面,Caddy已经被证明可以与Apache竞争,但在每秒处理的请求和负载下的稳定性方面都落后于Nginx

如果Nginx被用于性能优化,可能无法用Caddy取代它而不观察到一些性能的下降。Caddy的另一个可能的缺点是,它目前的市场份额很小,可能限制了用于教育和故障排除的资源。

结论

在这篇文章中,我们讨论了Caddy、Apache和Nginx的一些关键特征,以帮助你选择最适合你项目需求的网络服务器。

如果你主要关注的是性能,或者你计划提供大量的静态内容,Nginx可能是你的最佳选择。虽然Caddy很容易配置,而且对大多数使用情况来说性能很好,但如果你需要灵活性和定制,Apache是你最好的选择。

请记住,你也可以将任何两个网络服务器结合起来,以获得一个很好的结果。例如,你可以用Nginx提供静态文件,用Apache或Caddy处理动态请求。谢谢你的阅读,并祝你编码愉快