高性能的HTTP和反向代理服务器nginx及其负载均衡配置

1.Nginx作为负载均衡的优点

1工作在网络的7层之上,可以针对http应用做一些分流的策略,
比如针对域名、目录结构,它的正则规则比HAProxy更为强大
和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭
这点可利用的场合就远多于LVS了。
2、Nginx对网络稳定性的依赖非常小,理论上能ping通就能
进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大。
3、可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑
几万次的并发量,负载度比LVS相对小些。
4、Nginx可以通过端口检测到服务器内部的故障,比如根据服务
器处理网页返回的状态码、超时等等,并且会把返回错误的请求
重新提交到另一个节点,不过其中缺点就是不支持url来检测。
比如用户正在上传一个文件,而处理该上传的节点刚好在上传
过程中出现故障,Nginx会把上传切到另一台服务器重新处理,
而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的
文件的话,用户可能会因此而不满。

2.Nginx的缺点:

1、Nginx仅能支持httphttps和Email协议,这样就在
适用范围上面小些,这个是它的缺点。
2、对后端服务器的健康检查,只支持通过端口来检测,不支持
通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决。

3.Nginx负载均衡原理:

nginx是以反向代理的方式进行负载均衡的,其实现的
分配策略被编进Nginx内核的有轮询、ip_hash、第
三方的有fair、url_hash等。

4.重新配置一个全新的虚拟机子盘:

[root@foundation38 images]# qemu-img create -f qcow2 -b base.qcow2 test5
Formatting 'test5', fmt=qcow2 size=21474836480 backing_file='base.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off 

这里写图片描述

5.在新的虚拟机安装scp命令:

[root@server5 ~]# yum provides */scp 寻找scp的安装包
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
rhel-source                                              | 3.9 kB     00:00     
rhel-source/filelists_db                                 | 3.8 MB     00:00     
openssh-clients-5.3p1-94.el6.x86_64 : An open source SSH client applications
Repo        : rhel-source
Matched from:
Filename    : /usr/bin/scp
[root@server5 ~]# yum install openssh-clients-5.3p1-94.el6.x86_64  安装软件

这里写图片描述

6.进行负载均衡实验的配置:

server5作为nginx端,配置IP为172.25.38.6
server2和server3作为后端服务器
server2的IP:172.25.38.3
server3的IP:172.25.38.4

7.nginx的安装:

[root@server5 ~]# ls
anaconda-ks.cfg  install.log  install.log.syslog  nginx-1.14.0.tar.gz
[root@server5 ~]# tar zxf nginx-1.14.0.tar.gz  解压tar包
[root@server5 ~]# ls
anaconda-ks.cfg  install.log.syslog  nginx-1.14.0.tar.gz
install.log      nginx-1.14.0
[root@server5 ~]# cd nginx-1.14.0  进入解压目录
[root@server5 nginx-1.14.0]# ls
auto     CHANGES.ru  configure  html     man     src
CHANGES  conf        contrib    LICENSE  README
[root@server5 nginx-1.14.0]# src/
-bash: src/: is a directory
[root@server5 nginx-1.14.0]# cd src/
[root@server5 src]# ls
core  event  http  mail  misc  os  stream
[root@server5 src]# cd core/  进入指定目录
[root@server5 core]# ls

这里写图片描述

[root@server5 core]# vim nginx.h  编辑配置文件

这里写图片描述

[root@server5 core]# cd ..
[root@server5 src]# cd ..
[root@server5 nginx-1.14.0]# ls
auto     CHANGES.ru  configure  html     man     src
CHANGES  conf        contrib    LICENSE  README
[root@server5 nginx-1.14.0]# cd auto/
[root@server5 auto]# ls
cc          feature       headers  install  module   options  stubs    types
define      have          include  lib      modules  os       summary  unix
endianness  have_headers  init     make     nohave   sources  threads
[root@server5 auto]# cd cc/
[root@server5 cc]# ls
acc  bcc  ccc  clang  conf  gcc  icc  msvc  name  owc  sunc

这里写图片描述

[root@server5 cc]# vim gcc 编辑gcc文件

这里写图片描述

