Nginx负载均衡学习

原文:Nginx学习 – 简书 (jianshu.com)

1.负载均衡种类

第一种:通过硬件负载解决,常见的有NetScaler、F5、Radware和Array等商用的负载均衡器,价格比较昂贵

第二种:通过软件负载解决,常见的软件有LVS、Nginx、apache等,它们是基于Linux系统并且开源的负载均衡策略.

2.介绍

Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

3.nginx应用场景

1)http服务器。Nginx是一个http服务可独立提供http服务。可以做网页静态服务器。
2)虚拟主机。能实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。
3)反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

4.结构图

image.png

Nginx负载均衡服务器的nginx.conf
配置注释如下:

events
{
use epoll;
worker_connections 65535;
}
http
{
##upstream的负载均衡,四种调度算法##
#调度算法1:轮询.每个请求按时间顺序逐一分配到不同的后端服务器,
#如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响
upstream webhost {
server 192.168.0.5:6666 ;
server 192.168.0.7:6666 ;
}
#调度算法2:weight(权重).可以根据机器配置定义权重.权重越高被分配到的几率越大
upstream webhost {
server 192.168.0.5:6666 weight=2;
server 192.168.0.7:6666 weight=3;
}
#调度算法3:ip_hash. 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,
#有效解决了动态网页存在的session共享问题
upstream webhost {
ip_hash;
server 192.168.0.5:6666 ;
server 192.168.0.7:6666 ;
}
#调度算法4:url_hash(需安装第三方插件).此方法按访问url的hash结果来分配请求,
#使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率.
#Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包
upstream webhost {
server 192.168.0.5:6666 ;
server 192.168.0.7:6666 ;
hash $request_uri;
}
#调度算法5:fair(需安装第三方插件).这是比上面两个更加智能的负载均衡算法.
#此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,
#响应时间短的优先分配.Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块

####虚拟主机的配置(采用调度算法3:ip_hash)
server
{
listen 80;
server_name mongo.demo.com;
#对 “/” 启用反向代理
location / {
proxy_pass http://webhost;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选.
proxy_set_header Host $host;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
}
}
配置 192.168.0.4(Nginx-Server)

创建文件夹准备存放配置文件

$ mkdir -p /opt/confs
$ vim /opt/confs/nginx.conf
events
{
use epoll;
worker_connections 65535;
}
http
{
upstream webhost {
ip_hash;
server 192.168.0.5:6666 ;
server 192.168.0.7:6666 ;
}
server
{
listen 80;
server_name mongo.demo.com;
location / {
proxy_pass http://webhost;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
}
启动负载均衡服务器192.168.0.4(Nginx-Server)

//配置 192.168.0.5(Nginx-Node1/Nginx-Web1)
//创建文件夹用于存放web页面

$ mkdir -p /opt/html
$ vim /opt/html/index.html
//编辑内容如下:

The host is 192.168.0.5 - Node 1
启动192.168.0.5(Nginx-Node1/Nginx-Web1)

//配置192.168.0.7(Nginx-Node2/Nginx-Web2)
//创建文件夹用于存放web页面

$ mkdir -p /opt/html
$ vim /opt/html/index.html
//编辑内容如下:

The host is 192.168.0.7 - Node 2
启动192.168.0.7(Nginx-Node2/Nginx-Web2)
  • windows下nginx配置

1、多台服务器中挑选一台作为nginx代理服务器,其他服务器作为应用服务器(本地IIS测试,三个站点),如下图所示:

image.png

2、我们在nginx代理服务器上,首先安装nginx,我们首先去nginx官网下载安装包,如下图所示:
官方站点下载地址

image.png

3、将安装包解压到D盘根目录下,文件的目录结构,如下图所示:

image.png

4、找到nginx安装目录下的conf文件下的nginx.conf,默认访问端口是8080,如下图所示:
注:如果是80端口,请先关闭IIS的默认80端口

5、我们可以添加如下配置节

#IIS配置多台Server,weight是权重,权重越大,被访问的几率越大
    upstream iis_server{
        server 127.0.0.1:801 weight=1;
        server 127.0.0.1:802 weight=1;
        server 127.0.0.1:803 weight=1;
    }

接下来我们修改端口为8080,然后在location配置节下配置代理地址已经静态的目录,如下图所示:

location / {
            root   html;
            index  index.html index.htm;
            #iis_server代理地址
            proxy_pass http://iis_server;
        }
image.png

7、设置字符集,以防止中文字符乱码,如下图所示:

image.png

8、进入到nginx根目录,使用命令提示符关闭和重新启动nginx.

image.png

9、然后我们通过nginx代理服务地址访问,可以看到内容是随机访问3台服务器上的,如果我们有多台服务器,在这多台服务器上部署相同的应用,就可以达到负载均衡的目的,如下图所示:

Windows下Nginx的启动、停止等命令

在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动、停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍。
1、启动:

C:\server\nginx-1.0.2>start nginx

或

C:\server\nginx-1.0.2>nginx.exe

注:建议使用第一种,第二种会使你的cmd窗口一直处于执行中,不能进行其他命令操作。

2、停止:

C:\server\nginx-1.0.2>nginx.exe -s stop

或

C:\server\nginx-1.0.2>nginx.exe -s quit


注:stop是快速停止nginx,可能并不保存相关信息;quit是完整有序的停止nginx,并保存相关信息。

3、重新载入Nginx:

C:\server\nginx-1.0.2>nginx.exe -s reload

当配置信息修改,需要重新载入这些配置时使用此命令。

4、重新打开日志文件:

C:\server\nginx-1.0.2>nginx.exe -s reopen

5、查看Nginx版本:

C:\server\nginx-1.0.2>nginx -v
  • Linux下nginx配置

1.安装nginx(服务器1)

1)首先安装好编译环境

[root@VM_0_10_centos tmp]# yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

2)解压nginx并切换到解压目录

[root@VM_0_10_centos tmp]# tar -zxf nginx-1.16.1.tar.gz
[root@VM_0_10_centos tmp]# cd nginx-1.16.1/
[root@VM_0_10_centos nginx-1.16.1]# pwd
/tmp/nginx-1.16.1
3)编译安装
创建nginx的临时文件,存放在/var/tmp/nginx

