使用技巧

Web服务器摊牌:Nginx与Apache

正如我们今天所知,互联网在90年代开始了全球“征服”。整个“Web”协议可以概括为访问者从给定的Web地址请求文档,DNS和IP系统将该请求转发给正确的计算机。该计算机托管所请求的网页,将“将”网页“提供”给访问者。

网页本质上是HTML文档。为了能够向访问者提供不同的网页,“服务”机器需要服务器程序。像Nginx vs Apache这样的软件处理请求,分析它们,然后将相应的文档交回访问者的浏览器中查看。

  • 阿帕奇
  • Nginx的
  • 缓存的问题
  • 处理请求
  • 在现实生活中检查它

你厌倦了缓慢的WordPress主机和可怕的支持吗?我们在Kinsta做不同的事情。

查看我们的托管计划Apache vs Nginx:哪一个为您的WordPress网站提供更快的解决方案? ?查看我们的网络服务器摊牌!点击发推文Apache

自从它首先发布以来,我们将首先进入Apache。

在Tim Berners-Lee的CERN httpd和NCSA HTTPd在互联网的最初几年之后,Apache – 在1995年首次发布 – 迅速征服了市场并成为世界上最受欢迎的网络服务器。如今,它仍处于市场地位,但主要是出于传统原因。 Apache正在Apache许可下开发和维护Apache。

有关Apache如何得名的两个不同故事。一个版本说这个名字源于着名的美洲原住民遗产,而另一个版本说这个名字是“一个不完整的服务器”的双关语,它遵循一系列软件补丁。

Linux的

Apache的巨大市场份额部分归功于它预装了所有主要的Linux发行版,如Red Hat / Centos和Ubuntu。

Ubuntu默认页面

Ubuntu默认页面

Apache在Linux世界中的重要作用的一个例子是其服务器进程名称是HTTPd,使Apache成为Web服务器软件的同义词。

除了成为Web服务器市场上第一个重要的参与者之外,Apache的部分扩散是由于其配置系统和.httaccess文件。

的.htaccess

Apache使用.htaccess进行配置。有很多关于如何配置,编辑和使用此文件的教程,因为它在配置Apache处理传入请求的方式方面提供了很大的灵活性。一些示例包括:不同的重定向规则,最大上载文件大小,URL重写,内存限制,目录保护(htpasswd),过期标头,缓存控制标头,编码标头,cookie,查询字符串操作。

另一方面,Kinsta使用不支持.htaccess文件的Nginx。但是,.htaccess文件中的设置和规则可以轻松地“翻译”为Nginx自己的重写规则语法。

Apache的主要“优点”之一是在服务器根目录 – 主网站目录中 – 目录树中的每个级别或目录都可以拥有自己的.httaccess文件及其自己的配置。

对于共享托管服务提供商而言,这是一个梦想,因为他们可以在同一台计算机上为数百名用户提供配置网站服务方式的方式,而不会影响其他网站。客户可以在受限制的共享托管环境中配置许多详细信息,而从不接触全局服务器配置。

正如官方文件所说:

“通常,当您无权访问主服务器配置文件时,只应使用.htaccess文件。”

然而,这种灵活性是以牺牲性能为代价的“许可.htaccess文件会导致性能下降,无论您是否实际使用它们!”

每次启用.htaccess文件时,Apache都必须从所请求的URL或文件遍历整个目录树,直到服务器的根目录,然后为每个请求加载它们。然后,它需要处理这些文件,并为以这种方式配置的每个目录重新配置自身。

使用WordPress网站,事情可能变得非常复杂。典型的WordPress网站可以有来自不同目录的数百个请求。

从/ wp-content / uploads / yyyy / mm类型的目录,它通常会在单个页面加载上有多个请求,通常形成不同的月目录。然后会有/ wp-content / themes / parent-theme静态资源,/ wp-content / themes / child-theme资源:这些将包括javascript,css文件,图像。

然后还会有/ wp-content / plugins,其中包含经常从几十个插件子目录中加载的静态文件。对于这些资源中的每一个,Apache必须遍历其整个树以查找配置。

一项分析表明,典型的WordPress设置(对于共享主机上的网站而言很常见)将包括42个单独的.htaccess执行和249个单独的.htaccess文件查找。

这只是在Web服务器级别。访问者仍然需要等待PHP进程执行整个WordPress调用堆栈以创建数据库查询并将其提供给MySQL以组装网页并将其发送给访问者。

