Nginx反向代理
反向代理是指客户端与服务器通信时,代理服务器担任中介的角色,将客户端的请求转发给合适的服务器,并将服务器的响应返回给客户端。与正向代理不同的是,反向代理是由服务器端配置的,客户端对它是透明的。
Nginx反向代理就是将Nginx接收到的请求转发给其它应用服务器处理
Nginx反向代理的类型
Nginx反向代理有七层反向代理和四层反向代理
(1)七层反向代理
是基于http、https、mail等七层应用协议的代理转发,一般用于动静分离等应用场景
配置方法:
①在http配置块中使用upstream定义后端服务器列表名称和节点参数
http {
upstream 服务器池名称 {
server IP1:PORT1 weight=1;
server IP2:PORT2 weight=1;
......
}
②在server配置块中使用location匹配用户请求的动态页面的URL路径,使用 proxy_pass 基于协议代理转发
server {
......
location ~ .*\.jsp$ {
proxy_pass http://服务器池名称;
#用于为后端服务器获取真实的客户端地址
proxy_set_header HOST $host;
proxy_set_header X_Real_IP $remote_addr;
proxy_set_header X_Forwarded_For $proxy_add_x_forwarded_for;
}
......
}
......
}
(2)四层反向代理
是基于IP和端口的代理转发,一般用于做网关访问入口的负载均衡器等应用场景
配置方法:
①编译安装时需要添加 stream 四层代理模块
./configure --with-stream
②在http配置块同层级,一般在http配置块上面添加 stream 配置块,在 stream 配置块里使用upstream定义后端服务器列表名称和节点参数以及使用server配置块定义监听端口和转发配置
stream {
upstream 服务器池名称 {
server IP1:PORT1 weight=1;
server IP2:PORT2 weight=1;
......
}
server {
listen IP:PORT;
proxy_pass 服务器池名称;
}
}
http {....}
Nginx负载均衡
Nginx是一个高性能的Web服务器和反向代理服务器,它也可以用作负载均衡器。
负载均衡是一种技术,将传入的流量分配到多个服务器上,以确保每台服务器上的负载相对均衡。负载均衡可以提高系统的可伸缩性,增加系统的容错能力,并改善用户体验。
Nginx 负载均衡是通过反向代理实现,可以将nginx接收到的请求转发给多个后端应用服务器处理
Nginx的负载均衡算法
|------------|-----------|-------------------------------------------------------|
| rr | 轮询 | 是nginx的默认调度模式,按照时间顺序逐一分配请求 |
| wrr | 加权轮询 | 使用weight参数设置权重,weight值越高的节点被分配请求的概率越大 |
| least_conn | 最少连接、最小连接 | 优先将请求分配给当前连接数最少的节点 |
| ip_hash | 源地址哈希 | 根据客户端IP做hash缓存调度,会将请求分配给固定的一个节点 |
| url_hash | 目的地址哈希 | 根据客户端请求访问的URL路径做hash缓存调度,会将请求分配给固定的一个节点。需要另外按照第三方模块支持 |
| fair || 优先将请求分配给响应时间最少的节点。需要另外按照第三方模块支持 |
| random || 随机分配请求 |
| hash nginx全局变量 consistent || 一致性hash算法,根据nginx全局变量的值来做hash缓存调度 |
Nginx负载均衡会话保持
(1)基于客户端IP做hash缓存将请求发送给同一个后端节点服务器来实现会话保持,但是此方法容易导致负载失衡问题
ip_hash 或 一致性hash算法
(2)基于cookie来判断实现会话保持
sticky_cookie_insert
upstream backend {
server ...... ;
sticky_cookie_insert srv_id expires=浏览器中保持cookie的时间 domain=cookie的域名 path=cookie的路径;
}
(3)后端应用服务器自身通过相关机制设置,使用缓存数据库为后端节点服务器做session同步复制实现会话保持
Nginx动静分离
Nginx动静分离是指将网站的静态资源(如图片、CSS、JavaScript文件)和动态资源(如HTML页面、PHP文件)分别通过Nginx服务器进行处理和响应。
动静分离的目的是提高网站的性能和吞吐量。静态资源通常都是不会改变的,可以被缓存,通过Nginx直接响应,减少了动态资源处理的负担,提高了网站的访问速度。
Nginx 动静分离:静态页面请求,由nginx自行处理并响应;
动态页面请求,则nginx通过反向代理转发给后端应用服务器处理
动静分离的原理
动静分离是一种将动态生成的内容与静态页面分开存储和处理的技术,其原理如下:
-
客户端请求静态资源:当浏览器请求一个网页时,服务器首先检查其请求的资源是否为静态资源(如HTML、CSS、JavaScript、图片等)。若是静态资源,则直接返回给浏览器。
-
动态请求处理:若请求的资源为动态资源(如动态页面、接口),服务器将请求转发给相应的处理程序(如PHP、Python、Java等),执行相应的代码。
-
动态内容生成:处理程序根据用户请求和数据处理逻辑,生成动态内容(如数据库查询、业务逻辑处理),并将结果返回给服务器。
-
返回动态内容:处理程序将生成的动态内容返回给服务器。
-
动态内容与静态页面合并:服务器将动态内容嵌入到预先定义好的静态页面模板中,生成最终的网页。
-
返回整个页面:服务器将最终的网页返回给浏览器。
通过动静分离,可以将动态生成的内容和静态页面分开处理和存储,提高服务器的处理效率和网站的性能。静态资源可以通过缓存技术进行优化,减少对服务器的请求;动态请求可以通过负载均衡和分布式部署实现高并发处理。同时,动静分离也方便开发人员进行网站的维护和更新,降低了开发的复杂性。