Nginx高级配置
一、Nginx方向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问,加强安全防护。反向代理还可以为后端的多台服务器提供负载均衡,或为后端较慢的服务器提供缓存服务。另外反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时处于同一个URL空间下。
1、通过HttpProxy模块实现反向代理的简单配置:
server {
listen 8888;
server_name www.test.com;
location / {
proxy_pass http://192.168.189.129:80; #设置反向代理地址
proxy_redirect off;
proxy_set_header Host $host; #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
2、upstream模块配置实现:
upstream appserver {
server 192.168.189.129:802;
}
server {
listen 8888;
server_name www.test.com;
location / {
proxy_pass http://appserver;
}
}
二、Nginx负载均衡
Nginx本身提供轮询、用户IP哈希和指定权重三种方式负载均衡策略;在默认情况下,Nginx以轮询作为负载均衡策略。
1、轮询与指定权重策略
# 简单配置如下:
upstream appserver{
server 192.168.189.128:80 weight=5;
server 192.168.189.129:80 weight=2;
}
weight是设置权重,用于后端服务器性能不均的情况。轮询策略的缺点是某一时段内的一连串访问可能是由同一个用户A发起的,那么第一次A的请求可能是128,下一次可能是129,然后128、129....在大多数应用场景中,这样并不高效,并且如果后台服务器没有实现对session的共享,会导致session没有共享的。正因如此,nginx为你提供了一个按照IP来hash的方式,即ip绑定,这样每一个客户端的访问请求都会被甩被同一个后端服务器,解决session问题。
2、IP哈希策略
# 配置如下:
upstream appserver{
ip_hash;
server 192.168.189.128:80;
server 192.168.189.129:80;
}
在这种策略中,用于进行hash运算的key是客户端的IP地址。这样的方式保证了一个客户端每次请求都将到达同一台后台主机。当然如果所hash到的后台服务器当前不可用,则请求会被转移到其他服务器。
3、down机、重试策略以及备份
# 当某一个服务器暂时性的宕机(down)时,可以使用‘down’来标示出来,并且这样被标示的服务器就不会接受请求去处理。
upstream appserver{
server 192.168.189.128:80;
server 192.168.189.129:80 down;
}
# 可以为每个backend指定最大的重试次数和重试时间间隔。所使用的关键字是max_fails和fail_timeout。如下所示:
upstream appserver{
server 192.168.189.128:80;
server 192.168.189.129:80 max_fails=3 fail_timeout=30s;
}
# 可以使用'backup'关键字。当所有的非备机(non-backup)都宕机(down)或者繁忙(busy)的时候,就使用由backup标示的备机。backup不能和ip_hash关键字一起使用。
upstream appserver{
server 192.168.189.128:80;
server 192.168.189.129:80;
server 192.168.189.130:80 backup;
}
三、Nginx静态缓存
Nginx通过Proxy cache可以使其对静态资源进行缓存。其原理是把静态资源按照一定的规则存在本地硬盘,并且会在内存中缓存常用的资源,从而加快静态资源的相应。
在http段的设置:
proxy_connect_timeout 600; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_read_timeout 600; #连接成功后,后端服务器响应时间(代理接收超时) proxy_send_timeout 600; #后端服务器数据回传时间(代理发送超时) proxy_buffer_size 32k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 proxy_temp_path /data/nginx/local/proxy_temp; proxy_cache_path /data/nginx/local/proxy_temp/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g; #levels设置目录层次,keys_zone设置缓存名字和共享内存大小 #inactive在指定时间内没人访问则被删除在这里是1天,max_size最大缓存空间
server段的设置:
location ~* \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)$ {
proxy_pass http://appserver;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one; #使用指定的缓冲区
proxy_cache_valid 200 302 1h; #对不同返回状态码的URL设置不同的缓存时间
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m; #其他状态码的缓存时间
expires 30d; #放置失期时间,为30天
add_header Nginx-Cache "$upstream_cache_status"; #查看是否命中
}
四、IP并发限制、带宽限制
nginx可以通过HttpLimitReqModule和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防止cc攻击。HttpLimitReqModule用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制,一旦并发连接超过指定数量,就会返回503错误。HttpLimitConnModule用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令这两个模块的区别是limit_zone是对一段时间内的连接数限制,limit_conn是对同一时刻的连接连接数限制。
1、设置HttpLimitReqModule限制某一段时间内同一ip访问数
http段设置:
#限制同一ip每秒访问20次
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
这里定义了一个名为allips的limit_req_zone用来存储session,大小是10M内存,以$binary_remote_addr为key,限制平均每秒的请求为20个,1M能存储16000个状态,rate的值必须为整数,如果限制两秒一个请求,可以设置成30r/m。
server段设置:
limit_req zone=allips burst=5 nodelay;
# nodelay 如果不设置此项,将严格使用平均速率限制请求数,即如设置了rate=120r/m,相当于每秒只允许处理2个请求。
2、设置HttpLimitZoneModule限制并发连接数
http段设置:
# ip限制并发数
limit_conn_zone $binary_remote_addr zone=addr:10m;
# 服务器限制并发总数
limit_conn_zone $server_name zone=perserver:10m;
server段设置:
# 连接数限制
limit_conn addr 10;
limit_conn perserver 50000;
# 连接限速
limit_rate 500k;
# 限制ip
allow 192.168.189.0/24;
# allow的ip段从允许访问的段位从小到大排列
# 24表示子掩码:255.255.255.0,16表示:255.255.0.0,8表示:255.0.0.0;
浙公网安备 33010602011771号