模块

让Apache流行的另一件事是它的动态模块系统。

模块 – 作为一种允许用户扩展Web服务器功能的功能 – 存在于Nginx和Apache中。 Apache允许用户在安装和部署Web服务器后安装模块,然后根据需要启用/禁用它们。基于Debian的发行版具有允许启用和禁用这些模块的命令,而无需编辑任何配置文件:a2enmod和a2dismod。

作为Apache标准分发的一部分的官方模块列表在这里,其中包括从压缩,加密,日志记录,重定向到更高级的东西,如编辑请求和使用高级语法的响应。

Nginx的

Nginx(也写作nginx或NGINX)于2004年问世,当时俄罗斯开发商Igor Sysoev首次公开发布。正如Nginx的项目经理Owen Garrett所说:

“Nginx专门用于解决Apache Web服务器的性能限制。”

该服务器最初是作为2002年网站rambler.ru的缩放工具创建的。它有两个版本:开源,具有BSD类型许可证和Nginx Plus,具有支持和其他企业功能。

在它发布之后,Nginx主要用于提供静态文件,并在Apache安装之前用作负载平衡器或反向代理。随着网络的发展,以及随着时间的推移挤压速度和硬件使用效率的最后一步,更多的网站开始完全用Nginx取代Apache,这也要归功于更成熟的软件。

NGINX Inc被F5 Networks收购

NGINX Inc被F5 Networks收购

2019年3月,Nginx Inc以6.7亿美元被F5 Networks收购。在那一刻,正如Techcrunch报道的那样,Nginx服务器正在为“3.75亿个网站和大约1,500个付费用户”提供支持。

根据w3techs的数据,Nginx的市场份额一直在稳步增长,从而将Apache推出并从一开始就废除它:

Web服务器用法

Web服务器用法

这些数据与全球整体网络服务器有关,但如果我们采用前100万个网站的样本,Nginx已经存在了一段时间:

使用Nginx的网站百分比

使用Nginx的网站百分比

Google搜索趋势似乎也反映了这一事实:

谷歌搜索趋势:Nginx与Apache

谷歌搜索趋势:Nginx与Apache

Netcraft调查显示,Apache已于2019年4月被Nginx取代。

Nginx配置

Nginx没有像Apache那样的配置系统,所以尽管它的效率和速度都要高得多,但它并没有广泛应用于零售托管服务提供商。它不像Apache那样在共享环境中闪耀。

另一方面,正如我们所说,通过不允许目录级配置,Nginx比Apache更具优势。有一篇关于Nginx维基的文章比较了性能影响:

性能影响Nginx vs Apache.png

性能影响Nginx vs Apache.png

Nginx模块

Nginx模块系统是另一个将其定位为更高级选择的东西。 Nginx模块通常需要在构建时启用,这意味着涉及更多的技术实力,并且安装后添加模块有点复杂。

在2016年,随着版本1.9.11,事情发生了变化,官方/验证的动态模块存储库保留给付费用户。截至2019年5月,他们宣布开始支持QUIC和HTTP / 3。

缓存问题:Nginx与Apache

缓存 – 如果我们想过度简化它 – 可以被描绘为在访问之前为网站访问者准备内容,这样当他们“敲门”时,你不需要去寻找他们正在寻找的内容。你已经准备好了,并且无需等待就可以将它交给他们。

与Apache一样,Nginx的典型设置过去常常位于服务器和最终用户之间,以减轻其他基础架构的性能损失。在这些情况下,它可以缓存静态内容,而无需每次都从受保护的源服务器获取静态内容。

如果我们将Nginx用作独立的Web服务器 – 就像Kinsta LXC容器一样 – 没有这样的需求。 Nginx非常有效地提供静态内容。

然后是动态缓存或页面缓存的问题。在WordPress网站的场景中,这意味着将为每个URL生成的所有WordPress页面存储在内存或磁盘上。

FastCGI缓存本身可在标准Nginx安装中使用。它简单,功能强大,是不太常用的Nginx功能之一。

为了将它与Apache等价物进行比较,你应该知道Apache有mod_cache模块,据说这个模块很容易出错,与其他模块冲突。因此,使用Apache部署的标准缓存解决方案是Varnish HTTP加速器。虽然Varnish是专门的行业解决方案,但最近的一些测试使得Nginx缓存优于Varnish。

在Kinsta,我们使用Nginx进行动态WordPress缓存,以及专有的缓存插件,允许对缓存的页面进行精细控制,以及由Kinsta CDN缓存的静态资源。

