前言

Nginx 是一个非常轻量级的服务器,他虽轻但是他最大的优点就是可以承载大量的并发,所以说一般的话很少有用 Node 直接去做服务器让用户去访问的,因为 Node 本身就需要做非 常非常多的事情,虽然说简单的可以使用 Node 直接开启,但是对于负载和并发 Node 是弱项,就是反向代理和并发是 Node 整个的弱项,所以我们需要在前面用 Nginx 挡一层,这样的话对于我们整个的系统的运维架构来讲也是一个非常得力的一个助手,还有就是跟其他的比如说我们后层整个架构的设计属于运维的这一块,它也是有一种先天优势的这样的服务器

概述

  • 什么是反向代理与负载均衡
    • 反向代理
    • 负载均衡
  • Nginx 负载均衡的实现
  • HTTP UPstream 模块
    • 什么是 HTTP Upstream 模块
    • ip_hash 指令 – 落到哪个上
    • server 指令 – server 的权重
    • UPstream 指令
  • 其他负载均衡的方法

1. 什么是反向代理与负载均衡

1.1 反向代理

  • 比如说平时我们上谷歌上不了然后需要翻墙,谷歌是我们明确的去要访问的站点,这个时候我们会用一些翻墙的工具(代理服务器),这个代理服务器帮我们取回谷歌给我们看,这个就是一个正向的代理。
  • 那么反向 代理刚好是相反的:我们不知道去取哪一台机器,然后代理帮我们去取,然后把取到的内容返回给我们。
  • 一个是明确的知道,一个是不知道,这就是正向代理和反向代理

就是用自己的计算机 A 想访问国外的网站 B ,访问不了,就有一个中间的服务器 C 它去访问国外的网站 B ,其实如果是把这个 C 装到我们自己的电脑上,我们自己的电脑访问 C ,然后 C 再去访问 B ,这个时候这个 C 就叫代理服务器,这个时候就是正向代理,他有一个特点,就是我们一定知道要访问哪个网站。

还有就是当我们有一个服务器集群,而且服务器集群中的每台服务器的内容都是一样的时候,同样我们从个人的电脑访问到比如说 现在我们有四台 Node 的机器 ,但是我们无法访问,这个时候有第三方的服务器是可以访问到 那四个 Node 的机器的 ,这个时候我们就可以借助这个第三方的服务器去访问, 但是我们并不知道它最后会落到四台中的哪一台机器上,这个就是反向代理。

1.2 负载均衡

跟上面的反向代理有一个息息相关的东西就是负载均衡,就是上面的四台机器,你不知道最终要找的是谁,但是 Nginx 知道,它会帮你找到压力最小的那个服务器然后返回给你,就这样的可以分担你的压力

2. Nginx 负载均衡的实现

3. HTTP UPstream 模块

3.1 什么是 HTTP UPstream 模块

3.2 ip_hash 指令

比如用户落在这样一台服务器上了,然后下次用户一刷新又落到别的上面了,这个就不太对了,所以 ip_hash 是为了保证用户再次刷新的时候还能落到他之前落到的那台服务器上,这样就 ok 了

3.3 server 指令

可以指定这台服务器的权重,就是说如果你知道了这台机器要比别的优秀,那么你可以给它的权重给标的高一点,那么更多的请求就会落到这个你认为优秀的机器上面,默认是 1:1:1 的,这个 1:1:1 可以举成 2:1:1 的例子来说明:就是现在有三台机器,第一台的权重被设置为了 2 后面两台都是 1 ,这样的话落到第一台的几率就是 2 / 3,后面两台的都是 1 / 3。

3.4 UPstream 指令

4. 其他负载均衡的方法

实践

macOS 部署 Nginx

这个时候你会发现页面 title 的 icon 是 Jenkins 的头像,这个原因是因为如果你装过 Jenkins 的话,它是非常顽固的会不停的去折腾、重启你的 8080 端口,你如果是 kill 是杀不掉的,你需要用下面的命令就可以把它给停掉了

