nginx作为负载均衡根据定义将不同的用户请求分发到不同的服务器,同时也解决了因单点部署服务器故障导致的整个应用不能访问的问题
在加入nginx之后,如果多个服务器中的一个或多个(不是全部)发生故障,均不影响用户的正常使用,会将用户请求分发到可以提供服务的服务器上
本节实例仅实现 一个nginx + 2个tomcat + redis实现java web应用的自由切换,并保持用户会话信息,对前端用户完全不可见。
会话的共享是为了保证用户在首次登录系统后已经后续的会话不会因为nginx重新分发到其他服务器而再次登录,达到会话信息共享
本例在windows下采用的是
nginx 1.9.13
tomcat 7.0.64
redis 2.8
操作步骤:
① 准备两个tomcat,并修改端口,修改tomcat/webapps/ROOT中index.jsp内容为:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String username = request.getParameter("username"); System.out.println("username:"+username); if(username!=null){ session.setAttribute("userSession", username); System.out.println("value in session is :" + session.getAttribute("userSession")); } %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ngix+tomcat+redis session共享验证</title> </head> <body> <form action="index.jsp"> <input type="text" name="username" value=""/> <br/> <input type="submit" value="保存信息到session"/> </form> <hr/> <!-- 不同tomcat请使用不同mark 以便识别 --> 你访问的tomcat 端口为:8898 tomcat001 <br/> session值为: <%=session.getAttribute("userSession") %> </body> </html>
并保证两个tomcat都能正常启动,并能正常访问
② 下载ngix并修改conf文件如下
#Nginx所用用户和组
#user niumd niumd;
#工作的子进程数量(通常等于CPU数量或者2倍于CPU)
worker_processes 1;
#错误日志存放路径
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
#指定pid存放文件
pid logs/nginx.pid;
events {
#使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue
#use epoll;
#允许最大连接数
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#定义日志格式
#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 off;
access_log logs/access.log;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#keepalive_timeout 75 20;
include gzip.conf;
upstream localhost {
#ip_hash
#ip_hash; #测试时请不要打开ip_hash 否则不会在不同server间跳转,第一次访问的哪一个就会一直访问哪一个server
#下面为配置的server列表,weight表示权重,值越大分配到的请求就越多,默认为1.
server localhost:8898 weight=1;
server localhost:8899 weight=1;
}
server {
listen 8888; #8888为监听的端口,所以访问时就要通过 ip:8888来访问
server_name localhost;
location / {
proxy_connect_timeout 3;
proxy_send_timeout 30;
proxy_read_timeout 30;
proxy_pass http://localhost; #这里的名字要和上面upstream后面跟的名字一致
}
}
}