Skip to content

Nginx

导航目录

正向代理

功能说明:正向代理是指代理服务器代理用户请求,与用户请求方向一致,主要用于客户端访问外部资源时的中转。

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

配置示例

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

正向代理

反向代理

功能说明:反向代理是指代理服务器处理用户请求,与用户请求方向相反,主要用于服务器端的负载均衡和请求分发。

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

配置示例

js
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;
    }
}

反向代理

全局设置优化

功能说明:通过优化 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 及以上

配置示例

js
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 的核心模块,包括进程管理、连接数、压缩、负载均衡等关键功能。

js
# 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;
        }
    }
}

CORS 配置

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

简单请求

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

  • 请求方法HEADGETPOST
  • HTTP 头信息:只包含以下字段:
    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type:只限于三个值 application/x-www-form-urlencodedmultipart/form-datatext/plain

非简单请求

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

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

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

配置示例

js
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 模块的基本设置。

js
# 运行用户

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 代理。

js
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:支持多路复用,提升加载性能