Nginx服务器

本文最后更新于 2025年11月3日 上午

学习:

概念

Nginx 是高性能的开源 Web 服务器,同时可用作反向代理、负载均衡器、邮件代理 和 HTTP 缓存。由俄罗斯程序员 Igor Sysoev 用 C 编写于 2004 年创建,现已成为全球最流行的 Web 服务器之一。

原理

特点

特点 说明
高并发 单机支持上万并发连接
内存占用低 C 编写,极度轻量
异步非阻塞 epoll 事件模型
热加载 修改配置可平滑重启
可扩展 支持自定义模块(Lua、RTMP等)

高性能架构

  • 事件驱动架构
    • 采用异步非阻塞 I/O 模型
  • 低内存消耗
    • 处理静态资源时内存占用极少
  • 多进程模型
    • 一个主进程(Master Process)负责管理
    • 多个工作进程(Worker Processes)负责处理请求
    • 每个 Worker 都是单线程、基于 epoll(Linux 高性能 I/O 模型)
  • 高并发能力
    • 单机可高效处理成千上万的连接,在高并发环境下依然轻量、稳定、低占用

高可靠性

  • 热部署
    • 支持不停止服务更新配置和二进制文件
  • 健康检查
    • 对后端服务器进行健康状态监测
  • 故障转移
    • 自动剔除故障节点,保证服务可用性

应用

场景 说明
1️⃣ 静态资源服务器 高速提供 HTML、CSS、JS、图片、视频等静态文件
2️⃣ 反向代理 接收客户端请求,转发到后端(Node.js/Python/Java)服务
3️⃣ 负载均衡 在多台后端服务器之间分配请求,提高可用性与吞吐
4️⃣ 动静分离 静态资源由 Nginx 处理,动态接口由后端 API 服务处理
5️⃣ HTTPS / SSL 终结 Nginx 负责 HTTPS 握手与证书,后端只处理纯 HTTP
6️⃣ 缓存与压缩 可对静态文件 / 代理请求进行缓存与 Gzip 压缩,加速响应
7️⃣ 跨域与路由控制 rewrite、add_header 配置实现 CORS、URL 重写、访问控制

对比

特性 Nginx Apache
架构模型 事件驱动、异步非阻塞 进程/线程模型、同步阻塞
内存消耗 较低 较高
并发性能 优秀(高并发) 良好
静态资源 非常高效 良好
动态内容 需通过FastCGI等 原生支持良好
配置语法 简洁直观 较复杂
模块系统 较新,热插拔 成熟,丰富

实现

模块

关键模块解析:

模块 作用
http 处理 HTTP 请求的主要模块
server 定义虚拟主机(域名、端口)
location 定义请求路径匹配规则(路由分发)
proxy_pass 转发请求到后端服务器(反向代理)
upstream 定义负载均衡服务器组
gzip 开启响应压缩
ssl_certificate 设置 HTTPS 证书
rewrite URL 重写、跳转

配置

配置文件路径(默认):/etc/nginx/nginx.conf

配置文件主要分为三个层级:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 全局块:影响整个 Nginx 服务的参数
user nginx nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;

# events 块:影响网络连接的配置
events {
worker_connections 1024;
use epoll;
multi_accept on;
}

# http 块:HTTP服务器相关配置
http {
include mime.types;
sendfile on;
keepalive_timeout 65;
default_type application/octet-stream;

# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;

# server 块:虚拟主机配置
server {
listen 80;
server_name mysite.com;

# location 块:请求路径匹配规则
location / {
root /var/www/html;
index index.html index.htm;
}

# 反向代理
location /api/ {
proxy_pass http://localhost:3000/;
}
}
}

示例

静态服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
server_name example.com;

location /static/ {
root /var/www/html;
expires 1y; # 长期缓存
add_header Cache-Control "public, immutable";
}

location /uploads/ {
root /var/www;
# 自动生成缩略图等
}
}

动静分离

1
2
3
4
5
6
7
8
9
10
11
server {
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
root /var/www/static;
}

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

反向代理

