Nginx 介绍
Nginx 是目前比较主流的 HTTP 反向代理服务器,对于构建大型分布式 Web 应用,具有举足轻重的作用。 简单来说,Nginx 有 2 个主要的功能:动/静态资源分离、负载均衡。 动/静态资源分离: Nginx 支持正则表达式以区分静态资源或者动态资源,其中动态资源可以进一步转发给后端的 Proxy Server, 而静态资源则可以在 Nginx 层面使用本地缓存策略或者重定向(类 CDN)到其他 Nginx 上。 负载均衡: 对于动态资源而言,如果有多个 Proxy Server,那么 Nginx 将会根据一定的算法选择合适的 Server, 并转发请求,最终将客户端 Request 相对均衡的分发给多个 Server。 Nginx 作为“单点”,面向客户端请求,并将请求转发给后端的某个 Server,因为 Server 可以有多个, 那么从整体而言,提升了站点的“资源整合”能力,提升了站点的整体吞吐能力; 但因为受限于 Nginx 本身的 IO 模型,并没有“降低”对物理资源的消耗(即性能开支); 通常 Nginx 作为整个站点的“避雷针”和导流通道,它应该被架设在物理资源较为优越的机器上, 比如 8U 物理机,32 核心,64G 内存,对磁盘要求相对较低,对 CPU、内存、网卡带宽有较高的要求, 因为 Nginx 不仅需要和客户端请求建立链接,而且还需要与后端 Proxy Server 建立链接并且负责流量输入、输出 (这和 LVS、HAProxy 有本质区别),这种双倍的链接建立,就要求机器具有较高的内存和 CPU, 如果你的 Nginx 还有大量的“静态资源” Cache,还需要使用高速、高容量的磁盘。 因为 Nginx 节点最终为所有 Proxy Server 流量的总和,那么它应该具有更高的网卡带宽。 为了避免资源竞争,应该避免 Nginx 和 Web Server 部署在同一个节点上, 因为 Web Server 通常为 CPU 和内存高耗型,这会大大降低 Nginx 的代理能力。 1) 在中小型应用中(PV 在 KW 级别,单一垂直 Web 应用),通常一个 Nginx 代理多个(组)Server 即可。 2)对于大中型应用,一个 Nginx 将无法支撑全部的流量,我们将会采用多个 Nginx 代理(复制了 1)中的架构模型, 并在 Nginx 前端继续构建高性能的分流设备,比如 LVS、HAProxy 等更低层的软/硬件负载均衡器, 这种负载均衡器通常只是“转发”,而不涉及到流量的输出,所以转发效率将会更高,承载能力更强。 3)无论何时,我们也不希望 Nginx 存在单点故障问题,那么通常我们还需要使用 Keepalived(其他同类型技术,VIP) 来提高 Nginx 节点的可用性,即 Master-Backup 模式。 4)当有多个 Nginx 时,为了提升后端 Server 的代理能力,通常还会让多个 Nginx 之间交叉重叠代理后端的 Server。
Nginx 工作进程介绍
Nginx 会启动一个 master 进程,和“worker_processes”个 worker 进程, 其中 Master 进程主要的作用就是“加载、评定配置信息”、“维护 worker 进程”, worker 进程用于处理实际的 Request,Nginx 基于平台的 event 模型,向 worker 进程分发 Request。 当 master 进程收到 reload 信号时,首先检测配置文件的合法性,然后尝试使用新的配置信息; 如果成功,master 将启动新的 worker 进程,并向原来的 worker 进程发消息请求它们 shutdown, 此后 Request 将会被分发给新的 worker 进程,对于原来的 worker 将自己已经 accept 的请求处理完之后即关闭; 如果配置文件有问题,master 将会回滚配置的更改,而 worker 进程不受任何影响。