nginx的反向代理与负载均衡
代理(Proxy)也称网络代理。它是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这
个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络
代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。代理通常分为正向代
理、反向代理及透明代理。
代理服务器的类型:
1、正向代理服务器(标准代理服务器)
目的:内网的服务器通过代理服务器,然后能够访问外网的服务器
原理:内网用户将请求发给代理服务器,代理服务器根据用户需求,向真正的web服务器发出请求,然后获取到网页内容之后,在本地缓存然后发给用户。
缺点:需要用户对浏览器进行设置
2、透明代理服务器
目的和原理与正向代理服务器一致,但一般布署在网关上,用户不需要再对浏览器进行设置
需要结合iptables
3、反向代理服务器(反向加速服务器)
目的:外网客户端通过代理服务器,能够访问内网服务器的资源
原理:外网客户端访问正常的域名或者IP,其实访问的是代理服务器,代理服务器帮助客户端请求页面,在代理服务器上缓存,然后再发送给客户端。
反向代理:
该功能由ngx_http_proxy_module模块提供
location / {
proxy_pass http://192.168.10.12;
}
4、启用 nginx proxy 代理
环境两台nginx真实服务器
a、nginx-1 启动网站(内容)
nginx-1的IP:192.168.100.10
yum install -y nginx
systemctl start nginx
b、nginx-2 启动代理程序
nginx-2的IP:192.168.100.20
yum install -y nginx
systemctl start nginx
# nginx 配置文件添加 proxy 配置
vim /etc/nginx/conf.d/default.conf
location / {
.....
proxy_pass http://192.168.100.10:80;
proxy_redirect default;
proxy_set_header Host http_host;
proxy_set_header X-Real-IP remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
}
c、nginx proxy 具体配置详解
proxy_pass :真实服务器
proxy_redirect :如果真实服务器使用的是的真实IP:非默认端口。则改成IP:默认端口。
proxy_set_header:重新定义或者添加发往后端服务器的请求头
proxy_set_header X-Real-IP :启用客户端真实地址(否则日志中显示的是代理在访问网站)
proxy_set_header X-Forwarded-For:记录代理地址
proxy_connect_timeout::后端服务器连接的超时时间发起三次握手等候响应超时时间
proxy_send_timeout:后端服务器数据回传时间就是在规定时间之内后端服务器必须传完所有的数据
proxy_read_timeout :nginx接收upstream(上游/真实) server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭。像长连接
proxy_buffering on;开启缓存
proxy_buffer_size:proxy_buffer_size只是响应头的缓冲区
proxy_buffers 4 128k; 内容缓冲区域大小
proxy_busy_buffers_size 256k; 从proxy_buffers划出一部分缓冲区来专门向客户端传送数据的地方
proxy_max_temp_file_size 256k;超大的响应头存储成文件。负载均衡:
该功能由ngx_http_upstream_module+ngx_http_proxy_module模块提供
调度算法:
轮循 静态
加权轮循 静态
least_conn: 根据其权重值,将请求发送到活跃连接数最少的那台服务器, 动态
ip_hash: 把同一客户端的请求调度到同一台真实服务器上.
5. 轮循 - 后端每台服务器的权重相同
upstream webs {
ip_hash; #同一网段客户端分配同一服务器
server 192.168.10.12;
server 192.168.10.13;
}
server {
...
location / {
proxy_pass http://webs; #请求转向webs 定义的服务器列表
}
...
}
6.加权轮循: 在每台服务器上加入权值,权值越高的服务器分配到的请求越多
upstream webs {
server 192.168.10.12 weight=1;
server 192.168.10.13 weight=2;
}
--------------------------------------------------------------------------------------------
[root@nginx conf]# vim /usr/local/lnmp/nginx/conf/nginx.conf
upstream web1 {
server 192.168.10.11 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.10.12 weight=2;
server 192.168.10.13 backup; #backup:备份,其他服务器全部宕机后启用 sorry
}
-------------------------------------------------------------------------------------------
7. ip_hash: 让同一客户端在一定时间内访问到同一台服务器
IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。 这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。
upstream web1 {
ip_hash;
server 172.16.0.10;
server 172.16.5.100;
server 172.16.16.100;
}
客户端测试:
同一客户端访问一直得到同一个页面.
8、负载均衡算法
upstream 支持4种负载均衡调度算法:
A、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;
B、ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
C、url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务器为缓存的时候效率。
D、fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。
配置实例
热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....
upstream myweb {
server 172.17.14.2:8080;
server 172.17.14.3:8080 backup; #热备
}
cookie : 记录(用户名、密码、访问信息等数据)客户机上,不安全,若客户机访问其他网站时,该数据有被盗取的风险
session : 记录(用户名、密码、访问信息等数据)在服务器上,客户端上只记录sessionID号,客户端再次访时,与服务端的ID做匹配,可达到保持session会话效果