Nginx作为近年来较火的反向代理服务器,安装在目的主机端,主要用于转发客户机请求,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后面的服务器,决定哪台目标主机来处理当前请求。
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,
简单来说就是真实的服务器不能直接被外部网络访问,想要访问必须通过代理。
nginx的代理过程,就是将请求发送给nginx,然后将请求转发给后端web服务器,后端服务器处理完毕之后将结果再发给nginx,nginx再把结果发送给客户端。后端服务器可在远程也可在本地,也可以是nginx服务器内部定义的其他虚拟主机。
使用nginx做代理的目的之一是扩展基础架构的规模。
如果把服务只发布到一台web服务器上,一来如果访问量剧增,服务器可能就挂了,二来web服务器挂了或者停电了,造成之间无法访问了。所以可以把服务发布到多台web服务器上,起到分流和保证一台故障不会造成服务无法范围的问题。
nginx可以处理大量并发连接,请求到来后,nginx可将其转发给任意数量的后台服务器进行处理,这等于将负载均衡分散到整个集群。
源地址哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
随机法:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。
加权轮询法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
加权随机法:与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
最小连接数法:由于后端服务器的配置不尽相同,对于请求的处理有快有慢,最小连接数法根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
##upstream的负载均衡,四种调度算法##
#调度算法1:轮询.每个请求按时间顺序逐一分配到不同的后端服务器,
#如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响
upstream webhost {
server 172.36.25.256:6666 ;
server 172.36.25.257:6666 ;
}
#调度算法2:weight(权重).可以根据机器配置定义权重.权重越高被分配到的几率越大
upstream webhost {
server 172.36.25.256:6666 weight=2;
server 172.36.25.257:6666 weight=3;
}
#调度算法3:ip_hash. 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,
#有效解决了动态网页存在的session共享问题
upstream webhost {
ip_hash;
server 172.36.25.256:6666 ;
server 172.36.25.257:6666 ;
}
#调度算法4:url_hash(需安装第三方插件).此方法按访问url的hash结果来分配请求,
#使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率.
#Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包
upstream webhost {
server 172.36.25.256:6666 ;
server 172.36.25.257:6666 ;
hash $request_uri;
}
#调度算法5:fair(需安装第三方插件).这是比上面两个更加智能的负载均衡算法.
#此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,
#响应时间短的优先分配.Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块
#
背景:
两台web服务器,其中一台作为即是web服务器,也是ngnx服务器
172.36.25.256 web服务器、ngnx服务器
172.36.25.257 web服务器
找到nginx.conf文件
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream webhost {
server 172.36.25.256:8080 weight=2;
server 172.36.25.257:8080 weight=2;
}
server {
listen 8099;
server_name XXXX;
location /{
proxy_pass http://webhost;
proxy_set_header Host $host:8099;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
client_max_body_size 100m;
}
location /web{
proxy_pass http://webhost/framework;
proxy_set_header Host $host:8099;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
client_max_body_size 100m;
}
location /images {
proxy_pass http://webhost/images;
proxy_set_header Host $host:8099;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
client_max_body_size 100m;
}
}
}
输入:http:XXXX:8099/web可以访问
如果你觉得本篇文章对你有所帮助的话,麻烦请点击头像右边的关注按钮,谢谢!
技术在交流中进步,知识在分享中传播