Nginx 从入门到进阶:反向代理、负载均衡与高性能实战指南

Nginx 从入门到进阶:反向代理、负载均衡与高性能实战指南

面向小白的由浅入深教程:5 分钟跑起来,30 分钟玩转常见场景,进一步掌握 HTTPS、缓存压缩、限流与排错思路。


目录

一、Nginx 是什么?

  • 一个高性能的 Web 服务器与反向代理,擅长并发连接与静态资源分发。
  • 常用场景:静态托管、反向代理、负载均衡、SSL 终止、动静分离、网关限流与安全加固。

二、快速开始(本地最小可用)

  • 安装(Windows/Mac/Linux 按官方文档或包管理器)。
  • 启动与验证:
    • 运行 nginx(或 brew services start nginx
    • 访问 http://localhost 看到欢迎页即成功。
  • 常见命令:nginx -t(测试配置)、nginx -s reload(热加载)、nginx -v(版本)。

三、核心配置结构速览

Nginx 的主配置通常位于 nginx.conf,常见块:

  • events:连接与并发参数
  • http:Web 相关配置(包含多个 server
  • server:一个虚拟主机(域名/端口)
  • location:匹配路径并定义转发/静态规则

示例:

nginx 复制代码
worker_processes auto;

http {
  include       mime.types;
  sendfile      on;

  server {
    listen      80;
    server_name localhost;

    # 静态托管
    location / {
      root   html;
      index  index.html index.htm;
    }
  }
}

四、反向代理与动静分离

nginx 复制代码
http {
  upstream app_pool {
    server 127.0.0.1:3000;
  }

  server {
    listen 80;
    server_name example.com;

    # 动态请求转发给后端
    location /api/ {
      proxy_pass http://app_pool/;
      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 /assets/ {
      alias /var/www/assets/;
      access_log off;
      expires 7d;
    }
  }
}

要点:

  • proxy_pass 目标要以 / 结尾时会影响路径拼接方式;保持与 location 一致更直观。
  • aliasroot 区别:alias 替换整个匹配段,root 拼接路径。

五、负载均衡(轮询/权重/健康检查)

nginx 复制代码
upstream app_pool {
  # 默认轮询
  server 10.0.0.11:3000 weight=2;
  server 10.0.0.12:3000 weight=1;
  # 可选:ip_hash; least_conn;(按需启用)
}

server {
  listen 80;
  location / {
    proxy_pass http://app_pool;
  }
}
  • 策略:默认轮询、ip_hash(会话亲和)、least_conn(最少连接)。
  • 健康检查:开源模块或在上游层面(如 Kubernetes/Consul)完成,更可靠。

六、HTTPS 与 HTTP/2

nginx 复制代码
server {
  listen 443 ssl http2;
  server_name example.com;

  ssl_certificate     /etc/nginx/ssl/fullchain.pem;
  ssl_certificate_key /etc/nginx/ssl/privkey.pem;

  add_header Strict-Transport-Security "max-age=31536000" always;

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

# 80 跳转到 443
server {
  listen 80;
  server_name example.com;
  return 301 https://$host$request_uri;
}

要点:

  • 使用可信证书;启用 http2 获取多路复用与头部压缩收益。
  • 建议加 HSTS 与安全响应头;证书自动化可用 ACME(Let's Encrypt)。

七、性能优化:缓存与压缩

nginx 复制代码
http {
  # Gzip 压缩
  gzip on;
  gzip_types text/plain text/css application/javascript application/json image/svg+xml;
  gzip_min_length 1024;

  server {
    # 静态资源强缓存
    location /assets/ {
      alias /var/www/assets/;
      expires 30d;
      add_header Cache-Control "public, max-age=2592000, immutable";
    }

    # 反向代理缓存(示例)
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m use_temp_path=off;
    location /api/cacheable/ {
      proxy_cache mycache;
      proxy_cache_valid 200 10m;
      add_header X-Cache-Status $upstream_cache_status;
      proxy_pass http://app_pool;
    }
  }
}

八、限流与安全基础

nginx 复制代码
http {
  # 基于 IP 的简单限流
  limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;

  server {
    location /api/ {
      limit_req zone=perip burst=20 nodelay;
      proxy_pass http://app_pool;
    }

    # 基础安全头
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;
    add_header Referrer-Policy no-referrer;
  }
}

九、日志与排错

  • 测试配置:nginx -t;查看错误日志 error.log 与访问日志 access.log
  • 常见问题:
    • 502/504:后端不通或超时,检查上游健康与超时设置(proxy_read_timeout)。
    • 路径拼接错:确认 locationproxy_pass 尾部斜杠匹配。
    • 权限问题:静态目录与证书文件的读权限。

十、实践清单(建议)

  • 搭建一个静态站点与一个后端服务,完成动静分离。
  • /api/ 配置负载均衡与简单限流,验证高并发下表现。
  • 启用 HTTPS/HTTP2 与 Gzip,观察带宽与 TTFB 改善。
  • 打开代理缓存,给可缓存的 GET 接口加速。

彩蛋:梗版总结(轻松读法)

  • 把 Nginx 当"前台小管家":看门(监听端口)、带客(反向代理)、分座(负载均衡)、发扇子(压缩)、送冰阔落(缓存)。
  • location 像"区域导览牌",别把 aliasroot 搞反,不然客人迷路;
  • proxy_pass 末尾斜杠像"门缝",开大开小影响你鞋是不是被卡住(路径拼接);
  • 502/504 就像后厨断电或上菜太慢,先查电闸(上游)再看计时器(超时)。
  • HTTPS 像给餐厅装玻璃门:看得见更安全,还更快(HTTP/2);
  • 限流是"限量供应",别让黄牛(恶意请求)把座位全占了。
相关推荐
evo-master1 天前
linux问题10--克隆后ip地址和源linux主机相同
linux·运维·服务器
sayhi_yang1 天前
服务器上搭建支持GPU的DL+LLM Docker镜像
运维·服务器·docker
一匹电信狗1 天前
【MySQL】数据库基础
linux·运维·服务器·数据库·mysql·ubuntu·小程序
FL16238631291 天前
VMware运行python脚本提示libGL error: MESA-LOADER: failed to open swrast
linux·运维·服务器
致宏Rex1 天前
Docker 完整教程 | 从基础到实战 (1-2)
运维·docker·容器
東雪蓮☆1 天前
Dockerfile 镜像构建实战
linux·运维·docker
未来之窗软件服务1 天前
操作系统应用开发(十四)RustDesk服务器配置——东方仙盟筑基期
运维·服务器·远程桌面·rustdesk·仙盟创梦ide·东方仙盟
東雪蓮☆1 天前
Docker 资源限制与性能优化(CPU / 内存 / IO 管控实战)
linux·运维·docker
爱码社长1 天前
centos8安装docker【新】
运维·docker·容器
ms72wx1 天前
拥抱终端:Linux 新手命令行入门指南
linux·运维·服务器