目的
先说说我要干什么,如题:使用nginx实现多个tomcat服务器的负载均衡。
nginx
大名鼎鼎,相信很多人都听过,以前感觉很厉害,用了之后发现真的很厉害。nginx可以做以下几件事:
- 反向代理
- 负载均衡
- 动静分离
- 网页、图片缓存
需要明确的是nginx并不是应用服务器,也就是说nginx不能处理动态请求(和apache一样,熟悉apache应该知道),比如jsp、php等页面,nginx把这些请求转发给能处理这些页面的程序。
反向代理
好吧,之前我也为这个问题纠结挺久,为什么叫反向?既然有反向,那肯定有正向,现有客户端x,代理服务器y,最终服务器z,现在x直接访问z:x->z,通过代理服务器y:x->y->z,无论正反代理服务器y都是位于x、z之间,正反是根据代理服务器代理的是谁来判断的
- 正向:代理服务器y代理的是客户端,站在客户端的角度上是正向的,所以是正向代理
- 反向:代理服务器y代理的是最终服务器z,站在客户端的角度上是反向的,所以是反向代理
好吧,这是我的理解,可能不够详细,这里给大家推荐一片文章,介绍的挺好的:http://bbs.51cto.com/thread-967852-1-1.html
负载均衡
现在客户端所有请求都经过nginx了,那么nginx就可以决定将这些请求转发给谁,如果服务器A的资源更充分(CPU更多、内存更大等等),服务器B没有服务器A处理能力强,那么nginx就会吧更多的请求转发到A,转发较少的请求到服务器B,这样就做到了负载均衡,而且就算其中一台服务器宕机了,对于用户而言也能正常访问网站。
动静分离
借助于nginx强大的转发功能,可以通过配置实现网站的动态请求和静态文件进行分离,将动态请求发送到服务器A,将静态文件转发到服务器B,这样便于nginx做静态文件的缓存和后期对网站使用CDN。
实现多tomcat负载均衡
tomcat和nginx安装再次不再赘述,不过注意如果多个tomcat安装在同一台机器上的话,注意修改server.xml(在%tomcat_home%/conf/server.xml)中的端口号,以下是我的tomcat配置情况
tomcat A:10.10.31.11:8888
tomcat A:10.10.31.11:9999
nginx配置,nginx.conf
#user www-data; worker_processes 3; #pid /run/nginx.pid; events { #use epoll worker_connections 8192; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; # 在这儿配置多个服务器 upstream web_app{ server 10.10.31.11:8888; server 10.10.31.11:9999 } server{ # nginx监听80端口 listen 80; # 特别注意server_name配置,这儿在实际使用中配置多个域名,比如test.com www.test.com, server_name localhost 127.0.0.1; location / { root html; index index.html; proxy_pass http://web_app; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 100m; } } }
验证
service nginx start
访问:localhost或者127.0.0.1会发现两个tomcat首页在交替(为了区分两个tomcat,建议修改%tomcat_home%/weapps/ROOT/index.jsp页面,如修改两个title分别为8888, 9999)
很简单的配置,只有简单的负载均衡,而且两台服务器的权重也是一样的,这样配置主要是为了解决一个问题:因为系统已经上线了,如果在使用过程中发现了bug需要赶修复并重新部署,不能每次部署就shutdown-start吧,用户突然就不能访问网站了,还有一种方法就是等夜深人静没人访问网站的时候部署,更科学的方法是使用nginx做负载均衡,这样启动两台服务器A、B,部署A的时候B还在正常运行,部署完A,启动A,再部署B。
当然了,使用nginx做负载均衡之后还有一个很重要的问题亟待解决——session集群共享,接下来想使用shiro和redis做session集群共享,这样子随着业务的增长,后期有更多的服务器需要负载均衡也算是有基础了。
正文完。
最近一段时间感觉压力有点略大,经常做梦都在想项目上的事儿,每天醒来都感觉心里有点慌慌的感觉。希望自己还是要注意到这个问题,调节好。
还有一个感触就是:时势造英雄,有好多技术自己没有应用场景去学习的时候总感觉少了点什么,比如这次nginx的使用,以前也试着学习过,可是感觉也是不得要领,但是这次因为系统上线之后需要在不间断访问的前提下替换部署,感觉用起来挺快,理解起来也更流畅。业务发展才是促进技术发展的源动力,对于技术发展而言是这样,对于个人技术积累也是这样。在还没有遇到相应的业务场景的时候只能是不断提高自己的学习能力,在业务场景真的到来之际,能应用自己的能力解决实际问题,提高自己的技术和能力,而这里的业务场景就是程序员的时势。不断提高自己,然后等待时势的到来。