nginx和apache一样都是一种web服务器。基于REST架构风格,以统一资源标识符URI和统一资源定位符URL作为沟通依据,通过HTTP协议提供各种网络服务。apache稳定开源跨平台,但不支持高并发,在apache上运行数以万计的并发访问,会导致服务器消耗到大量内存。俄罗斯工程师使用c语言开发了Nginx,nginx使用基于事件驱动架构,使得其可以支持数以百万级别的tcp连接。 Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器,同时也是一个IMAP、POP3、SMTP代理服务器,nginx可以作为一个HTTP服务器进行网站的发布处理,另外还可以作为反向代理进行负载均衡的实现。
1.正向代理
用户访问google,我们需要vpn翻墙才能访问。 vpn对我们来说是可以感知的,但对google服务器来说不可感知,只知道是http请求来的。 人可以感知,但服务器不可以感知到的服务器叫正向代理服务器。正向代理最大的特点是客户端非常明确要访问的服务器地址,服务器端只清楚请求来自那个代理服务器但不清楚来自哪个具体的客户端。
正向代理的用途:
(1)访问原来无法访问的资源,如Google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
(5)隐藏了客户端信息
2.反向代理
通过反向代理实现负载均衡 当我们访问一个网站时,网站有一个代理服务器,通过这个代理服务器可以做负载均衡,路由到不同的server. 对于我们来说我们是不可感知的,但服务器知道。反向代理代理的是服务端,代服务端接受请求,然后再分发请求。
反向代理的作用:
(1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载
(3)隐藏了服务端信息
3.负载均衡
客户端发送,nginx反向代理服务器接收到的请求数量,就是负载亮。请求数量按照一定的规则分发到不同的服务器处理的规则就是一种均衡规则。所以,将服务器接收到的请求按照规则分发的过程,称为负载均衡。 分为硬件负载均衡和软件负载均衡。硬负载如F5负载均衡,相对造价成本昂贵。软负载里利用现有的技术结合主机硬件实现的一种消息队列分发机制。
Nginx支持的负载均衡调度算法方式如下:
(1)weight轮询(默认,常用):接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
(2)ip_hash(常用):每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
(3)fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。
(4)url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。
负载均衡具体实现:在upstream模块里面
在nginx.conf中:
#nginx 多核绑定
worker_processes 16;
worker_cpu_affinity auto;
daemon off;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 65535;
}
#后端服务器
http {
#可以进行设置
......
#添加每个负载的主机以及端口
# 1轮询方式
upstream test{
server 172.25.25.1:80;
server 172.25.25.3:80;
}
# 2权重方式
upstream test{
server localhost:8080 weight=9; //占90%
server localhost:8081 weight=1; //占10%
}
# 3 ip_hash
upstream test{
ip_hash;
server 172.25.25.1:80;
server 172.25.25.3:80;
}
# 4fair 第三方 按后端服务器相应时间来分配,响应时间短的优先分配
upstream test{
fair;
server 172.25.25.1:80;
server 172.25.25.3:80;
}
# 5 url_hash 第三方 按访问url的hash结果来分配请求,是每个url定向到同一个后端服务器,后端服务器为缓存时比较有效
upstream test{
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
}
#这个server也可以新建一个配置然后单独放入,项目中都是这样,然后nginx.conf中将其引入即可(这样重启nginx.conf都会将配置包括引入的配置重启)
server {
listen 80;
server_name www.example.com;
root /usr/local/etc/nginx/www/huxintong_admin;
index index.php;
proxy_pass http://test; #这个就是负载均衡的地方 http代表协议,如果上面写了http:..172.25.25.1:80 那么这块直接写个test即可。
autoindex on;
}
......
}
proxy_pass的值为 URL为要设置的被代理服务器的地址,包含传输协议、主机名称或IP地址加端口号、URI等要素。
4.主备配置:还是在upstream模块里面。现一般使用keepalived自动检测服务器情况。
设置节点为backup,那么一般情况下所有请求都访问上面的,当上面的server1挂掉或者忙的时候才会访问下面的
upstream webname {
server 192.168.0.1:8080;
server 192.168.0.2:8080 backup;
}
#设置节点为down,那么这个server不参与负载
upstream webname {
server 192.168.0.1:8080;
server 192.168.0.2:8080 down;
}