Nginx 反向代理缓存服务器搭建
相关标签:1.Nginx Ingress Controller
2. 解析 Nginx 日志
摘要:用于将内网的连接请求(如 VPN/NAT)代理到互联网。
代理服务可简单分为正向代理和反向代理:
正向代理:客户端指定代理服务器,将原本打算直接发送给目标 Web 服务器的 HTTP 请求发送到代理服务器,再由代理服务器访问 Web 服务器,并将 Web 服务器的响应返回给客户端:
反向代理:与正向代理相反,如果局域网向互联网提供资源并允许互联网上的其他用户访问局域网内的资源,可以设置代理服务器,其提供的服务即为反向代理。反向代理服务器接收来自互联网的连接,然后将请求转发到内网服务器,并将响应返回给
1. 反向代理是指代理服务器接收客户端的连接请求,然后将请求转发到网络上的 Web 服务器(可能是 Apache、Nginx、Tomcat、IIS 等),并将 Web 服务器获得的结果返回给请求连接的客户端,代理服务器对外表现为服务器。
从上图可以看出:反向代理服务器代理网站 Web 服务器接收 HTTP 请求并转发请求。而且作为反向代理服务器,Nginx 可以根据用户请求的内容将请求转发到不同的后端 Web 服务器,例如实现动静分离,又如在 Nginx 上创建多个虚拟主机,使得在浏览器中输入不同的域名(URL)时可以顺利访问后端不同的 Web 服务器或 Web 集群。
2. 反向代理的作用是什么?
① 保护网站安全:来自互联网的任何请求都必须先经过代理服务器;
wKioL1jsz9yAHyulAABvTU4R-Ew435.png-wh_50
② 通过配置缓存功能加速 Web 请求:可以缓存真实 Web 服务器上的一些静态资源,减轻真实 Web 服务器的负载压力;
wKiom1jsz-nwYDqSAABjrKK3l5E661.png-wh_50
③ 实现负载均衡:充当负载均衡服务器,均衡地分发请求,平衡集群中各台服务器的负载压力;
wKiom1jsz__Q7RpoAAJQnYSWdA8640.png-wh_50
1. Nginx 简介
Nginx 是一款轻量级的 Web 服务器、反向代理和邮件代理服务器。以稳定性、丰富的功能集、示例配置文件和低系统资源消耗著称。Nginx(发音同 engine x)由俄罗斯程序员 Igor Sysoev 开发,最初被俄罗斯大型门户网站和搜索引擎 Rambler(俄语:Рамблер)使用。该软件采用 BSD 类许可证发布,可运行于 UNIX、GNU/Linux、BSD、Mac OS X、Solaris 和 Microsoft Windows。
Nginx 的应用现状
Nginx 已在俄罗斯最大的门户网站 Rambler Media(www.rambler.ru)上运行,俄罗斯超过 20% 的虚拟主机平台使用 Nginx 作为反向代理服务器。
在中国,淘宝、新浪微博、新浪播客、网易新闻、六间房、56.com、Discuz!、水木社区、豆瓣、YUPOO、国内、迅雷在线等众多网站已使用 Nginx 作为 Web 服务器或反向代理服务器。
2. Nginx 的核心特性
(1)跨平台:Nginx 可在大多数操作系统上编译运行,同时提供 Windows 版本;
(2)配置非常简单:非常容易上手。
(3)非阻塞式高并发连接:官方测试可支持5万并发连接,在实际生产环境中可运行2万至3万并发连接。(这得益于 Nginx 使用了最新的 epoll 模型);
说明:
对于 Web 服务器,首先看一个请求的基本流程:建立连接 - 接收数据 - 发送数据,从系统底层来看:上述过程(建立连接 - 接收数据 - 发送数据)在系统底层是一个读写事件。
如果采用阻塞调用方式:当读写事件未就绪时,只能等待,当前线程被挂起,直到事件就绪才能进行读写操作。
如果采用非阻塞调用方式:事件立即返回,告知事件尚未就绪,稍后再来。过一会儿再次检查事件,直到事件就绪,期间可以先做其他事情,然后再回来检查事件是否就绪。虽然不会被阻塞,但需要不时检查事件状态,能做更多事情,不过开销不小。非阻塞调用意味着在结果未立即可用时,该调用不会阻塞当前线程。
(4)事件驱动:通信机制采用 epoll 模型,支持更大的并发连接。
非阻塞通过不断检查事件状态来判断是否执行读写操作,带来了很大的开销,因此有了异步非阻塞事件处理机制。该机制允许同时监听多个事件,调用它们是非阻塞的,但可以设置超时。在超时时间内,如果某个事件就绪就会返回。该机制解决了阻塞调用和非阻塞调用的上述两个问题。
以 epoll 模型为例:当事件未就绪时,将其放入 epoll(队列)。如果某个事件就绪,就处理它;当事件未就绪时,在 epoll 中等待。这样,我们就可以并发处理大量的请求。当然,这里的并发请求指的是未处理的请求。只有一个线程,所以同一时刻当然只有一个请求能被处理。只是在请求之间不断切换。切换也是因为异步事件未就绪而主动放弃的。这里的切换没有代价,可以理解为在循环遍历多个已就绪的事件。
与多线程方式相比,这种事件处理方式有很大优势。不需要创建线程,每个请求占用的内存极少。没有上下文切换。事件处理非常轻量,并发数量大也不会导致资源的不必要浪费(上下文切换)。对于 Apache 服务器,每个请求都会有一个独占的工作线程,当并发数达到几千时,就会有几千个线程同时处理请求。这对操作系统是一个很大的挑战:因为线程导致的内存占用非常大,线程上下文切换带来的 CPU 开销非常大,性能自然无法提高,这导致在高并发场景下性能严重下降。
总结:通过异步非阻塞事件处理机制,Nginx 实现了由进程循环处理多个就绪事件,从而达到高并发和轻量化。
(5)Master/Worker 结构:一个 Master 进程生成一个或多个 Worker 进程。
说明:Master-Worker 设计模式主要包含两个组件:Master 和 Worker。Master 维护 Worker 队列,将请求发送给多个 Worker 并行执行。Worker 主要执行实际逻辑计算,并将结果返回给 Master。
Nginx 采用这种进程模型有什么好处?使用独立进程可以防止进程之间相互影响。一个进程退出后,其他进程仍在工作,服务不会中断。Master 进程会快速启动新的 Worker 进程。当然,Worker 进程的异常退出一定是由程序缺陷导致的。异常退出会导致当前 Worker 上的所有请求失败,但不会影响所有请求,因此降低了风险。
(6)内存消耗小:处理大规模并发请求的内存消耗非常小。在3万并发连接下,10个 Nginx 进程仅消耗150MB内存(15MB×10=150MB)。
(7)内置健康检查功能:如果 Nginx 代理后端的某台 Web 服务器宕机,不会影响前端访问。
(8)节省带宽:支持 GZIP 压缩,可添加浏览器本地缓存的 Header 头部信息。
(9)高稳定性:用于反向代理时,宕机概率极低。
Nginx 配置反向代理
将 Nginx 配置为反向代理和负载均衡器,利用其缓存功能将静态页面缓存在 Nginx 中,减少后端服务器连接数,并检查后端 Web 服务器的健康状况。
wKiom1js0B-iFnITAACVfFt6894317.png-wh_50
1. 安装 Nginx
环境:
OS:CentOS 7.2
Nginx:192.168.31.83
Apache1:192.168.31.141
Apache2:192.168.31.250
安装 zlib-devel、pcre-devel 等依赖
[root@www ~]# yum -y install gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel
说明:
结合 proxy 和 upstream 模块实现后端 Web 负载均衡
利用 proxy 模块实现静态文件缓存
结合 Nginx 默认的 ngx_http_proxy_module 模块和 ngx_http_upstream_module 模块
实现后端服务器的健康检查,还可以使用第三方模块 nginx_upstream_check_module
使用 nginx-sticky-module 扩展模块实现 cookie 会话保持(保持会话)
使用 ngx_cache_purge 实现更强大的缓存清除功能
上述两个模块属于第三方扩展模块。需要提前下载源代码,然后在编译时通过 --add-module=src_path 一起安装。

