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,这时后面的/加与不加区别很大
当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
定义时候允许使用过期的缓存,这里的过期是指后端服务器更新资源后,缓存的内容不再是最新的了。
例: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.连接超时时长的定义

猜你喜欢

转载自blog.51cto.com/13322786/2161346