Appearance
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 的两种方式
- 进入容器重启 Nginx 进程
bash
docker exec -it ng /bin/bash
vi /etc/nginx/nginx.conf
nginx -t
nginx -s reload- 直接重启 Nginx 容器
bash
docker restart ng静态资源服务器
TODO
反向代理
TODO
负载均衡
负载均衡
当网关用。多个后端实例时,nginx 自动分发请求,让服务更稳、更抗压
例子:
- 3 个 Node 实例组成一个 cluster
- 后端升级时慢慢滚动更新
- 高并发峰值时自动均衡压力
虚拟主机
nginx 的虚拟主机 = 多个 server 块
两种分流方式:
- 基于域名(name-based virtual host)
- 基于端口(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
- 子域名方式(基于域名的虚拟主机)
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给 Webapi.xxx.com给 API
两者端口都还是 80 / 443,不变
- 路径方式(基于 location)
server {
listen 80;
server_name xxx.com;
location / {
root /var/www/web;
}
location /api/ {
proxy_pass http://backend:3000/;
}
}结果:还是同一个域名,同端口,但通过路径区分
xxx.com/-> Webxxx.com/api/-> API
基于端口
server {
listen 8080;
root /var/www/project1;
}
server {
listen 8081;
root /var/www/project2;
}http://localhost:8080-> project1http://localhost:8081-> project2
跨域请求
TODO
限流
你可以给接口设置 QPS 限制,硬控流量
例子:
- 登录接口 10 秒最多 5 次
- 防止脚本暴力刷接口
- 大促期间防止把后端打死
nginx 的限流有两套核心机制:
- 漏桶限流(limit_req) → 控制 QPS / 高频接口
- 并发连接数限制(limit_conn) → 控制同时连接数量
应用网关
微服务场景,作为应用网关
小团队不想上 Kong/Zuul/Nginx Plus 的时候,nginx 可充当轻量 API Gateway
例子:
- 统一鉴权
- 统一跨域控制
- 统一日志
- 统一入口路由