nginx 反向代理和负载均衡

之前简单的学习了一下nginx反向代理和负载均衡,写一篇文章总结一下。

什么是nginx呢
百度百科对它的解释就是:nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

nginx反向代理是什么呢?
我的理解是 :
它代理服务器接收用户的请求,然后再把请求转发给服务器,服务器处理得到响应,转发给它,它再转发给发起请求的那个客户端。对用户来说,这个服务器是透明的,我们不知道它到底是哪个服务器

百度百科的解释:
在计算机网络中,反向代理是代理服务器的一种。服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器簇的存在。
与前向代理不同,前向代理作为客户端的代理,将从互联网上获取的资源返回给一个或多个的客户端,服务端(如Web服务器)只知道代理的IP地址而不知道客户端的IP地址;而反向代理是作为服务器端(如Web服务器)的代理使用,而不是客户端。客户端借由前向代理可以间接访问很多不同互联网服务器(簇)的资源,而反向代理是供很多客户端都通过它间接访问不同后端服务器上的资源,而不需要知道这些后端服务器的存在,而以为所有资源都来自于这个反向代理服务器。
反向代理在现时的互联网中并不少见,而另一些例子,像是CDN、SNI代理等,是反向代理结合DNS的一类延伸应用。
nginx 反向代理和负载均衡_第1张图片
nginx如何设置配置反向代理呢?
下面拿我的虚拟机来说吧

server {
listen 80;
server_name localhost;
charset koi8-r;
access_log /var/log/nginx/host.access.log main;
root /usr/www/mysite1;
index index.html index.htm;
location / {
proxy_pass http://129.204.60.66:80;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
当你在浏览器输入127.0.0.1的时候,nginx作为反向代理服务器会接受这个请求,然后把这个请求转发给http://129.204.60.66:80, http://129.204.60.66:80这个服务器处理请求,得到响应转发给nginx这个反向代理服务器,照这个反向代理服务器再把响应发给浏览器。其实就是多了一个字段proxy_pass;
效果:
nginx 反向代理和负载均衡_第2张图片

反向代理的功能:
可以防止外网对内网服务器的恶性攻击、缓存以减少服务器的压力和访问安全控制之外,还可以进行负载均衡,将用户请求分配给多个服务器。

什么是nginx负载均衡呢?
我的理解:
就是把本应该是一台服务器的处理的请求, 分摊给多台服务器进行处理,这样就可以减轻服务器的压力,有利于服务器的稳定。
百度百科的解析是:
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
nginx如何配置负载均衡呢?

upstream test {
server ip1:端口;
server ip2:端口;
}
server {
listen 80;
server_name localhost;
charset koi8-r;
access_log /var/log/nginx/host.access.log main;
root /usr/www/mysite1;
index index.html index.htm;
location / {
proxy_pass http://test;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
默认情况下,采用的是轮询的方式,就是先访问ip1, 在访问ip2,这样来回的切换,
nginx 反向代理和负载均衡_第3张图片
nginx 反向代理和负载均衡_第4张图片
这两个页面会来回的切换,注意在浏览器显示的ip地址是不会变的

负载均衡的几种方法:
weight(权重)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如下所示, ip1:端口 的访问比率要比 ip2:端口的访问比率高一倍。

upstream test{
server ip1:端口 weight=5;
server ip2:端口 weight=10;
}

ip_hash(访问ip)

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream test{
ip_hash;
server ip1:端口0;
server ip2:端口;
}

fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。

upstream test{
server ip1:端口;
server ip2:端口;
fair;
}

url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。

upstream test{
server ip1:端口;
server ip2:端口;
hash $request_uri;
hash_method crc32;
}

upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:

down 表示单前的server暂时不参与负载.

weight 默认为1.weight越大,负载的权重就越大。

backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

你可能感兴趣的:(nginx)