https://www.cnblogs.com/oxspirt/p/15845640.html
https://blog.csdn.net/weixin_38175358/article/details/117215209
https://zhuanlan.zhihu.com/p/479334378
Nginx负载均衡实现的策略有以下五种:
1 .轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。
2. 权重 weight
3. ip_hash( IP绑定) ,如果后端某个服务器宕机,能自动剔除故障系统,需要引入check或者自动健康检查才可以
每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题
4、fair(第三方插件)
必须安装upstream_fair模块。
对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。
5、url_hash(第三方插件)
必须安装Nginx的hash软件包
一、连接数消耗
https://www.cnblogs.com/horizonli/p/5362563.html
做http服务,浏览器只有1个连接,所以第一个公式没有除
做反向代理,浏览器会发2个连接,然后nginx又用两个连到后端,所以除了4
经过自己亲自测试,发现如果ng是做http服务,会建立2个连接;如果做反向代理,会建立3个连接(与客户端2个连接,与后端应用1个连接)
二、location匹配规则及优先级
https://blog.csdn.net/weixin_48191039/article/details/108454677
三、/ 与/ / 的区别
关于 URI 尾部的 / 有三点也需要说明一下。第一点与 location 配置有关,其他两点无关。
location 中的字符有没有 / 都没有影响。也就是说 /user/ 和 /user 是一样的。
如果 URI 结构是 https://domain.com/ 的形式,尾部有没有 / 都不会造成重定向。因为浏览器在发起请求的时候,默认加上了 / 。虽然很多浏览器在地址栏里也不会显示 / 。这一点,可以访问baidu验证一下。
如果 URI 的结构是 https://domain.com/some-dir/ 。尾部如果缺少 / 将导致重定向。因为根据约定,URL 尾部的 / 表示目录,没有 / 表示文件。所以访问 /some-dir/ 时,服务器会自动去该目录下找对应的默认文件。如果访问 /some-dir 的话,服务器会先去找 some-dir 文件,找不到的话会将 some-dir 当成目录,重定向到 /some-dir/ ,去该目录下找默认文件。可以去测试一下你的网站是不是这样的。
四、自动转发
https://www.cnblogs.com/wwwdcsxudcom/p/16003622.html
五、 proxy_set_header配置注意事项:
https://blog.csdn.net/kissbike148/article/details/79302428
https://blog.csdn.net/u011066470/article/details/118909018
proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
简而言之,proxy_set_header 就是可设置请求头-并将头信息传递到服务器端,不属于请求头的参数中也需要传递时,重定义下即可!
https://cloud.tencent.com/developer/article/1557504
如果希望客户端IP传到后端应用去,可以做如下设置:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header中 $proxy_host, $host, $http_host的区别
当Host设置为 $http_host时,则不改变请求头的值,当Host设置为 $proxy_host时,则会重新设置请求头为proxy_pass中配置的Host信息。
如果客户端发过来的请求的header中有’HOST’这个字段时,
h
t
t
p
h
o
s
t
和
http_host和
httphost和host都是原始的’HOST’字段
比如请求的时候HOST的值是www.csdn.net 那么反代后还是www.csdn.net
如果客户端发过来的请求的header中没有有’HOST’这个字段时,
建议使用$host,这表示请求中的server name。会用 $host代替 $http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host ;
注意:在nginx的配置文件中,如果当前模块中没有proxy_set_header的设置,则会从上级别继承配置。继承顺序为:http, server, location。
只要调用了 proxy_set_header,如果没有设置 host 和 connection ,也会默认重写host、connection两个头,所以上面的三个参数最好都设置,避免使用默认值引发转发问题
二、Nginx日志配置
Nginx对于日志的配置,分为日志格式和日志文件两部分,日志格式定义了日志中含有什么内容,而日志文件定义了日志文件的位置和文件名。
Nginx的日志包含访问日志access_log和错误日志error_log两种,错误日志配置格式如下:
error_log 【日志文件】 【日志级别】
错误日志的级别有以下6种,从高到低分别是debug——info——notice——warning——error——critic,含义分别是测试、显示、通知、警告、报错和紧急,显示信息逐步减少。在生产环境中,我们一般将日志级别定义为warning及以上。
访问日志配置格式如下:
log_format 【日志格式名】 【日志参数】
access_log 【日志文件】 【日志格式】
log_format定义了日志中含有什么类型的参数,而access_log定义了访问日志的位置和采用的格式。
定义access_log时必须定义log_format。
三、Nginx日志参数
有时我们需要根据我们的需要来定义Nginx访问日志的参数,即Nginx访问日志的内容,这时需要我们对Nginx日志的参数有一定的了解,从而筛选出我们想要的信息。常见的Nginx日志参数及其含义如下所示:
1、
r
e
m
o
t
e
a
d
d
r
表
示
客
户
端
I
P
地
址
。
2
、
remote_addr 表示客户端IP地址。 2、
remoteaddr表示客户端IP地址。2、server_name
表示虚拟主机名称
3、KaTeX parse error: Double subscript at position 7: http_x_̲forward_for 表示H…remote_user
表示客户端用户
5、
r
e
q
u
e
s
t
表
示
请
求
的
U
R
L
和
H
T
T
P
协
议
6
、
request 表示请求的URL和HTTP协议 6、
request表示请求的URL和HTTP协议6、status
表示返回的HTTP状态码
7、
u
p
s
t
r
e
a
m
s
t
a
t
u
s
表
示
u
p
s
t
r
e
a
m
的
状
态
,
N
g
i
n
x
作
为
反
向
代
理
时
使
用
。
8
、
upstream_status 表示upstream的状态,Nginx作为反向代理时使用。 8、
upstreamstatus表示upstream的状态,Nginx作为反向代理时使用。8、ssl_protocol
表示SSL协议版本
9、
b
o
d
y
b
y
t
e
s
s
e
n
t
表
示
N
g
i
n
x
发
送
给
客
户
端
的
字
节
数
,
不
包
括
H
T
T
P
头
的
大
小
10
、
body_bytes_sent 表示Nginx发送给客户端的字节数,不包括HTTP头的大小 10、
bodybytessent表示Nginx发送给客户端的字节数,不包括HTTP头的大小10、bytes_sent
表示Nginx发送给客户端的字节数,包括HTTP头的大小
11、
c
o
n
n
e
c
t
i
o
n
r
e
q
u
e
s
t
s
表
示
通
过
当
前
链
接
获
得
的
请
求
数
量
12
、
connection_requests 表示通过当前链接获得的请求数量 12、
connectionrequests表示通过当前链接获得的请求数量12、http_referer
表示该访问的来源网页
13、
h
t
t
p
u
s
e
r
a
g
e
n
t
表
示
客
户
端
浏
览
器
14
、
http_user_agent 表示客户端浏览器 14、
httpuseragent表示客户端浏览器14、request_length
表示HTTP请求的长度,包括请求行、请求头和请求正文
15、
m
s
e
c
表
示
日
志
写
入
时
间
16
、
msec 表示日志写入时间 16、
msec表示日志写入时间16、request_time
表示请求处理时间,单位为秒,精度为毫秒级别,表示Nginx接受用户请求的第一个字节到发送完响应数据的时间,包括接收请求数据时间
17、$upstream_response_time
表示应用程序响应时间,Nginx作为反向代理时使用,计算从Nginx向后端真实服务器建立链接开始到接受完完整数据然后关闭链接的总时间。