Nginx 完全指南:高性能 Web 服务器与反向代理实战
Nginx(发音为 “engine x”)是一款轻量级、高性能的 Web 服务器和反向代理服务器,由俄罗斯程序员 Igor Sysoev 开发。凭借其事件驱动的异步架构,Nginx 在处理高并发连接时表现出色,已成为全球最流行的 Web 服务器之一,广泛用于静态资源服务、反向代理、负载均衡、API 网关等场景。
本文将带你从零开始在 Ubuntu 上安装和配置 Nginx,深入理解其核心概念,并通过实际案例掌握常见应用场景,助你打造高可用、高性能的 Web 服务。
1. Nginx 简介
Nginx 最初是为了解决 C10K 问题(同时处理一万个并发连接)而设计,其采用多进程 + 事件驱动的异步非阻塞模型,相比 Apache 的进程/线程模型,在内存占用和并发处理能力上优势明显。
主要功能:
- 静态文件服务:高效处理图片、CSS、JS 等静态资源
- 反向代理:将客户端请求转发到后端服务器(如 Tomcat、Node.js、Python 应用)
- 负载均衡:将请求分发到多个后端实例,提升可用性
- SSL/TLS 终止:处理 HTTPS 加密,减轻后端压力
- 缓存:缓存静态内容或后端响应,减少延迟
- URL 重写与重定向:灵活的路径控制
2. 安装 Nginx
2.1 使用 APT 安装(推荐)
Ubuntu 官方仓库中包含稳定版 Nginx,安装简单:
sudo apt updatesudo apt install nginx -y安装完成后,Nginx 服务会自动启动。检查状态:
sudo systemctl status nginx2.2 验证安装
访问服务器 IP 地址,若看到 Nginx 欢迎页,则安装成功。
curl http://localhost2.3 Nginx 服务管理
| 操作 | 命令 |
|---|---|
| 启动 | sudo systemctl start nginx |
| 停止 | sudo systemctl stop nginx |
| 重启 | sudo systemctl restart nginx |
| 重载配置 | sudo systemctl reload nginx |
| 开机自启 | sudo systemctl enable nginx |
3. Nginx 目录与文件结构
通过 APT 安装的 Nginx 主要目录如下:
| 路径 | 说明 |
|---|---|
/etc/nginx/ | 主配置目录 |
/etc/nginx/nginx.conf | 主配置文件 |
/etc/nginx/sites-available/ | 可用站点配置 |
/etc/nginx/sites-enabled/ | 已启用站点配置(软链接) |
/etc/nginx/conf.d/ | 额外配置文件 |
/var/www/html/ | 默认网站根目录 |
/var/log/nginx/ | 访问日志和错误日志 |
4. Nginx 配置文件结构
Nginx 配置文件采用层级结构,核心是 http 块,内部包含 server 块,server 块内可包含 location 块。
# /etc/nginx/nginx.conf 主配置文件结构
user www-data; # 运行用户worker_processes auto; # 工作进程数(通常等于CPU核心数)pid /run/nginx.pid;
events { worker_connections 768; # 每个工作进程最大连接数 multi_accept on;}
http { # 基础设置 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048;
include /etc/nginx/mime.types; default_type application/octet-stream;
# 日志格式 access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;
# 虚拟主机配置 include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;}4.1 server 块
一个 server 块定义一个虚拟主机,可监听不同端口或域名。
server { listen 80; # 监听端口 server_name example.com; # 域名 root /var/www/example.com; # 网站根目录 index index.html index.htm;
location / { try_files $uri $uri/ =404; }}4.2 location 块
location 块用于匹配 URL 路径,实现不同的处理逻辑。
location / { # 匹配根路径}
location /images/ { # 匹配以 /images/ 开头的路径}
location ~ \.php$ { # 正则匹配 .php 结尾的请求}5. 虚拟主机配置
5.1 创建网站目录
sudo mkdir -p /var/www/example.comsudo chown -R $USER:$USER /var/www/example.com创建测试页面:
echo "<h1>Hello from example.com</h1>" | sudo tee /var/www/example.com/index.html5.2 创建配置文件
在 /etc/nginx/sites-available/ 下创建配置文件 example.com:
server { listen 80; listen [::]:80; server_name example.com www.example.com;
root /var/www/example.com; index index.html index.htm;
location / { try_files $uri $uri/ =404; }}5.3 启用站点
创建软链接到 sites-enabled:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/5.4 测试配置并重载
sudo nginx -t # 测试配置文件语法sudo systemctl reload nginx此时通过域名或 IP 访问即可看到页面。
6. 反向代理配置
反向代理是 Nginx 最常用的功能之一,将客户端请求转发到后端应用服务器(如 Node.js、Java、Python)。
6.1 基础反向代理
将所有请求代理到本地的 http://localhost:3000:
server { listen 80; server_name api.example.com;
location / { proxy_pass http://localhost: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_set_header X-Forwarded-Proto $scheme; }}常用 proxy_set_header 指令用于传递客户端真实信息。
6.2 WebSocket 代理
WebSocket 需要特殊配置,增加升级头:
location /ws/ { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host;}7. 负载均衡
Nginx 支持多种负载均衡算法,将流量分发到多个后端服务器。
7.1 上游定义
在 http 块内定义上游服务器组:
upstream backend { server backend1.example.com weight=3; server backend2.example.com; server backend3.example.com backup; # 备份服务器}7.2 算法
- 轮询(默认):
server 192.168.1.1; server 192.168.1.2; - 权重轮询:
server 192.168.1.1 weight=3; server 192.168.1.2 weight=1; - IP 哈希(保持会话):
ip_hash; - 最少连接:
least_conn;
7.3 反向代理中使用
server { listen 80; server_name app.example.com;
location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }}8. HTTPS 配置(SSL/TLS)
8.1 使用 Let’s Encrypt 免费证书
安装 Certbot:
sudo apt install certbot python3-certbot-nginx -y申请并自动配置证书:
sudo certbot --nginx -d example.com -d www.example.comCertbot 会自动修改 Nginx 配置文件并启用 HTTPS。
8.2 手动配置 SSL
如果已有证书,可手动配置:
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt; ssl_certificate_key /etc/ssl/private/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/example.com; index index.html;}8.3 强制重定向 HTTP 到 HTTPS
server { listen 80; listen [::]:80; server_name example.com; return 301 https://$server_name$request_uri;}9. 缓存配置
Nginx 可以缓存静态文件或后端响应,减少重复请求。
9.1 浏览器缓存(静态资源)
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public, no-transform";}9.2 代理缓存
定义缓存路径和参数:
http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m inactive=60m; proxy_cache_key "$scheme$request_method$host$request_uri";
server { location / { proxy_cache mycache; proxy_cache_valid 200 302 60m; proxy_cache_valid 404 1m; proxy_pass http://backend; } }}10. 日志配置
Nginx 日志包括访问日志和错误日志,可自定义格式。
10.1 自定义日志格式
在 http 块中定义:
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;10.2 按站点区分日志
在 server 块中单独指定:
server { access_log /var/log/nginx/example.com.access.log main; error_log /var/log/nginx/example.com.error.log warn;}11. 性能优化
11.1 调整工作进程数
worker_processes 通常设为 CPU 核心数:
worker_processes auto;11.2 连接数优化
events { worker_connections 10240; multi_accept on;}11.3 开启 sendfile
sendfile on;tcp_nopush on;11.4 Gzip 压缩
gzip on;gzip_vary on;gzip_proxied any;gzip_comp_level 6;gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml image/svg+xml;11.5 客户端缓冲优化
client_max_body_size 100M;client_body_buffer_size 128k;client_header_buffer_size 1k;12. 安全加固
12.1 隐藏 Nginx 版本号
server_tokens off;12.2 限制请求方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 405;}12.3 限制 IP 访问
location /admin { allow 192.168.1.0/24; deny all;}12.4 禁用不安全的 SSL 协议
ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;ssl_prefer_server_ciphers off;13. 常见问题排查
| 问题 | 排查方法 |
|---|---|
| 配置测试失败 | sudo nginx -t 查看具体错误行号 |
| 502 Bad Gateway | 检查后端服务是否运行;查看 error.log |
| 404 Not Found | 检查 root 路径是否正确;检查 location 匹配规则 |
| 权限不足 | 确保 Nginx 用户(www-data)对网站目录有读取权限 |
| 端口被占用 | sudo netstat -tulpn | grep 80 查看占用进程 |
| 重定向循环 | 检查 HTTPS 重定向配置,避免循环跳转 |
14. 总结
Nginx 以其卓越的性能和灵活的配置,已成为现代 Web 架构中不可或缺的一环。本文从安装配置入手,介绍了虚拟主机、反向代理、负载均衡、HTTPS、缓存、性能优化等核心功能,覆盖了日常使用的大部分场景。
无论是作为静态服务器、API 网关,还是作为微服务架构的流量入口,Nginx 都能胜任。通过不断实践,你可以充分发挥其强大能力,构建高可用、高并发的 Web 服务。
进一步学习资源:
温馨提示:生产环境中务必定期备份配置文件,并保持 Nginx 版本更新,以获得最新的安全补丁和性能改进。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时









