提醒:教程是基于Windows7 64位系统下搭建

前言

Nginx简介

Nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

Nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx优点

  1. 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
  2. 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存
  3. 配置文件非常简单
  4. 开源免费:nginx为开源软件,可以免费使用
  5. 稳定性高:用于反向代理,宕机的概率微乎其微
  6. 支持热部署:可以不停机重载配置文件

反向代理

多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照规定好的分配策略分发给了不同服务器进行业务处理。
此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。 反向代理,“它代理的是服务端”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
举一个现实生活中的例子:比如我们要买一间二手房,虽然我们可以自己去找房源,但是这太花费时间精力了;最简单快捷的方法就是找二手房中介公司(为什么?别人那里房源多啊),于是我们就委托中介公司来给我找合适的房子。
这其中里面的中介公司就是给我们做代理服务,我们委托中介公司帮我们找房子。

负载均衡

分摊到多个操作单元上进行执行,和它的英文名称很匹配。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。

负载均衡的五种策略

  1. 轮询

    Nginx负载默认的方式,顾名思义,所有请求都按照时间顺序分配到不同的服务上,如果服务Down掉,可以自动剔除。

    1
    2
    3
    4
    upstream  myServer {
    server localhost:10001;
    server localhost:10002;
    }
  2. 权重

    指定每个服务的权重比例,weight和访问比率成正比,通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能。

    1
    2
    3
    4
    upstream  myServer {
    server localhost:10001 weight=1;
    server localhost:10002 weight=2;
    }
  3. iphash

    每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务;这种方式可以解决session同步的问题,其实说白了就是压根只有一个会话(来来回回都是访问同一台服务器),并且还会造成了负载不均衡的问题。

    1
    2
    3
    4
    5
    upstream  myServer {
    ip_hash;
    server localhost:10001 weight=1;
    server localhost:10002 weight=2;
    }
  4. 最少连接

    将请求分配到当前连接数最少的服务器上。

    1
    2
    3
    4
    5
    upstream  myServer {
    least_conn;
    server localhost:10001 weight=1;
    server localhost:10002 weight=2;
    }
  5. fair

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    1
    2
    3
    4
    5
    upstream  myServer {
    fair;
    server localhost:10001 weight=1;
    server localhost:10002 weight=2;
    }

在没有接触之前,总觉得反向代理、负载均衡听起来挺高逼格的;继续往下看,你会发现也就那样,简单的一批


搭建Nginx服务器

安装Nginx

修改配置文件nginx.conf

启动Nginx

Nginx相关命令

1
2
3
4
start nginx			--启动nginx
nginx -s stop --快速停止nginx
nginx -s quit --有序停止nginx (推荐)
nginx -s reload --重新加载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
2
redis-server						--启动redis服务端
redis-cli.exe -h 127.0.0.1 -p 6379 --raw --启动redis客户端,其是--raw可避免出现乱码

设置密码

  1. 命令行设置
    命令行设置的密码在服务重启后失效,所以一般不使用这种方式。
  2. 配置文件设置
    在redis根目录下找到redis.windows.conf配置文件,搜索requirepass,找到注释密码行,添加密码如下:

重启服务后,客户端重新登录后发现密码还是空

1
2
3
config get requirepass
1)"requirepass"
2)""

是因为启动命令需要指定配置文件名,正确启动命令:

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
2
3
4
5
6
<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服务,测试