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");
更多精彩文章请访问:百考汇