首页 > 其他 > 详细

nginx负载均衡

时间:2020-05-25 21:18:57      阅读:46      评论:0      收藏:0      [点我收藏+]

负载均衡

  • 注意:代理不能做负载均衡,但是负载均衡需要用到代理模块

负载均衡基本概述

# 为什么要使用负载均衡
当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台Web服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现负载的分发。那么会大大提升系统的吞吐率、请求性能、高容灾

# 代理和负载均衡的区别
Nginx负载均衡与Nginx代理不同地方在于,Nginx的一个location仅能代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池.

# 负载均衡的分类
· 七层负载:七层负载均衡它是在应用层,那么它可以完成很多应用方面的协议请求,比如我们说的http应用的负载均衡,它可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则,所以在应用层的服务里面,我们可以做的内容就更多,那么Nginx则是一个典型的七层负载均衡SLB

· 四层负载:所谓四层负载均衡指的是OSI七层模型中的传输层,那么传输层Nginx已经能支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载均衡,那么它的好处是性能非常快、只需要底层进行应用处理,而不需要进行一些复杂的逻辑。

# 负载均衡产品
· nginx
· LVS
· HAproxy

# 四层负载和七层负载的区别
四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发、由此可以看出,七层负载均衡效率没有四负载均衡高。
但七层负载均衡更贴近于服务,如:http协议就是七层协议,我们可以用Nginx可以作会话保持,URL路径规则匹配、head头改写等等,这些是四层负载均衡无法实现的。
注意:四层负载均衡不识别域名,七层负载均衡识别域名

负载均衡模块

# 语法规则
Syntax: upstream name { ... }
Default: -
Context: http
 
#upstream例
upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;
    server backup1.example.com:8080   backup;
}
server {
    location / {
        proxy_pass http://backend;
    }
}

# 故障检测模块,一般负载均衡中,只要一台web处于down机状态,自动切换到另一台web,如出现web正常,但web连接的后端服务如php,或nginx连接失败,返回错误码,如500 504 502等错误时,也同样分配到下一台服务器程序处理,提高平台访问成功率。用于location中
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
  

Nginx调度算法

调度算法 概述 简称
轮询 按时间顺序逐一分配到不同的后端服务器(默认) round-robin(RR)
加权轮询 加权轮询,weight值越大,分配到的访问几率越高 weight-round-robin(WRR)
ip_hash 每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器 ip_hash
url_hash 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器 url_hash
最小连接数 最少链接数,那个机器链接数少就分发 least_conn
  • 轮询配置
upstream load_pass {
    server 10.0.0.7:80;
    server 10.0.0.8:80;
}

技术分享图片

  • 加权轮询
upstream load_pass {
    server 10.0.0.7:80 weight=5;				
    server 10.0.0.8:80;
}
  • ip_hash
# 为什么做ip_hash
用户会话保持,当用户输入账号密码连接服务器一次之后,在一定时间内,用户再次访问服务器是无需输入账号密码,但用户能实现此效果仅因为开发对服务代码的书写,但代码中未曾做会话保持,就需使用ip_hash调度算法,将同一个ip的访问请求发送给同一台服务器进行处理,这样用户再次访问,会将该请求通过哈希算法,自动定位到该服务器,这样服务器中照样有用户信息,实现了会话保持功能,但这样做存在弊端,比如一个公司几千人使用同一个ip,这样会将几千人的访问全都发送到同一台web进行处理。

#如果客户端都走相同代理, 会导致某一台服务器连接过多
upstream load_pass {
    ip_hash;
    server 10.0.0.7:80 weight=5;
    server 10.0.0.8:80;
}

面试相关问题:
你们公司的会话保持(session共享)怎么做的?
· 开发做的会话保持,将用户登录信息存储在redis中
· 开发没有做会话保持,我们通过运维的方式做会话保持,nginx的upstream模块中的ip_hash调度算法,保证用户请求一直发送到同一台机器,不过这么做有弊端...负载不均衡,所以我们公司,先让运维做会话保持,后面开发会写
  • url_hash和最小连接数不常用,不做演示

配置实操

要求

· 基于lnmp环境,使用lb轮询方式将用户请求均匀分配到后端web服务器,后端服务器图片信息存储到nfs文件服务器中,数据信息存储到myslq中。
环境:
	一台lb	
	两台web
	一台nfs
	一台mysql
