您可以提高托管客户网站的 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 请求的技术详情将接下来进一步阐述。
带有 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 文件请求的示例
对于处理动态内容的请求,其前三步骤是相同的。然后请求会传递到相应 Apache 模块(mod_php、 mod_perl、 mod_cgi,等等)的处理程序。请求永远不会到达 mod_aclr2(SSI 请求除外)。处理程序会生成一个响应并发送到 nginx,而由 nginx 交付给客户端。下图展示了 Plesk 如何处理 PHP 文件请求的过程。