Nginx(三) Nginx负载均衡以及反向代理
Nginx负载均衡以及反向代理
一反向代理与正向代理
反向代理代理服务器,正向代理代理客户端。
1反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
2正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
二 负载均衡
负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无需其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。均衡负载能够平均分配客户请求到服务器阵列,籍此快速获取重要数据,解决大量并发访问服务问题。
三Nginx负载均衡以及反向代理完整配置示例
1 #CPU个数 2 worker_processes 1; 3 #pid文件存储位置 4 #pid logs/nginx.pid; 5 #最大处理请求个数 6 events { 7 worker_connections 1024; 8 } 9 http { 10 include mime.types; 11 default_type application/octet-stream; 12 #日志文件格式 13 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 14 '$status $body_bytes_sent "$http_referer" ' 15 '"$http_user_agent" "$http_x_forwarded_for"'; 16 #全局日志文件 17 #access_log logs/access.log main; 18 19 sendfile on; 20 #超时时间 21 keepalive_timeout 65; 22 #负载均衡配置 23 upstream www.solr.server{ 24 server 192.168.43.111:8080; 25 server 192.168.43.112:8080; 26 } 27 #主机 28 server{ 29 #监听端口 30 listen 80; 31 server_name www.hadoop.com; 32 error_page 500 502 503 504 /50x.html; 33 location = /50.html{ 34 root html; 35 } 36 #配置反向代理 37 location / { 38 proxy_pass_header Server; 39 proxy_set_header Host $http_host; 40 proxy_set_header X-Real-IP $remote_addr; 41 proxy_set_header X-Scheme $scheme; 42 proxy_pass http://www.solr.server; 43 } 44 #主机日志文件存放路径以及格式 45 access_log logs/hadoop.log main; 46 } 47 }
四 Nginx负载均衡以及反向代理实现
1 根据上面配置文件,新建两个虚拟机,根据自己的物理机IP(192.168.43.110)配置虚拟机IP(192.168.43.111,192.168.43.112)
2 两个虚拟机安装tomcat以及jdk
3 修改两个虚拟机的tomcat的默认欢迎页面~/apache-tomcat-8.5.13/webapps/ROOT/index.jsp,并分别启动两虚拟机上的tomcat
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 3 <html> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 6 <title>Nginx Reverse Proxy And Load Balancing</title> 7 </head> 8 <body> 9 <div>服务器IP:192.168.43.111(112)</div> 10 <div>Nginx代理服务器IP:<%String ip = request.getRemoteAddr(); out.print(ip); %></div> 11 <div>客户端IP:<%String ipClient = request.getHeader("X-Real-IP"); out.print(ipClient); %></div> 12 </body> 13 </html>
4 修改物理机C:\Windows\System32\drivers\etc\hosts文件,添加如下配置
192.168.43.112 www.hadoop.com
此处www.hadoop.com对应Nginx配置文件server(主机)节点下的server_name
5 切换到nginx安装目录下重启nginx
./nginx -s reload
6 访问www.hadoop.com页面,交替出现 服务器IP:192.168.43.111、服务器IP:192.168.43.112,简单负载均衡实现。
五 客户端IP问题
nginx,在做反向代理的时候,因为要代替客户端去访问服务器,所以,当请求包经过反向代理后,在代理服务器这里这个IP数据包的IP包头做了修改,最终后端web服务器得到的数据包的头部的源IP地址是代理服务器的IP地址,如此一来,后端服务器的程序给予IP的统计功能就没有任何意义,所以需要两个步骤让服务器获取真实客户端IP
1 配置反向代理时设置proxy_set_header的名称 为X-Real-IP值为$remote_addr
proxy_set_header X-Real-IP $remote_addr;
2服务器端根据Nginx的配置获取Nginx记录的真实IP
ipClient = request.getHeader("X-Real-IP");