Skip to content

Nginx 必知必会

使用 Docker 启动 Nginx

bash
docker run -d \
  --name ng \
  -p 8080:80 \
  -v $(pwd)/html:/usr/share/nginx/html \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf \
  -v $(pwd)/conf.d:/etc/nginx/conf.d \
  nginx
  • 挂载本地静态资源:-v $(pwd)/html:/usr/share/nginx/html
  • 挂载自定义 nginx.conf:-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro 只读挂载,避免误改(保护本地的文件不被“容器内部”修改)
重启 Nginx 的两种方式
  1. 进入容器重启 Nginx 进程
bash
docker exec -it ng /bin/bash

vi /etc/nginx/nginx.conf
nginx -t
nginx -s reload
  1. 直接重启 Nginx 容器
bash
docker restart ng

静态资源服务器

TODO

反向代理

TODO

负载均衡

负载均衡

当网关用。多个后端实例时,nginx 自动分发请求,让服务更稳、更抗压

例子:

  • 3 个 Node 实例组成一个 cluster
  • 后端升级时慢慢滚动更新
  • 高并发峰值时自动均衡压力

虚拟主机

nginx 的虚拟主机 = 多个 server 块

两种分流方式:

  1. 基于域名(name-based virtual host)
  2. 基于端口(port-based virtual host)

基于域名

server {
    listen 80;
    server_name a.com;

    root /var/www/a;
}

server {
    listen 80;
    server_name b.com;

    root /var/www/b;
}
  • 访问 a.com -> 第一个 server
  • 访问 b.com -> 第二个 server
案例:只有一个域名但要区分 API 和 Web
  1. 子域名方式(基于域名的虚拟主机)
server {
    listen 80;
    server_name www.xxx.com;
    root /var/www/web;
}

server {
    listen 80;
    server_name api.xxx.com;

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

结果:你有一个主域名 xxx.com,但你创建两个子域名

  • www.xxx.com 给 Web
  • api.xxx.com 给 API

两者端口都还是 80 / 443,不变

  1. 路径方式(基于 location)
server {
    listen 80;
    server_name xxx.com;

    location / {
        root /var/www/web;
    }

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

结果:还是同一个域名,同端口,但通过路径区分

  • xxx.com/ -> Web
  • xxx.com/api/ -> API

基于端口

server {
    listen 8080;
    root /var/www/project1;
}

server {
    listen 8081;
    root /var/www/project2;
}
  • http://localhost:8080 -> project1
  • http://localhost:8081 -> project2

跨域请求

TODO

限流

你可以给接口设置 QPS 限制,硬控流量

例子:

  • 登录接口 10 秒最多 5 次
  • 防止脚本暴力刷接口
  • 大促期间防止把后端打死

nginx 的限流有两套核心机制:

  • 漏桶限流(limit_req) → 控制 QPS / 高频接口
  • 并发连接数限制(limit_conn) → 控制同时连接数量

应用网关

微服务场景,作为应用网关

小团队不想上 Kong/Zuul/Nginx Plus 的时候,nginx 可充当轻量 API Gateway

例子:

  • 统一鉴权
  • 统一跨域控制
  • 统一日志
  • 统一入口路由