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)见下图:
![](https://i-blog.csdnimg.cn/blog_migrate/d56a9d2c08c9eaeb44071e9ba17727aa.png)
红框中的信息是我在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之间无限层次的转发,但必须保证各转发服务器之间不能形成闭路环。