你厌倦了缓慢的WordPress主机吗?我们在服务器级使用整页缓存,几乎可以立即向访问者提供内容。查看我们的托管计划

处理请求:Nginx与Apache

Apache和Nginx之间的最大区别在于它们处理请求的方式的底层架构。

Apache使用MPM-s或多处理模块处理请求,这些模块“负责绑定到机器上的网络端口,接受请求,并派遣子级来处理请求”。

最早的MPM,可以追溯到Apache的开端,是prefork模块。仅凭这个模块就可以归功于Apache的糟糕表现。在这种模式下,Apache会在每个请求上生成一个带有一个线程的新进程。

这个模块与mod_php一起使用,意味着Apache服务器在每个进程中都嵌入了一个PHP解释器,即使它必须提供CSS文件或图像。

这效率很低。 Prefork模块附带Apache作为默认模块。它还限制与HTTP / 1的连接。

在后来的几年里,Apache开发了多线程工作者mpm,之后,事件mpm。它们都可以缓解Apache的许多性能问题。切换到php-fpm使得Apache今天仍然可以成为一个竞争解决方案,同时消除了.htaccess的使用,但这种做法无法实现其目的。

Nginx使用异步,非阻塞事件驱动架构。

解释不同之处:在Linux / Unix世界中,进程正在运行程序。

线程是进程的子集,并且在一个进程执行中可以有多个线程。可以将其视为浏览器窗口中的多个选项卡。这样,程序可以利用多个CPU和多核,多线程CPU来更快地执行。你可以阅读Linus Torvalds详细说明差异。

简而言之,Apache为每个连接使用进程(并且使用worker mpm它使用线程)。随着流量的增加,它很快变得太昂贵了。

我们可以想象新的进程或线程创建,如启动计算机或启动程序。即使是最快的计算机,它仍然需要一些时间。如今网站在单个页面加载时会产生数百个请求,这很快就会增加。

事件mpm在优化方面更进一步,但一些测试显示它无法超越Nginx。特别是当我们谈论静态文件时,Nginx的服务量是Apache的两倍。

理想情况下,Nginx每个CPU /核心有一个工作进程。 Nginx工作进程的不同之处在于每个工作进程可以处理数十万个传入网络连接。无需为每个连接创建新线程或进程。

这就是为什么主要的内容交付网络,如Cloudflare,MaxCDN和我们的合作伙伴KeyCDN – 或Netflix等网站 – 发现Nginx对其内容交付至关重要的原因。

利用Nginx的公司名单太长,无法全部列出,因此我们将以WordPress.com背后的私人公司Automattic结束。

Automattic在2008年将所有负载均衡器转换为Nginx for WordPress.com(您可以在此处阅读)并将其服务器堆栈完全迁移到Nginx。

在现实生活中检查它

如果我们想要检查生产中的网站使用什么,我们通常可以在HTTP响应标头中找到它。这意味着我们需要右键单击一个网站> Inspect,在开发人员工具中,我们将选择网络面板,然后重新加载网站。我们将看到该网站正在加载的所有资源。如果我们选择任何特定资源及其Headers选项卡,我们通常会看到服务器信息。如果网站使用CDN,我们可能会在服务器行中看到类似Cloudflare的内容,或者如果网站使用HTTP加速器,则会看到类似Varnish的内容。

这是一个使用CPanel,Apache和PHP的典型共享主机设置的WordPress网站示例:

Apache http标头

Apache HTTP标头

这是一个关于Nginx的网站:

Nginx http标头

Nginx HTTP标头

在左侧,如果我们扩展它,我们还将能够分析每个资源的时间并查看其对整个页面加载时间的影响。

摘要

在本文中,我专注于Nginx与Apache,并解释了帮助Nginx在Web服务器领域获得更多牵引力和关注的主要架构差异。这些是使其在资源匮乏的行业中具有性能优势的关键特征。

当然,并非每个用例都具有相同的优先级,而Apache或其他工具如Lighttpd,IIS,LiteSpeed,Caddy可能是很好的解决方案。

在Kinsta,我们使用Nginx作为WordPress和WooCommerce性能优化托管解决方案的一部分。每个WordPress站点都位于自己的独立容器中,该容器具有运行它所需的所有软件资源(Nginx,Linux,PHP,MySQL)。资源是100%私有的,不在任何其他站点之间共享。