Nginx知识总结

标签: Nginx 分类: 杂文 创建时间:2020-09-28 06:18:15 更新时间:2025-01-17 10:39:22
参考文章:
1.openresty 通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台。

1.Nginx变量

我是用set命令自定义了一个变量

1
2
3
4
5
6
7
8
9
10
set $flag "1";
if ($uri ~* "^phemsweb"){
set $flag "${flag}1";
}
if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {
set $flag "${flag}2";
}
if($flag = "02"){
rewrite ^(.*) http://mb.proheng.com$1 permanent;
}

但是使用if进行判断的时候,总是提示:unknown directive “if($flag”,导致nginx无法启动。

最后的解决方案:
(1) 竟然是因为if和括号之间要有一个空格,否则就会报错
(2) 还有就是if中的等号,是一个=,不是==。

参考文章:
1.nginx配置自定义变量实现日志动态分发 (这里有很多的nginx变量的说明)
2.nginx自定义变量与内置预定义变量 (这里也有很多的内置变量的说明)
3.Nginx中if语句中的判断条件 (nginx中的if语句,这里有个错误就是等会他写成了双等号,而不是单等号)
4.Nginx: if 逻辑运算(&&,||)实现 (这里实现了nginx的逻辑and,也进行了if和括号空格的说明)

2.负载均衡

(1) 定义服务路径
在http节点中定义upstream对象,其中的负载均衡算法主要有轮询、加权轮询、IP_hash、URL_hash、最小连接数

1
2
3
4
5
6
7
8
9
10
11
12
## 1、down 表示单前的server暂时不参与负载
## 2、weight 权重,默认为1。 weight越大,负载的权重就越大,此策略可以与least_conn和ip_hash结合使用
## 3、max_fails 允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
## 4、fail_timeout max_fails次失败后,暂停的时间。
## 5、backup 备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻,不能与ip_hash同时使用
##

upstream testServer {
server localhost:8087 weight=10;
server localhost:8088 weight=2;
server localhost:8089;
}

(2) 定义转发
在server节点的内部,定义proxy_pass实现转发

1
2
3
4
5
location / {
root html;
index index.html index.htm;
proxy_pass http://testServer; // testServer 为自己定义的服务器集群
}
参考文章:
1.Nginx负载均衡配置
2.Nginx+upstream针对后端服务器容错的配置说明 (各种负载均衡的方法都说了如何去做)
3.五分钟看懂 Nginx 负载均衡 (讲解了什么是正向代理,以及反响代理,负载均衡算法:轮询、加权轮询、IP哈希、URL哈希、最小🔗数,并且用一个Node + Express的站点进行了轮询的测试)
4.Nginx反向代理,负载均衡,redis session共享,keepalived高可用 (nginx负载均衡、redis数据复制、keepalived高可用性)
5.从入门到精通-Nginx,图文并茂、负载均衡、动静分离、虚拟主机 附案例源码 入门、配置,到负载均衡,各项内容都有涉及,非常的详细
6.nginx upstream的五种分配方式 五种负载方式的说明

3.负载容错

配置了负载均衡之后,如何进行负载均衡的重试呢?就是如果其中一台服务器返回了503状态码,就进行下一个服务器请求。

【解决方法】
主要就是增加 proxy_next_upstream 配置,当出现503错误的时候,直接进行下一次尝试。语法:
proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | non_idempotent | off …;
默认: proxy_next_upstream error timeout;
上下文: http, server, location
指定请求应传递到下一个服务器的情况:
error:在与服务器建立连接,向其传递请求或读取响应标头时发生错误;
timeout:在与服务器建立连接,向其传递请求或读取响应头时发生超时;
invalid_header:服务器返回空响应或无效响应;
http_500:服务器返回了带有代码500的响应;
http_502:服务器返回具有代码502的响应;
HTTP_503:服务器返回具有代码503的响应;
http_504:服务器返回具有代码504的响应;
http_403:服务器返回带有代码403的响应;
http_404:服务器返回具有代码404的响应;
non_idempotent:通常,如果请求已经被发送到上游服务器(1.9.13),则具有非幂等方法的请求(POST,LOCK,PATCH)不被传递到下一个服务器;启用此选项明确允许重试此类请求;
off:禁用将请求传递到下一个服务器。

1
2
3
4
5
6
7
8
9
10
11
12
upstream example_upstream{
server 192.168.0.1 weight=1 max_fails=1 fail_timeout=30s;
server 192.168.0.2 weight=1 max_fails=1 fail_timeout=30s backup;
}
location /example/ {
proxy_pass http://example_upstream/;
proxy_set_header Host: test.example.com;
proxy_set_header X-real-ip $remote_addr;
# 重试机制,遇到这些错误,继续把请求发到下一个节点
# non_idempotent:POST支持,需要放在最前面
proxy_next_upstream non_idempotent http_502 http_503 http_504 http_404 error timeout;
}

注意事项
刚开始我配置了proxy_next_upstream之后,配置了max_fails,还是不生效,服务器返回503之后,总是还是会请求这个服务器,最后通过参考文章7,才最终解决了问题。我到请求是post请求,所以需要添加non_idempotent参数。

参考文章:
1.Nginx+upstream针对后端服务器容错的配置说明
2.Nginx 失败重试机制
3.nginx 通过proxy_next_upstream实现容灾和重复处理问题 两种不同的运用场景,当其中一台返回错误码404,500…等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率,多可运用于前台程序负载,设置proxy_next_upstream;当访问A时,A返回error timeout时,访问会继续分配到下一台服务器处理,就等于一个请求分发到多台服务器,就可能出现多次处理的情况,如果涉及到充值,就有可能充值多次的情况,这种情况下就要把proxy_next_upstream关掉
4.nginx backup 功能 backup参数 ,backup 不能和ip_hash一起使用,backup 参数是指当所有非备机都宕机或者不可用的情况下,就只能使用带backup标准的备机。除此之外,还有防盗链配置、下载限速、创建IP黑名单
5.Nginx负载均衡及算法分析 upstream容错机制介绍、典型的负载均衡策略配置、proxy_next_upstream机制、 Nginx对Round-Robin算法的优化、nginx平滑的基于权重轮询算法;Nginx对gRPC负载均衡的支持
6.nginx重试机制proxy_next_upstream
7.proxy_next_upstream 对POST无效 经过排查原来是只针对GET生效,针对POST等请求,需要增加 non_idempotent ,并且要放在最前面才行
8.nginx中的proxy_next_upstream容错处理 语法和运用场景,都有说明。
9.Nginx容灾 proxy_next_upstream 配置无效 没啥用的。
10.Nginx+upstream针对后端服务器容错的运维笔记 Nginx upstream负载均衡获取后端服务器的流程,GET_RR_PEER: 通过RR算法获取后端流程,绘制了流程图
11.​proxy_next_upstream和nginx upstream的排错逻辑可能导致的问题 502 bad gateway,循环

4.root与alias主要区别

(1) root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的定义。

(2) 示例:

1
2
3
4
5
6
7
8
9
## 如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/t/a.html的文件。
location ^~ /t/ {
root /www/root/html/;
}

## 如果一个请求的URI是/t/a.html时,web服务器将会返回服务器上的/www/root/html/new_t/a.html的文件。注意这里是new_t,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
location ^~ /t/ {
alias /www/root/html/new_t/;
}

(3) 注意
alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无~~。
alias只能位于location块中,root可以不放在location中。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。