提醒:教程是基于Windows7 64位系统下搭建
前言
Nginx简介
Nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。
Nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx优点
- 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
- 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存
- 配置文件非常简单
- 开源免费:nginx为开源软件,可以免费使用
- 稳定性高:用于反向代理,宕机的概率微乎其微
- 支持热部署:可以不停机重载配置文件
反向代理
多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照规定好的分配策略分发给了不同服务器进行业务处理。
此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。 反向代理,“它代理的是服务端”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
举一个现实生活中的例子:比如我们要买一间二手房,虽然我们可以自己去找房源,但是这太花费时间精力了;最简单快捷的方法就是找二手房中介公司(为什么?别人那里房源多啊),于是我们就委托中介公司来给我找合适的房子。
这其中里面的中介公司就是给我们做代理服务,我们委托中介公司帮我们找房子。
负载均衡
分摊到多个操作单元上进行执行,和它的英文名称很匹配。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。
负载均衡的五种策略
- 轮询
Nginx负载默认的方式,顾名思义,所有请求都按照时间顺序分配到不同的服务上,如果服务Down掉,可以自动剔除。
1
2
3
4upstream myServer {
server localhost:10001;
server localhost:10002;
} - 权重
指定每个服务的权重比例,weight和访问比率成正比,通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能。
1
2
3
4upstream myServer {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
} - iphash
每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务;这种方式可以解决session同步的问题,其实说白了就是压根只有一个会话(来来回回都是访问同一台服务器),并且还会造成了负载不均衡的问题。
1
2
3
4
5upstream myServer {
ip_hash;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
} - 最少连接
将请求分配到当前连接数最少的服务器上。
1
2
3
4
5upstream myServer {
least_conn;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
} - fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
1
2
3
4
5upstream myServer {
fair;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
在没有接触之前,总觉得反向代理、负载均衡听起来挺高逼格的;继续往下看,你会发现也就那样,简单的一批
搭建Nginx服务器
安装Nginx
修改配置文件nginx.conf
启动Nginx
Nginx相关命令
1 | start nginx --启动nginx |
启动多个服务器的应用
Tomcat服务:指定默认应用路径
网页访问nginx服务后,可以成功访问到不同服务器上的应用,到这似乎已经大功告成,当你准备登录后,尴尬地发现登录不了;没错,服务器上Session不同步问题,这是个比较棘手,但不得不解决的问题,请往下继续阅读
通过度娘搜货,网上提供了4种解决方案: 1、使用客户端的cookie作为存放登录信息,项目涉及变动代码过多,并且浏览器可禁用cookie,弃用 2、使用mysql数据库存储session,需要设计库表和实现代码,拖慢开发进度,增加了数据库的负担,弃用 3、ip_hash分配策略,造成了负载不均衡的问题,弃用 4、使用memcache或者redis等缓存机制存放session,不需要变动项目上任何代码,存放于服务器端,安全性高; 本人使用的是redis服务,也尝试过结合memcache服务,但是不成功,或许是某个姿势不正确,只能使用Redis了
搭建Redis服务
安装Redis
启动Redis服务
进入Redis根目录
1 | redis-server --启动redis服务端 |
设置密码
- 命令行设置
命令行设置的密码在服务重启后失效,所以一般不使用这种方式。
- 配置文件设置
在redis根目录下找到redis.windows.conf
配置文件,搜索requirepass
,找到注释密码行,添加密码如下:
重启服务后,客户端重新登录后发现密码还是空
1 | config get requirepass |
是因为启动命令需要指定配置文件名,正确启动命令:
1 | redis-server.exe redis.windows.conf |
客户端再重新登录,OK!!!
Tomcat配置Session共享
准备多个Tomcat
修改各自server.xml中的端口,保证两者不冲突。
下载Session-Manager的jar包
目前的jar包只适用于Tomcat7版本系列,Tomcat7以上版本请自行寻找其它jar包
将下载的jar包加入到Tomcat的lib目录下
Tomcat上配置Redis服务
在Tomcat目录上的配置文件context.xml
,添加如下内容,具体的`host、port、password由自己的环境决定。
1 | <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> |
访问Nginx服务,测试
