nginx负载均衡以及静态资源的反向代理实施方案html
做者:袁旭云前端
nginx (发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。 其特色是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx。java
本文全部的配置都基于win7 64位操做系统进行相关配置,不适用与其余类型的操做系统。nginx下配置两台tomcat,结构以下图:nginx
所用到的资源清单以下git
nginx/Windows-1.10.1 Windows系统稳定版github
Tomcat7 (后面高级部分有session同步机制 因此tomcat须要使用7 )web
jdk7 64位redis
(不须要session同步时不须要)apache
Redis-x64-3.2.100windows
commons-pool2-2.0.jar
jedis-2.5.2.jar
tomcat-redis-session-manager1.2.jar
不管是高并发仍是通常大应用程序,经过nginx来处理静态页面要比经过Tomcat处理在性能方面好不少,因此用nginx处理静态资源理论上可以提高系统性能的。单机部署项目虽然可以节省硬件成本,可是在产品更新迭代的时候因为系统不得不关闭,或者是因为硬件故障形成服务器宕机,多多少少会给用户的使用带来必定的影响。高并发下单机部署服务器压力会更大,这个时候负载均衡显得尤为重要。经过nginx能够实现单服务器的静态资源本地化,也能够实现tomcat集群的负载均衡,配合其余资源还能实现session的共享等等。基于上面这些特性,能够轻松的实现负载均衡,更新迭代能零宕机,作到用户体验和性能的双提高。
无session同步,无静态文件本地化,只作负载均衡。tomcat X 2 + nginx,jdk、tomcat相关配置及下载自行查阅相关资料,本文不作介绍
http://nginx.org/en/download.html ,这里咱们推荐下载稳定版(stable versions)
nginx-
|_ conf 配置目录
|_ contrib
|_ docs 文档目录
|_ logs 日志目录
|_ temp 临时文件目录
|_ html 静态页面目录
|_ nginx.exe 主程序
window下安装Nginx极其简单,解压缩到一个无空格的英文目录便可(我的习惯,担忧中文出问题),双击nginx启动,这里我解压缩到到:C:\service目录。
DOS环境启动
若是想中止nginx,dos环境运行命令:nginx -s stop
从新加载配置 nginx -s reload
nginx配置文件默认在conf目录,主要配置文件为nginx.conf,下面是nginx做为前端反向代理服务器的配置。
多的就再也不截图,文件在这里
对于tomcat你们都很熟悉,只须要修改server.xml配置文件便可,这里咱们以apache-tomcat-7.0.70为例,注意:一台服务器开多tomcat须要修改,若是是不在一台服务器,则不用。
第一处端口修改:
<!-- 修改port端口:18006 俩个tomcat不能重复,端口随意,别过小-->
<Server port="18006" shutdown="SHUTDOWN">
第二处端口修改:
<!-- port="18081" tomcat监听端口,随意设置,别过小 -->
<Connector port="18081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
第三处端口修改:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
首先测试nginx配置是否正确,测试命令:nginx -t (默认验证:conf\nginx.conf),也能够指定配置文件路径。
其次验证tomcat,启动两个tomcat,不出现端口冲突即为成功(tomcat依赖的java等搞“挨踢”的就废话不说了)
最后验证配置负载均衡设置,http://localhost/ 或http://localhost/index.jsp 。我修改了index.jsp页面,增长日志输出信息,便于观察。注意:左上角小猫头上的:access tomcat二、access tomcat1。说明访问了不一样的tomcat。
至此window下nginx+tomcat负载均衡配置结束,关于tomcat Session的问题一般是采用memcached,或者采用nginx_upstream_jvm_route ,他是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。若是tomcat过多不建议session同步,server间相互同步session很耗资源,高并发环境容易引发Session风暴。请根据本身应用状况合理采纳session解决方案。
采用这种方式,能够随机的访问到某一台服务器,减轻服务器压力,同时在进行程序更新的时候(server 127.0.0.1:7001 down;),也能保证有一台服务器在处于工做状态,对新登陆系统的用户不受影响。
无session同步,静态文件本地化+负载均衡,Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱。虽然Tomcat的最新版本支持epoll,可是经过Nginx来处理静态页面要比经过Tomcat处理在性能方面好不少。
假设分析发现系统将ext2部署在同级目录中,ext2文件夹下所有为静态文件;
首先拷贝ext2文件夹到磁盘,如图
展开看看 如图
那么如何将以/ext2请求的文件拦截下来呢?这时候就要说一说nginx的url拦截配置了。如图
详细的解释官方文档也有说明,这里就很少说了。
本文配置以下
location ^~ /ext2/ {
root F:/statics;
expires 30d;
}
这里特别要注意,ext2这个文件夹是必定要存在的 而且要在 statics文件夹里面,这也就是root F:/statics; 的缘由了,最终当带有ext2的url就会指向 F:/statics /ext2下面了,若是root F:/statics/ext2,这是不对了,这样会404,这里相信有很多人遇到,重点说下。
在cmd窗口执行(关闭tomcat 试试)
nginx -s reload
访问xxx/ ext2/index.html,看到了吧 成功出现下面的页面如图
看到了没,静态文件成功的指向了本地磁盘;
采用这种方式,能够随机的访问到某一台服务器,减轻服务器压力,同时在进行程序更新的时候(server 127.0.0.1:7001 down;),也能保证有一台服务器在处于工做状态,对新登陆系统的用户不受影响。同时经过Nginx来处理静态页面要比经过Tomcat处理在性能方面好不少。
session共享+静态文件本地化+负载均衡,memcached(尝试失败),或者采用nginx_upstream_jvm_route(没有windows版本的),本文采用基于nginx + tomcat redis分布式web应用的session共享配置,这里有记点先说明下,首先咱们是要在windows系统下进行这些工做的,前面文档开头就有说的,这里在再说下,win7 64 位,非64位 下面的步骤就不用尝试了,本文中tomcat-redis-session-manager1.2.jar 只能在tomcat7下使用,这个是本身编译好的;
Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟之内就能搞定。详情请参考:http://redis.io/download ,但有时候又想在windows下折腾下Redis,能够从redis下载页面看到以下提示(在页面中搜索 "windows"):
[plain] view plain copy
Win64 Unofficial The Redis project does not directly support Windows,
however the Microsoft Open Tech group develops and maintains
an Windows port targeting Win64.
大意就是 Redis官方是不支持windows的,只是 Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,项目地址是:
https://github.com/MSOpenTech/redis
打开之后,能够直接使用浏览器下载,或者git克隆。
下载地址: https://github.com/MSOpenTech/redis/releases
网上参考了一些资料,发觉可使用,也就没有深究,直接拿来主义: 阅读原文
要求把新开发的代码推送到到生产系统中部署,生产系统要可以零宕机、对使用用户零影响。个人设想是使用集群来搞定,经过通知负载均衡Nginx,取下集群中的Tomcat节点,而后对Tomcat上的应用进行升级,再通知负载均衡Nginx,把Tomcat节点从新加载上去。依次这么作,把集群中的全部Tomcat都替换一次便可。那么问题来了,在取下Tomcat节点和加载新Tomcat节点时如何作到对用户无影响呢?方法很简单,共享Session。咱们要使用tomcat-redis-session-manager这样的第三方库,主页见:
https://github.com/jcoleman/tomcat-redis-session-manager
要注意此库并不是开箱即用的,使用时须要作一些调整你须要下载源码,并在更新了依赖库的版本后重建项目。构建过程这里就很少写 。
正式开始配置tomcat,先拷贝jar到lib目录哪几个jar 见下图
开始配置tomcat 打开 context.xml 编辑
加入下面代码 (注意了 tomcat-redis-session-manager 你若是直接用官方的话, 这里启动tomcat以后就会保错的 这个要你本身编译的 )
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="60" />
开始测试了
启动 nginx 、redis、tomcat一、 tomcat2
访问
xxx/s.jsp(s.jsp 本身写的一个 显示session的)
运行截图以下
session id同样了,这就说明两台服务器session实现了共享,取下一台服务器,咱们看看能不能正常切过来,取下一个节点,例如
#server 127.0.0.1:9090 weight=2 max_fails=2 fail_timeout=10s;
server 127.0.0.1:9090 down;
再访问看看有会不会有错误呢
取下前
取下后
看到了吧 session不变,都转发到tomcat2了,重启tomcat1 以后再看看,如图
采用这种方式,能够随机的访问到某一台服务器,减轻服务器压力,同时在进行程序更新的时候(server 127.0.0.1:7001 down;),也能保证有一台服务器在处于工做状态,可以零宕机、对使用用户零影响。同时经过Nginx来处理静态页面要比经过Tomcat处理在性能方面好不少。