概述
nginx+tomcat负载均衡配置
1、网络拓扑
2、nginx安装配置
1.安装nginx服务器,实现OSI网络模型第七层(应用层)负载均衡及反向代理:
安装nginx 1.6.1 stable version, stable version版本为稳定版,为RHEL/CentOS设置yum安装源,从以下列表选择相应的nginx更新包:
- RHEL 5
- RHEL 6
- RHEL 7
- CentOS 5
- CentOS 6
- CentOS 7
此包包含yum配置文件和一个公共的PGP密钥必须验证签下。下载并安装它,然后运行下面:
#yum install nginx
2.nginx配置负载均衡与反向代理
Nginx配置文件/etc/nginx/nginx.conf及参数含义如下:
#进程以nginx用户启动
user nginx ;
#cpu核心数或者2倍核心数
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
#最大文件描述符
worker_rlimit_nofile 51200;
events
{ #epoll为linux内核提供的网络IO模型
use epoll;
#允许最大连接数
worker_connections 51200;
}
http
{
include mime.types;
default_type application/octet-stream;
keepalive_timeout 60;
tcp_nodelay on;
sendfile on;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plainapplication/x-javascript text/css application/xml;
gzip_vary on;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#指定负载均衡名称tekview33,任意指定
upstream tekview33
{
#对IP地址进行hash算法,保证客户端能访问固定IP,从而避免session问题,此方法适用于tomcat资源在单一网关内。高并发下访问下,ip_hash无法保证对固定IP发出请求,可以通过memcache软件来保证session同步问题
ip_hash;
#指定代理tomcat服务器IP及端口
server 192.168.0.30:8080;
server 192.168.0.35:8080;
server 192.168.0.39:8080;
}
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区,且/root/proxy_temp_dir目录存在
proxy_temp_path /root/proxy_temp_dir;
#设置Web缓存区名称为cache_one,内存缓存空间大小为50MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为10GB
proxy_cache_path /root/proxy_cache_dir levels=1:2keys_zone=cache_one:50m inactive=1d max_size=10g;
server
{ #nginx访问端口
listen 8889;
server_name tekview33;
#自动补全"/"
if (-d $request_filename)
{
rewrite ^/(.*)([^/])$ http://$host/$1$2/ last;
}
#实现网页动静态分离
location /
{
root /root/apache-tomcat-7.0.55/webapps/bankriskcontrol
index index.html index.htm;
if (!-f$request_filename)
{
rewrite^/([a-zA-Z]+).html /$1.jsp last;
proxy_passhttp://tomcat;
break;
}
}
#对网站的图片、Flash、JavaScript、CSS、静态HTML、进行web缓存
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css|html|shtml)$
{
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到 upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
#对不同的HTTP状态码设置不同的缓存时间
proxy_cache_valid 200 10m;
proxy_cache_valid 304 1m;
proxy_cache_valid 301 302 1h;
proxy_cache_valid any 1m;
#以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存 内容到二级缓存目录内
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://tekview33;
}
#扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。
location ~ .*.(php|jsp|cgi)?$
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://tekview33;
}
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*.(js|css)?$
{
expires 1h;
}
}
}
(3)、启动nginx服务,先测试nginx配置文件是否正确
#nginx -t
如果提示如下:
nginx: theconfiguration file /etc/nginx/nginx.conf syntax is ok
nginx:configuration file /etc/nginx/nginx.conf test is successful
就说明配置文件没有问题可以启动nginx服务器了:
[root@testing1-centos64-x64-tekview /]#service nginx start
正在启动 nginx:[确定]
如果启动报错,你可以根据报错提示修改配置文件
3、tomcat的配置
(1)、安装jdk
#cd /usr/local/src;chmod+xjdk-6u17-linux-i586.bin;./jdk-6u17-linux-i586.bin
在安装过程中敲几下空格,然后输入"yes",然后中途中再按回车jdk就装好了。
做软连接:
ln -s /usr/local/jdk1.6.0_17/ /usr/local/jdk
(2)、java环境变量的配置
#vi /etc/profile,把以下内容写到文件的尾部
JAVA_HOME="/usr/local/jdk"
CLASS_PATH="$JAVA_HOME/lib:$JAVA_HOME/jre/lib"
PATH=".:$PATH:$JAVA_HOME/bin"
CATALINA_HOME="/usr/local/tomcat"
export JAVA_HOME CATALINA_HOME
然后保存退出,执行source /etc/profile 使刚才配置的环境变量生效。
(3)、部署war包
分别将war包部署到192.168.0.30、192.168.0.35、192.168.0.39主机tomcat应用的webapps目录
(4)、启动tomcat服务
启动192.168.0.30 、192.168.0.35、192.168.0.39主机的tomcat服务
#/root/apache-tomcat-7.0.55/bin/startup.sh
(4)、测试访问http://192.168.0.33/bankriskcontrol,如果页面可以正常访问,说明nginx的代理和tomcat的服务都没有问题。
4、自动化部署脚本
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
import subprocess
import re
import shlex
import time
filename = sys.argv[0]
ABSDIR = os.path.abspath(os.path.dirname(__file__))
DICT = {'192.168.0.30': '/home/apache-tomcat-7.0.55',
'192.168.0.35': '/root/apache-tomcat-7.0.55',
'192.168.0.39': '/root/apache-tomcat-7.0.55'
}
# copytoserver执行远程拷贝,将sql文件拷贝至35的/root/test目录并执行、war文件拷贝至DICT字典所指定的目录,
def copytoserver():
filelist = [i for i in os.listdir(ABSDIR) if i.endswith('sql') or i.endswith('war')]
try:
for s in filelist:
if s.endswith('war'):
for k, v in DICT.items():
print "nn拷贝%s到%s的%s/webapps/目录......"%(s,k,v)
command_line1 = ['ssh', 'root@'+k, 'rm -rf ', v+'/webapps'+'/bankriskcontrol' ]
command_line2 = ['scp', s, 'root@'+k+':'+v]
p1 = subprocess.Popen(command_line1)
p1.wait()
p2 = subprocess.Popen(command_line2)
p2.wait()
print "nn"
else:
print "nn拷贝%s到192.168.0.35的/root/test目录......"%s
command_line3 = ['scp', s, 'root@192.168.0.35:/root/test']
p3 = subprocess.Popen(command_line3)
p3.wait()
except IOError, e:
print e
#changeDB执行sql脚本
def changedb():
sql = ['create_database.sql', 'init_database_data.sql', 'addtestdata.sql']
# path = '/usr/local/mysql/bin/'
try:
print "nn创建数据库......nn"
cmd1 = ['ssh', 'root@192.168.0.35', 'mysql', '-uroot', '-p111111', '<', '/root/test/'+sql[0]]
p1 = subprocess.Popen(cmd1)
p1.wait()
print "nn初始化数据库......nn"
cmd2 = ['ssh', 'root@192.168.0.35', 'mysql', '-uroot', '-p111111', '-Dbank_risk_control', '<', '/root/test/'+sql[1]]
p2 = subprocess.Popen(cmd2)
p2.wait()
print "nn添加测试数据......nn"
cmd3 = ['ssh', 'root@192.168.0.35', 'mysql', '-uroot', '-p111111', '-Dbank_risk_control', '<', '/root/test/'+sql[2]]
p3 = subprocess.Popen(cmd3)
p3.wait()
except IOError, e:
print e
#管理远端tomcat服务器
def restart_tomcat():
try:
for k, v in DICT.items():
command_line4 = ['ssh', 'root@'+k, v+'/bin/shutdown.sh']
command_line5 = ['ssh', 'root@'+k, v+'/bin/startup.sh']
print "nn%s的tomcat服务正在重启.........nn"%k
p1 = subprocess.Popen(command_line4)
p1.wait()
p2 = subprocess.Popen(command_line5)
p2.wait()
print "nn============================================="
except IOError, e:
print e
if __name__ == '__main__':
print '