安装 Nginx
[root@www ~]# groupadd www #添加 www 组
[root@www ~]# useradd -g www www -s /sbin/nologin #创建 Nginx 运行账户 www 并加入 www 组,不允许 www 用户直接登录系统
#tar zxf nginx-1.10.2.tar.gz
#tar zxf ngx_cache_purge-2.3.tar.gz
#tar zxf master.tar.gz
# cd nginx-1.10.2/
[root@www nginx-1.10.2]# ./configure --prefix=/usr/local/nginx1.10 --user=www --group=www --with-http_stub_status_module --with-http_realip_module --with- http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi- temp-path=/var/tmp/nginx/fcgi --with-pcre --add-module=../ngx_cache_purge-2.3 --with-http_flv_module --add-module=../nginx-goodies-nginx-sticky -module-ng-08a395c66e42
[root@www nginx-1.10.2]# make && make install
说明:Nginx 的所有模块必须在编译时添加,不能在运行时动态加载。
以下介绍 Nginx 负载均衡模块支持的其他调度算法:
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器。如果某台后端服务器宕机,故障系统会被自动剔除,不会影响用户访问。Weight 指定轮询权重,Weight 值越大分配到的访问概率越高,主要用于后端各台服务器性能不均的情况。
ip_hash:每个请求按访问 IP 的哈希结果分配,使来自同一 IP 的访客访问同一台后端服务器,有效解决了动态网页的 session 共享问题。当然,如果该节点不可用,会被发送到下一个节点,如果此时没有会话同步,用户会被登出。
least_conn:请求被发送到当前活跃连接数最少的真实服务器。会考虑 weight 权重值。
url_hash:该方法按访问 URL 的哈希结果分配请求,使每个 URL 指向同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身不支持 url_hash,如需使用该调度算法,必须安装 Nginx 的哈希包 nginx_upstream_hash。
fair:这是一种比上述两种更智能的负载均衡算法。该算法可以根据页面大小和加载时间智能地进行负载均衡,即根据后端服务器的响应时间分配请求,优先分配给响应时间短的服务器。Nginx 本身不支持 fair,如需使用该调度算法,必须下载 Nginx 的 upstream_fair 模块。
5. 负载均衡与健康检查:
严格来说,Nginx 没有对负载均衡后端节点的健康检查,但可以通过默认的 ngx_http_proxy_module 模块和 ngx_http_upstream_module 模块中的相关指令来完成。当后端节点故障时,会自动切换到下一个节点提供访问。
weight:轮询权重,也可用于 ip_hash,默认值为1
max_fails:允许请求失败的次数,默认为1。超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
fail_timeout:有两层含义,一是在10秒内最多允许2次失败;二是在2次失败后的10秒内不再向该服务器分配请求。
6. Nginx 的代理缓存使用:
缓存是将后端服务器的 js、css、图片等静态文件缓存到 Nginx 指定的缓存目录中,不仅可以减轻后端服务器的负担,还可以加快访问速度,但及时清理缓存就成了问题,因此需要 ngx_cache_purge 模块在到期时间前手动清理缓存。
proxy 模块中常用的指令是 proxy_pass 和 proxy_cache。
Nginx 的 Web 缓存功能主要由 proxy_cache、fastcgi_cache 指令集及相关指令集完成。proxy_cache 指令负责反向代理缓存后端服务器的静态内容,fastcgi_cache 主要用于处理 FastCGI 动态进程缓存。
2. 解析 Nginx 日志
摘要:用于将内网的连接请求(如 VPN/NAT)代理到互联网。
代理服务可简单分为正向代理和反向代理:
正向代理:客户端指定代理服务器,将原本打算直接发送给目标 Web 服务器的 HTTP 请求发送到代理服务器,再由代理服务器访问 Web 服务器,并将 Web 服务器的响应返回给客户端:
反向代理:与正向代理相反,如果局域网向互联网提供资源并允许互联网上的其他用户访问局域网内的资源,可以设置代理服务器,其提供的服务即为反向代理。反向代理服务器接收来自互联网的连接,然后将请求转发到内网服务器,并将响应返回给
请求连接的互联网客户端:
1. Nginx 反向代理:Web 服务器的调度器
1. 反向代理是指代理服务器接收客户端的连接请求,然后将请求转发到网络上的 Web 服务器(可能是 Apache、Nginx、Tomcat、IIS 等),并将 Web 服务器获得的结果返回给请求连接的客户端,代理服务器对外表现为服务器。
从上图可以看出:反向代理服务器代理网站 Web 服务器接收 HTTP 请求并转发请求。而且作为反向代理服务器,Nginx 可以根据用户请求的内容将请求转发到不同的后端 Web 服务器,例如实现动静分离,又如在 Nginx 上创建多个虚拟主机,使得在浏览器中输入不同的域名(URL)时可以顺利访问后端不同的 Web 服务器或 Web 集群。
2. 反向代理的作用是什么?
① 保护网站安全:来自互联网的任何请求都必须先经过代理服务器;
wKioL1jsz9yAHyulAABvTU4R-Ew435.png-wh_50
② 通过配置缓存功能加速 Web 请求:可以缓存真实 Web 服务器上的一些静态资源,减轻真实 Web 服务器的负载压力;
wKiom1jsz-nwYDqSAABjrKK3l5E661.png-wh_50
③ 实现负载均衡:充当负载均衡服务器,均衡地分发请求,平衡集群中各台服务器的负载压力;
wKiom1jsz__Q7RpoAAJQnYSWdA8640.png-wh_50
2. 什么是 Nginx
1. Nginx 简介
Nginx 是一款轻量级的 Web 服务器、反向代理和邮件代理服务器。以稳定性、丰富的功能集、示例配置文件和低系统资源消耗著称。Nginx(发音同 engine x)由俄罗斯程序员 Igor Sysoev 开发,最初被俄罗斯大型门户网站和搜索引擎 Rambler(俄语:Рамблер)使用。该软件采用 BSD 类许可证发布,可运行于 UNIX、GNU/Linux、BSD、Mac OS X、Solaris 和 Microsoft Windows。
Nginx 的应用现状
Nginx 已在俄罗斯最大的门户网站 Rambler Media(www.rambler.ru)上运行,俄罗斯超过 20% 的虚拟主机平台使用 Nginx 作为反向代理服务器。
在中国,淘宝、新浪微博、新浪播客、网易新闻、六间房、56.com、Discuz!、水木社区、豆瓣、YUPOO、国内、迅雷在线等众多网站已使用 Nginx 作为 Web 服务器或反向代理服务器。
2. Nginx 的核心特性
(1)跨平台:Nginx 可在大多数操作系统上编译运行,同时提供 Windows 版本;
(2)配置非常简单:非常容易上手。
(3)非阻塞式高并发连接:官方测试可支持5万并发连接,在实际生产环境中可运行2万至3万并发连接。(这得益于 Nginx 使用了最新的 epoll 模型);
说明:
对于 Web 服务器,首先看一个请求的基本流程:建立连接 - 接收数据 - 发送数据,从系统底层来看:上述过程(建立连接 - 接收数据 - 发送数据)在系统底层是一个读写事件。
如果采用阻塞调用方式:当读写事件未就绪时,只能等待,当前线程被挂起,直到事件就绪才能进行读写操作。
如果采用非阻塞调用方式:事件立即返回,告知事件尚未就绪,稍后再来。过一会儿再次检查事件,直到事件就绪,期间可以先做其他事情,然后再回来检查事件是否就绪。虽然不会被阻塞,但需要不时检查事件状态,能做更多事情,不过开销不小。非阻塞调用意味着在结果未立即可用时,该调用不会阻塞当前线程。
(4)事件驱动:通信机制采用 epoll 模型,支持更大的并发连接。
非阻塞通过不断检查事件状态来判断是否执行读写操作,带来了很大的开销,因此有了异步非阻塞事件处理机制。该机制允许同时监听多个事件,调用它们是非阻塞的,但可以设置超时。在超时时间内,如果某个事件就绪就会返回。该机制解决了阻塞调用和非阻塞调用的上述两个问题。
以 epoll 模型为例:当事件未就绪时,将其放入 epoll(队列)。如果某个事件就绪,就处理它;当事件未就绪时,在 epoll 中等待。这样,我们就可以并发处理大量的请求。当然,这里的并发请求指的是未处理的请求。只有一个线程,所以同一时刻当然只有一个请求能被处理。只是在请求之间不断切换。切换也是因为异步事件未就绪而主动放弃的。这里的切换没有代价,可以理解为在循环遍历多个已就绪的事件。
与多线程方式相比,这种事件处理方式有很大优势。不需要创建线程,每个请求占用的内存极少。没有上下文切换。事件处理非常轻量,并发数量大也不会导致资源的不必要浪费(上下文切换)。对于 Apache 服务器,每个请求都会有一个独占的工作线程,当并发数达到几千时,就会有几千个线程同时处理请求。这对操作系统是一个很大的挑战:因为线程导致的内存占用非常大,线程上下文切换带来的 CPU 开销非常大,性能自然无法提高,这导致在高并发场景下性能严重下降。
总结:通过异步非阻塞事件处理机制,Nginx 实现了由进程循环处理多个就绪事件,从而达到高并发和轻量化。
(5)Master/Worker 结构:一个 Master 进程生成一个或多个 Worker 进程。
说明:Master-Worker 设计模式主要包含两个组件:Master 和 Worker。Master 维护 Worker 队列,将请求发送给多个 Worker 并行执行。Worker 主要执行实际逻辑计算,并将结果返回给 Master。
Nginx 采用这种进程模型有什么好处?使用独立进程可以防止进程之间相互影响。一个进程退出后,其他进程仍在工作,服务不会中断。Master 进程会快速启动新的 Worker 进程。当然,Worker 进程的异常退出一定是由程序缺陷导致的。异常退出会导致当前 Worker 上的所有请求失败,但不会影响所有请求,因此降低了风险。
(6)内存消耗小:处理大规模并发请求的内存消耗非常小。在3万并发连接下,10个 Nginx 进程仅消耗150MB内存(15MB×10=150MB)。
(7)内置健康检查功能:如果 Nginx 代理后端的某台 Web 服务器宕机,不会影响前端访问。
(8)节省带宽:支持 GZIP 压缩,可添加浏览器本地缓存的 Header 头部信息。
(9)高稳定性:用于反向代理时,宕机概率极低。
3. Nginx+Apache 搭建 Web 服务器集群的负载均衡
Nginx 配置反向代理
将 Nginx 配置为反向代理和负载均衡器,利用其缓存功能将静态页面缓存在 Nginx 中,减少后端服务器连接数,并检查后端 Web 服务器的健康状况。
wKiom1js0B-iFnITAACVfFt6894317.png-wh_50
1. 安装 Nginx
环境:
OS:CentOS 7.2
Nginx:192.168.31.83
Apache1:192.168.31.141
Apache2:192.168.31.250
安装 zlib-devel、pcre-devel 等依赖
[root@www ~]# yum -y install gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel
说明:
结合 proxy 和 upstream 模块实现后端 Web 负载均衡
利用 proxy 模块实现静态文件缓存
结合 Nginx 默认的 ngx_http_proxy_module 模块和 ngx_http_upstream_module 模块
实现后端服务器的健康检查,还可以使用第三方模块 nginx_upstream_check_module
使用 nginx-sticky-module 扩展模块实现 cookie 会话保持(保持会话)
使用 ngx_cache_purge 实现更强大的缓存清除功能
上述两个模块属于第三方扩展模块。需要提前下载源代码,然后在编译时通过 --add-module=src_path 一起安装。

