【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

时间:2022-10-11 17:55:03

1. Nginx 概述

1.1 Nginx 介绍

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,实际上 Nginx 的并发能力在同类型的网页服务器中表现较好,国内使用 Nginx 的网站有:百度、京东、淘宝、腾讯等。

Nginx 官网:https://nginx.org/

1.2 Nginx 下载和安装

Nginx 官网下载地址:https://nginx.org/en/download.html

Linux 安装 Nginx 过程:

  1. 安装依赖包

    yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
    
  2. 下载 Nginx 安装包

    wget https://nginx.org/download/nginx-1.16.1.tar.gz
    
    # 如果未安装 wget 命令,则可以通过以下命令进行安装
    yum install wget
    
  3. 解压

    tar -zxvf nginx-1.16.1.tar.gz
    
  4. 配置 Nginx 安装目录为 /usr/local/nginx

    # 先创建安装的目录
    mkdir -p /usr/local/nginx
    
    # 配置安装目录
    cd nginx-1.16.1
    ./configure --prefix=/usr/local/nginx
    

    如果不配置安装的路径,那么安装后可执行文件默认存放在 /usr/local/bin,库文件默认存放在 /usr/local/lib,配置文件默认存放在 /usr/local/etc,其他的资源文件存放在 /usr/local/share

  5. 编译和安装 Nginx

    make && make install
    
  6. 通过以上步骤,Nginx 就已经安装好了,切换到其安装目录我们就能看到以下几个目录【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

1.3 Nginx 目录结构

安装完 Nginx 后,我们就能看到以下几个目录:

目录 说明
conf 存放配置文件
html 存放静态文件(html、css、js)
logs 存放日志文件
sbin 存放脚本文件

在这些目录中还有几个重要的文件:

文件 说明
conf/nginx.conf Nginx 配置文件
sbin/nginx 二进制文件,用于启动、停止 Nginx 服务

Nginx 目录和文件总览:

【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

2. Nginx 命令

命令 说明
./nginx -v 查看 Nginx 版本
./nginx -t 检查配置文件正确性
./nginx 启动 Nginx 服务
./nginx -s stop 停止 Nginx 服务
./nginx -s reload 重新加载配置文件(当修改 Nginx 配置文件后,需要重新加载才能生效)

以上命令都需要进入 Nginx 的安装目录的 sbin 目录才能执行,因此执行这些命令的时候其实是有点麻烦的。为了解决这个问题,能够在任何路径都能执行这些命令,可以将 Nginx 的二进制文件的路径配置到系统的环境变量中。

配置方式:

  1. 进入 /etc/profile 文件进行编辑

    vim /etc/profile
    
  2. 在 Path 变量后面追加 nginx 的 sbin 路径

    【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

  3. 让修改后的 /etc/profile 立即生效

    source /etc/profile
    

3. Nginx 配置文件结构

Nginx 配置文件(conf/nginx.conf)整体分为三部分:

  • 全局块:和 Nginx 运行相关的全局配置【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

  • events 块:和网络连接相关的配置【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

  • http 块:代理、缓存、日志记录、虚拟主机配置

    • http 全局块

      【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

    • server 块

      【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

      server 块又可以分成 server 全局块和 location 块。注意:http 中可以配置多个 server 块,每个 server 块又可以配置多个 location 块。

4. Nginx 具体应用

4.1 部署静态资源

Nginx 可以作为静态 web 服务器来部署静态资源。静态资源指在服务端真实存在并且能够直接展示的一些文件,比如 html、css、hs、图片、视频等资源。

相对于 Tomcat,Nginx 处理静态资源的能力更加高效,所以在生产环境下,一般都会将静态资源部署到 Nginx 中。将静态资源部署到 Nginx 非常简单,只需要将文件复制到 Nginx 安装目录的 html 目录即可。

除此之外,如果有需要还可以对 Nginx 的配置文件的 http 块的 server 块的参数进行指定的修改,参数说明如下:【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

4.2 反向代理

4.2.1 介绍

代理就像是我们去购买海外的东西,找了个中间人帮我们去买物品并且带了回来。

从系统的角度来说,直接访问就是浏览器的请求直接到了最终的服务器,中间没有经过任何的代理服务器,否则就是通过了代理的形式去访问了服务器。

代理(proxy)又分为正向代理(forward proxy)和反向代理(reverse proxy)。

正向代理(forward proxy):

是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

一个正向代理服务器并没有直接响应请求的能力,就像商店不生产方便面一样,它不过是把请求转发到最终的网页服务器上,再把后者的响应再转发给请求者。

