Appearance
Nginx
导航目录
- 正向代理
- 反向代理
- 正向 vs 反向代理
- 全局设置优化
- 系统文件限制设置
- 升级 HTTP/2
- 核心模块配置
- location 匹配优先级
- 负载均衡策略
- 限流
- 防盗链
- WebSocket 代理
- CORS 配置
- 基础配置
- 静态资源配置
正向代理
功能说明:正向代理代理的是客户端,代理服务器与客户端处于同一侧,客户端明确知道要访问的目标服务器,但通过代理去转发请求。典型场景是「科学上网」、企业内网统一出口。
- 核心作用:
- 突破网络限制,访问被屏蔽的网站
- 提高访问速度,通过缓存机制减少重复请求
- 隐藏客户端真实 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 头信息:只包含以下字段:
AcceptAccept-LanguageContent-LanguageLast-Event-IDContent-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:支持多路复用,提升加载性能