一、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;

Nginx学习总结(3)——Nginx配置及应用场景之高级配置的更多相关文章

  1. nginx 学习笔记(2) nginx新手入门

    这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作.前提是nginx已经被安装到你的服务器上.如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装.这篇手册主要内容:1. ...

  2. Nginx学习笔记六Nginx的模块开发

    1.Nginx配置文件主要组成:main(全局配置)这部分的指令将影响其他所有部分.server(虚拟主机配置)这部分指令主要用于指定虚拟主机域名,IP和端口.upstream(主要为反向代理,负载均 ...

  3. nginx学习笔记(7)Nginx如何处理一个请求---转载

    如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口 ...

  4. nginx 学习笔记(1) nginx安装

    1.nginx安装 根据操作系统的不同,nginx的安装方式也不相同. 1.1 对linux系统来说,nginx.org提供了nginx安装包.http://nginx.org/en/linux_pa ...

  5. nginx学习(五):nginx.conf 核心配置文件详解

    整体结构 详细信息 1.设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody user root; 2.worker进程工作数设置,一般来 ...

  6. nginx学习(三):nginx的进程模型

    概述 nginx 进程分为 master进程和work进程 1.打开配置文件查看,这里我修改为2 [root@xxx conf]# vim nginx.conf #user nobody; worke ...

  7. Nginx学习之十一-Nginx启动框架处理流程

    Nginx启动过程流程图 下面首先给出Nginx启动过程的流程图: ngx_cycle_t结构体 Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个N ...

  8. 七、Nginx学习笔记七Nginx的Web缓存服务

    user www; worker_processes 1; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/l ...

  9. Nginx学习系列三Nginx的启动、停止、修改配置文件后重启

    1.启动Nginx 命令规则:Ngxin的安装地址 -c Nginx的安装地址下的配置文件地址 注意:一般都在root权限下进行Nginx的启动 2.停止Nginx (1).从容停止 第一步:查看Ng ...

随机推荐

  1. MySQL 备份和恢复数据

    备份指定数据库的全部表或指定表 mysqldump -u user -h localhost -p [password] db_name[ tbl_name[,tbl_name.......]]> ...

  2. Linux下 FACL详解

    1. 什么是ACL ACL即Access Control List 主要的目的是提供传统的owner,group,others的read,write,execute权限之外的具体权限设置 ACL可以针 ...

  3. 【WIP_S4】栈

    创建: 2018/01/15 更新: 2018/01/24 更改标题 [[WIP_S3]堆] => [[WIP_S4]堆] 继续添加内容 更新: 2018/05/13 更改标题  [[WIP_S ...

  4. 【杂文】虚拟键码表(供函数GetAsyncKeyState()使用)

    [杂文]虚拟键码表(供函数GetAsyncKeyState()使用) 什么?你说你不知道 \(GetAsyncKeyState()\) ?\(→\)戳我\(←\) (惊奇的发现 \(0\) ~ \(9 ...

  5. LN : leetcode 207 Course Schedule

    lc 207 Course Schedule 207 Course Schedule There are a total of n courses you have to take, labeled ...

  6. cocos2d-x android 环境部署

    1.下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.下载 and ...

  7. switch-case用法

    1.switch-case 一般的用它来做值匹配的. //匹配 就是全等. /* 语法: switch(表达式){ case 值1: 表达式的值和 值1匹配上了,需要执行的代码; break; cas ...

  8. Js onmouseover和onmouseout小特效

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  9. Python在云端编程之IPython notebook

    Python在云端编程之IPython notebook 如果本地编程考虑到Python版本,机器位数,编译环境,科学栈安装等等繁琐的事,弄得你焦头烂额,不如移步云端,省去这些繁琐过程,在云端编程是很 ...

  10. (求助)对某一颜色,设置透明度 alpha 后,其他使用该颜色的地方 受到影响!!!!原因未知

    对某一颜色,设置透明度 alpha 后,其他使用该颜色的地方 受到影响!!!!原因未知,有谁碰到过这样的问题?????? 测试了以下三款手机,结果如下: 1.android 4.4.2: 不受影响 2 ...