当前位置 博文首页 > 青春季风暴:(三)Nginx配置及应用场景之高级配置

    青春季风暴:(三)Nginx配置及应用场景之高级配置

    作者:[db:作者] 时间:2021-09-06 10:28

    一、Nginx反向代理
    反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
    通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。
    一个通过HttpProxy模块实现反向代理的简单配置:

    server {
    listen ??8888;
    server_name ?134.32.28.134;
    
    
    location / {
    ????proxy_pass http://134.32.28.134:8090;
    ????proxy_redirect off;
    ????proxy_set_header X-Real-IP $remote_addr;
    ????proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    } 此配置实现在ie中输入http://134.32.28.134:8888即会调转到134.32.28.134:8090中
    Upstream模块配置实现:
    upstream appserver {?
    ????server 134.32.28.134:8090;
    }?
    server {
    ???listen ??8888;
    ???server_name ?134.32.28.134;
    
    ???location / {
    ???????proxy_pass http://appserver;
    ???}
    }


    HttpRewrite模块配置实现

    server {
    ???listen ??8888;
    ???server_name ?134.32.28.134;
    ???rewrite ?http://134.32.28.134:8090/ permanent;
    }


    二、Nginx负载均衡
    Nginx本身提供轮询(round robin)、用户IP哈希(ip_hash)和指定权重三种方式负载均衡策略, 另外也出现第三方负载均衡模块fair和url_hash,默认情况下,Nginx以轮询作为负载均衡策略。
    轮询与指定权重策略
    简单配置如下:

    upstream appserver {?
    ???????server 134.32.28.134:8090 weight=5;
    ???????server 134.32.28.134:8091 weight=2;
    }?


    weight是设置权重,用于后端服务器性能不均的情况。 轮询策略的缺点是某一时段内的一连串访问可能都是由同一个用户A发起的,那么第一次A的请求可能是 8090,而下一次是 8091,然后是 8090、8091…… 在大多数应用场景中,这样并不高效,并且如果后台服务器没有实现对session的共享,会导致session没有共享的。当然,也正因如此,Nginx 为你提供了一个按照IP来hash的方式,这样每个客户端的访问请求都会被甩给同一个后端服务器。
    IP哈希策略
    配置如下:

    upstream appserver {?
    ??ip_hash;
    ??????server 134.32.28.134:8090;
    ??????server 134.32.28.134:8091;
    }?


    这种策略中,用于进行hash运算的key是客户端的IP地址。这样的方式保证一个客户端每次请求都将到达同一个后台主机。当然,如果所hash到的后台服务器当前不可用,则请求会被转移到其他服务器。
    down机、重试策略及备份
    当某个一个服务器暂时性的宕机(down)时,你可以使用“down”来标示出来,并且这样被标示的 、服务器就不会接受请求去处理。如:

    upstream appserver {?
    ???????server 134.32.28.134:8090;
    ???????server 134.32.28.134:8091 down;
    }?


    可以为每个 backend 指定最大的重试次数,和重试时间间隔。所使用的关键字是 max_fails 和 fail_timeout。如下所示:

    upstream appserver {?
    ???????server 134.32.28.134:8090;
    ???????server 134.32.28.134:8091 max_fails=3 fail_timeout=30s;
    }?


    可以使用“backup”关键字。当所有的非备机(non-backup)都宕机(down)或者繁忙(busy)的时候,就只使用由 backup 标注的备机。backup不能和ip_hash关键字一起使用。举例如下:

    upstream appserver {?
    ???????server 134.32.28.134:8090;
    ???????server 134.32.28.134:8091;
    ??server 134.32.28.134:8092 backup;
    }?


    fair(Nginx需安装第三方模块,OpenResty已经集成)
    fair按后端服务器的响应时间来分配请求,响应时间短的优先分配,配置如下:

    upstream appserver {?
    ??????server 134.32.28.134:8090;
    ??????server 134.32.28.134:8091;
    ??fair;
    }?


    url_hash(Nginx需安装第三方模块)
    url_hash按访问URL的hash结果来分配请求,使每个URL定向到同一个后端服务器,后端服务器为缓存时比较适用。另外,在upstream中加入hash语句后,server语句不能写入weight等其他参数。

    upstream appserver {?
    ??????server 134.32.28.134:8090;
    ??????server 134.32.28.134:8091;
    ??hash ?$request_uri;
    ??hash_method ?crc32;
    }?


    三、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 /home/spdev/nginx/openresty/local/nginx/proxy_temp;
    proxy_cache_path /home/spdev/nginx/openresty/local/nginx/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; ?#哪些状态缓存多长时间
    ?????proxy_cache_valid 301 1d;
    ?????proxy_cache_valid any 1m; ?????#其他的缓存多长时间 ??
    ?????expires 30d; ??#置失期时间,为30天
    ?}


    四、IP并发限制、带宽限制
    nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。 HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。 一旦并发连接超过指定数量,就会返回503错误。HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制。
    设置HttpLimitReqModul限制某一段时间内同一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;
    #brust的意思就是,如果第1秒、2,3,4秒请求为19个,第5秒的请求为25个是被允许的。
    #但是如果你第1秒就25个请求后面的5个请求就会被限制,返回503错误。
    #nodelay,如果不设置该选项,严格使用平均速率限制请求数,
    #也就是说如果你设置rate=120r/m,相当于每秒只允许处理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 132.35.75.0/24;
    #deny all;
    其中allow、deny是HTTP Access模块对应的指令,以下需注意:
    、deny 一定要加一个ip,否则直接跳转到403,不往下执行了;如果403默认页是
    ???同一域名下,会造成死循环访问;
    、allow的ip段从允许访问的段位从小到大排列,如127.0.0.0/24 下面才能是
    .10.0.0/16
    表示子网掩码:255.255.255.0
    表示子网掩码:255.255.0.0
    表示子网掩码:255.0.0.0;
    、deny all;结尾 表示除了上面allow的其他都禁止
    ???如:
    deny 192.168.1.1;
    allow 127.0.0.0/24;
    allo w 192.168.0.0/16;
    allow 10.10.0.0/16;
    deny all;
    五、第三方合并静态文件模块的使用
    这里介绍的是淘宝开发的nginx_concat_module针对nginx的文件合并模块,主要用于合并前端代码减少http请求数。对于此模块的安装前面已经有过说明,这里不再详细解说。
    nginx_concat_module模块配置
    # nginx_concat_module 主开关
    concat on;
    # 最大合并文件数
    concat_max_files 10;
    # 只允许同类型文件合并
    concat_unique on;
    # 允许合并的文件类型,多个以逗号分隔。如:application/x-javascript, text/css
    concat_types text/html;
    举例如:
    http://主机地址/test/??1.css,2.css,3.css…10.css,这里会将1.css,2.css…10.css 是个css文件合并为一个文件从而只需一次请求。
    六、实际应用中配置实例nginx.conf部分配置
    include ?common.conf;
    ??include ?proxy_cache.conf;
    #设定负载均衡的服务器列表

    upstream appserver {?
    ??????server 134.32.28.134:8090 weight=5;
    ??????server 134.32.28.134:8091 weight=2;
    }?
    
    

    include limit_common.conf;
    # server虚拟主机配置 ????????????????????????

    server {
    ???listen ??????8888;
    ???server_name ?134.32.28.134;
    ?????????
    #设置网页的默认编码格式
    ???#charset utf8;?
    
    #根据访问域名生成对应的访问日志
    ???access_log ?logs/host.access.log ?main; ????
    ???
    ???lua_code_cache on;?
    
    ???location / { ????
    ???????proxy_pass http://appserver;?
    ???????include user_agent.conf;
    ???????include limit_info.conf;
    ???}
    ???
    ???location /mytest { ???
    ???????content_by_lua_file conf/alcache.lua; ??????
    ???}
    ???
    ???location /proxy { ???
    ????include user_agent.conf;?
    ???????include limit_info.conf;
    ???????proxy_pass http://appserver$uri;?
    ???}
    ????
    ???#静态文件缓存
    ???location ~* \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)$ {
    ???
    ????????#防盗链
    ????#valid_referers none blocked 134.32.28.134;
    #if ($invalid_referer) {
    #return 403;
    #}
    ?
    ????proxy_pass http://appserver;
    ????????proxy_redirect off;
    ????????proxy_set_header Host $host;
    ????????proxy_cache cache_one;
    ????????proxy_cache_valid 200 302 1h;
    ????????proxy_cache_valid 301 1d;
    ????????proxy_cache_valid any 1m;
    ????????expires 30d;
    ??}


    此处nginx.conf中include了limit_common.conf、user_agent.conf、limit_info.conf与proxy_cache.conf,其中user_agent.conf中配置了客户端信息判断及文件合并等信息,limit_common.conf配置了ip限制相关公用信息,limit_info.conf配置了实际server中限制要求,proxy_cache.conf中配置了静态缓存相关信息,其中静态文件缓存部分为server运用中的配置。
    user_agent.conf配置
    #客户端判断
    #if ($http_user_agent ~* "MSIE") { proxy_pass http://appserver; }
    if ($http_user_agent ~* "Nokia") { rewrite . /404.html break; }
    if ($http_user_agent ~* "Mobile") { rewrite . /404.html break; }
    if ($http_user_agent ~* "SAMSUNG") { rewrite . /404.html break; }
    if ($http_user_agent ~* "SonyEricsson") { rewrite . /404.html break; }
    if ($http_user_agent ~* "MOT") { rewrite . /404.html break; }
    if ($http_user_agent ~* "BlackBerry") { rewrite . /404.html break; }
    if ($http_user_agent ~* "LG") { rewrite . /404.html break; }
    if ($http_user_agent ~* "HTC") { rewrite . /404.html break; }
    if ($http_user_agent ~* "J2ME") { rewrite . /404.html break; }
    if ($http_user_agent ~* "Opera Mini") { rewrite . /404.html break; }
    if ($http_user_agent ~* "ipad") { proxy_pass http://appserver; }
    if ($http_user_agent ~* "iphone") { proxy_pass http://appserver; }
    if ($http_user_agent ~* "android") { proxy_pass http://appserver; }
    #只允许访问get、head、post方法
    if ($request_method !~* ^(GET|HEAD|POST)$ ) {
    return 403;
    }


    #js、css文件合并
    ??concat on;
    ??#concat_max_files 10;
    ??#只允许同类型文件合并
    ??#concat_unique on;
    ??#允许合并的文件类型,多个以逗号分隔。如:application/x-javascript, text/css
    ??#concat_types text/html
    limit_common.conf配置
    #限制同一ip每秒访问20次
    limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
    #ip限制并发数
    limit_conn_zone ?$binary_remote_addr zone=addr:10m;
    #服务器限制并发总数
    limit_conn_zone $server_name zone=perserver:10m;
    limit_info.conf配置
    #brust的意思就是,如果第1秒、2,3,4秒请求为19个,第5秒的请求为25个是被允许的。
    #但是如果你第1秒就25个请求后面的5个请求就会被限制,返回503错误。
    #nodelay,如果不设置该选项,严格使用平均速率限制请求数,
    #也就是说如果你设置rate=120r/m,相当于每秒只允许处理2个请求
    limit_req zone=allips burst=5 nodelay;
    #连接数限制
    limit_conn addr 10; ?
    limit_conn perserver 50000;
    #连接限速
    limit_rate 500k; ??
    #限制ip
    allow 132.35.75.0/24;
    #deny all;
    proxy_cache.conf配置
    proxy_connect_timeout 5;
    proxy_read_timeout 60;
    proxy_send_timeout 5;
    proxy_buffer_size 16k;
    proxy_buffers 4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 128k;
    proxy_temp_path /home/spdev/nginx/openresty/local/nginx/proxy_temp;
    proxy_cache_path /home/spdev/nginx/openresty/local/nginx/cache levels=1:2?
    keys_zone=cache_one:200m inactive=1d max_size=30g;
    ---------------------?


    原文:https://blog.csdn.net/u012562943/article/details/53418445?
    ?

    cs