nginx作为反向代理常用模块

什么是反向代理?

反向代理简单讲就是代理后端服务器响应客户端请求的服务器。我的理解,反向代理也可以理解为工作在7层应用层的负载均衡服务器
为什么需要反向代理?
1.隐藏后端主机
2.更好的管理后端各主机的路由状况
3.灵活的分配后端服务器资源
4.根据具体服务进行转发。

nginx如何实现反向代理功能?

最简单的例子:

location / {
            proxy_pass http://localhost:8000; #将匹配此location的请求发送到http://localhost:80000处理
            proxy_set_header Host $host; #自定义首部发送到后端主机
            proxy_set_header X-Real-IP $remote_addr;
        }   

nginx作为反向代理常用的模块

1.proxy_pass URL;

proxy_pass是nginx作为反向代理最关键的一个指令
例:

location /name/ {
        proxy_pass http://127.0.0.1/remote/;
        }

在这个例子中,假如用户访问路径是www.baidu.com/name/,那么实际访问路径是remote/目录
proxy_pass会将location下的URI,另外若proxy_pass后面只有IP,如:proxy_pass http://18.18.18.18,这时后面的/加与不加区别很大

在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/,当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。

location ^~ /static_js/ 
{ 
proxy_cache js_cache; 
proxy_set_header Host js.test.com; 
proxy_pass http://js.test.com/; 
}

如上面的配置,如果请求的url是http://servername/static_js/test.html
会被代理成http://js.test.com/test.html

而如果这么配置

location ^~ /static_js/ 
{ 
proxy_cache js_cache; 
proxy_set_header Host js.test.com; 
proxy_pass http://js.test.com; 
}

则会被代理到http://js.test.com/static_js/test.htm
当location后使用正则表达式模式匹配,if语句或limt_execept时,proxy_pass后面是不能加URI的

2.proxy_set_header field value;

用来使代理服务器修改发往后端服务器的报头文件的,因为后端服务器所接收并处理的请求实际是由代理服务器发送来的,后端主机并不知道客户端的信息,在后期做日志分析时就无法查询真正的请求来源,虽然真正的客户端来源记录是代理服务器处理的,但一般为了尽量减少代理服务器的磁盘IO代理服务器是不做日志的,所以就需要此参数将真正的客户端来源IP把默认的来源IP(代理服务器IP)替换并发送至后端服务器。
例:

location / {
            proxy_pass http://localhost:8000; #将匹配此location的请求发送到http://localhost:80000处理
            proxy_set_header Host $host; #自定义首部发送到后端主机
            proxy_set_header X-Real-IP $remote_addr;
        }

X-Real-IP是自定义的守护,将它加入log文件的format中日志便会记录。
当生产环境中出现多级代理时需使用$proxy_add_x_forwarded_for,此参数做的是往后添加,而非替换
同理,反向代理也能修改发往客户端的包头文件,将真正的后端服务器IP或者代理服务器IP响应给客户端,这就需要用到专门的报头模块ngx_http_headers_module模块。如:add_header就是用来修改由代理服务器发送至客户端的指令。例:add_header X-Via $server_addr;

3.nginx作为代理服务器时的缓存模块。

什么是缓存?

一般所说的缓存就是将数据临时存放在内存中,当需要用到数据或程序时,直接从内存中读取,因为内存的读写速度与磁盘IO不是一个量级,所以使用缓存能极大的提高系统使用效率。

为什么需要缓存?

在nginx作为代理服务器时,会同时处理大量的请求与响应,若每一次都需要用到磁盘IO会极大地影响架构的性能,所以一般会将请求频率较高的数据作为缓存并缓存至代理服务器,当客户端请求时会直接响应,不再向后端发起网络或磁盘IO。

nginx是如何构建缓存的?

根据请求做hash计算创建树状结目录,并建立hash表,将hash表存放在内存中,当接收到用户请求后查找hash表并根据查找结果读取数据所在目录并相应。一般只缓存GET,HEAD
proxy_cache_path #只能用在http下#
例:proxy_cache_path /data/nginx/cache levels=1:1:1 keys_zone=one:10m max_size=2g; #定义缓存目录为/data/nginx/cache,创建3级子目录,每级子目录分别有16个目录,键大小为10兆,键名为one,缓存的最大空间为2g
proxy_cache_path只能用在http中定义,在http中定义完成proxy_cache_path后,还需要在server或location中定义一下几个参数

1.prox_cache_key

定义缓存的键与空间大小的,也可以理解为定义缓存的名称与占用空间大小
例:proxy_cache_key NAME;

2.proxy_cache_methods

定义客户端请求的那些内容会被缓存,默认是GET HEAD
例:proxy_cache_methods GET HEAD POST;

3.prox_cache_min_uses

例:proxy_cache_min_uses 2;
定义缓存的最小使用次数,即当客户端请求某一资源时达到设定次数时才会被缓存

4.prox_cache_valid

对不同的缓存定义不同的有效时间
例:proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

5.prox_cache_use_stale

定义时候允许使用过期的缓存,这里的过期是指后端服务器更新资源后,缓存的内容不再是最新的了。
例:.prox_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;

4.超时模块

在实际环境中,常常会遇到连接异常中断的情况,所以需要定义响应超时的时间。

1.prox_connect_timeout

定义代理向后端服务建立连接(TCP三次握手)的超时时间,默认是60秒,最长为75秒
例:proxy_connect_timeout 10;

2.proxy_read_timeout

定义代理与后端服务建立连接后,后端读取响应给代理的超时时间

3.proxy_send_timeout

向后端发送请求的超时时间

5.fastcgi模块

由于nginx是一个处理静态内容的工具,但当用户请求为动态内容时,就需要使用fastcgi协议将动态内容交由php来处理并响应给代理再响应客户端。
fcgi传输处理请求的能力不如httpd,常常会用到lnamp架构。当用户请求静态资源时就在本地处理并响应,当客户端请求的是动态资源时由nginx作为代理转发至后端AP服务器,之间用http协议进行传输,这样能提高性能。
总结:1.如何实现代理,如何实现映射
2.如何建立缓存实现加速
3.连接超时时长的定义

转载于:https://blog.51cto.com/13322786/2161346

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值