案例一、【web服务应用】七层反向代理,负载均衡,动静分离
vim /usr/local/nginx/conf/nginx.conf ...... http { ...... #gzip on; #配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大 upstream tomcat_server { server 192.168.80.100:8080 weight=1; server 192.168.80.101:8080 weight=1; server 192.168.80.101:8081 weight=1; } server { listen 80; server_name www.kgc.com; charset utf-8; #access_log logs/host.access.log main; #配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理 location ~ .*.jsp$ {
proxy_pass http://tomcat_server;
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名($host、$http_host、$proxy_host)。
##如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。
proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取客户端的真实IP
proxy_set_header X-Real-IP $remote_addr;
##是一个特殊的 Nginx 变量,它包含了原始请求的 X-Forwarded-For
头的内容,并附加上客户端的 IP 地址。设置的IP列表,会把经过的机器ip,代理机器ip都记录下来。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#Nginx可以在转发请求到上游服务器时添加X-Forwarded-Proto头部来指定协议类型($scheme 变量即为http和https)
#proxy_set_header X-Forwarded-Proto $scheme;
#Referer是一个http请求头字段(用于只是请求是从哪个页面或URL发起的),以下为将客户端的Referer头原封不动地传递给后端服务器(也可以强制为某个页面地址)。
#proxy_set_header Referer $http_referer;
} #配置Nginx处理静态图片请求 location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css)$ { root /usr/local/nginx/html/img; expires 10d; } location / { root html; index index.html index.htm; } ...... } ...... }
* X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。 它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。标准格式如下:X-Forwarded-For: client1, proxy1, proxy2。 这一HTTP头一般格式如下:X-Forwarded-For: client1, proxy1, proxy2。其中的值通过一个“逗号+空格”把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。 鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。 |
案例二、【web服务应用】四层反向代理
(1) 如图所示四层反向代理只做一个负载均衡配置,他代理两台七层反向代理服务器
第一步:如上面实验所示,在配置一台七层反向代理服务器,里面也要配置动静分离与负载均衡,同样代理两台tomcat服务器
(2)配置四层反向代理服务器
#四层反向代理需要stream块,如果编译时没有配置请重新编译 ./configure --with-stream 和http同等级:所以一般只在http上面一段设置, stream { #这里代理两台Nginx服务器 upstream appserver { server 192.168.243.102:80 weight=1; server 192.168.243.103:80 weight=1; } #设置反向代理的端口号为8080与本机的端口号不一致即可 server { listen 8080; proxy_pass appserver; } } http { #实验环境中负载均衡最好把连接保持关闭,否则会发转跳转失败 ......