[root@server5 cc]# cd ..
[root@server5 auto]# cd ..
[root@server5 nginx-1.14.0]# ls
auto     CHANGES.ru  configure  html     man     src
CHANGES  conf        contrib    LICENSE  README
[root@server5 nginx-1.14.0]# yum install gcc openssl-devel -y  直接安装一些依赖性
[root@server5 nginx-1.14.0]# yum install pcre-devel -y

这里写图片描述

源码编译三步:

第一步生成makefile
第二步读取文件生成的二进制文件
第三步开始安装

[root@server5 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio
[root@server5 nginx-1.14.0]# make
[root@server5 nginx-1.14.0]# make install

制作软链接:

[root@server5 nginx-1.14.0]# cd /usr/local/nginx/
[root@server5 nginx]# ls
conf  html  logs  sbin
[root@server5 nginx]# du -sh
980K    .
[root@server5 nginx]# cd sbin/
[root@server5 sbin]# pwd
/usr/local/nginx/sbin
[root@server5 sbin]# ls
nginx
[root@server5 sbin]# pwd
/usr/local/nginx/sbin
[root@server5 sbin]# ln -s /usr/local/nginx/sbin/nginx /sbin/  制作软连接

这里写图片描述

nginx的基本语法:

[root@server5 sbin]# nginx -t  检测语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server5 sbin]# nginx
[root@server5 sbin]# nginx -s stop  关闭服务
[root@server5 sbin]# nginx  打开服务
[root@server5 sbin]# nginx -s reload 重载服务

这里写图片描述

[root@server5 sbin]# cd /usr/local/nginx/html/ 进去默认访问目录
[root@server5 html]# ls
50x.html  index.html
[root@server5 html]# vim test.html  编辑默认访问文件

这里写图片描述
在网页访问:
这里写图片描述
这里写图片描述

Nginx的简单部署及配置:

[root@server5 ~]# pwd
/root
[root@server5 ~]# ls
anaconda-ks.cfg  install.log.syslog  nginx-1.14.0.tar.gz
install.log      nginx-1.14.0
[root@server5 ~]# pwd
/root
[root@server5 ~]# ls
anaconda-ks.cfg  install.log.syslog  nginx-1.14.0.tar.gz
install.log      nginx-1.14.0
[root@server5 ~]# rm -fr install.log* anaconda-ks.cfg 
[root@server5 ~]# ls
nginx-1.14.0  nginx-1.14.0.tar.gz
[root@server5 ~]# cd /usr/local/nginx/
[root@server5 nginx]# ls
client_body_temp  fastcgi_temp  logs        sbin       uwsgi_temp
conf              html          proxy_temp  scgi_temp
[root@server5 nginx]# pwd
/usr/local/nginx
[root@server5 nginx]# cd conf/
[root@server5 conf]# pwd
/usr/local/nginx/conf

这里写图片描述

[root@server5 conf]# vim nginx.conf添加自动策略
当不知道调用几个CPU或者当前CPU个数未知的时候添加自动策略

这里写图片描述

[root@server5 conf]# nginx -s reload  重新读入
[root@server5 conf]# sysctl -a|grep file 查看最大文件数目
fs.file-nr = 480    0   47356
fs.file-max = 47356
[root@server5 conf]# lscpu  查看CPU个数为1个
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1   一个CPU

这里写图片描述

[root@server5 conf]# vim nginx.conf  在配置文件添加一个CPU

这里写图片描述

[root@server5 conf]# nginx -s reload  重载服务
[root@server5 conf]# vim nginx.conf 最大文件数小于查看的文件

这里写图片描述

[root@server5 conf]# nginx -s reload 重载服务
[root@server5 conf]# vim /etc/security/limits.conf
limits.conf文件实际是Linux PAM(插入式认证模块,Pluggable Authentication Modules)中 pam_limits.so 的配置文件,
突破系统的默认限制,对系统访问资源有一定保护作用。 limits.conf 和sysctl.conf区别在于limits.conf是针对用户,而sysctl.conf
是针对整个系统参数配置。 

这里写图片描述

[root@server5 conf]# vim nginx.conf 编辑配置文件写入nginx用户和组

这里写图片描述

[root@server5 conf]# useradd -M -d /usr/local/nginx/ nginx建立用户默认组也为nginx
[root@server5 conf]# id nginx 查看nginx用户
uid=500(nginx) gid=500(nginx) groups=500(nginx)
[root@server5 conf]# nginx -s reload  重载服务

这里写图片描述

负载均衡配置(轮询):

[root@server5 conf]# vim nginx.conf  编辑主配置文件

这里写图片描述
这里写图片描述

[root@server5 conf]# nginx -t  检查语法
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server5 conf]# nginx -s reload 重载服务

