Nginx 知识点

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、

转载于:https://www.cnblogs.com/linguoguo/p/11347558.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值