Nginx反向代理、负载均衡及日志
Nginx反向代理、负载均衡及日志
1、原理图
2、正向代理与反向代理
(1)代理服务器
代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。
使用代理服务器的好处
(1.1)提高访问速度
由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次客户再访问相同的站点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能明显提高请求速度。
(1.2)防火墙作用
由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。
(1.3)通过代理服务器访问不能访问的目标站点
互联网上有许多开发的代理服务器,客户机在访问受限时,可通过不受限的代理服务器访问目标站点,通俗说,我们使用的FQ浏览器就是利用了代理服务器,虽然不能出国,但也可直接访问外网。
(2)正向代理的概念
正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
结论就是,正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
(3)反向代理的概念
反向代理指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接到客户端,此时代理服务器对外就表现为一个服务器,而此种工作模式类似于LVS-NET模型。
反向代理也可以理解为web服务器加速,它是一种通过在繁忙的web服务器和外部网络之间增加的一个高速web缓冲服务器,用来降低实际的web服务器的负载的一种技术。反向代理是针对web服务器提高加速功能,所有外部网络要访问服务器时的所有请求都要通过它,这样反向代理服务器负责接收客户端的请求,然后到源服务器上获取内容,把内容返回给用户,并把内容保存在本地,以便日后再收到同样的信息请求时,它会将本地缓存里的内容直接发给用户,已减少后端web服务器的压力,提高响应速度。因此Nginx还具有缓存功能。
(4)反向代理的工作流程
1.用户通过域名发出访问请求,该域名被解析为反向代理服务器的IP地址;
2.反向代理服务器接收用户的请求;
3.反向代理服务器在本地缓存查找是否存在当前用户所请求的内容,找到则直接把内容返回给用户;
4.如果本地没有用户请求的内容,反向代理服务器会以自己的身份去后端服务器请求同样的信息内容,并把信息内容发给用户,如果信息内容是可以被缓存的,则会将该内容缓存在代理服务器的本地缓存中
(5)反向代理的好处
1.解决了网站服务器对外可见的问题,提高了网站服务器的安全性;
2.节约了有限的IP地址资源,后端服务器均可使用私有IP地址与代理服务器进行通信;
3.加速了网站的访问速度,减轻了真实web服务器的负荷。
(6)正向代理与反向代理的区别
从用途上来讲:
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。
从安全性来讲:
正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
3、负载均衡
负载均衡器 (Load Balancer,简称LB) 将来自多个公网地址访问的流量分发到多台主机上,支持自动检测并隔离故障主机,提升业务系统的服务能力和可用性
3.1 准备环境两台web,一台lb01均安装nginx
3.2 修改web01和web02的首页index html,进行区分
3.3 修改lb01的nginx.conf配置文件
[root@lb01 conf]# cat nginx.conf
省略其他内容
keepalive_timeout 65;
upstream backup01 {
server 10.0.0.7;
server 10.0.0.8;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backup01;
}
}
}
测试:使用curl命令或者浏览器访问
[root@lb01 conf]# curl 10.0.0.5
Web02
[root@lb01 conf]# curl 10.0.0.5
Web01
[root@lb01 conf]# curl 10.0.0.5
Web02
[root@lb01 conf]# curl 10.0.0.5
Web01
4、nginx负载均衡算法
4.1、round-robin(rr轮询,默认算法)
round-robin的意思是循环轮询。Nginx最简单的负载均衡配置如下:
http {
upstream app1 {
server 10.10.10.1;
server 10.10.10.2;
}
server {
listen 80;
location / {
proxy_pass http://app1;
}
}
}
upstream app1用来指定一个服务器组,该组的名字是app1,包含两台服务器。在指定服务器组里面包含的服务器时以形式"server ip/domain:port"的形式指定,其中80端口可以忽略。然后在接收到请求时通过"proxy_pass http://app1"把对应的请求转发到组app1上。Nginx默认的负载均衡算法就是循环轮询,如上配置我们采用的就是循环轮询,其会把接收到的请求循环的分发给其包含的(当前可用的)服务器。使用如上配置时,Nginx会把第1个请求给10.10.10.1,把第2个请求给10.10.10.2,第3个请求给10.10.10.1,以此类推。
4.2、least-connected(最小连接数)
least-connected算法的中文翻译是最少连接,即每次都找连接数最少的服务器来转发请求。例如Nginx负载中有两台服务器,A和B,当Nginx接收到一个请求时,A正在处理的请求数是10,B正在处理的请求数是20,则Nginx会把当前请求交给A来处理。要启用最少连接负载算法只需要在定义服务器组时加上"least_conn",如:
upstream backup01 {
least_conn;
server 10.0.0.7;
server 10.0.0.8;
}
4.3、ip-hash(ip哈希)
ip-hash算法会根据请求的客户端IP地址来决定当前请求应该交给谁。使用ip-hash算法时Nginx会确保来自同一客户端的请求都分发到同一服务器。要使用ip-hash算法时只需要在定义服务器组时加上"ip-hash "指令,如:
upstream backup01 {
ip_hash;
server 10.0.0.7;
server 10.0.0.8;
}
4.4、weighted(权重值)
weighted算法也就是权重算法,会根据每个服务的权重来分发请求,权重大的请求相对会多分发一点,权重小的会少分发一点。这通常应用于多个服务器的性能不一致时。需要使用权重算法时只需要在定义服务器组时在服务器后面指定参数weight,如:
upstream backup01 {
server 10.0.0.7 weight=2;
server 10.0.0.8 weight=1;
}
4.5、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream web_pool {
server 172.23.136.148;
server 172.23.136.149;
fair;
}
4.6、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream web_pool {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
5、upstream支持的状态参数
在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。设为0则表示关闭该项功能,当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
注,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
[root@lb01 ~]# vim /etc/nginx/nginx.conf
省略其他内容
upstream webservers {
server 10.0.0.7 weight=1 max_fails=2 fail_timeout=2;
server 10.0.0.8 weight=1 max_fails=2 fail_timeout=2;
}
6、解决负载均衡无法读取用户真实信息
根据负载均衡的原理,根据web服务器的访问日志无法读取访问者的真实ip等信息,可以利用nginx定义的变量,修改nginx.conf设置请求头来达到目的
设置请求头
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
[root@lb01 conf]# vim nginx.conf
省略其他内容
keepalive_timeout 65;
upstream backup01 {
server 10.0.0.7;
server 10.0.0.8;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backup01;
proxy_set_header Host $host; #请求头
proxy_set_header X-real-ip $remote_addr; #真实ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #代理ip
}
}
}
再修改日志格式加入真实ip的变量即可
6、nginx日志
官方说明:http://nginx.org/en/docs/http/ngx_http_log_module.html
5.1 查看日志
cat /application/nginx/logs/access.log #查看正确访问日志
cat /application/nginx/logs/error.log #查看错误日志
5.2 日志格式说明
nginx.conf.default默认配置文件21-23行内容
21#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
22 # '$status $body_bytes_sent "$http_referer" '
23 # '"$http_user_agent" "$http_x_forwarded_for"';
log_format为日志格式关键参数,不能变
main是为日志指定的标签,记录日志时通过这个main标签选择指定的格式。其后所接的所有内容都是可以记录的日志信息,所有的日志段以空格分隔,一行可以记录多个
Nginx日志变量 | 说明 |
$remote_addr | 记录访问网站的客户端地址 |
$remote_user | 远程客户端用户名称 |
$time_local | 记录访问时间与时区 |
$request | 用户的http请求起始行信息 |
$status | http状态码,记录请求返回的状态,例如:200、404、301等 |
$body_bytes_sent | 服务器发送给客户端的响应body字节数 |
$http_referer | 记录此次请求是从哪个链接访问过来的,可以根据refer进行防盗链设置 |
$http_user_agent | 记录客户端访问信息,例如:浏览器,手机客户端等 |
$http_x_forwarded_for | 当前端有代理服务器时,设置Web节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的http_x_forwarded_for设置 |
日志格式重要字段说明
http_referer:HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
5.3、access_log参数说明
官方说明:
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
buffer=size为存放访问日志的缓冲区大小,flush=time为将缓冲区的日志刷到磁盘的时间,gzip=level表示压缩级别,if=condition表示其他条件,一般的场景中,这些参数都无须配置,极端优化时才可能会考虑这些参数。
access_log off中的off表示不记录访问日志