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;

posted @ 2019-03-05 12:01  让我们荡起双桨!  阅读(242)  评论(0)    收藏  举报