## 停掉 jenkins
sudo launchctl unload/Library/LaunchDaemons/org.jenkins-ci.plist
## 停掉之后如果想启动 jenkins
systemctl start jenkins

想要进行上面的 反向代理和负载均衡 还需要对 nginx 进行配置

/etc/nginx/ 这个是 macOS 下 nginx 的安装目录,其他系统的可能会不大一样

## 先进入 nginx 目录
cd /etc/nginx/
## 查看该目录下的所有文件,可以在下图看到 nginx 目录
ls

可以看到里面有个 nginx.conf 的文件,这个就是 nginx 的配置文件

  • ##user 指的是哪个用户能用,可以将后面的 nobody 修改成你指定谁用的那个用户的用户名
  • worker_processes 这个是你的一个工作的进程,其实实际上指的就是 CPU 的核数,如果你是 4 核的话,这个值就是 4,你需要看到自己的电脑是几核的处理器,然后你可以在这里面做相应的设置,最多就是 2 倍,一般就是标准的几核就是几个 或者 2 倍,这个不能乱设
  • error_log 这个就是整个产生错误的日志
    • nginx 的日志跟我们 Node 的日志比一点都不逊色,它们的区别是:nginx 可以完全的记录所有的请求的日志,因为它是一个向外去扩散的一个去做负载均衡的口子,你的那个 Node 是你的项目里的一些 log ,两个人都各自有分工。
    • 这个 log 是会非常庞大的,所以像有的一些大公司会有专门去存 log 的服务器,那些数据挖掘的人或者是运维会每天去查这个日志,从这些日志里其实可以拿到很多很多的东西,所以这个日志是至关重要的,对于大公司来讲这个是比命还重要的东西,所以 nginx 的日志是万万不能丢的,任何语言里的日志它们都会分成 level(级别)。
    • 上面的第一行就是 出错的日志 ,第二行是警告的,第三行是基本信息。
  • pid 这个是 nginx 非常重要的一个配置文件,这个就别动就好了
  • events -> worker_connections 这个就是整个的连接数,就是说你一下子往你的这个上面压多少
  • http 模块 在这个里面可以去指定一下所谓的我们平时的 gzip 、Etag 等等都是从这里去开启的
  • server
    • listen 这里是监听 8080 端口
    • charset koi8-r这个是它输出的语言
    • access_log 这个是它的日志
    • location 这个非常重要,里面的 root 不是指的同户名,而是当前的 html 文件夹,它会从下面的顺序依次开始找,直到找到对应的一个文件然后去给你吐
    • error_page 这个是 Node 控制出错的,有时你会发现百度、腾讯或者是其他的一些公司的 404 是一样的,原因就是在这的,所有的请求都固定到这,然后他把一些出错都控制好 是这样的一个原因
    • 下面还有一些 500 502 503 504 ,他都把这些出错导到 50x 去了,所以这些不是真正的内部的系统去做的。而是一些做负载均衡的服务器去做的
    • location ~ \.php$ 这些就是用正则去匹配一些更复杂的,就是你真正的路由都可以在这里面去写
## 这个就是我们前端需要给运维做的东西,这个是从复杂的 nginx 里去抽出来的
worker_processes 4; ## 这个是你的一个工作的进程,其实实际上指的就是 CPU 的核数
events{
    worker_connections 1024; ## 这个就是整个的连接数,就是说你一下子往你的这个上面压多少
}
## 上面两个其实你不给运维的话也是可以的,他都不要,你写了也没用,关键的就是下面的 http
http{
    ## 这个是负载均衡的所有的 server ,这里的 IP 地址需要写成你需要用到的真实有效的才行
    upstream firsttest{
        server 192.168.230.128;
        server 192.168.230.129;
    }

    server{
        ## 通过 server 监听的是 8080
        listen 8080;
        ## 当你访问 / 这个路由地址的时候 通过下面的  proxy_pass 代理去访问 firsttest 然后就可以了
        location / {
            proxy_pass http://firsttest;
        }
    }
}