多功能服务器 - Nginx

一、什么是 Nginx?

Nginx 是一个高性能、高并发的 Web 服务器和反向代理服务器,同时也可以用作负载均衡器、邮件代理服务器等。

  • 属于开源软件,使用 C 语言开发。
  • 设计上注重高并发连接处理能力,适用于静态资源服务和反向代理。

二、为什么用 Nginx?

理由 说明
高性能 能处理上万并发连接,占用资源少(事件驱动模型)
反向代理 支持转发请求到后端服务器,隐藏后端 IP,提升安全性
负载均衡 将流量分配给多台服务器
静态资源处理快 处理 HTML、JS、CSS、图片等静态文件性能极高
模块丰富 可扩展支持缓存、限流、安全控制等功能
跨平台支持 可在 Linux、Windows、Mac 上运行

三、怎么用 Nginx?

1. 安装 Nginx


2. 常见用法

启动与停止

sudo systemctl start nginx   # 启动
sudo systemctl stop nginx    # 停止
sudo systemctl restart nginx # 重启

配置文件路径

默认配置文件位于 /etc/nginx/nginx.conf

配置反向代理示例

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:8080;  # 把请求转发到 SpringBoot 等后端服务
    }
}

配置静态资源服务

server {
    listen 80;
    server_name static.example.com;

    location / {
        root /var/www/html;  # 指定静态资源路径
        index index.html;
    }
}

配置负载均衡

upstream myapp {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
}

server {
    listen 80;

    location / {
        proxy_pass http://myapp;
    }
}

3. 配置检查与重载

sudo nginx -t       # 检查配置文件是否有误
sudo nginx -s reload  # 平滑重载配置

问题总结

Q1:什么是事件驱动模型?

事件驱动模型是一种程序设计方式,它通过监听事件(如请求到来、数据读取完成),并在事件发生时触发相应的“处理函数”,而不是阻塞等待结果。

阻塞模型(传统模式) 事件驱动模型
打电话一直等对方接听,不接就一直占线 留言让对方回电,有电话来时再处理

事件驱动模型的流程:

  1. 程序启动后,进入事件循环
  2. 它会监听一系列事件(如网络请求、文件读写等)。
  3. 一旦某个事件发生,就立即触发对应的回调函数来处理该事件。
  4. 执行完后继续监听下一个事件。

对比其他模型

模型 特点
多线程模型 每个连接一个线程,资源消耗大
事件驱动模型 单线程处理所有事件,性能优越
协程模型(如 Go) 模拟成轻量线程,也基于事件驱动底层

Q2:什么是正向代理?

Q3:什么是反向代理?

Q4:前端发送的请求,是如何请求到后端服务的?

有以下两个地址:

前端请求地址:http://localhost/api/employee/login
后端接口地址:http:///ocalhost:8080/admin/employee/login

发现两个地址并不一致,那是如何请求到后端服务的呢?

上面我们了解到Nginx的反向代理,那么实践一下:

server{
     listen 80;
     server_name localhost;
     
     location /api/{
         proxy_pass http://localhost:8080/admin/; #反向代理
     }
 }

proxy_pass 是 Nginx 中用于设置代理目标地址的核心指令,支持配置为主机名、IP 地址加端口号等多种形式。

那么上面代码的含义是:

访问:http://localhost/api/user/list
实际代理请求为:http://localhost:8080/admin/user/list

Q5:什么是负载均衡?

在服务采用集群部署时,为了合理分配请求压力,Nginx 通常会配合负载均衡功能,将请求转发至多台后端服务器。

这么来看,负载均衡其实是建立在反向代理的基础之上的,它的作用就是根据设定的规则,将请求“有策略地”分发给后端服务。

1. Nginx 负载均衡配置方式

如下为 Nginx 配置示例:

upstream webservers{
     server 192.168.100.128:8080;
     server 192.168.100.129:8080;
 }
 server{
     listen 80;
     server_name localhost;
     
     location /api/{
         proxy_pass http://webservers/admin;#负载均衡
     }
 }

配置说明:

  • upstream:用于定义一个后端服务器组,可自定义名称(例如这里的 webservers)。
  • 当访问 http://localhost/api/... 时,请求将通过反向代理 location /api/ 转发至 http://webservers/admin,并由配置的后端服务器按策略处理。
  • 默认的分发策略为轮询。

注意:upstream 名称需在配置中保持一致。


2. 负载均衡策略说明

策略名称 描述
轮询 默认方式,请求按顺序依次分发
weight 权重方式,权重越高,被分配请求越多(默认权重为 1)
ip_hash 根据客户端 IP 分配,适用于保持会话一致的场景
least_conn 根据后端当前连接数,优先分配给连接数少的服务器
url_hash 根据请求的 URL 分配,确保同一 URL 落到同一服务器
fair 根据后端响应时间分配,请求优先发送到响应更快的服务器

3. 不同策略配置示例

3.1 轮询(默认)
upstream webservers {
    server 192.168.100.128:8080;
    server 192.168.100.129:8080;
}

3.2 权重(weight)
upstream webservers {
    server 192.168.100.128:8080 weight=90;
    server 192.168.100.129:8080 weight=10;
}

3.3 IP Hash

IP Hash 根据客户端IP通过哈希函数生成一个数值,然后将该数值对后端服务器数量取模,决定分发到哪台服务器。这样可以实现同一 IP 一致性访问,保持会话状态。

例如:

  • 客户端 IP 哈希值为 12,后端有 3 台服务器
  • 计算结果:12 % 3 = 0 → 分发到第一台服务器
upstream webservers {
    ip_hash;
    server 192.168.100.128:8080;
    server 192.168.100.129:8080;
}

3.4 最少连接(least_conn)
upstream webservers {
    least_conn;
    server 192.168.100.128:8080;
    server 192.168.100.129:8080;
}

3.5 URL Hash

URL Hash 使用请求的 URI 计算哈希值,从而将相同的 URL 分发到同一台服务器,有利于缓存和会话保持。

upstream webservers {
    hash $request_uri;
    server 192.168.100.128:8080;
    server 192.168.100.129:8080;
}

3.6 Fair(响应时间优先)
upstream webservers {
    server 192.168.100.128:8080;
    server 192.168.100.129:8080;
    fair;
}

注意:fair 策略并不是 Nginx 默认内置的模块,使用前需要安装第三方模块 ngx_http_upstream_fair_module


欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1701220998@qq.com
导航页 GitHub