nginx高可用实现部署详细文档
主机名 | 主机IP | 角色 | 备注 |
server1 | 192.168.153.111 | nginx主机 | 反向代理访问tomcat1或者tomcat2 |
server2 | 192.168.153.112 | nginx备机 | 反向代理访问tomcat1或者tomcat2 |
server3 | 192.168.153.113 | tomcat1 | 业务服务器 |
server4 | 192.168.153.114 | tomcat2 | 业务服务器 |
一.修改启动web服务器
在192.168.15.128和192.168.15.30上分别解压修改tomcat的index页面:
viwebapps/ROOT/index.jsp
修改页面html部分
<html>
<head>
</head>
<body>
SessionID:<%=session.getId()%>
<br/>
SessionIP:<%=request.getServerName()%>
<br/>
<h1>tomcat1 page</h1>
</body>
</html>
这样可以通过访问index来判断访问是不是轮询的
前期准备,
a;修改主机名,
b;修改网关能上网,
c;关闭防火墙
d;修改系统安全设置
1、/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态
SELinux status: enabled
2、修改配置文件需要重启机器:
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可。
二.安装配置nginx
1.安装GCC编译器等工具:
一、安装编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
二、首先要安装 PCRE
PCRE 作用是让 Nginx 支持 Rewrite 功能。
1、下载 PCRE 安装包,下载地址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
[root@bogon src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
2、解压安装包:
[root@bogon src]# tar zxvf pcre-8.35.tar.gz
3、进入安装包目录
[root@bogon src]# cd pcre-8.35
4、编译安装
[root@bogon pcre-8.35]#./configure
[root@bogon pcre-8.35]# make && make install
5、查看pcre版本
[root@bogon pcre-8.35]# pcre-config --version
2.下载安装Nginx:
CentOS 6.7下配置 yum 安装 Nginx。
第一步,在/etc/yum.repos.d/
目录下创建一个源配置文件nginx.repo
:
cd /etc/yum.repos.d/
vim nginx.repo
填写如下内容:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
保存,则会产生一个/etc/yum.repos.d/nginx.repo
文件。
下面直接执行如下指令即可自动安装好Nginx:
yum install nginx -y
安装完成,下面直接就可以启动Nginx了:
service nginx start
现在Nginx已经启动了,直接访问服务器就能看到Nginx欢迎页面了的。
3.配置Nginx.conf
配置文件,二个nginx负载均衡器的文件一样
user root;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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 myServer{
server 192.168.153.113:8080;
server 192.168.153.114:8080;
}
server {
listen 80;
server_name 192.168.153.222;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://mySer
}
}
include /etc/nginx/conf.d/*.conf;
}
这里面配置较多,其中比较有用的已经标红了,可以直接将此部分配置在默认的nginx的配置文件里面即可 |
三.安装及配置keepalived
1.安装keepalived
在两台nginx服务器安装keepalived:
通过yum –y install keepalived 来代替,不同安装方式而已,不是重点
二台Nginx上keepalived.conf配置文件如下,配置完成后分别service keepalived start启动。检验keepalived配置是否成功
两台keepalived的配置如下:可以看出两者之间的区别仅仅是主备的权重不同,主为100备为66,其余一些有作用的配置已经用红色标注
主:
global_defs { notification_email { } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_MASTER } vrrp_script chk_http_port { script "/usr/local/src/check_nginx_pid.sh" interval 2 #(检测脚本执行的间隔) weight 2 } vrrp_instance VI_1 { #state MASTER state BACKUP nopreempt #设置非抢占模式时,修改“state MASTER”为“state BACKUP”,添加“nopreempt“ interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port #(调用检测脚本) } virtual_ipaddress { 192.168.153.222 } } |
备:
global_defs { notification_email { } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_BACKUP } vrrp_script chk_http_port { script "/usr/local/src/check_nginx_pid.sh" interval 2 #(检测脚本执行的间隔) weight 2 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 66 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port #(调用检测脚本) } virtual_ipaddress { 192.168.153.222 } } |
以下是针对nginx状态进行检测的脚本,第一次nginx服务死掉时,会重新启动,如果Nginx服务无法正常启动,则杀掉keepalived进程
vim /usr/local/src/check_nginx_pid.sh
#!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi |
Ok,开始nginx负载均衡测试,停掉其中一台的任何服务,不影响整个系统的运作。
添加系统开机启动
chkconfig --add keepalived
chkconfig --level 23456 keepalived on
四.测试
依次启动两个tomcat=》启动两个nginx=》启动两个keepalived,查看主机上是否有虚拟ip192.168.15.135
通过虚拟ip访问nignx,看页面是不是轮询两个tomcat
将主机的nginx进程kill掉,看看vip是不是切换到备机器上了
访问虚拟ip是不是还能轮询访问tomcat
service nginx restart
service keepalived stop
tail -f /var/log/messages
keepalived 配置的网卡名称不对
chkconfig --add keepalived
chkconfig --level 23456 keepalived on
-level<等级代号> 指定读系统服务要在哪一个执行等级中开启或关闭。
等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动
错误:[alert] 3790#3790: setrlimit(RLIMIT_NOFILE, 51200) failed (13: Permission denied)
vi /etc/security/limits.conf 底部加上
* soft nofile 51200
* hard nofile 51200
scp /etc/security/limits.conf 192.168.153.111:/etc/security/
vi /etc/sysctl.conf 底部添加
fs.file-max=51200
scp /etc/ sysctl.conf 192.168.153.111: /etc/
错误:failed (13: Permission denied) while reading upstream(巨坑)
1、/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态
SELinux status: enabled
2、修改配置文件需要重启机器:
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
重启机器即可。
配置状态监控:
在nginx.conf中配置如下:
location /nginx_status {
stub_status on;
auth_basic "NginxStatus";
auth_basic_user_file /usr/local/nginx/htpasswd;
#allow 127.0.0.1;
#deny all;
}
然后运行下面的命令:
printf "admin:$(openssl passwd -crypt 123456)\n" >>/usr/local/nginx/htpasswd
最后在浏览器地址栏中输入:
http://192.1
输入用户名和密码:
效果如下图:
在192.168.153.111上面安装memcached
yum -y install memcached
启动memcached服务
services memcached start
检查服务是否正常启动
[root@server1 etc]# ps -ef | grep memcached
494 11771 1 0 11:49 ? 00:00:00 memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid
root 11789 4401 0 11:49 pts/1 00:00:00 grep memcached
[root@server1 etc]# netstat -anp | grep mem
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 11771/memcached
tcp 0 0 :::11211 :::* LISTEN 11771/memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:* 11771/memcached
udp 0 0 :::11211 :::* 11771/memcached
C:\Users\teacher>telnet 192.168.153.111 11211
stats
配置tomcat的配置文件。
context.xml
server.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.153.111:11211"
sticky="false"
lockingMode="auto"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
======================server.xml===================
<Engine name="Catalina" defaultHost="localhost">
jvmRoute="tomcatRoute1"
导入jar包。推荐使用maven自动下载
<groupId>de.javakaffee.msm</groupId>
<artifactId>memcached-session-manager</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>de.javakaffee.msm</groupId>
<artifactId>memcached-session-manager-tc7</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>de.javakaffee.msm</groupId>
<artifactId>msm-kryo-serializer</artifactId>
<version>2.1.1</version>
</dependency>
重新启动tomcat,sessionID不变
使用redis实现session一致性
yum install epel-release
yum install redis
[root@server2 ~]# service redis status
redis-server is stopped
[root@server2 ~]# service redis start
Starting redis-server: [ OK ]
[root@server2 ~]#
[root@server2 ~]# netstat -anp | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 47886/redis-server
[root@server2 ~]#
修改配置文件/etc/redis.conf
将127.0.0.1修改为192.168.153.112
重启服务
[root@server2 ~]# service redis restart
Stopping redis-server: [ OK ]
Starting redis-server: [ OK ]
配置tomcat配置文件
/usr/local/tomcat7_redis/conf/server.xml 修改端口号为8181
/usr/local/tomcat7_redis/conf/context.xml
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.153.112"
port="6379"
database="0"
maxInactiveInterval="60" />
上传jar包
重启tomcat
修改nginx配置
/etc/nginx/nginx.conf
重启nginx服务
[root@server1 ~]# service nginx restart
Stopping nginx: [ OK ]
Starting nginx: [ OK ]
备份机同样
设置redis主备切换
在备机的redis.conf中加下面配置
slaveof 192.168.153.112 6379