nginx 代理服务器、负载均衡配置

        虚拟机Linux环境服务器1台:192.168.216.164.

        

        代理服务器:

        所谓"代理",是指在内网边缘设置一个硬件/软件转发请求;"正向"还是"反向"的说法,取决于转发的是"出站请求"还是"入站请求"。

        正向代理处理来自客户端的出站请求,将其转发到Internet,然后将生成的相应返回给客户端

        反向代理处理来自Internet的入站请求,将其转发给后端工作程序,然后将相应返回给客户端

        代理服务器存在的目的

        ①堡垒机/隔离内网:内网客户端无法访问外网需要设置堡垒机、隐藏内网工作服务器;

        ②代理服务器附加功能:对流量执行操作、使用缓存或压缩来提高性能、防御攻击并过滤信息;


        什么是正向代理?

        一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

        客户端才能使用正向代理。正向代理总结就一句话:代理端代理的是客户端。例如说:我们使用的OpenVPN 等等。

        什么是反向代理?

        反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

        反向代理总结就一句话:代理端代理的是服务端。

        反向代理服务器的优点是什么?

        反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。

冷暖自知一抹茶ck

        Nginx是个厉害的服务器,可以配置多个服务器,一个server就是一个服务器

server {
      listen       80;
      server_name  *.yourdomain.com;
      ....
}

        代理转发是在server下面的location进行配置

server {
   // 服务器配置

   location  / {
       // ...... 代理配置
   }
}

        常见的Nginx代理配置

upstream my_server {                                                        
    server 10.0.0.2:8080;                                               
    keepalive 2000;

}

server {
    listen       80;                                                        
    server_name  10.0.0.1;                                              
    client_max_body_size 1024M;

    location /my/ {
        proxy_pass http://my_server/;
        proxy_set_header Host $host:$server_port;

    }
}


本地添加host :

192.168.216.164 www.laravel.com

那么,访问nginx地址www.laravel.com/my的请求会被转发到zp_server1服务地址 192.168.216.164:8080/my/ 。


