Nginx 概述
Nginx 是一款自由的, 开源的, 高性能的 HTTP 服务器和反向代理服务器; 同时也是一个 IMAP,POP3,SMTP 代理服务器; Nginx 可以作为一个 HTTP 服务器进行网站的发布处理, 另外 Nginx 可以作为反向代理进行负载均衡的实现.
正向, 反向代理
1, 正向代理 (forward proxy). 一个位于客户端和原始服务器之间的服务器, 为了从原始服务器取得内容, 客户端向代理发送一个请求并制定目标 (原始服务器), 然后代理向原始服务器转发请求并将获得的内容返回给客户端, 客户端才能使用正向代理. 我们平时说的代理就是指正向代理.
2, 反向代理 (Reverse Proxy), 以代理服务器来接受 internet 上的连接请求, 然后将请求转发给内部网络上的服务器, 并将从服务器上得到的结果返回给 internet 上请求的客户端, 此时代理服务器对外表现为一个反向代理服务器.
下面我用 Nginx 来实现一个简单的反向代理加负载均衡的例子.
1, 准备前提
因为实际情况一般都是多台服务器, 我这里不好实现, 只能在 VM 虚拟机里面安装两台 CentOS 7 服务器, 加上本机 Windows 来进行模拟.
前期规划及准备工作:
Windows: 安装 Nginx
192.168.43.124: 安装 tomcat
192.168.43.45: 安装 tomcat
注意: 保证 tomcat 的端口开放, 能被 Windows 访问, 验证方法是在 Windows 浏览器中输入 http://ip:8080/ 能访问到两台 CentOS 7 里面的 tomcat 页面.
2,Nginx 配置反向代理
Nginx 最重要的一个配置文件: nginx.conf
一般情况下所有的配置都在这里进行配置.
下面是在 nginx.conf 配置反向代理的情况:
image.PNG
上面这个配置是在 Windows 下的 Nginx 进行配置的, 所以当正确进行以上操作后, 我在 Windows 浏览器中输入 127.0.0.1, 就会自动跳转到百度首页去了, 截图在这里我就不放了.
3,Nginx 配置反向代理同时实现负载均衡
同样的, 实现负载均衡也没增加多少难度, 就是在 Nginx.conf 配置文件中加了最下面这一段:
- upstream tomcatserver1 {
- server 192.168.43.124:8080;
- server 192.168.43.45:8080;
- }
注意: tomcatserver1 这个名字是可以随意取的, 但是多个 upstream 要保证不能重复
下图是我的文件配置:
image.PNG
上面这个配置是在 Windows 下的 Nginx 进行配置的, 所以当正确进行以上操作后, 我在 Windows 浏览器中输入 127.0.0.1, 就会匹配到 tomcatserver1, 然后就会去找对应的 upstream, 读取里面参与负载的服务器信息, 然后根据一定的均衡算法进行分发. 具体的算法稍后进行简单介绍. 所以就会跳转到 tomcat 的默认页面如下:
image.PNG
4, 负载均衡调度算法
1, 轮询 (默认)
每个请求按时间顺序逐一分配到不同的后端服务, 如果后端某台服务器死机, 自动剔除故障系统, 使用户访问不受影响.
2,weight(轮询权值)
weight 的值越大分配到的访问概率越高, 主要用于后端每台服务器性能不均衡的情况下. 或者仅仅为在主从的情况下设置不同的权值, 达到合理有效的地利用主机资源.
指定轮询几率, weight 和访问比率成正比, 用于后端服务器性能不均的情况. 例如:
- upstream servertest {
- server 192.168.0.14:8080 weight=10;
- server 192.168.0.15:8080 weight=10;
- }
- 3,ip_hash
每个请求按访问 IP 的哈希结果分配, 使来自同一个 IP 的访客固定访问一台后端服务器, 并且可以有效解决动态网页存在的 session 共享问题.
每个请求按访问 ip 的 hash 结果分配, 这样每个访客就固定访问一个后端服务器, 该调度算法可以解决动态网页的 session 共享问题, 但是会导致请求分配不均. (在 upstream 里配置如果是 ip_hash, 不能有 weight 和 bakcup)
例如:
- upstream servertest {
- ip_hash;
- server 192.168.0.14:8080;
- server 192.168.0.15:8080;
- }
- 4,fair
这是比 weight,ip_hash 更加智能的负载均衡算法, fair 算法可以根据页面大小和加载时间长短智能地进行负载均衡, 也就是根据后端服务器的响应时间来分配请求, 响应时间短的优先分配. Nginx 本身不支持 fair, 如果需要这种调度算法, 则必须安装 upstream_fair 模块.
fair 算法会根据后端节点服务器的响应时间来分配请求, 时间短的优先分配, 必须下载 nginx 的相关模块 upstream_fair, 例如:
- upstream servertest {
- server 192.168.0.14:8080;
- server 192.168.0.15:8080;
- fair;
- }
5,url_hash 算法 (web cache)
按访问的 URL 的哈希结果来分配请求, 使每个 URL 定向到一台后端服务器, 可以进一步提高后端缓存服务器的效率. Nginx 本身不支持 url_hash, 如果需要这种调度算法, 则必须安装 Nginx 的 hash 软件包.
按访问 url 的 hash 结果来分配请求, 使每个 url 定向到同一个后端服务器, 后端服务器为缓存时比较有效.(注意: 在 upstream 中加入 hash 语句, server 语句中不能写入 weight 等其他的参数, hash_method 是使用的 hash 算法.). 例如:
- upstream servertest{
- server 10.0.0.10:7777;
- server 10.0.0.11:8888;
- hash $request_uri;
- hash_method crc32;
- }
5,Nginx 负载均衡调度状态
在 Nginx 的 upstream 模块中, 可以设定每台后端服务器在负载均衡调度中的状态, 常用的状态有如下几种:
image.PNG
配置实例解释:
- upstream tomcattest {
- server 192.168.43.44:8080 down;
- server 192.168.43.45:8080 backup;
- server 192.168.43.44:8080 max_fails=1 fail_timeout=10s;
- }
- #server 192.168.43.44:8080 down; 表示第一个服务不可用, 暂不参与负载均衡
- #server 192.168.43.45:8080 backup; 表示这个是备用服务器, 当其他的负载服务器不可用时会调用备份服务器
- #server 192.168.43.44:8080 max_fails=3 fail_timeout=10s; 表示可用服务, 但最大失败 3 次之后需要等待 10 秒钟之后继续重试
来源: http://www.jianshu.com/p/0b98fdc44534