Nginx负载配置教程


Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。Nginx 是由伊戈尔·赛索耶夫所开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。

本文将简单介绍 Nginx 的安装与实现反向代理步骤。

一、安装部署

1. YUM安装

通过 yum 安装虽然方便但无法自定义存放目录,如果只是虚拟机测试使用则无伤大雅。

# 添加 Nginx 源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 安装 Nginx
yum install -y nginx

# 启动服务
systemctl start nginx.service
(1) 文件目录
  • 安装目录: /etc/nginx
  • 配置文件: /etc/nginx/nginx.conf
  • 日志目录: /var/log/nginx/access.log
  • 异常日志: /var/log/nginx/error.log
  • 网站默认站点配置: /etc/nginx/conf.d/default.conf
  • 网站文件存放默认目录: usr/share/nginx/html
  • 自定义 Nginx 站点配置文件存放目录: /etc/nginx/conf.d
(2) 服务启动

服务相关的启停命令如下:

systemctl start nginx.service              # 启动
            
systemctl stop nginx.service               # 关闭
            
systemctl restart nginx.service            # 重启

2. 编译安装

除了通过 yum 安装外更推荐自定义编译安装,这里通过 wget 下载为例,当然也可以官网手动下载上传。

# 进入安装目录
cd /usr/local/  

# 下载安装包,版本请自行选择
wget https://nginx.org/download/nginx-1.21.2.tar.gz   

# 解压
tar -zxf nginx-1.21.2.tar.gz
(1) 文件编译

进入解压后的文件执行 configure 文件验证当前系统环境。

# 进入解压目录
cd ./nginx-1.21.2

# 验证环境
./configure

如果在执行 ./configure 报错根据下面提示执行不同操作即可。

# 提示 ./configure: error: C compiler cc is not found
yum install -y gcc-c++

# 提示 error: the HTTP rewrite module requires the PCRE library.
yum install -y pcre pcre-devel

# 提示 error: Invalid C++ compiler or C++ compiler flags.
yum install -y gcc gcc-c++

# 提示 error: the HTTP gzip module requires the zlib library.
yum install -y zlib-devel

如果没有提示异常说明环境没有问题继续执行编译即可。

# 执行编译
make

# 执行安装
make install
(2) 服务启动

编译完成后会在 /usr/local/ 下生成 nginx 目录,其中 nginx/sbin 中为可执行文件,配置文件在 nginx/conf 目录下。

cd /usr/local/nginx/sbin          # 打开脚本目录

./nginx                           # 运行

./nginx -s stop                   # 停止
    
nginx -s reload                   # 重载配置
            
nginx -t                          # 检查配置是否正确

3. Windows

上述两种方式都是在 Linux 环境下部署 Nginx 服务,如果是初学者可以先在 Windows 上先熟悉基本配置,下面介绍 Windows 平台部署步骤。

先进入官网下载对应的部署包:Nginx官网

解压下载的文件,其中包含如下文件,启动服务双击 nginx.exe 文件即可。

(1) 常用命令

Windwos 环境下 nginx 涉及的常用命令如下:

# 查看版本信息
nginx -V

# 测试配置文件合法性
nginx -t
(2) 服务启停

Windwos 环境下 nginx 服务启停命令如下:

# 启动服务
nginx.exe -c conf/nginx.conf

# 重载配置
nginx -s reload

# 快速关闭,可能不保存相关信息,并迅速终止服务
nginx -s stop

# 平稳关闭,保存相关信息,有安排的结束服务
nginx -s quit

二、请求代理

1. 正向代理

在正向代理模式下, 代理服务器 代表 客户端 请求 目标服务器 上的内容。客户端通过向代理服务器发送请求来访问目标服务器上的资源,而目标服务器并不知道客户端的存在,只知道代理服务器的存在。

正向代理常用于需要访问外部网络资源的网络环境中,例如访问 Google 等被屏蔽的网站,其典型示意图如下:

客户端  -->  正向代理服务器  -->  目标服务器

2. 反向代理