1 .两台web服务安装配置
# web01和web02安装nginx
· 本地已经存在各种安装包,所以直接本地安装
[root@web01 /tmp]# yum localinstall -y nginx-1.18.0-1.el7.ngx.x86_64.rpm 
[root@web02 /tmp]#  yum localinstall -y nginx-1.18.0-1.el7.ngx.x86_64.rpm 

# web01和web02安装php
[root@web01 /tmp]# yum localinstall -y php*
[root@web02 /tmp]# yum localinstall -y php*

# 创建用户组,统一用户
[root@web01 /tmp]# groupadd www -g 666
[root@web01 /tmp]# useradd www -u 666 -g 666 -s /sbin/nologin -M
[root@web02 /tmp]# groupadd www -g 666
[root@web02 /tmp]# useradd www -u 666 -g 666 -s /sbin/nologin -M

# 修改nginx配置文件统一用户
[root@web01 /tmp]# vim /etc/nginx/nginx.conf 
user  www;
[root@web02 /tmp]# vim /etc/nginx/nginx.conf 
user  www;

# 修改php配置文件统一用户
[root@web01 /tmp]# vim /etc/php-fpm.d/www.conf 
user = www
group = www
[root@web02 /tmp]# vim /etc/php-fpm.d/www.conf 
user = www
group = www

# 启动服务加入开启自启(web01和web02相同)
[root@web01 /tmp]# systemctl start nginx
[root@web01 /tmp]# systemctl enable nginx
[root@web01 /tmp]# systemctl start php-fpm
[root@web01 /tmp]# systemctl enable php-fpm

# 查看端口是否开启
[root@web01 /tmp]# netstat -lntup|grep -E ‘80|9000‘
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      7212/php-fpm: maste 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7187/nginx: master  

# 书写nginx配置文件与php建立连接,以下为wordpress配置 
[root@web01 /]# vim /etc/nginx/conf.d/www.wp.com.conf
server {
        listen 80;
        server_name www.wp.com;
        root /code/wp;
        index index.php index.html;

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;

        }
}

# 书写nginx配置文件与php建立连接,以下为知乎搭建配置
[root@web01 /etc/nginx/conf.d]# vim www.zh.com.conf 
server {
        listen 80;
        server_name www.zh.com;
        root /code/zh;
        index index.php index.html;

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;

        }
}

# 将如上两份配置文件scp到web02中
[root@web01 /etc/nginx/conf.d]# scp www.wp.com.conf www.zh.com.conf root@10.0.0.8:/etc/nginx/conf.d/

# 根据配置文件内容创建对应两个目录(web01和web02都需操作)
[root@web01 /]# mkdir /code/wp /code/zh -p

# 更改权限(web01和web02都需操作)
[root@web01 ~]# chown -R www.www /code/wp
[root@web01 ~]# chown -R www.www /code/zh

# 测试nginx和php是否建立连接(web02可测可不测)
[root@web01 /code/wp]# vim wp.php
<?php
        phpinfo();
?>

[root@web01 /code/zh]# vim /code/zh/zh.php
<?php
        phpinfo();
?>

# 重启nginx服务
[root@web01 /code/zh]# systemctl reload nginx


# 页面访问结果(图一)


  • 图一

技术分享图片

2. 数据库安装配置
# 数据库安装
[root@db01 ~]# yum install -y mariadb-server

# 启动数据库
[root@db01 ~]# systemctl start mariadb

# 对数据库登录配置密码
[root@db01 ~]# mysqladmin -uroot password ‘123‘

# 登录数据库
[root@db01 ~]# mysql -uroot -p123

# 登录后创建wordpress和知乎对应库
MariaDB [(none)]> create database wp;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database zh;
Query OK, 1 row affected (0.00 sec)

# 创建wordpress和知乎连接数据库用户
MariaDB [(none)]> grant all on *.* to wp_user@‘%‘ identified by ‘123‘;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on *.* to zh_user@‘%‘ identified by ‘123‘;
Query OK, 0 rows affected (0.00 sec)

# 退出数据库
quit
3. nfs搭建及配置
# nfs服务端安装
[root@nfs ~]# yum install -y nfs-utils

# nfs客户端安装(即web01和web02)
[root@web01 ~]# yum install -y nfs-utils
[root@web02 ~]# yum install -y nfs-utils

