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必须加一个^

}

负载均衡

2. 语法

2.1 基本语法

upstream的基本语法如下,一个upstream需要设置一个名称,这个名称可以在server里面当作proxy主机使用。

upstream default {
    server  php-fpm-tfphp:9000;
}

一个upstream可以设置多个server,通常情况下Nginx会轮询每一个server,从而达到最基本的负载循环效果。

upstream default {
    server  tflinux_php-fpm-tfphp_1:9000;
    server  tflinux_php-fpm-tfphp_2:9000;
}

2.2 max_fails

max_fails是最多出错数量,可以为每一个server设置一个max_fails,如果请求server发生了错误则max_fails会加一,如果请求server错误次数达到了max_fails后,Nginx会标记这个server为故障状态,后面就不会再去请求它了。

默认情况下,max_fails的次数是1次。

upstream default {
    server  tflinux_php-fpm-tfphp_1:9000 max_fails=5;
    server  tflinux_php-fpm-tfphp_2:9000 max_fails=3;
}

2.3 fail_timeout

fail_timeout是故障等待超时时间,前面说过了max_fails是请求server错误次数,如果达到了max_fails次数之后server会被标记为故障状态,那么多长时间会重新尝试呢?这个fail_timeout就是这个时间了,在达到max_fails次数之后server进入故障状态,而后在fail_timeout时间之后会被重新标记为正常状态。

#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;
}

upstream default {
    server  tflinux_php-fpm-tfphp_1:9000 max_fails=5 fail_timeout=100;
    server  tflinux_php-fpm-tfphp_2:9000 max_fails=3 fail_timeout=60;
}

2.4 proxy_connect_timeout

这个proxy_connect_timeout是连接超时时间,如果连接不到就会报错了。

proxy_connect_timeout 3s;

2.5 proxy_next_upstream_tries

这个proxy_next_upstream_tries是一个upstream反向代理的重试次数,简单说就是如果请求server出错的次数达到了proxy_next_upstream_tries的次数的话,即使没有达到max_fails的次数,即使后面还有没有尝试过的server,都不会再继续尝试了,而是直接报错。

proxy_next_upstream_tries 3;

2.6 proxy_next_upstream_timeout

这个proxy_next_upstream_timeout是一个upstream反向代理的故障等待时间,简单说就是无论upstream内部如何进行重试,所有花费的时间加在一起达到了proxy_next_upstream_timeout时间的话,就会直接报错,不会再继续尝试了。

proxy_next_upstream_timeout 60s;

  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的区别

缓存(详细:  https://www.jb51.net/article/199392.htm

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

使用Nginx的http_proxy模块可以实现缓存功能

配置实例:

proxy_cache_path  /opt/cache/ levels=1:2 keys_zone=suliao:10m inactive=1h max_size=20m;

日志

#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");

更多精彩文章请访问:百考汇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值