Apache 与 nginx

您可以提高托管客户网站(Apache) 的 web 服务器的工作性能,方法使用 nginx,一个辅助的高性能 web 服务器,通常用作反向代理服务器。该 web 服务器专门为交付大容量静态内容(例如,图像、视频、css、xml,等)而设计。与 Apache 相反,nginx 在处理大量并行连接时反而更高效。与 Apache 相比该 web 服务器的另一个优势是 nginx 在每个客户端连接上内存占用小的多。

为了充分利用 nginx 的所有优势,Plesk 会配置它作为反向代理服务器置于互联网和 Apache 之间(如下图)。也就是说 nginx 会成为处理所有来自网站访客的接收连接请求的前端 web 服务器。这些请求会发送到 Apache,会被区分为静态和动态内容请求。如果请求是静态文件请求(例如,jpg、css、html,等),Apache 会通过所有注册的处理程序传递请求(应用 .htaccess 目录级别的配置,覆写 URL 等等)并返回给 nginx 一个响应,该响应只包含请求文件在文件系统中所处的位置。nginx 会找到该文件然后发送给客户端。如果请求是动态文件请求(例如 PHP 脚本),Apache 会执行该文件并发送响应给 nginx,然后由 nginx 交付给客户端。

nginx 和 Apache 的组合有如下优势:

  • 并发连接网站的数量增加。
  • 消耗服务器 CPU 和内存资源减少。
    带有大量静态内容(例如,相册、视频网站,等等)的网站获益最大。
  • 为连接速度慢(GPRS、EDGE、3G,等等)的客户提供服务的效率提高了。
    例如,一个 10 KB/秒连接速度的客户请求一个 PHP 脚本,会产生 100 KB 的响应。如果服务器上没有 nginx 而直接由 Apache 交付响应。在要求交付响应的 10 秒钟内,Apache 和 PHP 会继续因该连接消耗所有的系统资源。如果安装了 nginx,Apache 会把响应转发给 nginx(nginx 到 Apache 的连接非常快,因为两者都位于同一服务器上)并释放系统资源。因为 nginx 内存占用少的多,所有系统上整体的负载会减少。如果您有大量的低速连接,使用 nginx 将会大幅度提升网站的性能。

Plesk 如何在 nginx 的帮助下处理 HTTP 请求的技术详情将接下来进一步阐述。欲了解如何在 Plesk 中打开 nginx,请参阅 安装 nginx。如果您不想使用 nginx,请根据小节 关闭 nginx 中的说明设置 Apache 为您的前端 web 服务器。如果您希望 nginx 处理网站内容的所有 HTTP 请求,请访问 调整 Apache Web 服务器设置

带有 nginx 支持的 Plesk 如何处理 HTTP 请求

为了无缝整合 nginx 和 Apache,Plesk 会额外使用两个 Apache 模块:

  • mod_aclr2
    该模块会设置一个处理程序,在所有其它 Apache 模块(mod_rewrite、.htaccess 相关的模块、mod_php,等等)的处理程序后运行。因此,如果请求是动态内容请求,mod_aclr2 将永远无法获取,因为该请求将会被某个 Apache 模块(mod_php、mod_perl、 mod_cgi,等等)更高级别的处理程序处理。唯一的例外是 SSI 请求:一旦抵达 mod_aclr2,就会被重定向到相应的处理程序。如果请求是静态文件请求,mod_aclr2 会搜索在文件系统上的确切地址并把地址发送给 nginx。
  • mod_rpaf
    从 Apache 角度来看,其所有的客户端都有一个相同的 IP 地址 - 即 nginx 服务器的地址(如上图)。这会导致把客户端 IP 地址用于验证和统计等目的的网站和 web 应用程序出现问题。mod_rpaf 会使用客户端 IP 地址替代所有请求中的 nginx 服务器的 IP 地址,从而解决该问题。更精确地说就是该模块会使用特殊的 X-Forwarded-For 请求头,nginx 会在该请求头中放入一个客户端的 IP 地址。

我们进一步来看 Plesk 在这些模板的帮助下是如何处理静态和动态内容请求的。

处理静态文件的 HTTP 请求的序列如下(如图):

  1. 一个客户发送一个请求给一个 web 服务器。
  2. nginx 会在请求中添加 X-Accel-Internal(被 mod_aclr2 使用)和 X-Forwarded-For (包含客户端的 IP 地址)请求头然后发送请求给 Apache。
  3. Apache 会接收到请求并开始通过注册的处理程序处理该请求(应用 .htaccess 配置,覆写 URL,等等)。在此步骤中,mod_rpaf 会使用来自 X-Forwarded-For 请求头中的客户端地址替代 REMOTE_ADDR Apache 中 nginx 服务器的 IP 地址。
  4. 在被所有注册的处理程序处理过后,请求会抵达 mod_aclr2。该处理程序会检查 X-Accel-Internal 请求头是否存在。如果该请求头存在,该模块会给 nginx 发送一个带有零内容长度和 X-Accel-Redirect 请求头的响应。该请求头包含由 by mod_aclr2 确定的文件的确切地址。
  5. nginx 一旦收到该响应,即会查找文件并交付给客户端。

下图是 Plesk 处理程序如何处理 2 KB GIF 文件请求的示例。

static_seq

对于处理动态内容的请求,其前三步骤是相同的。然后请求会传递到相应 Apache 模块(mod_php mod_perl mod_cgi,等等)的处理程序。请求永远不会到达 mod_aclr2(SSI 请求除外)。处理程序会生成一个响应并发送到 nginx,而由 nginx 交付给客户端。下图展示了 Plesk 如何处理 PHP 文件请求的过程。


在本节:

安装 nginx

关闭 nginx

 

安装 nginx

如果您干净安装 Plesk,将会默认启用 nginx。如果您从早期版本升级,您则可以在升级后任何时候添加 nginx 组件,具体操作是进入 工具与设置 > 更新与升级 > 添加组件。添加该组件后,启动 反向代理服务器 (nginx) 服务(在 工具与设置 > 服务管理 中)。

您可以在 工具与设置 > 服务器组件 中查看已安装 nginx 服务器的版本。

nginx version

  

 

关闭 nginx

若要返回到只有单个 Apache web 服务器的配置,请停止 反向代理服务器 (nginx) 服务(在 工具与设置 > 服务管理)。

nginx_stop

若要再次设置 nginx 为前端 web 服务器,请启动 反向代理服务器 (nginx) 服务。

注意:启动或停止 反向代理服务器 (nginx) 服务的运行不仅是启动或停止 nginx,实际上还会切换 web 服务器配置(nginx 和 Apache 组合或仅设置 Apache 为前端 web 服务器)。重启操作与其它任何服务的操作方式相同:nginx 服务已被重启。

 

Leave your feedback on this topic here

If you have questions or need support, please visit the Plesk forum or contact your hosting provider.
The comments below are for feedback on the documentation only. No timely answers or help will be provided.