Nginx localtion路由匹配、反向代理、负载均衡、缓存

1.location的用法     location可以把不同方式的请求,定位到不同的处理方式上.

location ~* /js/.*/\.js
以 = 开头,表示精确匹配;如只匹配根目录结尾的请求,后面不能带任何字符串。
以^~ 开头,表示uri以某个常规字符串开头,不是正则匹配
以~ 开头,表示区分大小写的正则匹配;
以~* 开头,表示不区分大小写的正则匹配
以/ 开头,通用匹配, 如果没有其它匹配,任何请求都会匹配到

匹配顺序总结为以下两点:


1.匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的location顺序是无关紧要的,反正最后nginx会根据配置的长短来进行匹配,但是需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个匹配的正则表达式将停止搜索。

2.一般情况下,匹配成功了普通字符串location后还会进行正则表达式location匹配。有两种方法改变这种行为,其一就是使用“=”前缀,这时执行的是严格匹配,并且匹配成功后立即停止其他匹配,同时处理这个请求;另外一种就是使用“^~”前缀,如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。

3.nginx匹配顺序是先匹配普通location,在匹配正则location;
4.普通匹配规则无顺序无论写在配置文件的那个地方都一样,但是正则匹配则是按照匹配配置文件中由上到下的先后顺序匹配;

 

实例:

rewrite:

location /static/ {

     rewrite ^ http://www.baidu.com;      #rewrite必须加一个^

}

 

负载均衡

  1 
  2 #fail_timeout  默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会
    将请求分配给它
  3 #max_conns 限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制
  4 upstream proxy_name
  5 {
  6         server  www.suliao.com:8003  weight=3 max_fails=3 fail_timeout=15 backup; #weight权重 3/8
  7         #server  www.suliao1.com:8004 weight=5 max_conns=1000 backup; #weight权重 5/8
  8         #server  www.suliao2.com:8005 backup;   #备份机,所有服务器挂了之后才会生效 
  9         server  www.suliao3.com:8007;
 10 }
 11 
 12 #log_format 自定义日志格式,必须要放到server外面否则会报错
 13 log_format      main '$host----------$request_uri-----$remote_addr-------请求的URI和HTTP协议:$request'
 14                      '-----请求ip: "$http_x_forwarded_for"';
 15 
 16 server {
 17         server_name     www.proxy.com;
 18         listen          80;
 19 
 20 
 21         access_log      /var/log/www.proxy.com.access.log main;
 22 
 23         location / {
 24                 proxy_pass      http://proxy_name;
 25                 proxy_set_header Host $proxy_host;     #将目前Host头域信息填充成客户端的地址
 26         }
 27 
 28 }

     说明:

        proxy_set_header: 该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给被代理的服务器。其语法格式为:

        proxy_set_header Host $proxy_host;

        proxy_set_header Connection close;

       实例: 

        proxy_set_header Host  $http_host;   #将目前Host头域的值填充成客户端的地址。

        proxy_set_header Host  $host;             #将当前host块的server_name指令填充到Host域

        proxy_set_header Host  $host:$proxy_pory;   #将当前location块的server_nam指令值和listtener指令值一起填充到Host头域。

break和last的区别

 

缓存

配置缓存时内存设置内存大小时不能超过真实的内存大小,否则缓存不会生效

配置实例:

proxy_cache_path  /opt/cache/ levels=1:2 keys_zone=suliao:10m inactive=1h max_size=20m;
#fail_timeout  默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它
#max_conns 限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制
upstream proxy_name 
{
    server    www.suliao.com:8003  weight=3 max_fails=3 fail_timeout=15 backup; #weight权重 3/8
    #server  www.suliao1.com:8004 weight=5 max_conns=1000 backup; #weight权重 5/8
    #server  www.suliao2.com:8005 backup;   #备份机,所有服务器挂了之后才会生效 
    server    www.suliao3.com:8007;
}

#log_format 自定义日志格式,必须要放到server外面否则会报错
log_format    main '$host----------$request_uri-----$remote_addr-------请求的URI和HTTP协议:$request'
             '-----请求ip: "$http_x_forwarded_for"'; 
 
server {
    server_name    www.proxy.com;
    listen        80;
    
    
    access_log    /var/log/www.proxy.com.access.log main;

    location / {
        proxy_cache                suliao;
        proxy_cache_methods      GET HEAD;
        proxy_cache_valid      200 304 1h; #这项配置很重要,设置http状态的缓存时间
        #proxy_no_cache 配置不缓存页面  php代码  header("Cache-Control: no-cache"); 表示不缓存此页面
        proxy_no_cache          $arg_nocache; #配置不缓存页面
        
        #proxy_cache_revalidate指示NGINX在刷新来自服务器的内容时使用GET请求。如果客户端的请求项已经被缓存过了,但是在缓存控制头部中定义为过期,那么NGINX就会在GET请求中包含If-Modified-Since字段,发送至服务器端。这项配置可以节约带宽,因为对于NGINX已经缓存过的文件,服务器只会在该文件请求头中Last-Modified记录的时间内被修改时才将全部文件一起发送
        proxy_cache_revalidate on;

        proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
        proxy_cache_key "$scheme$host$uri|$is_args|$args|$cookie_language"; #内存缓存中存储的键值
        
        add_header X_Cache_Status $upstream_cache_status;
        proxy_set_header          Host $proxy_host;
        proxy_pass                http://proxy_name;    
    }

}


php代码配置缓存:

走缓存:

$ts = gmdate("D, d M Y H:i:s", time() + $time) . " GMT";
header("Expires: $ts");
header("Pragma: cache");
header("Cache-Control: max-age=$time");

不走缓存:

header("Cache-Control: no-cache");

 

 

 

 

Guess you like

Origin blog.csdn.net/weixin_46742102/article/details/110861539