Nginx和Tomcat实现集群和负载均衡

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。说到Nginx和Apache的比较,在高并发连接的情况下,Nginx是Apache服务器最佳替代品。网上有一篇经典的博文,写得非常详细->点击查看

本文资料借鉴于网络

反向代理

上次整理了Apache和Tomcat实现集群和负载均衡的配置,本文简述一下Nginx和Tomcat实现集群和负载均衡。

负载均衡

F5是操作于OSI网络模型的传输层,Nginx、Apache是基于Http反向代理方式,位于OSI模型的第七层应用层,即TCP/UDP 和Http协议的区别。


1.准备工作


http://memcached-session-manager.googlecode.com/files/memcached-session-manager-1.3.0.jar

http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-jodatime-1.3.0.jar

http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-cglib-1.3.0.jar

http://spymemcached.googlecode.com/files/memcached-2.4.2.jar

http://memcached-session-manager.googlecode.com/files/javolution-5.4.3.1.jar

如果tomcat过多不建议session同步,server间相互同步session很耗资源,高并发环境容易引起Session风暴。而且大多数情况下,同一个用户没有必要访问不同的server。

2.安装

同Apache一样简单,Windows下载后直接解压即可。如果需要memcached,将上述5个依赖包放到$TOMCAT_HOME/lib目录下。

Linux下载后执行以下命令:

tar -xzvf nginx-1.x.x.tar.gz
cd nginx-1.x.x
./configure
make
make install 

如果是Ubuntu,常用在线安装的方式:apt-get install nginx

3.配置

#Nginx所用用户和组,window下不指定
#user niumd niumd;

#工作的子进程数量(通常等于CPU数量或者2倍于CPU)
worker_processes 2;

#错误日志存放路径
#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,window下不指定。
#use epoll;

#允许最大连接数
worker_connections 2048;
}

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;

upstream tomcat {
#根据ip计算将请求分配各那个后端tomcat,许多人误认为可以解决session问题,其实并不能。
#同一机器在多网情况下,路由切换,ip可能不同
#ip_hash; 通知nginx使用ip hash负载均衡算法。如果没加这条指令,nginx会使用默认的round robin负载均衡模块。
server localhost:9080 weight=1; #weight为请求权重,值越大,被请求的机率越高。
server localhost:8080 weight=1;
}

server {
listen 80;
server_name localhost;
charset utf-8;

location / {
root html;
index index.html index.htm;
proxy_connect_timeout 3;
proxy_send_timeout 30;
proxy_read_timeout 30;
proxy_pass http://tomcat; #代理上文配置的upstream tomcat
}

location ~ ^/(WEB-INF)/ {
deny all;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}


}
}

主要改动在server里面,相当于一个代理服务器,可以配置多个。


解决SESSION共享,则还需修改Context节点:

<Context docBase="xx/WebContent" path="" reloadable="true" >
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11211 n2:localhost:11212"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
copyCollectionsForSerialization="false"
/>
</Context>
location ~ \.jsp$ {
proxy_pass http://localhost:8080;
}

location ~ \.(html|js|css|png|gif)$ {
root /opt/tomcat/webapps/ROOT;
expires 30d;
}