nginx.conf添加配置  upstream:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;


    upstream zp_server1{
        server 192.168.216.164:8080;
    }


    server {
        listen       80;
        server_name  localhost;
        
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }


        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        include /usr/local/nginx/vhosts/*;
}

修改 vhost/www.laravel.conf 配置文件:

server {
     listen 80;
     server_name laravel.com www.laravel.com;
     root /usr/local/nginx/html/www.laravel.com;
     #access_log /www/access_ abc.log main;
     location / {
         index index.php index.html index.htm;
     }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/www.laravel.com$fastcgi_script_name;
        include fastcgi_params;
    }

    location /my/ {

        proxy_pass http://zp_server1/my/;

        proxy_set_header Host $host:$server_port;

    }

    location ~ /\.ht {
        deny all;
    }
}

新增转发到的配置   vhosts/www.yii.conf:

server {
     listen 8080;
     server_name 192.168.216.164:8080;
     root /usr/local/nginx/html/www.yii.com;
     #access_log /www/access_abc.log main;
     location / {
         index index.php index.html index.htm;
     }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/www.yii.com$fastcgi_script_name;
        include fastcgi_params;
    }
    location ~ /\.ht {
        deny all;
    }
}
  1. 重新启动nginx,使配置生效。

  2. 本机访问http://www.laravel.com/my/ ,注意启动绑定的端口要和 nginx 中的 upstream 设置的端口保持一致。  

冷暖自知一抹茶ck



负载均衡(负载均衡实现利用服务器集群处理客户端请求,提高访问效率,降低服务器响应压力。)

        前面的例子中,代理仅仅指向一个服务器,但是,网站在实际运营过程中,大部分都是以集群的方式运行,这时需要使用负载均衡来分流。

        nginx 也可以实现简单的负载均衡功能。

        冷暖自知一抹茶ck

        假设这样一个应用场景:将应用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三台 linux 环境的服务器上。网站域名叫 www.helloworld.com,公网 IP 为 192.168.1.11。在公网 IP 所在的服务器上部署 nginx,对所有请求做负载均衡处理(下面例子中使用的是加权轮询策略)。

        nginx.conf 配置如下:

http {     
    #设定mime类型,类型由mime.type文件定义
    include       /etc/nginx/mime.types;    default_type  application/octet-stream;    
    #设定日志格式
    access_log    /var/log/nginx/access.log;    
    #设定负载均衡的服务器列表
    upstream load_balance_server {        
        #weigth参数表示权值,权值越高被分配到的几率越大
        server 192.168.1.11:80   weight=5;        
        server 192.168.1.12:80   weight=1;        
        server 192.168.1.13:80   weight=6;
    }   
    #HTTP服务器
    server {        
        #侦听80端口
        listen       80;        
        #定义使用www.xx.com访问
        server_name  www.helloworld.com;        
        #对所有请求进行负载均衡请求
        location / {            
            root        /root;                 #定义服务器的默认网站根目录位置
            index       index.html index.htm;  #定义首页索引文件的名称
            proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表

            #以下是一些反向代理的配置(可选择性配置)
            #proxy_redirect off;
            proxy_set_header Host $host;            
            proxy_set_header X-Real-IP $remote_addr;            
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $remote_addr;            
            proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传

            client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

负载均衡策略:

        1. Nginx 提供了多种负载均衡策略,让我们来一一了解一下:

        轮询

upstream bck_testing_01 {
    # 默认所有服务器权重为 1
    server 192.168.250.220:8080
    server 192.168.250.221:8080
    server 192.168.250.222:8080
}

        加权轮询

upstream bck_testing_01 {
    server 192.168.250.220:8080   weight=3
    server 192.168.250.221:8080              # default weight=1
    server 192.168.250.222:8080              # default weight=1
}

        最少连接

upstream bck_testing_01 {
    least_conn;

    # with default weight for all (weight=1)
    server 192.168.250.220:8080
    server 192.168.250.221:8080
    server 192.168.250.222:8080
}

        加权最少连接

upstream bck_testing_01 {
    least_conn;

    server 192.168.250.220:8080   weight=3
    server 192.168.250.221:8080              # default weight=1
    server 192.168.250.222:8080              # default weight=1
}

        IP Hash

upstream bck_testing_01 {

    ip_hash;

    # with default weight for all (weight=1)
    server 192.168.250.220:8080
    server 192.168.250.221:8080
    server 192.168.250.222:8080
}

        普通 Hash

upstream bck_testing_01 {

    hash $request_uri;

    # with default weight for all (weight=1)
    server 192.168.250.220:8080
    server 192.168.250.221:8080
    server 192.168.250.222:8080
}

        2. 一些重要的命令和参数

        在定义集群服务器中,某个服务器后通过以下命令和参数实现重要功能

        1)down:表示该服务器下线,不参与负载均衡;

        2)backup:表示该服务器为备份服务器,当集群中其他服务器宕机时可用

        3)max_fails:表示该服务器处理客户端请求经过几次失败后认定该服务器宕机,默认为1

        4)fail_timeout:单独使用时表示该服务器被认为宕机后,经过多久会再次被尝试加入集群,默认为10S

        5)max_conns:表示该服务器允许连接数的上限,默认为0即无限制

upstream test {
    server 127.0.0.1:8001   down ; 
    server 10.10.11.85:8001  backup; 
    server 10.10.11.86:8001 max_fails=2 fail_timeout=30s; 
    server 10.10.11.87:8001 max_fails=2 fail_timeout=30s; 
}

        通常max_fails和fail_timeout配合使用,表示在fail_timeout内失败max_fails次以后,认为该服务器宕机,然后再等待fail_timeout后,再尝试与该服务器通信。


        扩展阅读:使用LVS实现负载均衡原理及安装配置详解

                        lvs 介绍



网站有多个 webapp 的配置:

        当一个网站功能越来越丰富时,往往需要将一些功能相对独立的模块剥离出来,独立维护。这样的话,通常,会有多个 webapp。

        举个例子:假如 www.helloworld.com 站点有好几个 webapp,finance(金融)、product(产品)、admin(用户中心)。访问这些应用的方式通过上下文(context)来进行区分:

        www.helloworld.com/finance/

        www.helloworld.com/product/

        www.helloworld.com/admin/ 

        我们知道,http 的默认端口号是 80,如果在一台服务器上同时启动这 3 个 webapp 应用,都用 80 端口,肯定是不成的。所以,这三个应用需要分别绑定不同的端口号。

        那么,问题来了,用户在实际访问 www.helloworld.com 站点时,访问不同 webapp,总不会还带着对应的端口号去访问吧。所以,你再次需要用到反向代理来做处理。

http {	
    #此处省略一些基本配置

    upstream product_server{		
        server www.helloworld.com:8081;
    }	
    upstream admin_server{		
        server www.helloworld.com:8082;
    }	
    upstream finance_server{		
        server www.helloworld.com:8083;
    }	
    server {		
        #此处省略一些基本配置
        #默认指向product的server
        location / {			
            proxy_pass http://product_server;
        }		
        location /product/{			
            proxy_pass http://product_server;
        }		
        location /admin/ {			
            proxy_pass http://admin_server;
        }		
        location /finance/ {			
            proxy_pass http://finance_server;
        }
    }
}


搭建文件服务器:

        有时候,团队需要归档一些数据或资料,那么文件服务器必不可少。使用 Nginx 可以非常快速便捷的搭建一个简易的文件服务。

        Nginx 中的配置要点:

  •         将 autoindex 开启可以显示目录,默认不开启。 

  •         将 autoindex_exact_size 开启可以显示文件的大小。 

  •         将 autoindex_localtime 开启可以显示文件的修改时间。 

  •         root 用来设置开放为文件服务的根路径。 

  •         charset 设置为 charset utf-8,gbk;,可以避免中文乱码问题(windows 服务器下设置后,依然乱码,本人暂时没有找到解决方法)。

一个最简化的配置如下:

autoindex on;# 显示目录
autoindex_exact_size on;# 显示文件大小
autoindex_localtime on;# 显示文件时间
server {    
    charset      utf-8,gbk; # windows 服务器下设置后,依然乱码,暂时无解
    listen       9050 default_server;    
    listen       [::]:9050 default_server;    
    server_name  _;    
    root         /share/fs;
}



动静分离:

        动静分离就是将动态资源和静态资源分开;动态资源包括需要访问数据库获得的数据;静态资源如图片、html、CSS等文件。

        动静分离的方式有多种,动态资源和静态资源分别部署在不同服务器或者同一服务器的不同路径下,也可以是在访问时通过location块Nginx中location块配置入门 中与正则字符串的匹配(后缀模式)区分出动态资源和静态资源,从而代理到不同服务器中进行处理,例如:

        不区分大小写的匹配模式,以.css结尾的文件,在/res/css/lead/中寻找该css文件。

location ~* \.css$ {		    
    root /res/css/lead/;
}

location /image/ {
        root   /usr/local/static/;
        autoindex on;
}


Nginx虚拟主机怎么配置?

        1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站

            需要建立/data/www /data/bbs目录,windows本地hosts添加虚拟机ip地址对应的域名解析;对应域名网站目录下新增index.html文件;

# 当客户端访问www.rumenz.com,监听端口号为80,直接跳转到data/www目录下文件
server {
    listen       80;
    server_name  www.rumenz.com;
    location / {
        root   data/www;
        index  index.html index.htm;
    }
}

    # 当客户端访问www.rumenz.com,监听端口号为80,直接跳转到data/bbs目录下文件
     server {
    listen       80;
    server_name  bbs.rumenz.com;
    location / {
        root   data/bbs;
        index  index.html index.htm;
    }
}

        2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台

                使用端口来区分,浏览器使用域名或ip地址:端口号 访问

# 当客户端访问www.rumenz.com,监听端口号为8080,直接跳转到data/www目录下文件
server {
listen       8080;
server_name  rumenz.com;
    location / {
        root   data/www;
        index  index.html index.htm;
    }
}

# 当客户端访问www.rumenz.com,监听端口号为80直接跳转到真实ip服务器地址 11:8080
server {
listen       80;
server_name  www.rumenz.com;
    location / {
                 proxy_pass http://11:8080;
         index  index.html index.htm;
    }
}

        3、基于ip的虚拟主机。


location的作用是什么?

        location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

        注意:~ 代表自己输入的英文字母

匹配符匹配规则优先级
=精确匹配1
^~以某个字符串开头2
~区分大小写的正则匹配3
~*不区分大小写的正则匹配4
/通用匹配,任何请求都会匹配到5
# 优先级1,精确匹配,根路径

location =/ {
    return 400;
}
# 优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
location ^~ /av {
   root /data/av/;
}

# 优先级3,区分大小写的正则匹配,匹配/media*****路径
location ~ /media {
      alias /data/static/;
}

# 优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
location ~* .*\.(jpg|gif|png|js|css)$ {
   root  /data/av/;
}

# 优先5,通用匹配
location / {
    return 403;

}


限流怎么做的?

        Nginx限流就是限制用户请求速度,防止服务器受不了。Nginx的限流都是基于漏桶流算法。

        1、正常限制访问频率(正常流量):

                限制一个用户发送的请求,我Nginx多久接收一个请求。

Nginx中使用ngx_http_limit_req_module模块来限制的访问频率,限制的原理实质是基于漏桶算法原理来实现的。在nginx.conf配置文件
中可以使用limit_req_zone命令及limit_req命令限制单个IP的请求处理频率。

# 定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
# 绑定限流维度
server{
    location /seckill.html{
        limit_req zone=zone;    
        proxy_pass http://lj_seckill;
    }
}

1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。

        2、突发限制访问频率(突发流量):

上面的配置一定程度可以限制访问频率,但是也存在着一个问题:如果突发流量超出请求被拒绝处理,无法处理活动时候的突发流量,这时
候应该如何进一步处理呢?Nginx提供burst参数结合nodelay参数可以解决流量突发的问题,可以设置能处理的超过设置的请求数外能额外
处理的请求数。我们可以将之前的例子添加burst参数以及nodelay参数:

# 定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
# 绑定限流维度
server{
    location/seckill.html{
        limit_req zone=zone burst=5 nodelay;
        proxy_pass http://lj_seckill;
    }

}

为什么就多了一个 burst=5 nodelay; 呢,多了这个可以代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他
用户的请求我就处理你的,有其他的请求的话我Nginx就漏掉不接受你的请求

        3、 限制并发连接数

Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置。
接下来我们可以通过一个简单的例子来看下:

http {
          limit_conn_zone $binary_remote_addr zone=myip:10m;
          limit_conn_zone $server_name zone=myServerName:10m;
}
server {
    location / {
        limit_conn myip 10;
        limit_conn myServerName 100;
        rewrite / http://www.rumenz.net permanent;
    }

}


怎么限制浏览器访问?

## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500
if ($http_user_agent ~ Chrome) {   
    return 500;  
}


Nginx怎么判断别IP不可访问?

# 如果访问的ip地址为11115,则返回403

 if  ($remote_addr = 11115) {
     return 403;  
 }


Nginx配置高可用性怎么配置?

        当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。

server {
    listen       80;
    server_name  www.rumenz.com;

    location / {

        ### 指定上游服务器负载均衡服务器
        proxy_pass http://backServer;

        ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
        proxy_connect_timeout 1s;

        ###nginx发送给上游服务器(真实访问的服务器)超时时间
        proxy_send_timeout 1s;

        ### nginx接受上游服务器(真实访问的服务器)超时时间
        proxy_read_timeout 1s;
        index  index.html index.htm;
    }
}


502报错可能原因有哪些?

1)FastCGI进程是否已经启动
2)FastCGI worker进程数是否不够
3)FastCGI执行时间过长
4)FastCGI Buffer不够
     nginx和apache一样,有前端缓冲限制,可以调整缓冲参数
    fastcgi_buffer_size 32k;
    fastcgi_buffers 8 32k;
5)Proxy Buffer不够
    如果你用了Proxying,调整
    proxy_buffer_size 16k;
    proxy_buffers 4 16k;
6)php脚本执行时间过长
将php-fpm.conf的0s的0s改成一个时间

 



Nginx自带后端健康检查

        严格说Nginx并没有自带针对负载均衡后端节点的健康检查功能,但是可以通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的相关指令来完成当后端节点出现故障时,自动切换到健康节点。

        1、ngx_http_proxy_module模块

                proxy_connect_timeout 指令

语  法:    proxy_connect_timeout time;
默认值:    proxy_connect_timeout 60s;
上下文:    http, server, location

        该指令的功能是设置与后端服务器建立连接的超时时间。应该注意超时一般不可能大于75秒。

                proxy_read_timeout指令

语  法:    proxy_read_timeout time;
默认值:    proxy_read_timeout 60s;
上下文:    http, server, location

        定义从后端服务器读取响应的超时时间。该超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,则连接将被关闭。

                proxy_next_upstream指令

语  法:    proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off ...;
默认值:    proxy_next_upstream error timeout;
上下文:    http, server, location

        指定在何种情况下一个失败的请求应该被发送到下一台后端服务器节点。

        error:Nginx与后端服务器建立连接时;或者向后端服务器发送请求时;或者从后端服务器接收响应头时,出现错误

        timeout:和后端服务器建立连接时;或者向后端服务器发送请求时;或者从后端服务器接收响应头时,出现超时

        invalid_header:后端服务器返回空响应或者非法响应头

        http_500:后端服务器返回的响应状态码为500

        http_502:后端服务器返回的响应状态码为502

        http_503:后端服务器返回的响应状态码为503

        http_504:后端服务器返回的响应状态码为504

        http_404 :后端服务器返回的响应状态码为404

        off :停止将请求发送给下一台后端服务器

        需要理解一点的是,只有在没有向客户端发送任何数据之前,将请求转给下一台后端服务器才是可行的。也就是说,如果在传输响应到客户端时出现错误或者超时,这类错误是不可能恢复的。

http {
    proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
}

        2、ngx_http_upstream_module模块

        server指令

语  法:    server address [parameters];
默认值:    —
上下文:    upstream

        max_fails=number:设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。失败的尝试次数默认是1。设为0就会停止统计尝试次数,认为服务器是一直可用的。可以通过指令proxy_next_upstream、fastcgi_next_upstream和 memcached_next_upstream来配置什么是失败的尝试。默认配置时,http_404状态不被认为是失败的尝试。

        fail_timeout=time:设定服务器被认为不可用的时间段以及统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。默认情况下,该超时时间是10秒。

upstream name {
   server 192.168.1.110:8081 max_fails=3 fail_timeout=60s;
   server 192.168.1.122:8082 max_fails=3 fail_timeout=60s;
}

        采用这个方式需要注意的一点是,如果后端有不健康节点,负载均衡器依然会先把该请求转发给该不健康节点,然后再转发给别的节点,这样就会浪费一次转发。



nginx中break和last的区别

        1. last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异。 注意一点就是,他们会跳过所有的在他们之后的rewrite 模块中的指令,去选择自己匹配的location。

        2. last 和 break 当出现在location 内部时,两者就存在了差异。

        一、环境准备
        资源文件创建

mkdir -p /opt/tmp/wqy/test/aaa
mkdir -p /opt/tmp/wqy/test/bbb
echo "aaa" >> /opt/tmp/wqy/test/aaa/index.html
echo "bbb" >> /opt/tmp/wqy/test/bbb/index.html

        二、测试过程
        2.1、初始配置时
        nginx配置

server {
    listen 80;
    server_name wqy.test.com;
    access_log logs/wqy-test-com/access.log;

    location ^~ /aaa {

        root /opt/tmp/wqy/test;
    }

    location ^~ /bbb {
        return 200 "hello world\n";

    }
}

        测试结果

        #curl -s http://wqy.test.com/aaa/index.html -x 127.0.0.1:80
        aaa
        #curl -s http://wqy.test.com/bbb/index.html -x 127.0.0.1:80
        hello world


        2.2、配置rewrite last时

         nginx配置

server {
    listen 80;
    server_name wqy.test.com;
    access_log logs/wqy-test-com/access.log;

    location ^~ /aaa {
        rewrite ^/aaa/(.*) /bbb/$1 last;
        root /opt/tmp/wqy/test;
    }

    location ^~ /bbb {
        return 200 "hello world\n";
    }
}

         测试结果

        #curl -s http://wqy.test.com/aaa/index.html -x 127.0.0.1:80
        hello world
        #curl -s http://wqy.test.com/bbb/index.html -x 127.0.0.1:80
        hello world

        url由重写前的http://wqy.test.com/aaa/index.html变为http://wqy.test.com/bbb/index.html,重新进行location匹配后,匹配到第二个location条件,所以请求url得到的响应是hello wold。

        测试结论:配置rewrite last时,请求跳出当前location,进入server块,重新进行location匹配,超过10次匹配不到报500错误。客户端的url不变

        2.3、配置rewrite break时

        nginx配置

server {
    listen 80;
    server_name wqy.test.com;
    access_log logs/wqy-test-com/access.log;

    location ^~ /aaa {
        rewrite ^/aaa/(.*) /bbb/$1 break;
        root /opt/tmp/wqy/test;
    }

    location ^~ /bbb {
        return 200 "hello world\n";
    }
}

        测试结果

        #curl -s http://wqy.test.com/aaa/index.html -x 127.0.0.1:80
        bbb
        #curl -s http://wqy.test.com/bbb/index.html -x 127.0.0.1:80
        hello world

        url由重写前的http://wqy.test.com/aaa/index.html变为http://wqy.test.com/bbb/index.html,nginx按照重写后的url进行资源匹配,匹配到的资源文件是/opt/tmp/wqy/test/bbb/index.html,所以请求url得到的响应就是/opt/tmp/wqy/test/bbb/index.html文件中的内容:bbb。

        测试结论:配置rewrite break时,请求不会跳出当前location,但资源匹配会按照重写后的url进行,如果location里面配置的是proxy_pass到后端,后端服务器收到的请求url也会是重写后的url。客户端的url不变。



冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论