那么浏览器只知道最终浏览器的地址,但是如何知道代理服务器在哪呢?

这个需要我们主动的告诉浏览器,即主动配置代理服务器。

正向代理的典型用途是为在防火墙内的局域网客户端提供访问 Internet 的途径。

反向代理(reverse proxy):

反向代理服务器位于用户于目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源,反向代理服务器负责将请求转发给目标服务器。

用户不需要知道目标服务器的地址,也无须在用户端做任何设定。

反向代理与正向代理的一个很大区别就是,它不需要客户端去做什么配置,并没有什么配置代理服务器的操作。

如果说正向代理是主动配置,主动走代理,那么反向代理则是”被代理“。从这点上看,反向代理有时又称为“透明代理”,也即是浏览器都不知道自己被代理了,浏览器以为发给它响应的就是最终的网页服务器,其实不过是个“代理”。

【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

4.2.2 配置反向代理

配置反向代理只需要修改 nginx.conf 配置文件即可,需要配置的参数如下:

server {
    listen 81;	# 监听端口
    server_name localhost;	# 服务器名称
    location / {
        proxy_pass http://目标服务器IP:端口号; #反向代理配置,将请求转发到指定服务
    }
}

配置后记得重新加载配置文件。

4.3 负载均衡

4.3.1 介绍

早期的网站流量和业务功能都比较简单,单台服务器就可以满足基本需求,但是随着互连网的发展,业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群,进行性能的水平扩展以及避免单点故障出现。

  • 应用集群:将同一应用部署到多台机器上,组成应用集群,接收负载均衡器分发的请求,进行业务处理并响应返回数据。
  • 负载均衡器:将用户请求根据对应的负载均衡算法分发到应用集群中的一台服务器进行处理。

【Nginx】认识与基本使用 Nginx 实现反向代理、配置负载均衡

4.3.2 配置负载均衡

配置负载均衡只需要修改 nginx.conf 配置文件即可,需要配置的参数如下:

upstream targetserver {		# upstream 指令可以定义一组服务器
    server 服务器1IP:端口号;
    server 服务器2IP:端口号;
}

server {
    listen 8080;	# 监听端口
    server_name localhost;	# 服务器名称
    location / {
        proxy_pass http://targetserver;	# 请求转发的一组服务器的名称
    }
}

配置后记得重新加载配置文件。

4.3.3 负载均衡策略

名称 说明
轮询 默认方式
weight 权重方式,权重越大分配的机率越高
ip_hash 依据 ip 分配方式
least_conn 依据最少连接方式
url_hash 依据 url 分配方式
fair 依据响应时间方式
  1. 轮询:默认方式,当刷新浏览器时,会发现目标服务器是被轮流着访问。

    upstream targetserver {		# upstream 指令可以定义一组服务器
        server 服务器1IP:端口号;
        server 服务器2IP:端口号;
    }
    
  2. weight:通过分配权重的方式,权重越大分配的机率越高。

    upstream targetserver {		# upstream 指令可以定义一组服务器
        server 服务器1IP:端口号 weight=10;
        server 服务器2IP:端口号 weight=5;
    }
    
  3. ip_hash:通过客户端的 ip 地址经过哈希算法来分配到一个服务器上,之后同一个 ip 访问时都会固定的访问一个服务器。

    通过 ip_hash 能够解决 Session 丢失的问题,即用户第一次在A服务器登陆后,如果下次请求访问到B服务器的话,那么登录信息则会丢失。

    upstream targetserver {		# upstream 指令可以定义一组服务器
    	ip_hash;
        server 服务器1IP:端口号;
        server 服务器2IP:端口号;
    }
    
  4. least_conn:分配服务器中最少连接的那个。

    upstream targetserver {		# upstream 指令可以定义一组服务器
    	least_conn;
        server 服务器1IP:端口号;
        server 服务器2IP:端口号;
    }
    
  5. url_hash:按照访问的 url 经过哈希算法来分配到一个服务器上,之后同一个 url 访问都会访问到固定的一个服务器。

    适合后端服务器作为缓存时使用。

    upstream targetserver {		# upstream 指令可以定义一组服务器
    	hash $request_uri;
    	hash_methond cr32;	# hash 算法
        server 服务器1IP:端口号;
        server 服务器2IP:端口号;
    }
    
  6. fair:根据后端服务器的响应时间来分配请求,响应时间短的分配优先。

    upstream targetserver {		# upstream 指令可以定义一组服务器
    	fair;
        server 服务器1IP:端口号;
        server 服务器2IP:端口号;
    }