安装 Nginx
[root@www ~]# groupadd www #添加 www 组
[root@www ~]# useradd -g www www -s /sbin/nologin #创建 Nginx 运行账户 www 并加入 www 组,不允许 www 用户直接登录系统
#tar zxf nginx-1.10.2.tar.gz
#tar zxf ngx_cache_purge-2.3.tar.gz
#tar zxf master.tar.gz
# cd nginx-1.10.2/
[root@www nginx-1.10.2]# ./configure --prefix=/usr/local/nginx1.10 --user=www --group=www --with-http_stub_status_module --with-http_realip_module --with- http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi- temp-path=/var/tmp/nginx/fcgi --with-pcre --add-module=../ngx_cache_purge-2.3 --with-http_flv_module --add-module=../nginx-goodies-nginx-sticky -module-ng-08a395c66e42
[root@www nginx-1.10.2]# make && make install
说明:Nginx 的所有模块必须在编译时添加,不能在运行时动态加载。
4. 负载均衡的其他调度方案:
以下介绍 Nginx 负载均衡模块支持的其他调度算法:
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器。如果某台后端服务器宕机,故障系统会被自动剔除,不会影响用户访问。Weight 指定轮询权重,Weight 值越大分配到的访问概率越高,主要用于后端各台服务器性能不均的情况。
ip_hash:每个请求按访问 IP 的哈希结果分配,使来自同一 IP 的访客访问同一台后端服务器,有效解决了动态网页的 session 共享问题。当然,如果该节点不可用,会被发送到下一个节点,如果此时没有会话同步,用户会被登出。
least_conn:请求被发送到当前活跃连接数最少的真实服务器。会考虑 weight 权重值。
url_hash:该方法按访问 URL 的哈希结果分配请求,使每个 URL 指向同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身不支持 url_hash,如需使用该调度算法,必须安装 Nginx 的哈希包 nginx_upstream_hash。
fair:这是一种比上述两种更智能的负载均衡算法。该算法可以根据页面大小和加载时间智能地进行负载均衡,即根据后端服务器的响应时间分配请求,优先分配给响应时间短的服务器。Nginx 本身不支持 fair,如需使用该调度算法,必须下载 Nginx 的 upstream_fair 模块。
5. 负载均衡与健康检查:
严格来说,Nginx 没有对负载均衡后端节点的健康检查,但可以通过默认的 ngx_http_proxy_module 模块和 ngx_http_upstream_module 模块中的相关指令来完成。当后端节点故障时,会自动切换到下一个节点提供访问。
weight:轮询权重,也可用于 ip_hash,默认值为1
max_fails:允许请求失败的次数,默认为1。超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
fail_timeout:有两层含义,一是在10秒内最多允许2次失败;二是在2次失败后的10秒内不再向该服务器分配请求。
6. Nginx 的代理缓存使用:
缓存是将后端服务器的 js、css、图片等静态文件缓存到 Nginx 指定的缓存目录中,不仅可以减轻后端服务器的负担,还可以加快访问速度,但及时清理缓存就成了问题,因此需要 ngx_cache_purge 模块在到期时间前手动清理缓存。
proxy 模块中常用的指令是 proxy_pass 和 proxy_cache。
Nginx 的 Web 缓存功能主要由 proxy_cache、fastcgi_cache 指令集及相关指令集完成。proxy_cache 指令负责反向代理缓存后端服务器的静态内容,fastcgi_cache 主要用于处理 FastCGI 动态进程缓存。
