1、http请求完成后会断开,但tcp可以不用,因为建立和初始化会有开销,所以通常会保持keep-alive,这样就可以处理多个http请求了。HTTP/1.1 无法并发处理多个请求,HTTP/2 则可以。
tcp的生存时间看服务器配置:
keepalive_timeout:设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
client_header_tomeout:设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误。
client_body_timeout:设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60。
send_timeout:设定响应客户端的超时时间。这个超时仅限于两个链接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
2、连接方式其实有三种
Unix Socket:这个性能效率最高,直接内存交换,但必须应用和nginx同在一台服务器上
TCP Socket:二进制包传递
HTTP:基于 TCP 上面的一层文本协议
3、proxy_pass 指向的域名的IP发生变动,但是nginx缓存了旧的IP,这时请求无法处理,会超时,然后nginx日志显示499,而前端显示504 Gateway Time-out
4、up_stream
5、加快请求响应的参数
6、如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接
7、keepalive_requests
8、https://www.nginx.com/blog/tuning-nginx/
9、rewrite,会将所有请求都转成get请求
10、resolver:用于解析域名背后的IP变化问题,resolver + ip(DNS服务器)
11、proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义:&oq=即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
12、变量参数:$remote_ip等
13、http -> server -> location,location的正则和占位符
14、对于proxy_pass和upstream默认使用的是基于IP的转发,假如proxy_pass后面跟的是域名,然后默认proxy_set_header Host $proxy_host配置,使得转发时会将域名变为ip去访问
1 location ^~ /index/ { 2 proxy_set_header HOST a.com; 3 proxy_set_header X-Real-IP $remote_addr; 4 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 5 proxy_pass https://a.com; 6 }
假如访问 http://b.com,进入nginx会被转发到https://a.com,但是域名会被转为ip,最后请求变为:https://11.11.11.11
如果这个11.11.11.11的服务器跑着多个应用,有c.com、d.com等多个域名,这样在proxy_pass转发时就无法识别是哪个域名,因此,只要在 proxy_set_header HOST a.com 配上想到达的域名,那么后端就能识别。
proxy_set_header Host $host; 的作用是把原http请求的Header中的Host字段也放到转发的请求里。如果不加这一行的话,nginx转发的请求header里就不会有Host字段,而服务器是靠这个Host值来区分你请求的是哪个域名的资源的。
15、proxy_set_header X-Real-IP $remote_addr; 这个语句是将上一层的IP注入到X-Real-IP变量,假如后面就是后端服务,则可以通过X-Real-IP请求头拿到真实的客户端IP;但是如果后面还有多层代理的话,代理也有这条语句,那么X-Real-IP就只会是最后一个代理服务器的IP(当然,后面几个代理服务器不添加这句即可)。
只要记住$remote_addr永远是上一层的真是IP就OK了,因为TCP连接是经过三次握手的,所以这个值是无法伪造的。
16、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这条语句可以用来解决上面多个代理的问题。$proxy_add_x_forwarded_for作用是将上一层的IP都加入X-Forwarded-For,因此X-Forwarded-For的格式是:
X-Forwarded-For:client, proxy1, proxy2
所以只要取X-Forwarded-For的第一个值就可以获取到client IP,注意最后一个代理服务器请求 Web 服务器的时候是不会将自己的 IP 附加到 X-Forwarded-For 头上的,最后一个代理服务器的 IP 地址应该通过X-Real-IP获取。
在默认情况下,Nginx并不会对X-Forwarded-For头做任何的处理,除非用户使用。假如前端不带有X-Forwarded-For请求头而且nginx转发不写上那条语句,那么下一层的服务则无法获取X-Forwarded-For的值。
$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr。
X-Forwarded-For是可以伪造的,即客户端在请求头伪造,这样第一个值就不能保证是真实的的客户端IP了,可以在第一层代理写下面的语句来避免:
proxy_set_header X-Forwarded-For $remote_addr;(这个效果是重置,不是添加,后面的代理用 $proxy_add_x_forwarded_for )
或者只在一层写上如下语句,其它层不添加:
proxy_set_header X-Real-IP $remote_addr;
或者使用nginx的 ngx_http_realip_module 模块,从 X-Forwarded-For 或其他属性中提取真实IP。此处以 X-Forwarded-For 结合该模块为例子,需要做两件事:
(1)请求途径的各代理需要设置 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
(2)利用 realip 模块获取真实IP
1 server { 2 ... 3 location / { 4 set_real_ip_from 127.0.0.1; 5 real_ip_header X-Forwarded-For; 6 real_ip_recursive on; 7 ... 8 } 9 }
set_real_ip_from: 表示从何处获取真实IP(解决安全问题,只认可自己信赖的IP),可以是IP或子网等, 可以设置多个set_real_ip_from。
real_ip_header:表示从哪个header属性中获取真实IP
real_ip_recursive:递归检索真实IP,若从 X-Forwarded-For 中获取,则需递归检索;若像从X-Real-IP中获取,则无需递归。
17、