这里写图片描述

在真机进行测试可以正常轮询:

[root@foundation38 images]# curl www.westos.org
www.westos.org
[root@foundation38 images]# curl www.westos.org
bbs.westos.org
[root@foundation38 images]# curl www.westos.org
www.westos.org
[root@foundation38 images]# curl www.westos.org
bbs.westos.org

这里写图片描述

在真机添加解析:

[root@foundation38 kiosk]# vim /etc/hosts

这里写图片描述

在网页测试进行论询:

这里写图片描述
这里写图片描述

负载均衡策略:

1、IP绑定ip_hash,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 当使用该策略时,不使用weight,backup。

ip_hash策略:

[root@server5 conf]# vim nginx.conf  写入IP_hash算法意味着只有一个后端坏了之后会访问另外一个
[root@server5 conf]# nginx -s reload

这里写图片描述

在真机进行测试:

[root@foundation38 kiosk]# for i in range{1..10}; do curl www.westos.org; done;
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org
www.westos.org

这里写图片描述

weight策略即指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的 情况:

[root@server5 conf]# vim nginx.conf 加入权重
[root@server5 conf]# nginx -s reload

这里写图片描述

在真机进行测试:

[root@foundation38 kiosk]# for i in range{1..10}; do curl www.westos.org; done;
www.westos.org
bbs.westos.org
www.westos.org
www.westos.org
bbs.westos.org
www.westos.org
www.westos.org
bbs.westos.org
www.westos.org
www.westos.org

这里写图片描述

weigth策略的缺点:

上述方式存在一个问题就是说,在负载均衡系统中,假如用户
在某台服务器上登录了,那么该用户第二次请求的时候,因为
我们是负载均衡系统,每次请求都会重新定位到服务器集群中
的某一个,那么已经登录某一个服务器的用户再重新定位到
另一个服务器,其登录信息将会丢失,这样显然是不妥的。

加入本机的策略,到后端服务器全部DOWN掉之后访问本机:

[root@server5 conf]# vim nginx.conf
[root@server5 conf]# nginx -s reload

这里写图片描述

将server2和server3的阿帕奇停止后会访问本机:

[root@foundation38 kiosk]# curl www.westos.org
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/</center>
</body>
</html>

这里写图片描述

在nginx中添加模块,1.14.0版本不支持所以下载1.10.1版本:

[root@server5 ~]# tar zxf nginx-1.10.1.tar.gz  解压
[root@server5 ~]# ls
nginx-1.10.1         nginx-1.14.0         nginx-sticky-module-ng.tar.gz
nginx-1.10.1.tar.gz  nginx-1.14.0.tar.gz
[root@server5 ~]# cd nginx-1.10.1
[root@server5 nginx-1.10.1]# ls
auto     CHANGES.ru  configure  html     man     src
CHANGES  conf        contrib    LICENSE  README
[root@server5 nginx-1.10.1]# cd 
[root@server5 ~]# tar nginx-sticky-module-ng.tar.gz 
tar: Old option `g' requires an argument.
Try `tar --help' or `tar --usage' for more information.
[root@server5 ~]# ls
nginx-1.10.1         nginx-1.14.0         nginx-sticky-module-ng.tar.gz
nginx-1.10.1.tar.gz  nginx-1.14.0.tar.gz
[root@server5 ~]# tar zxf nginx-sticky-module-ng.tar.gz  解压模块包
[root@server5 ~]# ls
nginx-1.10.1         nginx-1.14.0         nginx-sticky-module-ng
nginx-1.10.1.tar.gz  nginx-1.14.0.tar.gz  nginx-sticky-module-ng.tar.gz

这里写图片描述

进行源码编译三部曲:

[root@server5 ~]# cd nginx-1.10.1 进入解压的文件路径
[root@server5 nginx-1.10.1]# ./configure --prefix=/opt/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/root/nginx-sticky-module-ng
更改路径是因为之前装了一个版本不进行更改会覆盖原来的,然后添加模块
[root@server5 nginx-1.10.1]# make
[root@server5 nginx-1.10.1]# make install

