以下都是在centos7的环境下进行
1、相关知识点:nginx,tomcat,会话同步,nfs,nfs指定端口,redis
2、准备一台Nginx服务器,作为负载均衡的前置机, 3台应用服务器安装tomcat服务, 一台nfs文件存储服务器,用于存放用户数据,3台tomcat共享这个存储服务器, 一台mysql服务器;
3、安装部署nginx
yum install nginx
可能你会遇到域名无法解析的情况,有两种方式处理
第一种:修改 /etc/resolv.conf 增加三行脚本:
nameserver 8.8.8.8
nameserver 114.114.114.114
nameserver 223.6.6.6
第二种:修改网卡的配置 /etc/sysconfig/network-scripts/ifcfg-eth0 : 增加三行脚本:
DNS1=8.8.8.8
DNS2=114.114.114.114
DNS3=223.6.6.6
然后重启网络: service network restart, 此次系统同样会自动在/etc/resolv.conf增加三行nameserver的脚本
你可能遇到的第二个问题是安装nginx,提示没有可以的软件包, 那是因为yum还没有nginx的源
下载对应当前系统版本的nginx包(package)
wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
建立nginx的yum仓库
rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm
下载并安装nginx
yum install nginx
启动nginx服务
systemctl start nginx
默认端口80,所以还需要添加防火墙开放端口
firewall-cmd --zone=public(作用域) --add-port=80/tcp(端口和访问类型) --permanent(永久生效)
firewall-cmd --reload (重启防火墙)
访问 http://ip 出现 "Welcome to nginx!" 的页面,说明nginx安装成功了, 下面还要配置负载均衡,这里涉及到会话保持,session同步的问题, 通常采用ip_hash方式, 我这里用采用redis保存回话的方式; 下面修改nginx配置 /etc/nginx/nginx.cnf, 这个配置文件最后一段是include了另一个配置文件(include /etc/nginx/conf.d/*.conf;),我们把这行删掉,同时把include的配置文件内容copy到这个位置, 修改其中的location,再增加upstream配置,注意如果nginx用其他端口,就要修改server下面的listen 8080,同时再修改location的proxy_set_header Host $host:8080; 完整配置如下:
user nginx;
worker_processes auto;
worker_rlimit_nofile 65536;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 65536;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream tomcat8{
server 172.17.110.141:8080 weight=2;
server 172.17.110.142:8080 weight=2;
server 172.17.110.143:8080 weight=2;
server 172.17.110.144:8080 weight=2;
}
server {
listen 80;
server_name localhost;
charset UTF-8;
location / {
proxy_pass http://tomcat8;
proxy_redirect default;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 300;
proxy_read_timeout 300;
proxy_send_timeout 300;
}
location /front/ {
alias /opt/front/;
}
error_page 500 502 503 504 /50x.html;
}
}
只做这些还不够,如果此时应用服务已经配置好,访问nginx的话会出现 (13: Permission denied)错误,此时需要关闭SeLinux
永久修改:/etc/selinux/config 将SELINUX=enforcing改为SELINUX=disabled, 这个修改需要重启机器才生效, 所以可以再做一步临时修改,执行下面的命令:
setenforce 0
4、安装部署tomcat
下载经jdk 的 rpm包,这种安装最简单,一条命令即可,也不需要配置环境变量
rpm -ivh jdk-8u91-linux-x64.rpm
下载tomcat.tar.gz包,解压
tar -zxvf apache-tomcat-8.0.30.tar.gz
重命名目录 mv apache-tomcat-8.0.30 tomcat8
如果要调整端口, 修改 tomcat8-eip/conf/server.xml
开放防火墙端口, 以80为例
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
新建服务文件,以tomcat8为例 /usr/lib/systemd/system/tomcat8.service
[Unit]
Description=Tomcat8
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/opt/tomcat8/bin/tomcat8.pid
ExecStart=/opt/tomcat8/bin/startup.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
新建tomcat环境文件 tomcat8/bin/setenv.sh
#add tomcat env
JAVA_HOME=/usr/java/jdk1.8.0_91
JAVA_JRE=/usr/java/jdk1.8.0_91/jre
#add tomcat pid
CATALINA_PID="$CATALINA_BASE/bin/tomcat8.pid"
配置开机启动命令 systemctl enable tomcat8
前面Nginx配置的时候说过,负载均衡需要保持session同步,下面就来配置:
a. copy 4个包 到 tomcat的lib目录 commons-logging-1.2.jar,commons-pool2-2.4.2.jar,jedis-2.9.0.jar,tomcat-cluster-redis-session-manager-2.0.4.jar, 这几个包在https://github.com/ran-jit/tomcat-cluster-redis-session-manager这个项目上可以下载到,找它的2.0.4版本,最新的版本没有验证过;
b. 然后从tomcat-cluster-redis-session-manager-2.0.4.jar包内解压出配置文件redis-data-cache.properties放到tomcat的conf目录,注意修改redis服务的地址和端口,
c. 修改tomcat/conf/context.xml在最下面增加两行配置
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />
e. 注意webapps/ROOT/WEB-INF/web.xml 内不能把session-timeout设置成-1,这个坑填了好久。。。
其他几台tomcat同样配置
启动tomcat systemctl start tomcat8
5、安装配置redis
下载最新的redis wget http://download.redis.io/releases/redis-5.0.5.tar.gz
解压 tar xzf redis-4.0.10.tar.gz
安装
cd redis-5.0.5
make
这个打包过程可能会出现错误,由于redis是c语言写的, 所以需要安装c语言的编译环境gcc, 先安装它,然后在make就不会有错误了。
启动redis
src/redis-server
后台启动
src/redis-server &
也可以把redis安装成服务
在redis-5.0.5 目录下 执行make install。会将make编译生成的可执行文件拷贝到/usr/local/bin目录下,
执行./utils/install_server.sh配置Redis配置之后Redis能随系统启动。
Redis服务查看、开启、关闭
通过ps -ef|grep redis命令查看Redis进程;
开启Redis服务操作通过/etc/init.d/redis_6379 start命令,也可通过(service redis_6379 start);
关闭Redis服务操作通过/etc/init.d/redis_6379 stop命令,也可通过(service redis_6379 stop)
最后注意开放6379端口
6、安装配置nfs
服务端安装
1.安装
yum -y install nfs-utils rpcbind
2.启动服务,先启动rpcbind
service rpcbind start
service nfs start
3.创建需要共享的目录
mkdir -p /data/share
4.对文件夹设置权限
chown -R nfsnobody /data/share
5.编辑共享
vi /etc/exports
#增加下面内容
/data/share 192.168.0.50(ro,insecure,sync,all_squash)
注:可以指定特定的ip,也可以直接写*开放所有ip访问权限。
常见的选项:
ro:默认选项,以只读的方式共享。
rw:以读写的方式共享。
root_squash:将客户端使用的是root用户时,则映射到NFS服务器的用户为NFS的匿名用户(nfsnobody)。
no_root_squash:将客户端使用的是root用户时,则映射到FNS服务器的用户依然为root用户。
all_squash:默认选项,将所有访问NFS服务器的客户端的用户都映射为匿名用户,不管客户端使用的是什么用户。
anonuid:设置映射到本地的匿名用户的UID
anongid:设置映射到本地的匿名用户的GID
sync:默认选项,保持数据同步,数据同步写入到内存和硬盘。
async:异步,先将数据写入到内存,在将数据写入到硬盘。
secure:NFS客户端必须使用NFS保留端口(通常是1024以下的端口),默认选项。
insecure:允许NFS客户端不使用NFS保留端口(通常是1024以上的端口)。
6.生效配置
exportfs -r
7.开启防火墙
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload
注意:对于不能开发服务只能开发端口的的服务器,那么就需要固定NFS端口了,因为nfs服务默认是端口随机的
vi /etc/sysconfig/nfs
RQUOTAD_PORT=9001
MOUNTD_PORT=9002
STATD_PORT=9003
vi /etc/modprobe.d/lockd.conf
options lockd nlm_tcpport=9004
options lockd nlm_udpport=9005
然后重启服务 restart nfs rpcbind
开放 9001 9002 9003 9904 9005 2049,111 端口,其中2049,111 是nfs固定的不能修改的端口。
客户端安装配置,也就是几个tomcat的服务器
yum -y install nfs-utils
1.客户端创建需要挂载的目录
mkdir /usr/share
2.客户端查看服务器共享目录信息
showmount -e 服务器ip
3.进行挂载
mount -t nfs 主机ip:/data/share /usr/share -o proto=tcp -o nolock
4、设置开机挂载
vi /etc/fstab
增加一行配置
服务器ip:/data/share /usr/share /usr/share nfs defaults 0 0
至此,完整的负载均衡安装配置完成了,省略了mysql的安装, 这里面还是有一些坑的,需要实际操作才能一一填上, 另外nginx本身也有一些配置可以调整,如proxy_connect_timeout, 这些需要在实际运行中调试配置,才能达到最佳的效果, 一般来说并发超过250个,就建议做负载均衡了,但是多少并发量需要搭建多少个tomcat,这个还需要实际调试配置, 这里经验尚浅,无法给出完美的建议。