Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,具备占有内存少,并发能力强的特点。在高连接并发的情况下,是Apache服务器不错的替代品。
1.安装配置
1.1依赖安装
yum install pcre pcre-devel
1.2安装nginx
# 解压并进入解压目录 tar -zxvf nginx-1.9.5.tar.gz cd nginx-1.9.5 # 配置安装在默认的/usr/local目录下 ./configure # 编译安装 make && make install
1.3拷贝配置文件至/etc/nginx
cp -r /usr/local/nginx/conf/nginx.conf /etc/nginx
1.4将nginx定义为服务
# 编辑nginx启动脚本 vi /etc/init.d/nginx
输入如下Shell命令
#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
# It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/etc/nginx/nginx.conf
nginx_pid=/var/run/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
echo "nginx already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $nginxd -c ${nginx_config}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
return $RETVAL
}
# Stop nginx daemons functions.
stop() {
echo -n $"Stopping $prog: "
killproc $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx $nginx_pid
}
# reload nginx service functions.
reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${nginx_pid}`
killproc $nginxd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|reload|status|help}"
exit 1
esac
exit $RETVAL
完成后可通过如下命令对nginx进行启动
service nginx start
1.5添加开机启动
vi /etc/rc.d/rc.local
添加如下配置:
# tomcat启动命令 /usr/local/tomcat/bin/startup.sh # 加载指定的配置后启动nginx /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf /usr/local/nginx/sbin/nginx
1.6测试
在浏览器中输入http://localhost,若展现出欢迎界面,则说明配置成功
二、Nginx实现Tomcat的负载均衡
2.1实现目标
目标清单:
1)210、211和212三台主机上各安装一个Tomcat,利用统一的8080接口提供服务;
2)210和211还各安装了一个Nginx,利用统一的80接口提供请求分发并实现Tomcat负载均衡的目的;
3)可利用http://192.168.31.210和http://192.168.31.211两个http地址随机访问到最底层的Tomcat,但在实际的生产环境中,对外只提供一个url地址,因此需要keepalived来提供VIP(192.168.31.200)来实现;
4)keepalived安装在210和211两台主机上,它还有一个目的就是监控本机Nginx的运行状态。例如:当210的Nginx处于不可运行状态时,keepalived将VIP飘逸到211,使211上的keepalived继续利用VIP对外提供访问入口。
2.2实现过程
2.2.1在各主机上安装Tomcat
(此处省略一千字......)
2.2.2在210和211上安装配置Nginx
安装已在第1节中实现,直接进行Nginx的配置。
vi /etc/nginx/nginx.conf
主要的配置内容如下:
worker_processes 1;
# 指定error日志和pid文件的路径
error_log /data/logs/nginx/error.log;
pid /var/run/nginx.pid;
events {
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日志文件的路径
access_log /data/logs/nginx/access.log main;
sendfile on;
# tcp_nopush on;
keepalive_timeout 65;
# 定义负载组
upstream upstream1 {
# 对应具体若干个Tomcat服务器的访问地址
server 192.168.31.210:8080;
server 192.168.31.211:8080;
server 192.168.31.212:8080;
}
server {
listen 80;
# 服务器host,不同的主机有不同的名称
server_name 192.168.31.211;
# 定义根路径访问规则
location / {
root html;
index index.html index.htm;
# 访问地址,upstream1最终会被负载组中的某个server替换成真实的地址
proxy_pass http://upstream1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
由于在Nginx的启动脚本中修改了所加载的配置文件路径为/etc/nginx(默认为/usr/local/nginx/conf),因此在启动之前还需要将mime.types文件拷贝于此
cp /usr/local/nginx/conf/mime.types /etc/nginx
2.2.3重启210和211上的Nginx后测试
service nginx restart
1)输入http://192.168.31.210和http://192.168.31.211后,如果在浏览器中能呈现出Tomcat的首页,说明启动成功;
2)查看pid和日志目录,如果出现pid和access.log文件,则说明配置的文件路径有效;
3)见下图:
红框中的信息是我在tomcat首页中自己加的,反复刷新页面,如果IP地址在210 - 212之间变化,则说明Nginx的负载均衡配置成功。
yum install popt-devel yum install gcc gcc-devel yum install openssl openssl-devel3.2安装Keepalived
# 解压并进入安装目录 tar -zxvf keepalived-1.1.19.tar.gz cd keepalived-1.1.19 # 配置,指定配置文件的目录和安装目录 ./configure --sysconf=/etc --prefix=/usr/local/keepalived # 编译安装 make && make install3.3设置开机启动
# 拷贝启动脚本到/usr/sbin/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/vi /etc/rc.d/rc.local 后加入如下启动命令:
/etc/rc.d/init.d/keepalived start启动
service keepalived start重启系统后,输入如下命令:
service keepalived status如果出现如下示例信息:
keepalived (pid 1897) 正在运行...
则说明设置成功
vi /opt/nginx_keepalived.sh后输入如下命令行:
#!/bin/bash nginxpid=`ps -C nginx --no-header |wc -l` if [ $nginxpid -eq 0 ];then service nginx start sleep 3 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then service keepalived stop fi fi
作用在于当本机nginx处于停止(宕机)状态时,尝试重启。等待3秒再次校验,仍然失败则不再尝试,将本机keepalived停止,让其它处于同一个VIP的keepalived来接管,达到灾备切换的目的。
启动脚本授权
chmod -R 755 /opt/nginx_keepalived.sh
3.5编辑配置文件
vi /etc/keepalived/keepalived.conf
主机210(Master)上的配置内容:
! Configuration File for keepalived
global_defs {
notification_email {
code727@163.com
}
notification_email_from pub@easymobi.cn
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/opt/nginx_keepalived.sh" # 检查nginx状态的脚本
interval 2
weight 3
}
vrrp_instance VI_1 {
state Master
# 取决于具体的eth
interface eth2
virtual_router_id 51
# Nginx Master的IP地址
mcast_src_ip 192.168.31.210
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111222
}
virtual_ipaddress {
# Master和Backup共有的虚拟IP地址
192.168.31.200
}
track_script {
chk_http_port
}
}
备机211(Backup)上的配置内容:
! Configuration File for keepalived
global_defs {
notification_email {
code727@163.com
}
notification_email_from pub@easymobi.cn
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/opt/nginx_keepalived.sh" # 检查nginx状态的脚本
interval 2
weight 3
}
vrrp_instance VI_1 {
state Backup
# 取决于具体的eth
interface eth4
virtual_router_id 51
# Nginx Backup的IP地址
mcast_src_ip 192.168.31.211
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111222
}
virtual_ipaddress {
# Master和Slave共有的虚拟IP地址
192.168.31.200
}
track_script {
chk_http_port
}
}
3.6重启系统后测试
1)输入192.168.31.200后能正常访问到Tomcat首页,此时210上的Nginx日志文件的内容在增加,211的没有,说明常规情况下都是210的Nginx在处理转发;
2)停掉Master的Nginx(模拟宕机)后输入同样的地址仍然能正常访问到Tomcat首页,日志结果和场景1)一样,因为keepalived会监控到Nginx被关闭而又重新将它启动;
3)停掉Backup的nginx(模拟宕机)后输入同样的地址仍然能正常访问到Tomcat首页,日志结果和场景1)一样;
4)停掉Master的keeplived后输入同样的地址仍然能正常访问到Tomcat首页,此时已被Backup的keeplived接管,211上的Nginx日志文件的内容在增加,210的没有,说明在这种情况下都是211的Nginx在处理转发;
5)重启Master的keeplived,此时Master的keeplived抢回主动权(因为keeplived.conf的vrrp_install中没有声明nopreempt,将采用默认抢占策略),输入同样的地址后仍然能正常访问到Tomcat首页,日志结果和场景1)一样。
4.总结
从前面的架构图中可看出,每一个Tomcat存在单点问题,虽然从Nginx层面来访问可过滤掉不可用的Tomcat,但整体来说,由于少了一台服务器,性能会有所下降,最极端的情况下,当所有的Tomcat都处于不可用时,访问Nginx也无济于事了。因此,对于那种可靠性要求非常高的环境来说,可为每一个Tomcat再添加一个备份,同样利用keeplived来分配VIP并实施监控。在这种环境下,nginx.conf文件中的server配置将修改为VIP:8080。
上述手段也是服务器维护升级时,为保证7*24时不断服务更新的惯用手段——升级时,手动停到当前Tomcat主机,让keeplived接管到备机后继续对外提供老服务,当在主机上更新完成后,再将主机重新启动,如果keeplived为抢占式的,则主机自动抢回主动权后对外提供新服务,备机又处于待命状态,此时就可以在备机上“悄无声息”的更新服务了。
另外,将server配置中的ip指向另一台Nginx服务器的ip,来实现Nginx之间无限层次的转发,但必须保证各转发服务器之间不能形成闭路环。
本文介绍如何使用Nginx实现Tomcat服务器的负载均衡,并通过Keepalived实现故障转移,确保服务高可用性。
1402

被折叠的 条评论
为什么被折叠?