反向代理与正向代理的区别?

  • 正向代理:客户端代理自己访问外部(如 VPN)。

  • 反向代理:代理服务器替后端服务处理客户端请求。

  • 需求:当前端访问 http://example.com/api/... 时,Nginx 将请求转发到本地运行的 Node.js 后端 http://127.0.0.1:3000

  • 原理:客户端不知道后端真实地址,所有请求都通过 Nginx 转发。这就是“反向代理”,在 Nginx 中通过 proxy_pass 实现。

  • 实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    server {
    listen 80;
    server_name example.com;

    location /api/ {
    proxy_pass http://127.0.0.1:3000/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    }
    }

负载均衡

  • 说明:
    • weight:权重,数值越大请求比例越高
    • down:临时下线
    • 支持多种负载均衡算法
      • 轮询(round-robin):默认方式
      • 加权轮询(weighted round-robin)
      • IP 哈希(ip_hash):会话保持
      • 最少连接(least_conn)
      • 一致性哈希(hash)
  • 实现:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    upstream backend_servers {
    server 127.0.0.1:3001 weight=3;
    server 127.0.0.1:3002 weight=1;
    server 127.0.0.1:3003 down;
    }

    server {
    listen 80;
    location /api/ {
    proxy_pass http://backend_servers;
    }
    }

SSL/TLS

  • 可以用 Let’s Encrypt 免费申请证书,通过 sudo certbot --nginx 自动配置
  • 实现:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/private.key;

    # 安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;

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

常用

前端常用场景总结:

场景 Nginx 配置功能
部署前端项目(React/Vue) 静态资源服务(root + index)
配置路由模式 history try_files $uri /index.html;
代理后端 API proxy_pass http://localhost:3000/
解决跨域问题 add_header Access-Control-Allow-Origin *;
前后端分离 动静分离配置
HTTPS 强制跳转 return 301 https://$host$request_uri;

问题

分类 考点
静态资源服务 root、index
反向代理 proxy_pass
路由重写 try_files
跨域处理 add_header
缓存控制 expires、Cache-Control
HTTPS 配置 ssl_certificate
性能优化 gzip、worker_processes

什么是 Nginx?作用是?

Nginx 是一个高性能的 Web 服务器,同时也作为反向代理、负载均衡器和静态资源服务器。在前端中 Nginx 通常用于:

  • 静态资源托管(HTML/CSS/JS/图片)
  • 接口请求的反向代理(解决跨域)
  • 前端路由的 history 模式支持
  • 简单的负载均衡(开发环境多服务)
  • HTTPS 证书管理

为什么前端项目要用 Nginx 部署,而不是 Node

优点:

  • 性能优势:Nginx 处理静态文件效率极高
  • 资源消耗:内存占用少,并发能力强
  • 稳定性:久经考验,故障率低

功能:

  • Nginx 负责高效分发静态资源
  • 支持路由控制、缓存、gzip 压缩
  • 可以代理 API 请求

对比:

项目 Nginx Node.js
类型 Web 服务器 应用服务器
语言 C JavaScript
主要用途 静态文件服务、反向代理 动态业务逻辑处理
优势 高并发、低内存、配置简单 灵活、逻辑可编程

实际上常搭配使用:Nginx 代理请求到 Node.js。

如何配置 Nginx 支持前端路由的 history 模式

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name your-domain.com;
root /var/www/dist;
index index.html;

location / {
# try_files 指令的作用:按顺序尝试文件路径,最终回退到 index.html 让前端路由接管
try_files $uri $uri/ /index.html;
}
}

如何配置 Nginx 解决跨域问题?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
server_name localhost;

location /api/ {
proxy_pass http://api-server:3000;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;

if ($request_method = 'OPTIONS') {
return 204;
}
}
}

如何用 Nginx 优化前端静态资源加载?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 缓存策略
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Vary "Accept-Encoding";
}

location ~* \.(html)$ {
expires 1h;
add_header Cache-Control "public";
}

# gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024;
gzip_comp_level 6;

开发环境中如何使用 Nginx?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 开发环境多项目代理
server {
listen 80;

location /project-a/ {
proxy_pass http://localhost:3001;
}

location /project-b/ {
proxy_pass http://localhost:3002;
}

location /mock-api/ {
proxy_pass http://localhost:3003;
}
}

Nginx服务器
https://xuekeven.github.io/2025/10/31/Nginx服务器/
作者
Keven
发布于
2025年10月31日
更新于
2025年11月3日
许可协议