# 修改nfs配置文件
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(sync,rw,all_squash,anonuid=666,anongid=666)

# 根据配置文件创建对应目录及用户
[root@nfs ~]# groupadd www -g 666
[root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R www.www /data

# 启动服务并加入开机自启动
[root@nfs ~]# systemctl start nfs-server
[root@nfs ~]# systemctl enable nfs-server

# 客户端检测结果
[root@web01 /code/wp]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
4.wordpress搭建
# 将安装包上传至站点目录下
[root@web01 /code/wp]# ll
total 10844
-rw-r--r-- 1 root root 11098483 May 20 14:38 wordpress-5.0.3-zh_CN.tar.gz

# 安装包解压
[root@web01 /code/wp]# tar -xf wordpress-5.0.3-zh_CN.tar.gz 

# 将解压目录里面的文件移动到站点目录底下
[root@web01 /code/wp]# mv wordpress/* ./

# 页面访问web01,和数据库建立连接(图二、图三、图四、图五所示)

# 将web01注册连接服务器的各种信息全部scp到web02的站点目录(web02即不用登陆连接操作)
[root@web01 /code/wp]# scp /code/wp/* root@10.0.0.8:/code/wp/

# 修改权限(两台web都需操作)
[root@web01 /code/wp]# chown -R www.www /code/wp
[root@web02 /code/wp]# chown -R www.www /code/wp


# 连接进入wordpress中(图六)

# 书写博客,上传图片,让web01产生对应upload目录(图七)

# 查看对应目录下是否产生upload目录
[root@web01 /code/wp/wp-content]# ll
total 8
-rw-r--r-- 1 www www   28 Jan  9  2012 index.php
drwxr-xr-x 4 www www 4096 Jan 11  2019 languages
drwxr-xr-x 3 www www   55 Jan 11  2019 plugins
drwxr-xr-x 5 www www   89 Jan 11  2019 themes
drwxr-xr-x 3 www www   18 May 22 00:23 uploads

# 因挂载后原本文件内容会消失,需要首先将内容scp到nfs共享存储目录下,再进行挂载
[root@web01 /code/wp/wp-content/uploads]# scp -r 2020/ root@10.0.0.31:/data

# 将站点目录共享存储到nfs
[root@web01 /code/wp/wp-content/uploads]# mount -t nfs 172.16.1.31:/data /code/wp/wp-content/uploads/
[root@web01 /code/wp/wp-content/uploads]# df -h
Filesystem         Size  Used Avail Use% Mounted on
/dev/sda3           19G  1.5G   18G   8% /
devtmpfs           476M     0  476M   0% /dev
tmpfs              487M     0  487M   0% /dev/shm
tmpfs              487M  7.7M  479M   2% /run
tmpfs              487M     0  487M   0% /sys/fs/cgroup
/dev/sda1          497M  120M  378M  25% /boot
tmpfs               98M     0   98M   0% /run/user/0
172.16.1.31:/data   19G  1.3G   18G   7% /code/wp/wp-content/uploads

# web02创建目录并且挂载
[root@web02 ~]# mkdir /code/wp/wp-content/uploads/ -p
[root@web02 ~]# mount -t nfs 172.16.1.31:/data /code/wp/wp-content/uploads/

# 测试用web02登录(图八)

  • 访问web01进行第一次连接配置(图二)

技术分享图片

  • 填写数据库中创建库名,wordpress连接数据库用户和密码(图三)
    技术分享图片

  • 开始安装(图四)

技术分享图片

  • 安装成功(图五)

技术分享图片

  • 图六
    技术分享图片

  • 图七
    技术分享图片

  • web02登录结果(图八)

技术分享图片

5.知乎搭建
# 上传知乎包
[root@web01 /code/zh]# ll
total 8256
-rw-r--r-- 1 root root 8451194 May 21 16:52 WeCenter_3-2-1.zip

# 解压
[root@web01 /code/zh]# unzip WeCenter_3-2-1.zip 

# 将解压目录下包含index文件内容全部移动到站点目录下
[root@web01 /code/zh]# mv WeCenter_3-2-1/* ./

# 权限配置
[root@web01 ~]#  chown -R www.www /code/zh

# 网页访问,直接选择下一步(图九)

# 根据数据库中创建,填写对应信息,(图十)

# 创建登录用户(图十一)

# 进入知乎,上传图片到web中,产生upload目录 (图十二)
[root@web01 /code/wp/wp-content]# ll
total 8
-rw-r--r-- 1 www www   28 Jan  9  2012 index.php
drwxr-xr-x 4 www www 4096 Jan 11  2019 languages
drwxr-xr-x 3 www www   55 Jan 11  2019 plugins
drwxr-xr-x 5 www www   89 Jan 11  2019 themes
drwxr-xr-x 3 www www   18 May 22 00:35 uploads

# 将web01的站点目录下内容全部scp到web02站点目录下,并修改权限
[root@web01 /code/wp]# scp -r ./* root@10.0.0.8:/code/zh/
[root@web02 ~]#  chown -R www.www /code/zh

# 修改配置文件(nfs中操作)
[root@nfs /data]# vim /etc/exports
/data 172.16.1.0/24(sync,rw,all_squash,anonuid=666,anongid=666)
/nfs 172.16.1.0/24(sync,rw,all_squash,anonuid=666,anongid=666)

# 建立新的共享存储目录(nfs中操作)
[root@nfs /data]# mkdir /nfs
[root@nfs /data]# chown -R www.www /nfs
[root@nfs /data]# systemctl restart nfs-server

# 将web01中的数据scp到nfs中,然后挂载
[root@web01 /code/zh/uploads]# scp -r ./* root@10.0.0.31:/nfs
[root@web01 /code/zh/uploads]# mount -t nfs 172.16.1.31:/nfs /code/zh/uploads/
[root@web01 /code/zh/uploads]# df -h
Filesystem         Size  Used Avail Use% Mounted on
/dev/sda3           19G  1.6G   17G   9% /
devtmpfs           476M     0  476M   0% /dev
tmpfs              487M     0  487M   0% /dev/shm
tmpfs              487M  7.7M  479M   2% /run
tmpfs              487M     0  487M   0% /sys/fs/cgroup
/dev/sda1          497M  120M  378M  25% /boot
tmpfs               98M     0   98M   0% /run/user/0
172.16.1.31:/data   19G  1.3G   18G   7% /code/wp/wp-content/uploads
172.16.1.31:/nfs    19G  1.3G   18G   7% /code/zh/uploads
                       

# web02挂载
[root@web02 /code/zh/install]# mount -t nfs 172.16.1.31:/nfs /code/zh/uploads/

# 页面测试,结果为图十三和十四对比图
  • 图九

技术分享图片

  • 图十

技术分享图片

  • 图十一
    技术分享图片

  • 图十二

技术分享图片

  • 图十三

技术分享图片

  • 图十四

技术分享图片

6.负载均衡配置
# 下载nginx
[root@lb01 ~]# yum install -y nginx

# 优化模块直接放入/etc/nginx/目录下命名为proxy_params(优化模块也可直接写入负载配置文件中)
[root@web01 /etc/nginx]# vim proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
 
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

# 编辑主配置文件,添加内容,让nginx读取proxy_params文件
[root@lb01 /etc/nginx/conf.d]# vim ../nginx.conf 
 include /etc/nginx/*_params;


# 编写nginx配置文件,将lb中收到的请求轮询发送到两台web服务器中
[root@lb01 /etc/nginx/conf.d]# vim wp.lb.conf
upstream tcy_lb {
        server 172.16.1.7;							# 轮询方式发送请求
        server 172.16.1.8;
}

server {
        listen 80;									# 代理端口
        server_name www.wp.com;						 # 代理域名

        location / {
                proxy_pass http://tcy_lb;			# tcy_lb为upstream中命名
                include proxy_params;				# 包含文件为/etc/nginx/目录下文件,自定义
 # 当
 proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        }
}

# 重启服务
[root@lb01 /etc/nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 /etc/nginx]# systemctl restart nginx

# 测试
· ① hosts文件修改域名对应ip为lb服务器对外网卡ip 
· ② 浏览器访问wordpress网页(图一)
· ③ 查看日志文件,用户请求如何发送到后端web中(图二)
  • 浏览器访问,由lb服务器返回(图一)
    技术分享图片

  • 查看用户请求 ,共8个请求,均匀分布到web01和web02中(图二)

技术分享图片

nginx负载均衡

原文:https://www.cnblogs.com/tcy1/p/12960610.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!