在反向代理模式下, 代理服务器 代表 目标服务器 响应 客户端 的请求。客户端向代理服务器发送请求,代理服务器根据请求内容选择相应的目标服务器,并将请求转发到目标服务器。目标服务器将响应返回给代理服务器,代理服务器再将响应返回给客户端。

反向代理常用于负载均衡和高可用性场景中,其典型示意图如下:

客户端  <--  反向代理服务器  <--  目标服务器

三、服务代理

1. 基本格式

Nginx 配置文件中主要包含三大模块:httpserverlocation,三者分别对应一个网络地址的 IP端口接口地址

三个模块其基本的配置格式如下,当配置冲突时 location 模块优先级最高,其次为 serverhttp 优先级最低,即内层优先级越高但作用范围越小。

http {
    // 此处配置全局生效
    
    server {
        // 一个 server 对应一个端口
        // 一个 http 模块可包含多个 server 模块
        // 配置优先级高于 http 模块但低于 location 模块

        location / {
            // 一个 location 对应一个转发地址
            // 一个 server 模块可包含多个 location 模块
            // 相同配置 location 模块优先级最高
        }
    }
}

2. 资源代理

通过 Nginx 可实现便捷的静态资源代码,如下配置即通过本机的 8080 端口代理本地目录 /usr/local/spring/vue 下的 index.html 静态资源。

server {
    listen       8080;
    server_name  localhost;

    location / {
        root   /usr/local/spring/vue;
        index  index.html index.htm;
    }
}

3. 代理转发

通过代理转发即可实现将指定服务转发至另一端口服务上。

如下述配置中即通过 127.0.0.1:5000 实现 127.0.0.1:4000 服务的资源代理,具体的配置文件如下:

server {
    listen 5000;
    server_name ibudai.xyz;
        
    location / {
        proxy_pass http://127.0.0.1:4000/;        # 端口号替换成对应服务端口
        
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

4. SSL服务

通过配置 SSL 服务,即可通过 HTTPS 方式访问所代理的服务,下面即介绍配置步骤:

  • 到阿里云申请免费 SSL 证书,并解析绑定你的域名。
  • 然后下载 nginx 对应的 .key.pem 文件。
  • nginx 安装路径下新建文件夹用于存放上一步下载的两个文件,这里我创建了 cert 目录。
  • nginx.conf 文件添加如下配置:
server {
    listen 443 ssl;
    server_name www.ibudai.xyz;
    root /home/hexo;
        
    index index.html index.htm;
    ssl_certificate cert/xxx.pem;         # .pem 证书存放目录
    ssl_certificate_key cert/xxx.key;     # .key 证书存放目录
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
}

四、常用配置

1. 重定向

通过 rewrite 可实现请求的重定向,如下述中将所有 HTTP 请求通过 rewrite 指令重定向到 HTTPS

server {
    listen 80;
    server_name ibudai.xyz;
    rewrite ^(.*)$ https://$host$1;     # 重定向请求

    location / {
        index index.html index.htm;
    }
}

2. 超时配置

其中 keepalive_timeoutNginx 中用来设置连接保持时间的参数,它决定了一个客户端和后端服务器之间的连接在空闲状态下保持打开的时间,以便复用该连接减少连接建立的开销。

当一个客户端与 Nginx 建立连接后,在超过 keepalive_timeout 设置的时间内没有再次请求,该连接将被关闭。

(Ⅰ) 请求配置(作用于客户端与代理服务器之间)

  • send_timeout:设置服务器向客户端发送响应的超时时间,单位为秒。
  • keepalive_timeout:设置服务器与客户端之间保持连接的超时时间,单位为秒。
  • client_body_timeout:设置客户端向服务器发送请求体的超时时间,单位为秒。
  • client_header_timeout:设置客户端向服务器发送请求头的超时时间,单位为秒。

(Ⅱ) 代理配置(作用于代理服务器与后端服务之间)

  • proxy_connect_timeout:设置代理服务器与后端服务器建立连接的超时时间,单位为秒。
  • proxy_send_timeout:设置代理服务器向后端服务器发送数据的超时时间,单位为秒。
  • proxy_read_timeout:设置代理服务器从后端服务器读取数据的超时时间,单位为秒。

(Ⅲ) 其它配置

  • fastcgi_connect_timeout: 设置与 FastCGI 后端服务器的连接超时时间。
  • fastcgi_send_timeout: 设置向 FastCGI 后端服务器发送请求数据的超时时间。
  • fastcgi_read_timeout: 设置从 FastCGI 后端服务器读取响应数据的超时时间。

上述配置可配置于 http 模块或 location 模块,配置于前者则全局生效,当 location 模块与 http 模块配置冲突时以 location 模块配置为准。

http {
    # 设置与后端服务器的连接超时时间为 30 秒
    proxy_connect_timeout 30s;
    # 设置向后端服务器发送请求数据的超时时间为 30 秒
    proxy_send_timeout 30s;
    # 设置从后端服务器读取响应数据的超时时间为 30 秒
    proxy_read_timeout 30s;

    # 设置与 FastCGI 后端服务器的连接超时时间为 30 秒
    fastcgi_connect_timeout 30s;
    # 设置向 FastCGI 后端服务器发送请求数据的超时时间为 30 秒
    fastcgi_send_timeout 30s;
    # 设置从 FastCGI 后端服务器读取响应数据的超时时间为 30 秒
    fastcgi_read_timeout 30s;
}

3. 缓存配置

(Ⅰ) 请求配置参数(作用于客户端与代理服务器之间)

  • client_max_body_size:用于限制客户端向 nginx 发送请求的 body 大小(即 POST 的请求体大小),默认值为 1MB
  • client_body_buffer_size:当客户端发送请求时,请求体的数据需要先缓冲到 nginx 的内存中,然后再转发给后端服务器,该参数用于指定缓冲请求体的内存大小,默认根据操作系统的页大小来自动设置缓冲区大小。
  • client_header_buffer_size:用于限制客户端请求头的大小,默认值为 1 KB。可以根据需要将其设置为适当的值,如 client_header_buffer_size 4k 表示允许的请求头大小为 4 KB
  • large_client_header_buffers:用于设置用于存储客户端请求头的缓冲区大小,默认值为 4 8k,即使用 48KB 的缓冲区来存储请求头。

(Ⅱ) 代理配置参数(作用于代理服务器与后端服务之间)

  • proxy_buffers:用于设置代理响应的缓冲区数量和大小,默认情况下 nginx 使用 48 KB 的缓冲区来存储代理响应。
  • proxy_buffer_size:当 nginx 作为反向代理服务器向后端服务器请求数据时,会先将响应数据存储到内存缓冲区中,参数决定了代理服务器一次从后端服务读取的数据量大小。
  • proxy_max_temp_file_size:当 nginx 作为反向代理服务器向后端服务器请求数据时,如果缓冲区的大小不足以存储响应数据,那么 nginx 会将数据暂存到临时文件中,设置为 0 则禁用临时文件。
  • proxy_busy_buffers_size:当 nginx 代理模块将响应数据传输给客户端时,如果传输数据大小超过了参数配置大小,nginx 将会暂停从后端服务接收响应数据,直到客户端读取了足够的数据将缓冲区腾出来。

在配置代理参数时需要注意下列事项:

  • proxy_max_temp_file_size 值需要等于或大于 proxy_buffersproxy_buffer_size 中的最大值。
  • proxy_busy_buffers_size 值需要等于或大于 proxy_buffersproxy_buffer_size 中的最大值。
http {
    client_max_body_size 128m;
    client_body_buffer_size 10m;

    proxy_buffers 4 10m;
    proxy_buffer_size 10m;
    proxy_max_temp_file_size 15m;
    proxy_busy_buffers_size 15m;
}

五、请求头配置

1. 请求配置

add_header 配置的请求头作用于客户端与代理服务器期间。

location {
    add_header 'Content-Type' 'text/plain; charset=utf-8';
    
    add_header Access-Control-Allow-Origin http://127.0.0.1;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Credentials 'true';
    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
}

2. 代理配置

proxy_set_header 配置的请求头作用于代理服务器与后端服务器期间。

location {
    proxy_set_header HOST $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    # 后端的 Web 服务器可以通过 X-Forwarded-For 获取用户真实 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

六、负载均衡

负载均衡即通过一定的算法机制,将接收请求的分发至集群中不同服务节点,从而降低单台服务器的压力,而通过 Nginx 即可实现便捷的负载均衡配置。

1. 负载类型

Nginx 代理中针对不同的应用场景提供了一系列负载均衡配置算法,常用的类型包含下述六类。

(1) 基础轮询

基础轮询默认所有服务器权重为 1

upstream host_list {
    server 192.168.0.20:8080
    server 192.168.0.21:8080
    server 192.168.0.22:8080
}
(2) 加权轮询

加权轮询可以为每个节点单独指定权重,权重越高服务负载越高,未指定权重时默认为 1

upstream host_list {
    server 192.168.0.20:8080     weight=3
    server 192.168.0.21:8080     # default weight=1
    server 192.168.0.22:8080     # default weight=1
}
(3) 最少连接

根据当前活跃连接数选择负载更少的后端服务器来分配请求,从而实现负载均衡。

upstream host_list {
    least_conn;

    # with default weight for all (weight=1)
    server 192.168.0.20:8080
    server 192.168.0.21:8080
    server 192.168.0.22:8080
}
(4) 加权最少连接

在最少连接的负载前提下同时指定节点的权重。

upstream host_list {
    least_conn;
        
    server 192.168.0.20:8080     weight=3
    server 192.168.0.21:8080     # default weight=1
    server 192.168.0.22:8080     # default weight=1
}
(5) 普通 Hash

普通Hash 是将每个请求按照其某个固定的属性(如 URL 等)计算出一个哈希值,并将其分配给相应的服务器进行处理。这种方式可以确保相同的请求总是被分配给同一个服务器,避免了因服务器动态上下线而导致的请求重复路由的问题。

upstream host_list {
    hash $request_uri;
        
    # with default weight for all (weight=1)
    server 192.168.0.20:8080
    server 192.168.0.21:8080
    server 192.168.0.22:8080
}
(6) IP Hash

IP Hash 则是在 普通Hash 的基础上,加入了客户端 IP 地址的因素。它会根据客户端 IP 地址进行哈希计算,从而保证来自同一个 IP 地址的请求总是被分配给同一个服务器进行处理。

upstream host_list {
    ip_hash;
        
    # with default weight for all (weight=1)
    server 192.168.0.20:8080
    server 192.168.0.21:8080
    server 192.168.0.22:8080
}

2. 参数配置

在配置服务均衡时除了可以指定节点权重外 nginx 还提供了其它参数,详细介绍参考下表:

参数 作用
weight 标识服务器节点的权重,权重越高负载则越高。
backup 标识是否为备用服务器,当所有的非备用服务器都不可用时请求会发送给备用节点。
down 标识服务器是否不参与负载,通常用于服务下线停机维护时。
max_conns 设置最大活动链接数,防止请求过高导致宕机,当设置为 0 时表示无限制。
max_fails 设置允许请求代理服务器最大的失败次数。
fail_timeout 服务器在经过 max_fails 次失败后服务器暂停的时间,默认 10 秒。

3. 负载示例

下述是一个完整的 Nginx 负载配置示例,相应的配置文件如下:

http {
    # 设定负载均衡的服务器列表
    upstream host_list {
        # weigth 参数表示权值,权值越高被分配到的几率越大
        server 192.168.0.20:80   weight=1;
        server 192.168.0.21:80   weight=2;
        server 192.168.0.22:80   weight=3;
    }

   server {
        listen       80;
        server_name  www.helloworld.com;

        # 对所有请求进行负载均衡请求
        location / {
            root        /root;              
            index       index.html index.htm;  
            # 请求转向 host_list 定义的服务器列表
            proxy_pass  http://host_list ;
        }
    }
}

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录