文章目录
- 前言
- [一、NGINX 是什么?](#一、NGINX 是什么?)
- [二、为什么选择 NGINX?](#二、为什么选择 NGINX?)
- [三、安装 NGINX](#三、安装 NGINX)
-
- [1. 使用包管理器安装](#1. 使用包管理器安装)
- [2. 从源码编译安装](#2. 从源码编译安装)
- [四、NGINX 基本配置与工作原理](#四、NGINX 基本配置与工作原理)
-
- [1. 主要配置文件结构](#1. 主要配置文件结构)
- [2. 核心指令块](#2. 核心指令块)
- [3. 工作进程与事件模型](#3. 工作进程与事件模型)
- 五、反向代理
-
- [1. 基本反向代理示例](#1. 基本反向代理示例)
- [2. 路径转发与重写](#2. 路径转发与重写)
- 六、负载均衡
-
- [1. 轮询(默认)](#1. 轮询(默认))
- [2. 最少连接(least_conn)](#2. 最少连接(least_conn))
- [3. IP 哈希(ip_hash)](#3. IP 哈希(ip_hash))
- [4. 权重(weight)](#4. 权重(weight))
- [5. 健康检查](#5. 健康检查)
- 七、缓存与加速
-
- [1. 反向代理缓存](#1. 反向代理缓存)
- [2. 静态文件缓存](#2. 静态文件缓存)
- [3. Gzip 压缩](#3. Gzip 压缩)
- 八、SSL/TLS
-
- [1. 基本 SSL 配置](#1. 基本 SSL 配置)
- [2. 安全头部](#2. 安全头部)
- [3. 限流与防护](#3. 限流与防护)
- 九、日志与监控
-
- [1. 日志配置](#1. 日志配置)
- [2. 简易状态监控](#2. 简易状态监控)
- [十、NGINX 高级特性](#十、NGINX 高级特性)
-
- [1. WebSocket 代理](#1. WebSocket 代理)
- [2. gRPC 代理](#2. gRPC 代理)
- [3. Lua 扩展(OpenResty / ngx_lua)](#3. Lua 扩展(OpenResty / ngx_lua))
- [4. 动态模块](#4. 动态模块)
- [5. HTTP/2 与 HTTP/3 支持](#5. HTTP/2 与 HTTP/3 支持)
- [6. 反向代理上传大文件](#6. 反向代理上传大文件)
前言
NGINX 因其高并发、低内存消耗和丰富功能,已成为 Web 服务器、反向代理和负载均衡器中的佼佼者。
一、NGINX 是什么?
NGINX(Engine X)是一款高性能、高并发、开源的 HTTP 服务器,同时也可用作反向代理、负载均衡、邮件代理(IMAP/POP3)等。由 Igor Sysoev 于 2004 年开发,旨在解决 C10k(处理上万个并发连接)问题。
- 事件驱动架构:采用异步非阻塞的事件驱动模型,在高并发场景下表现优异,内存消耗相对较低。
- 模块化设计:核心功能加上多种可选模块,用户可以编译所需模块,或使用动态模块。
- 广泛应用:很多大型网站(如 Netflix、Airbnb、GitHub、腾讯、阿里等)都在使用 NGINX 作为前端网关或负载均衡器。
当客户端发来大量并发请求时,NGINX 的事件模型可以高效地调度网络 I/O,避免线程/进程过多导致的上下文切换开销。
二、为什么选择 NGINX?
- 高并发处理能力:事件驱动使其能处理数万并发连接,资源利用效率高。
- 低内存消耗:相比传统进程/线程模型,内存使用更可控。
- 灵活的反向代理和负载均衡功能:支持多种负载均衡算法(轮询、IP 哈希、最少连接等)及健康检查。
- 丰富的缓存支持:可做静态资源缓存、反向代理缓存,提升响应速度并减轻后端压力。
- 易于扩展:通过第三方模块(如 Lua、Image Filter、GeoIP2 等)满足不同需求。
- 稳定成熟:社区活跃,文档丰富,生态完善。
三、安装 NGINX
1. 使用包管理器安装
以 Ubuntu/Debian 为例:
bash
sudo apt update
sudo apt install -y nginx
安装后,服务通常自动启动。使用以下命令检查状态:
bash
sudo systemctl status nginx
在 CentOS/RHEL:
bash
sudo yum install -y epel-release
sudo yum install -y nginx
sudo systemctl enable --now nginx
2. 从源码编译安装
bash
# 安装依赖
sudo apt update
sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
# 下载 NGINX 源码(以 1.24.0 为例)
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# 配置编译选项(可根据需求添加模块或路径)
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-stream \
--with-stream_ssl_module \
--with-http_gzip_static_module
# 编译并安装
make
sudo make install
# 启动
sudo /usr/local/nginx/sbin/nginx
四、NGINX 基本配置与工作原理
1. 主要配置文件结构
- 主配置文件:
nginx.conf,通常位于/etc/nginx/nginx.conf或/usr/local/nginx/conf/nginx.conf。 - 其他配置:常将虚拟主机配置放在
conf.d/或sites-available/、sites-enabled/目录中。 - 日志文件:
access_log、error_log设置在配置文件内。
2. 核心指令块
events {}:设置事件模型,如worker_connections。http {}:HTTP 功能及模块配置,包括server{}、upstream{}、proxy_*、gzip等。stream {}:TCP/UDP 流量代理,用于非 HTTP 协议负载均衡(如数据库、MQ 代理)。mail {}:邮件代理配置(IMAP/POP3/SMTP)。
3. 工作进程与事件模型
worker_processes: 通常设置为 CPU 核心数或 auto。worker_connections: 每个 worker 可处理的并发连接数。- 异步事件驱动:使用 epoll/kqueue 等高效 I/O 多路复用。
五、反向代理
NGINX 常用作反向代理,将请求转发到后端应用服务器。
1. 基本反向代理示例
nginx
http {
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
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;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
}
}
}
upstream定义后端服务器组。proxy_pass转发请求。- 设置请求头确保后端可获知原始请求信息。
2. 路径转发与重写
-
location /api/ { proxy_pass http://backend/api/; } -
使用
rewrite做 URL 重写:nginxlocation /old/ { rewrite ^/old/(.*)$ /new/$1 permanent; }
六、负载均衡
1. 轮询(默认)
nginx
upstream backend {
server 192.168.0.101;
server 192.168.0.102;
server 192.168.0.103;
}
请求按顺序分配,简单易用。
2. 最少连接(least_conn)
nginx
upstream backend {
least_conn;
server 192.168.0.101;
server 192.168.0.102;
}
将请求发给当前活动连接数最少的后端,适合请求时间差异大的场景。
3. IP 哈希(ip_hash)
nginx
upstream backend {
ip_hash;
server 192.168.0.101;
server 192.168.0.102;
}
根据客户端 IP 分配后端,保证同一客户端请求分配到同一后端,有助于会话粘性。
4. 权重(weight)
nginx
upstream backend {
server 192.168.0.101 weight=3;
server 192.168.0.102 weight=1;
}
对后端分配比例进行控制,资源更强的服务器可配置更高权重。
5. 健康检查
-
NGINX 开源版需借助第三方模块(如 nginx-upstream-check-module);NGINX Plus 原生支持健康检查。
-
或通过配置
proxy_next_upstream、超时等,简单应对后端异常:nginxproxy_connect_timeout 2s; proxy_read_timeout 5s; proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
七、缓存与加速
1. 反向代理缓存
nginx
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_bypass $cookie_nocache $arg_nocache;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://backend;
}
}
}
proxy_cache_path配置缓存存储位置和大小。proxy_cache_valid设置不同响应码的缓存时长。proxy_cache_bypass控制绕过缓存。- 在响应头中添加
X-Cache-Status便于调试。
2. 静态文件缓存
对于静态资源,可利用 expires、add_header Cache-Control:
nginx
location ~* \.(js|css|png|jpg|jpeg|gif|svg)$ {
root /var/www/static;
expires 7d;
add_header Cache-Control "public";
}
3. Gzip 压缩
nginx
http {
gzip on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
通过压缩减少传输体积,加快加载。
八、SSL/TLS
1. 基本 SSL 配置
使用 Let's Encrypt 生成证书(示例工具 certbot),并在 NGINX 中配置:
nginx
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://backend;
...
}
}
- 强制 HTTP 跳转到 HTTPS。
- 开启 HTTP/2 提升多路复用性能。
2. 安全头部
nginx
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self';" always;
帮助防止点击劫持、MIME 类型混淆等问题。
3. 限流与防护
-
限制连接数、请求速率:
nginxhttp { limit_conn_zone $binary_remote_addr zone=addr:10m; limit_req_zone $binary_remote_addr zone=req:10m rate=5r/s; server { ... location /login { limit_conn addr 1; limit_req zone=req burst=10 nodelay; proxy_pass http://backend; } } } -
防止恶意请求:可结合 fail2ban、WAF(如 ModSecurity、OpenResty+Lua 规则)等。
九、日志与监控
1. 日志配置
-
access_log:记录请求信息,可自定义格式:nginxlog_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; error_log /var/log/nginx/error.log warn; -
通过日志分析工具(如 GoAccess、ELK、Fluentd)进行流量趋势、错误率分析。
2. 简易状态监控
在配置中开启:
nginx
server {
listen 127.0.0.1:8081;
server_name localhost;
location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}
}
访问 http://127.0.0.1:8081/nginx_status,得到活动连接、请求计数等信息。可配合 Prometheus 的 nginx-exporter 采集指标,或自定义脚本定期抓取。
十、NGINX 高级特性
1. WebSocket 代理
nginx
location /ws/ {
proxy_pass http://backend_ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
支持实时通信应用。
2. gRPC 代理
nginx
http {
upstream grpc_backend {
server 127.0.0.1:50051;
}
server {
listen 80 http2;
location / {
grpc_pass grpc://grpc_backend;
}
}
}
3. Lua 扩展(OpenResty / ngx_lua)
借助 Lua 脚本进行动态处理、ACL、灰度发布等:
nginx
server {
location /lua {
content_by_lua_block {
ngx.say("Hello from Lua!")
}
}
}
4. 动态模块
许多第三方模块可以按需编译成动态模块并通过 load_module 引入,如 ngx_brotli、ngx_pagespeed 等。
5. HTTP/2 与 HTTP/3 支持
- HTTP/2 可提高多路复用效率;HTTP/3(QUIC)需在较新版 NGINX 或使用第三方 patch/模块支持。
- 在生产中,可根据客户端支持情况逐步部署 HTTP/2;HTTP/3 目前生态仍在发展,可视需求尝试。
6. 反向代理上传大文件
设置较大 client_max_body_size:
nginx
http {
client_max_body_size 100m;
}
并调整相关超时,确保上传稳定。