[root@VM_0_10_centos nginx-1.16.1]# mkdir -p /var/tmp/nginx
#执行命令
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_realip_module

#编译源码,安装nginx
[root@VM_0_10_centos nginx-1.16.1]# make
[root@VM_0_10_centos nginx-1.16.1]# make install

安装完成,查看安装目录

4)启动nginx服务

[root@VM_0_10_centos nginx]# cd sbin/
[root@VM_0_10_centos sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf
#查看nginx进程是否启动
[root@VM_0_10_centos sbin]# ps -aux | grep nginx

注意:其中master为主进程worker为工作进程

5)退出nginx

1 [root@VM_0_10_centos sbin]# ./nginx -s quit

6)重启nginx

1 [root@VM_0_10_centos sbin]# pwd
2 /usr/local/nginx/sbin
3 [root@VM_0_10_centos sbin]# ./nginx -s reload

7)测试nginx

在浏览器上通过ip访问:http://localhost,出现如下界面即成功

image.png

 

2.安装tomcat服务(服务器1,服务器2)

下载tomcat

查看服务端口进程是否启动

3.配置nginx负载(服务器1)

1)修改配置文件nginx.conf

[root@VM_0_10_centos ~]# cd /usr/local/nginx/conf/
[root@VM_0_10_centos conf]# vi nginx.conf

配置负载均衡,配置完保存并退出

#20190827添加
    upstream testTomcat{
        #设置分权,权重越高优先访问
        server 106.53.73.200:8888 weight=1;
        server 182.254.184.102:8888 weight=1;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #所有请求都在这里去找分配
        location / {
            #root   html;
            index  index.html index.htm;
            #使用test分配规则,即刚刚自定义添加的upstream节点
            proxy_pass http://testTomcat/test/;
        }
 }

重新启动nginx服务

1 [root@VM_0_10_centos conf]# /usr/local/nginx/sbin/nginx -s reload

2)测试负载均衡

通过浏览器访问负载ip,出现下图即负载成功