对于Nginx首先要了解的是Nginx的作用和它的代理方式,Nginx的作用为负载均衡、代理方式为反向代理。
负载均衡:平衡web服务器集群中转发给各服务器的请求数,防止出现服务器因为处理请求压力大或小导致内存溢出、宕机或资源浪费的情况发生。
反向代理:对外暴露的地址是代理服务器的地址隐藏了真实服务器的地址,客户端将请求发送到代理服务器上。由代理服务器根据配置规则选择真实服务器处理请求,在获得服务器返回数据后再返回给客户端。此时代理服务器在外看来就是提供服务的服务器,客户端对代理是无感知的并不知道具体是哪台服务器处理的它的请求且不需要做任何配置。
正向代理:例如当因工需要,需要访问浏览器正常访问不到的服务器时,此时要找到一个可以访问该服务器的代理服务器。客户端将请求发送给代理服务器,代理服务器去访问该服务器,然后将访问到的数据返回给我们,这样的代理模式称为正向代理。正向代理时真实客户端的信息被屏蔽或者隐藏了,服务器只清楚请求来自哪台代理服务器而不清楚来自哪个客户端,但客户端非常明确要访问的服务器地址。
即:正向代理代理的是客户端的请求,反向代理代理的是服务器。
例如页面请求地址为http://www.sayhi.com/products/pageManage,则在nginx.conf中配置server如下:
server {
listen 80; #监听80的服务端口
server_name www.sayhi.com; #监听的域名
location /{
root emstatic;
index index.html;
}
location /products {
proxy_pass http://127.0.0.1:8103/zuul-product/product/manage;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Origin' '*';
}
}
根据域名www.sayhi.com和后缀/products匹配到server中的server_name和location后,将剩余url后缀/pageManage拼接到location中的配置项proxy_pass的url后通过网关访问服务器资源。
所以访问http://www.sayhi.com/products/pageManage时经过nginx配置后实际访问的地址为http://127.0.0.1:8103/zuul-product/product/manage/pageManage。
2.1 轮询
依次按照顺序访问后端的每一个服务器,按照这个计算,相当于平均分配请求给所有集群节点-物理均衡。首先准备一个upstream的虚拟域名,保管后端服务器的详细信息。
upstream ouservers{
server 127.0.0.1:8091;
server 128.0.0.2:8092;
server 129.0.0.3:8093;
}
nginx启动时加载成为一个内存的list对象元素有3个分别是8091 8092 8093,负载均衡的计算都是通过这个list完成的,在server中使用proxy_pass指向这个新创建的upstream名称ouservers。
添加server案例
server{
listen 80;
server_name www.ou.com;
location / {
proxy_pass http://ouservers/;
}
}
在访问有多个用户访问www.ou.com时会把请求轮询转给127.0.0.1:8091、128.0.0.2:8093和129.0.0.3:8093服务器去处理。
2.2 权重
总是按照物理均衡分配并发有时候不满足实际情况,按照情况通过占用比例的分配均衡逻辑就是权重(权衡比重)。权重基于轮询完成,可以在upstream的轮询基础上添加权重的关键字weight,权重值越高转发的请求越多(参数为整数等于down表示该server不可访问)。
upstream ouservers {
#补充后端服务器的ip:port-based
server 127.0.0.1:8091 weight=10;
server 128.0.0.2:8092 weight=5;
server 129.0.0.3:8093 weight=1;
}
2.3 Nginx解决集群共享session问题的方案
在单节点进程中可以使用session属性存储一些数据。在一次会话中使用这些属性如果是集群中会产生问题,不能实现集群共享session数据。由于session是属于服务器端的技术,不同进程中生成的session对象无法共同使用,所以无法使用session会话技术实现携带状态的请求功能。
数据通信共享:会话的session会被全部节点所存储,并发高时会导致集群中每一个节点中都有量的session对象容易造成服务器内存溢出。
ip_hash黏着:根据ip做hash取余计算绑定服务器但有可能导致倾斜,会有服务器由于倾斜严重,提前宕机。
采用第三方容器:session数据不再存储到服务器本地,采用第三方存储使每个服务器连接这个第三方存储读写数据。但引入第三方势必导致多占用网络访问带宽资源,对容器技术的稳定性,速度要求比较高。理论上存储容器可以是关系型数据库(例mysql)。但是非关系型数据库(例redis)是更好的选择。
nignx配置ip_hash黏着只需要在upstream的括号中填写一个关键属性 "ip_hash"。
upstream ouservers {
ip_hash;
server 127.0.0.1:8091;
server 127.0.0.1:8092;
server 127.0.0.1:8093;
}
后端服务器集群是动态数据的来源,nginx作为http服务器代理用来管理后端所需文件和静态资源,在nginx服务器中,准备好访问的静态资源可以通过域名url地址访问。
添加server案例(以Linux系统为例)
server{
listen 80;
server_name www.image.com;
location /{
root /home/static; #关键字root配置项为静态资源的根目录
index default.html #没有找到指定静态资源时默认访问的静态资源
}
}
具体流转过程如下:请求地址http://www.image.com/xyy.png匹配server中的location后将静态资源名称tp.png衔接在root配置项后,拼接成资源在Nginx服务器上的绝对地址/home/static/tp.png根据地址拿到静态资源返回到浏览器页面给用户展示。
root配置项:可以是文件夹绝对路径,如Linux (root /home/static)、Windows(root C:/static)。也可以是文件夹相对路径root static(表示在nginx安装的根目录有一个文件夹叫做static)。
index配置项:表示当访问请求匹配到location中的root后,在没有找到指定静态资源时默认访问的静态资源地址。index也可以配置多个静态资源,例如:index default1.html default2.html。如果静态资源/home/static/default1.html不存在则接着验证/home/static/default2.html是否存在,存在则用/default2.html在该server中发起内部重定向去重新匹配location)
注:在配置nginx.conf文件时需要将资源ip和监听域名写进Nginx服务器的本地hosts文件中(如127.0.0.1 www.sayhi.com)