12.17 Nginx负载均衡

时间:2022-04-27
本文章向大家介绍12.17 Nginx负载均衡,主要内容包括Nginx负载均衡目录概要、Nginx负载均衡、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

Nginx负载均衡目录概要

  • vim /usr/local/nginx/conf/vhost/load.conf // 写入如下内容
upstream qq_com
{
    ip_hash;
    server 61.135.157.156:80;
    server 125.39.240.113:80;
}
server
{
    listen 80;
    server_name www.qq.com;
    location /
    {
        proxy_pass      http://qq_com;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
  • upstream来指定多个web server

Nginx负载均衡

  • 代理一台机器称为代理 ,代理两台机器就可以称为负载均衡
  • 代理服务器后面可以有多个web服务器,多个web服务器去提供服务的时候,就可以实现一个负载均衡的功能
  • 正常情况下,用户访问web服务器,是一台一台去请求;要么就是指定一个IP,把这域名解析到多台服务器上
  • 案例
    • 用户1 –> web1服务器
    • 用户2 –> web2服务器
      • 假设这时web1服务器挂掉了(宕机),用户1因为解析到了web1,但web1宕机了,所以就无法正常访问
      • 这时候若是用nginx的负载均衡,在web1宕机后,代理服务器就不会把请求发送给web1,这就是代理的一个优点,负载均衡的优点
  1. 配置负载均衡,负载均衡的配置借助了upstream 模块
  2. 这里将qq.com作为演示对象
  • dig命令查看解析的IP——>yum install -y bind-utils
[root@hanfeng ~]# yum install -y bind-utils


[root@hanfeng ~]# dig qq.com

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.1 <<>> qq.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24485
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;qq.com.				IN	A

;; ANSWER SECTION:
qq.com.			273	IN	A	125.39.240.113
qq.com.			273	IN	A	61.135.157.156

;; Query time: 18 msec
;; SERVER: 119.29.29.29#53(119.29.29.29)
;; WHEN: 一 1月 08 22:46:59 CST 2018
;; MSG SIZE  rcvd: 67

[root@hanfeng ~]# 
  1. 会看到返回出两个IP,这个就是域名解析,也就是qq.com解析到了两个IP上
  2. 这时候就可以用这两个125.39.240.113IP和61.135.157.156IP,去 做负载均衡
  3. 写一个配置文件vim /usr/local/nginx/conf/vhost/load.conf
[root@hanfeng ~]# vim /usr/local/nginx/conf/vhost/load.conf

写入以下内容
upstream qq_com        //upstream后的名称自定义
{
    ip_hash;        //目的是为了让同一个用户始终保持在同一个机器上
    server 61.135.157.156:80;    //如果域名解析端口是80,这段配置上的指定端口80是可以省略的
    server 125.39.240.113:80;
}
server
{
    listen 80;    //定义监听端口
    server_name www.qq.com;     //域名

    location /
    {
        proxy_pass      http://qq_com;         //这里填写的是upstream 的名字
即“http://upstream”,因为作为一个模块,代理访问的是通过解析后的IP访问;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
保存退出
  1. upstream来指定多个web server
  • 当有多个服务器同时对一个域名提供服务的时候,长时间访问一个域名,在一定的时效内,会出现需要重新登录或者是说跳转到另外一个地址的服务器上;ip_hash,就是使通过这个代理访问的同一个域名的多个IP的服务器是,始终保持在一个IP上对这个域名进行访问
  1. 在未加载配置的时候,本机去访问qq.com,回去访问默认虚拟主机
[root@hanfeng ~]# curl -x127.0.0.1:80 www.qq.com
This is the default site.
[root@hanfeng ~]# 
  1. 测试访问qq.com
  2. 检查配置文件语法,并重新加载
[root@hanfeng ~]# /usr/local/nginx/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@hanfeng ~]# /usr/local/nginx/sbin/nginx -s reload
[root@hanfeng ~]# 
  1. 这时再来访问qq.com,会看到的是qq.com的主页,反馈回来的是网页的源码
[root@hanfeng ~]# curl -x127.0.0.1:80 www.qq.com
  1. 这个就是负载均衡

nginx代理和负载均衡的知识点

  • nginx不支持去代理https,也就是在配置文件中的server 后不能写443,是不支持的,只能代理http、tcp
  • 若想要实现代理https,nginx监听443端口,但web服务必须是80端口