nginx除了可以自己充当web服务器之外,还可以充当其它web服务器的反向代理工具。
Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。
反向代理原理图
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他一一找出来做下实现。
以下是轮询和加权轮询原理图:
以下是Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
测试环境: centos6.5 32系统, nginx1.10.3
测试环境简单拓扑图如下:
nginx.conf配置如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
limit_conn_zone $binary_remote_addr zone=addr:10m;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream wx.com { #配置服务集群
#ip_hash
server 192.168.68.1:8080 weight=1; #weight越大,处理请求的概率就越高
server 192.168.68.129:8080 weight=1;
}
server {
listen 80;
server_name 192.168.68.128;
#charset koi8-r;
#access_log logs/host.access.log main;
location /NginxProj { #配置反向代理站点
#指定反向代理的服务集群,注意wx.com是集群名称,要和upstream中的wx.com一致
proxy_pass http://wx.com;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /nginx_status {
stub_status on;
access_log off;
}
}
}
其它详细配置请参考我的上篇文章
测试jsp页面的代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="java.net.InetAddress"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="path" value="${pageContext.request.contextPath}"></c:set>
<c:set var="scheme" value="${pageContext.request.scheme}"></c:set>
<c:set var="serverName" value="${pageContext.request.serverName}"></c:set>
<c:set var="serverPort" value="${pageContext.request.serverPort}"></c:set>
<c:set var="basePath" value="${scheme}://${serverName }:${serverPort }${path }/"></c:set>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="${basePath }">
<title>nginx演示</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<%
String serverIp=InetAddress.getLocalHost().getHostAddress();
String serverInfo=application.getServerInfo();
Properties props=System.getProperties(); //获得系统属性集
String osName = props.getProperty("os.name"); //操作系统名称
String osArch = props.getProperty("os.arch"); //操作系统构架
String osVersion = props.getProperty("os.version"); //操作系统版本
%>
<body>
<h2>sessionId:<%=session.getId() %></h2>
<h2>服务器ip:<%=serverIp %></h2>
<h2>tomcat服务器信息:<%=serverInfo %></h2>
<h2>服务器操作系统名称 :<%=osName %></h2>
<h2>服务器操作系统构架 :<%=osArch %></h2>
<h2>服务器操作系统版本 :<%=osVersion %></h2>
</body>
</html>
运行结果如下,找一个客户端反复刷新页面:
请求的服务器会在.1和.129之间切换,ok,负载均衡和反向代理测试成功!
如果配置的是ip_hash方案,请在配置服务集群哪里去掉ip_hash前面的注释,那么刷新页面,session就不变了!