Nginx 入门教程:从安装到配置反向代理与负载均衡
1. 什么是 Nginx?
Nginx 是一个高性能的 HTTP 服务器 和 反向代理服务器,同时也可以作为邮件代理服务器。它的特点包括:
- 高并发,低内存消耗(采用异步非阻塞事件驱动模型)
- 热部署(不中断服务即可升级配置或可执行文件)
- 丰富的功能:负载均衡、静态文件服务、缓存、SSL/TLS 支持等
适用场景:静态网站托管、API 网关、负载均衡器、反向代理缓存。
2. Nginx 请求处理流程
下面用一张流程图展示 Nginx 接收到客户端请求后的核心处理路径:
HTTP 请求
解析配置
静态文件
代理转发
重定向
客户端
Nginx 主进程
匹配 location 块
返回本地文件
如 HTML/CSS/JS/图片
反向代理到
后端服务器群
返回 3xx 重定向
Upstream 负载均衡
后端服务器 1
后端服务器 2
接收响应
解释:
- Nginx 根据请求的 URL 匹配
location规则; - 如果是静态文件请求,直接返回本地磁盘文件;
- 如果是动态请求,则反向代理至一组后端服务器(如 Node.js、Java、Python 应用);
- 支持负载均衡策略(轮询、最少连接、IP Hash 等)。
3. 安装 Nginx
3.1 在 Ubuntu/Debian 上安装
bash
sudo apt update
sudo apt install nginx -y
3.2 在 CentOS / RHEL 上安装
bash
sudo yum install epel-release -y
sudo yum install nginx -y
3.3 在 macOS 上安装
bash
brew install nginx
3.4 验证安装
bash
nginx -v # 显示版本号
sudo systemctl start nginx # 启动(Linux systemd)
浏览器访问 http://你的服务器IP,看到 Welcome to nginx 页面即成功。
4. Nginx 配置文件结构
主配置文件路径:/etc/nginx/nginx.conf(Linux)或 /usr/local/etc/nginx/nginx.conf(macOS)。
典型的配置文件层次结构:
包含
包含
http块
nginx.conf
conf.d/ *.conf
sites-enabled/*.conf
HTTP 配置块
server 块 - 虚拟主机
location /
location /api
核心配置块说明:
| 块 | 作用 |
|---|---|
events |
配置工作进程连接数、事件模型 |
http |
所有 HTTP 相关配置的顶层容器 |
server |
定义一个虚拟主机(类似 Apache 的 VirtualHost) |
location |
匹配特定 URL 路径,并定义处理方式 |
5. 第一个配置:托管静态网站
假设你的静态文件放在 /var/www/mysite,目录结构:
/var/www/mysite/
├── index.html
├── css/
└── images/
编辑 /etc/nginx/sites-available/default 或新建一个配置文件 /etc/nginx/conf.d/mysite.conf:
nginx
server {
listen 80; # 监听端口
server_name example.com; # 域名(本地测试可改为 localhost)
root /var/www/mysite; # 静态文件根目录
index index.html; # 默认首页文件
location / {
try_files $uri $uri/ =404; # 尝试直接返回文件,否则 404
}
}
测试配置并重载:
bash
sudo nginx -t # 语法检查
sudo systemctl reload nginx
访问 http://example.com 即可看到 index.html 内容。
6. 反向代理配置
什么是反向代理?
客户端请求 Nginx,Nginx 将请求转发给内部的一个或多个后端服务器,再将后端响应返回给客户端。后端服务器对客户端不可见。
典型场景:前端 Nginx 代理后端 Node.js(运行在 3000 端口)。
nginx
server {
listen 80;
server_name api.myapp.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;
}
}
常用代理参数解释:
proxy_pass:转发目标地址proxy_set_header:修改转发请求的头部,保证后端获取真实 IP、协议等
7. 负载均衡
需求:同一个应用部署在多台服务器上(如 3 个 Node.js 实例),Nginx 作为入口将流量分发。
nginx
upstream backend_servers {
# 负载均衡策略默认为轮询(round-robin)
server 192.168.1.10:3000 weight=3; # weight 越大权重越高
server 192.168.1.11:3000;
server 192.168.1.12:3000 backup; # 备份服务器,平时不转发
}
server {
listen 80;
server_name loadbalance.demo.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
}
}
支持的负载均衡算法:
- 轮询(默认)
least_conn:最少连接数ip_hash:同一客户端 IP 固定到同一台后端(解决 session 问题)hash:自定义 key 哈希
8. HTTPS 配置(SSL/TLS)
假设你已经通过 Let's Encrypt 获得证书文件(fullchain.pem 和 privkey.pem),或使用自签名证书。
nginx
server {
listen 443 ssl http2;
server_name secure.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /var/www/secure_site;
index index.html;
}
}
# 强制将 HTTP 重定向到 HTTPS
server {
listen 80;
server_name secure.example.com;
return 301 https://$host$request_uri;
}
验证配置并重载,用 https:// 访问测试。
9. 常用运维命令
| 命令 | 作用 |
|---|---|
nginx -t |
检查配置文件语法是否正确 |
nginx -s reload |
平滑重载配置(不中断请求) |
nginx -s stop |
快速停止 |
nginx -s quit |
优雅停止(处理完当前请求再退出) |
systemctl restart nginx |
重启服务(会短暂中断,慎用) |
tail -f /var/log/nginx/access.log |
实时查看访问日志 |
tail -f /var/log/nginx/error.log |
实时查看错误日志 |
10. 完整示例:动静分离 + 负载均衡
假设:
- 所有静态资源(
/static/*)由 Nginx 直接返回 - 动态请求(
/api/*)转发给后端负载均衡组
nginx
upstream api_servers {
least_conn;
server 10.0.1.10:8080;
server 10.0.1.11:8080;
}
server {
listen 80;
server_name www.myapp.com;
# 静态资源
location /static/ {
root /var/www/myapp;
expires 30d; # 缓存30天
add_header Cache-Control "public, immutable";
}
# 动态 API
location /api/ {
proxy_pass http://api_servers;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 首页
location / {
root /var/www/myapp;
index index.html;
}
}
11. 排错小技巧
- 403 Forbidden :检查用户权限(Nginx 工作进程用户如
www-data是否有读取文件权限);或者索引文件缺失。 - 502 Bad Gateway :后端代理服务未启动或网络不通,检查
proxy_pass地址。 - 404 Not Found :
root路径错误或location匹配规则不正确。 - 无法看到修改生效 :执行
nginx -t检查语法,然后nginx -s reload;若仍不生效,检查浏览器缓存。
结语
通过本教程你应该已经掌握了 Nginx 的核心概念和常用配置。Nginx 非常强大,还可以深入学习 限流、缓存、gzip压缩、安全头配置、WebSocket 代理 等高级主题。建议在自己的虚拟机或云服务器上动手实践,配合 curl -v 和日志分析,会理解得更深刻。