作者:uplt_21631521023 | 来源:互联网 | 2023-05-19 14:06
nginx作为反向代理的工作模型相对于LVS工作在四层,nginx工作于应用层,所以它能够理解http请求报文中首部的请求方法、URL、http协议等信息。nginx收到请求报文后,这个报文源
nginx作为反向代理的工作模型
相对于LVS工作在四层,nginx工作于应用层,所以它能够理解http请求报文中首部的请求方法、URL、http协议等信息。
nginx收到请求报文后,这个报文源IP为客户端CIP,目标IP是nginx服务器所在的供外界访问的VIP。然后把用户的请求封装成新的报文发给后端服务器,发送的报文源IP为nginx所在服务器的DIP,目标IP为后端真实响应请求的RIP(为避免后端服务器暴露于外网中,DIP与RIP可以为私网地址)。
nginx_http_proxy_model模块实现反向代理,适用范围:location, if in location , limit_except
常见用法
1) proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机;
server {
...
server_name HOSTNAME;
location /uri/ {
proxy http://RIP[:port];
}
...
}
此时传递给后端的请求路径为:http://RIP/uri/,直接补充在REMOTE-IP之后;
http://HOSTNAME/uri --> http://RIP/uri
2)proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri;
server {
...
server_name HOSTNAME;
location /uri/ {
proxy http://RIP/new_uri/;
}
...
}
此时客户端请求被location的/uri/匹配到,跳转到后端请求路径将由/new uri/替换/uri/;
http://HOSTNAME/uri/ --> http://RIP/new_uri/
3)如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri;
server {
...
server_name HOSTNAME;
location ~|~* /uri/ {
proxy http://RIP;
}
...
}
此时客户端请求时传递的uri将直接附加代理到的服务的之后;
http://HOSTNAME/uri/ --> http://host/RIP/
实验环境:
nginx反向代理服务器centos7.2 VIP:9.110.187.120,DIP:10.1.1.120 安装nginx
后端RealServer1 RIP:10.1.1.121 安装apache 提供测试页面
[root@controller2 html]# cat index.html
Hello,This is controller2
[root@controller2 html]# cat ./book/index.html
This is controller /book/index.html
后端RealServer2 RIP:10.1.1.122 安装LAMP
客户端为win7主机
实验一:
nginx 反代配置
![](https://www.#.com/imgs/0/1/8/7/31/fbebccc14b3ec319c09b50d5ca4c8232.jpe)
重启服务后验证
![](https://www.#.com/imgs/5/2/2/6/83/f99ae44c470ef85f9369e70b5d14e063.jpe)
实验二:
nginx 反代配置
![](https://www.#.com/imgs/2/0/0/2/97/98afee620365d3e7f293bbe2aa663575.jpe)
![](https://www.#.com/imgs/3/0/8/6/56/8f528073a1c60ff4ea00e85a0dcd30ba.jpe)
实验三:
![](https://www.#.com/imgs/1/0/8/4/31/50ec945b17f94e834d62850b808c6ebb.jpe)
![](https://www.#.com/imgs/6/8/0/7/58/0948e0274d01edd9fb222e542e4db3b4.jpe)
解决后端Web 服务器记录真实客户端IP
默认情况后端服务器记录的全是代理服务器的IP
![](https://www.#.com/imgs/2/8/7/1/28/3864639e5f0cdbca54f040e53cc1846e.jpe)
此时需要用户proxy_set_header指令
nginx反向代理服务器server 配置段中添加配置 proxy_set_header CIP $remote_addr;
后端apache 配置文件中日志配置更改
LogFormat "%{CIP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
利用proxy_set_header 指令,nginx向后端发送请求报文中添加CIP首部(名称自定义) 值为remote_addr真实客户端IP(这个是固定的)效果如下
![](https://www.#.com/imgs/1/9/9/3/32/a5be08aa02c573a824dc7ec3903621eb.jpe)
Nginx 作为反向代理时,可以启用缓存机制。
1)proxy_cache_path
path [levels=levels] [use_temp_path=on|off] keys_zOne=name:size [inactive=time] [max_size=size]
定义缓存,可用上下文为http; (与fastcgi的缓存定义相似)
2)proxy_cache zone | off;
指明要调用的缓存,或关闭缓存机制;用于http, server, location 上下文
3)proxy_cache_key string;
缓存中用于“键”的内容;默认值为:proxy_cache_key $scheme$proxy_host$request_uri;
4)proxy_cache_valid [code ...] time;
定义对特定响应码的响应内容的缓存时长;
缓存定义示例:
(定义在http上下文)
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zOne=pxycache:20m max_size=1g;
调用缓存定义示例:
定义在需要调用缓存功能的配置段,例如server{...};
proxy_cache pxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
5)proxy_cache_use_stale
定义当代理服务器与后端主机通信出现故障时在哪种情况下,可以向客户端直接用缓存中缓存项响应给客户端;如下;
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
6)proxy_cache_methods GET | HEAD | POST ...;
定义为哪种请求方法使用缓存;默认GET|HEAD 其他的不建议使用
7)proxy_buffering on | off;
是否启用代理服务器对后端服务器的发送缓冲和接收缓冲
默认proxy_buffering on;
8)proxy_buffers number size;
定义启用代理服务器对后端服务器的发送缓冲和接收缓冲的buffer的数量和每个buffer的类型
默认proxy_buffers 8 4k|8k;
用于http,server,locaton上下文
9)proxy_buffer_size size;
定义代理服务器对后端服务器的发送缓冲和接收缓冲的每个buffer的大小
默认proxy_buffer_size 4k|8k;
定义缓存可以在http,server,location中,作用范围不同,下面是我的例子
proxy_cache_path /var/proxycache/ levels=1:1:1 keys_zOne=jpgcache:10m max_size=1g;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# root /usr/share/nginx/html;
proxy_set_header CIP $remote_addr;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://10.1.1.121;
index index.html;
proxy_cache jpgcache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 301 302 1h;
proxy_cache_valid any 1m;
}
[root@controller1 nginx]# tree /var/proxycache/
/var/proxycache/
├── 4
│ └── a
│ └── d
│ └── 880e10635371e8065a004e01fd401da4
└── 9
└── d
└── 9
└── 35a63c8a85b1279a0f991ce8828fb9d9
6 directories, 2 files
缓存的文件和访问的文件(是一个图片)大小相同。
nginx_http_headers_module模块实现nginx响应报文中的首部定义
默认情况下,nginx不会传递 Date ,Server,X-Pad ,X-Accel等信息,避免后端服务器信息被泄露。示例
add_header cache-test $upstream_cache_status;
添加一个首部名称cache-test,值为nginx_upstream模块引入的一个变量,用于记录从后端服务器缓存的资源是否被命中。
![](https://www.#.com/imgs/3/6/4/8/45/b40181acf607dbb88d6998ac47750a1d.jpe)
nginx_http_upstream_module模块:用于把后端服务器定义成服务器组,实现负载均衡功能。
定义后端服务器组,会引入一个新的上下文;用于http上下文
upstream httpdsrvs {
server ...
server...
...
}
server address [parameters];在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文;
upstream websrvs {
server 10.1.1.121 weight=2 max_fails=2 fail_timeout=6s;
server 10.1.1.122 weight=1 max_fails=2 down;
server 10.1.1.123:8080 backup
}
负载均衡算法
least_conn:最少连接调度算法,当server拥有不同的权重时其为wlc;(当各server权重不同时,即为加权最少连接);最少连接算法通常只适用与那些长连接的协议;
ip_hash:源地址hash调度方法;把来自同一个ip地址的请求始终发往同一个backendserver,除非此backend server不可用;
hash key [consistent]:基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者的组合;
常用的hash key:
1) $COOKIE_name:
将一个用户的请求始终发往同一个backendserver,能实现会话绑定的功能;此处的name为COOKIE某些参数的名称,此处常用的有COOKIE_username;
2) $request_uri:
将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用;
match NAME { … }:对backendserver做健康状态检测时,定义其结果判断机制;只能用于http上下文;
常用的参数:
status code[code ...]:期望的响应状态码;
header HEADER[operator value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较;
body:期望响应报文的主体部分应该有的内容;
health _ check [PARAMETERS]:健康状态检测机制;只能用于location上下文;
常用参数:
interval=#:检测的频率,默认为5秒;
fails=#:判定服务器不可用的失败检测次数;默认为1次;
passes=#:判定服务器可用的失败检测次数;默认为1次;
uri=uri:做健康状态检测测试的目标uri;默认为/;
match=NAME:健康状态检测的结果评估调用此处指定的match配置块;
keepalive connections:为每个worker进程保留的空闲的长连接数量;
示例:
注释掉之前的缓存配置段
# proxy_cache_path /var/proxycache/ levels=1:1:1 keys_zOne=jpgcache:10m max_size=1g;
upstream testservers {
server 10.1.1.121;
server 10.1.1.122;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# root /usr/share/nginx/html;
proxy_set_header CIP $remote_addr;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
add_header cache-test $upstream_cache_status;
location / {
#proxy_pass http://10.1.1.121;
proxy_pass http://testservers;
index index.html;
# proxy_cache jpgcache;
# proxy_cache_key $request_uri;
# proxy_cache_valid 200 301 302 1h;
# proxy_cache_valid any 1m;
}
在后端建立不同的index.html,刷新访问页面,可查看页面变化。