编译完成进行简单配置:

[root@server5 nginx-1.10.1]# cd conf
[root@server5 conf]# ls
fastcgi.conf    koi-utf  mime.types  scgi_params   win-utf
fastcgi_params  koi-win  nginx.conf  uwsgi_params
[root@server5 conf]# pwd
/root/nginx-1.10.1/conf
[root@server5 conf]# ls
fastcgi.conf    koi-utf  mime.types  scgi_params   win-utf
fastcgi_params  koi-win  nginx.conf  uwsgi_params
[root@server5 conf]# pwd
/root/nginx-1.10.1/conf
[root@server5 conf]# cd /opt/nginx/
[root@server5 nginx]# ls
conf  html  logs  sbin
[root@server5 nginx]# cd conf/
[root@server5 conf]# ls
fastcgi.conf            koi-win             scgi_params
fastcgi.conf.default    mime.types          scgi_params.default
fastcgi_params          mime.types.default  uwsgi_params
fastcgi_params.default  nginx.conf          uwsgi_params.default
koi-utf                 nginx.conf.default  win-utf
[root@server5 conf]# pwd
/opt/nginx/conf

这里写图片描述

Sticky模块的工作原理:

Sticky工作原理 Sticky是nginx的一个模块,通过分发和识别
cookie,来使同一个客户端的请求落在同一台服务器上。sticky
的处理过程如下(假设cookie名称为route):
1.客户端首次发起请求,请求头未带route的cookie。nginx接收请求,
发现请求头没有route,则以轮询方式将请求分配给后端服务器。
2.后端服务器处理完请求,将响应头和内容返回给nginx。
3.nginx生成route的cookie,返回给客户端。route的值与
后端服务器对应,可能是明文,也可能是md5、sha1等Hash值。
4.客户端接收请求,并创建route的cookie。
5.客户端再次发送请求时,带上route。
6.nginx接收到route,直接转给对应的后端服务器

sticky策略的配置:

[root@server5 conf]# cp /usr/local/nginx/conf/nginx.conf .
cp: overwrite `./nginx.conf'? y
[root@server5 conf]# vim nginx.conf  编写配置文件写入sticky策略

这里写图片描述

[root@server5 conf]# which nginx  查看nginx的路径
/sbin/nginx
[root@server5 conf]# ll /sbin/nginx 
lrwxrwxrwx 1 root root 27 Jul 31 15:31 /sbin/nginx -> /usr/local/nginx/sbin/nginx
[root@server5 conf]# /opt/nginx/sbin/nginx -t 用绝对路径调用防止冲突
nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx/conf/nginx.conf test is successful
[root@server5 conf]# /opt/nginx/sbin/nginx  打开新版本

这里写图片描述

[root@server5 conf]# /opt/nginx/sbin/nginx -s stop 将新版本关闭
[root@server5 conf]# cd /usr/local/nginx/ 进入之前版本演示模块不支持的原因
[root@server5 nginx]# ls
client_body_temp  fastcgi_temp  logs        sbin       uwsgi_temp
conf              html          proxy_temp  scgi_temp
[root@server5 nginx]# cd conf/
[root@server5 conf]# vim nginx.conf  添加sticky策略

这里写图片描述

[root@server5 conf]# /usr/local/nginx/sbin/nginx -t 检查语法的时候会报错
nginx: [emerg] unknown directive "sticky" in /usr/local/nginx/conf/nginx.conf:22
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
[root@server5 conf]# /opt/nginx/sbin/nginx 调用新的版本打开策略,这个策略是基于浏览器的,在真机测试效果不正确

这里写图片描述

在网页测试按F12打开测试页面:

总结:
在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信
,我们势必使用长连接。使用什么方式来实现这种连接呢,常见的有使用
nginx自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端
是CDN,或者说一个局域网的客户同时访问服务器,导致出现服务器分配
不均衡,以及不能保证每次访问都粘滞在同一台服务器。如果基于cookie
会是一种什么情形,想想看,每台电脑都会有不同的cookie,在保持长连接
的同时还保证了服务器的压力均衡,nginxsticky值得推荐

这里写图片描述

猜你喜欢

转载自blog.csdn.net/aaaaaab_/article/details/81327417