Skip to content

Nginx ​

导航目录 ​

正向代理 ​

功能说明:正向代理代理的是客户端,代理服务器与客户端处于同一侧,客户端明确知道要访问的目标服务器,但通过代理去转发请求。典型场景是「科学上网」、企业内网统一出口。

  • 核心作用:
    • 突破网络限制,访问被屏蔽的网站
    • 提高访问速度,通过缓存机制减少重复请求
    • 隐藏客户端真实 IP,保护用户隐私

请求流向:

text
客户端 ──► 正向代理服务器 ──► 目标服务器
客户端 ◄── 正向代理服务器 ◄── 目标服务器

目标服务器只知道代理的 IP,不知道真实客户端 —— 隐藏了客户端。

配置示例:

nginx
server {
    listen 8080;
    resolver 8.8.8.8;
    location / {
        proxy_pass http://$http_host$request_uri;
    }
}

反向代理 ​

功能说明:反向代理代理的是服务器,代理服务器与后端服务处于同一侧。客户端只知道代理的地址,并不知道背后真正处理请求的是哪台服务器。典型场景是负载均衡、网关、静态资源服务。

  • 核心作用:
    • 负载均衡:将请求分发到多个后端服务器,提高系统可用性和性能
    • 隐藏真实服务器:保护后端服务器的真实 IP,提高安全性
    • SSL 终端:在代理服务器上处理 HTTPS 连接,减轻后端服务器负担
    • 缓存静态资源:减少后端服务器的请求压力

请求流向:

text
                     ┌──► 后端服务器 1
客户端 ──► 反向代理服务器 ─┼──► 后端服务器 2
                     └──► 后端服务器 3

客户端只知道代理的 IP,不知道真实后端服务器 —— 隐藏了服务端。

配置示例:

nginx
upstream backend {
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

正向 vs 反向代理 ​

对比维度正向代理反向代理
代理对象客户端服务器
部署位置客户端一侧服务器一侧
客户端是否感知需主动配置代理无感知,以为直连
隐藏对象隐藏客户端真实 IP隐藏后端真实服务器
典型场景科学上网、内网统一出口负载均衡、网关、SSL 卸载

全局设置优化 ​

功能说明:通过优化 Nginx 的全局配置参数,提高服务器性能和稳定性。

  • worker_processes:设置 Nginx 服务的进程数,推荐设置为 CPU 内核数,充分利用多核性能

    worker_processes 4;

  • worker_cpu_affinity:将 Nginx 进程绑定到特定 CPU 核心,避免进程在不同核心间切换,提高硬件资源利用率

    worker_cpu_affinity 0001 0010 0100 1000;

  • worker_rlimit_nofile:设置一个进程允许打开的最大文件数,理论上越大越好,但不可以超过系统限制

    worker_rlimit_nofile 200000;

  • worker_connections:设置单个进程的最大连接数,最大连接数 = worker_processes × worker_connections

    events { worker_connections 65535; }

系统文件限制设置 ​

功能说明:查看和修改服务器最大可以打开文件的数量,这是优化 Nginx 性能的重要系统设置。

操作命令:

bash
# 查看当前系统文件限制

ulimit -a

# 修改最大打开文件数

ulimit -n 300000

永久设置:

bash
# 编辑系统限制配置文件

vi /etc/security/limits.conf

# 添加以下内容

* soft nofile 300000
* hard nofile 300000

升级 HTTP/2 ​

功能说明:启用 HTTP/2 协议,提高网站加载速度和性能。

前提条件:

  • Nginx 版本:必须在 1.9.5 以上
  • OpenSSL 版本:必须在 1.0.2e 及以上

配置示例:

nginx
server {
    listen 443 ssl http2;
    server_name example.com;

    # SSL 配置
    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;

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

HTTP/2 优势:

  • 多路复用:多个请求可以在同一个连接上并行处理
  • 服务器推送:服务器可以主动推送资源给客户端
  • 头部压缩:减少 HTTP 头部的传输大小
  • 二进制传输:更高效的数据传输格式

核心模块配置 ​

功能说明:配置 Nginx 的核心模块,包括进程管理、连接数、压缩、负载均衡等关键功能。

nginx
# Nginx进程数,建议设置为等于CPU总核心数

worker_processes  1;

# 全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]

# error_log  logs/error.log;

# 一个Nginx进程打开的最多文件

worker_rlimit_nofile 65535;

# 工作模式与连接数上限

events {
    # 单个进程最大连接数(最大连接数=连接数*进程数)
    # 该值受系统进程最大打开文件数限制,需要使用命令ulimit -n 查看当前设置
    worker_connections 65535;
}

# 设定HTTP服务器

http {
    # 长连接超时时间,单位是秒,默认为0
    keepalive_timeout  65;

    # gzip压缩功能设置
    gzip on; # 开启gzip压缩输出
    gzip_comp_level 6; # 压缩等级
    gzip_types application/javascript text/css text/html application/json; # 压缩类型

    # HTTP代理服务全局设置
    client_max_body_size   10m; # 客户端最大请求体大小

    # 设定负载均衡后台服务器列表
    upstream backend {
        server 192.168.10.100:8080 max_fails=2 fail_timeout=30s;
        server 192.168.10.101:8080 max_fails=2 fail_timeout=30s;
    }

    # 虚拟主机的配置
    server {
        # 监听端口
        listen 80;
        # 域名可以有多个,用空格隔开
        server_name localhost frontend.com;

        # 代理配置
        location / {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # 图片缓存时间设置
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
            expires 10d;
        }

        # JS和CSS缓存时间设置
        location ~ .*\.(js|css)?$ {
            expires 1h;
        }
    }
}

location 匹配优先级 ​

功能说明:一个请求 URI 可能匹配多个 location,Nginx 按固定的优先级规则决定最终命中哪一个,而不是按书写顺序。

匹配修饰符:

修饰符含义优先级
location = /path精确匹配最高
location ^~ /path前缀匹配,命中后不再查正则次高
location ~ pattern正则匹配(区分大小写)中
location ~* pattern正则匹配(不区分大小写)中
location /path普通前缀匹配(最长前缀优先)低
location /通用匹配(兜底)最低

匹配顺序:精确 = → 前缀 ^~ → 正则 ~ / ~*(按书写顺序)→ 普通前缀(最长优先)→ 通用 /。

nginx
server {
    # 1. 精确匹配,最高优先级
    location = /login {
        proxy_pass http://auth;
    }
    # 2. 前缀匹配,命中后跳过正则
    location ^~ /static/ {
        root /data/www;
    }
    # 3. 正则匹配(不区分大小写)
    location ~* \.(gif|jpg|png|css|js)$ {
        expires 30d;
    }
    # 4. 通用匹配,兜底
    location / {
        proxy_pass http://backend;
    }
}

负载均衡策略 ​

功能说明:通过 upstream 定义后端服务器组,Nginx 支持多种分发算法,将请求合理地分配到各个后端节点。

text
                    ┌──► 服务器 A
客户端 ──► Nginx 负载均衡 ─┼──► 服务器 B
                    └──► 服务器 C

常见策略:

  • 轮询(默认):请求按顺序依次分配到每台服务器
  • 权重 weight:性能好的机器分配更多请求
  • ip_hash:按客户端 IP 哈希固定分配,解决会话保持(Session)问题
  • least_conn:优先分配给当前连接数最少的服务器
  • fair(第三方):按响应时间分配,响应快的优先
nginx
upstream backend {
    # 权重轮询:weight 越大分配越多
    server 192.168.1.100:8080 weight=3;
    server 192.168.1.101:8080 weight=1;

    # ip_hash:同一 IP 固定落到同一后端
    # ip_hash;

    # least_conn:分配给连接数最少的节点
    # least_conn;

    # 健康检查参数
    server 192.168.1.102:8080 max_fails=2 fail_timeout=30s;
    # 备用机,主节点全挂时才启用
    server 192.168.1.103:8080 backup;
}

限流 ​

功能说明:通过限制请求速率和并发连接数,防止服务器被突发流量或恶意请求压垮,是常见的防护与保护后端的手段。

两类限流:

  • limit_req:基于漏桶算法限制请求速率(每秒请求数)
  • limit_conn:限制并发连接数
nginx
http {
    # 定义限流区域:按客户端 IP,10MB 内存,限制 10 请求/秒
    limit_req_zone $binary_remote_addr zone=reqLimit:10m rate=10r/s;
    # 定义并发连接限流区域
    limit_conn_zone $binary_remote_addr zone=connLimit:10m;

    server {
        location /api/ {
            # burst=20:允许 20 个请求的突发缓冲
            # nodelay:突发请求立即处理,不排队延迟
            limit_req zone=reqLimit burst=20 nodelay;
            # 单 IP 最多 10 个并发连接
            limit_conn connLimit 10;
            # 超限返回的状态码
            limit_req_status 503;
            proxy_pass http://backend;
        }
    }
}

burst 是突发缓冲队列大小,nodelay 表示缓冲内的请求不做延迟处理,两者常配合使用以兼顾平滑与体验。

防盗链 ​

功能说明:通过校验请求头中的 Referer,阻止其他网站直接引用本站的图片、视频等静态资源,避免带宽被盗用。

nginx
location ~* \.(gif|jpg|jpeg|png|bmp|swf|mp4)$ {
    # 允许的来源:空 Referer、本站域名
    valid_referers none blocked server_names
                   *.example.com example.com;
    # 非法来源返回 403(或重定向到默认图)
    if ($invalid_referer) {
        return 403;
        # rewrite ^/ /images/403.png break;
    }
}
  • none:允许 Referer 为空的请求(如直接在浏览器打开)
  • blocked:允许 Referer 被防火墙/代理删除或伪装的请求
  • server_names:允许 Referer 为本站域名的请求

WebSocket 代理 ​

功能说明:WebSocket 基于 HTTP 协议升级(Upgrade)而来,反向代理时必须显式转发 Upgrade 和 Connection 头,否则连接无法建立。

nginx
location /ws/ {
    proxy_pass http://websocket_backend;
    # WebSocket 协议升级必需的两个头
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    # 使用 HTTP/1.1(WebSocket 要求)
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    # 延长超时,避免长连接被断开
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
}

关键点:proxy_http_version 1.1 + 转发 Upgrade/Connection 头,三者缺一不可。

CORS 配置 ​

功能说明:跨域资源共享(CORS)配置,允许不同域名的客户端访问服务器资源。

简单请求 ​

定义:满足以下条件的请求称为简单请求:

  • 请求方法:HEAD、GET、POST
  • HTTP 头信息:只包含以下字段:
    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type:只限于三个值 application/x-www-form-urlencoded、multipart/form-data、text/plain

非简单请求 ​

定义:不满足简单请求条件的请求,例如:

  • 请求方法是 PUT、DELETE 或 OPTIONS
  • Content-Type 字段的类型是 application/json
  • 包含自定义头部信息

预检机制:非简单 CORS 请求会先发送一个 OPTIONS 预检请求,服务器需要返回 200 状态码以允许后续请求。

配置示例:

nginx
location / {
   add_header 'Access-Control-Allow-Origin' '*';// 跨域白名单
   add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
   add_header 'Access-Control-Allow-Headers' 'Content-Type';
   # 处理非简单请求
   if ($request_method = 'OPTIONS') {
      return 200;
   }
}

基础配置 ​

功能说明:Nginx 的基础配置模板,包含进程管理、日志、HTTP 和 Stream 模块的基本设置。

nginx
# 运行用户

user  nginx;
# 进程数

worker_processes  4;

# 加载模块

include /usr/share/nginx/modules/mod-stream.conf;

# 错误日志

error_log  /var/log/nginx/error.log warn;
# PID 文件

pid        /var/run/nginx.pid;

# 事件模块配置

events {
    # 单个进程最大连接数
    worker_connections  1024;
}

# HTTP 模块配置

http {
    # 包含 MIME 类型定义
    include       /etc/nginx/mime.types;
    # 默认 MIME 类型
    default_type  application/octet-stream;
    # 关闭服务器版本信息
    server_tokens       off;
    # 开启代理错误拦截
    proxy_intercept_errors on;

    # 日志格式定义
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" '
                      '"$http_host" "$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time"';

    # 访问日志
    access_log  /var/log/nginx/access.log  main;
    # 客户端最大请求体大小
    client_max_body_size 100m;
    # 开启 sendfile
    sendfile        on;
    # 开启 TCP_NOPUSH
    # tcp_nopush     on;

    # 长连接超时时间
    keepalive_timeout  65;

    # 开启 gzip 压缩
    # gzip  on;

    # 大客户端头部缓冲区
    # large_client_header_buffers  4 1m;

    # 包含其他配置文件
    include /etc/nginx/conf.d/*.conf;
    # 限流配置
    limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=10r/s;
}

# Stream 模块配置(用于 TCP/UDP 代理)

stream {
    # 日志格式定义
    log_format  basic   '$time_iso8601 $remote_addr '
                        '$protocol $status $bytes_sent $bytes_received '
                        '$session_time $upstream_addr '
                        '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

    # 访问日志
    access_log      /var/log/nginx/stream.log  basic buffer=1k flush=5s;

    # 包含其他 Stream 配置文件
    include /etc/nginx/conf.d/*.tcp;
}

静态资源配置 ​

功能说明:配置 Nginx 作为静态资源服务器,处理前端静态文件和 API 代理。

nginx
server {
    # 监听端口
    listen 50080;
    # 服务器名称
    server_name localhost;

    # 字符集设置
    # charset koi8-r;
    # 访问日志
    # access_log logs/host.access.log;

    # 静态资源配置
    location /internet_payment_account {
        # 静态文件路径
        alias /usr/share/nginx/html/frontapp/internet_payment_account/dist;
        # 默认索引文件
        index index.html index.htm;
        # 处理单页应用路由
        try_files $uri $uri/ /internet_payment_account/index.html;
    }

    # API 代理配置
    location /ipa-bizcenter/api {
        # 客户端最大请求体大小
        client_max_body_size 50m;
        # 代理到后端 API 服务
        proxy_pass http://10.123.78.82:8001/ipa-bizcenter;
        # 代理头信息设置
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

静态资源优化建议:

  • 启用 gzip 压缩:减少静态文件传输大小
  • 设置合理的缓存时间:根据文件类型设置不同的缓存策略
  • 使用 CDN:将静态资源部署到 CDN,提高访问速度
  • 启用 HTTP/2:支持多路复用,提升加载性能