Nginx
1.1 Nginx 简介
- nginx 是一个高性能的HTTP和反向代理web服务器
- 其特点是占用内存小,并发能力强,支持热部署(修改配置升级版本不需要停机)
1.2 Nginx 作用
- 正向代理和反向代理区别
- 正向代理是代理客户端的(如VPN),服务器不知道真实的客户端是谁
- 反向代理是代理服务端的(如Nginx),客户端不知道真实的后端服务器是谁
- 负载均衡
- 将请求按照一定的策略,分发给服务器,减轻服务器处理请求的压力
- 常用策略:
- 轮询
- 权重:根据服务器的权重来转发请求
- IP Hash:对每个请求的IP使用Hash算法,确保同一个IP始终访问同一个服务器(解决Session登录态丢失的问题,但是如果这台服务器挂了之后Session会丢失,推荐使用Redis或JWT解决Session共享的问题)
- Least Conn:谁现在空闲,给谁发
- 动静分离
- Nginx处理静态资源(
.jpg,.html),而动态请求(接口查询),则通过proxy_pass转发,减轻后端压力
- Nginx处理静态资源(
1.3 Nginx 常用命令
| 命令 | 作用 |
|---|---|
nginx -t | 最常用。测试配置文件语法是否正确。 |
nginx -s reload | 不重启服务的情况下,重新加载配置。 |
nginx -s stop | 强制停止。 |
tail -f /var/log/nginx/error.log | 排查报错。看最新的错误日志。 |
1.4 Nginx配置
nginx配置文件结构
Nginx 的配置是层级结构的:
- Main (全局块):配置运行用户、工作进程数(worker_processes)、错误日志路径。
- Events (事件块):配置每个进程的最大连接数。
- Http (HTTP 块):
- Upstream (负载均衡块):定义服务器组。
- Server (虚拟主机块):定义一个网站(监听哪个端口、哪个域名)。
- Location (路由块):定义具体的路0径匹配规则(比如
/api走代理,/static走文件系统)。
- Location (路由块):定义具体的路0径匹配规则(比如

使用
- Upstream 块:后端资源池配置
upstream块定义了后端服务器集群,负责“请求分发策略”。nginx# 定义后端服务器组,命名为 my_backend upstream my_backend { # 策略 1:ip_hash (可选) # 每个请求按访问 IP 的 hash 结果分配,使同一客户端固定访问一台后端,解决 Session 共享问题 ip_hash; # 策略 2:轮询与权重 # weight:权重,数值越高被分配的概率越大,适合服务器硬件性能不一的情况 server 192.168.1.10:8080 weight=5; # 策略 3:健康检查与故障转移 # max_fails:最大失败次数,超过后认为该服务器不可用 # fail_timeout:在规定时间内如果失败次数达到上限,该服务器将被暂停服务 server 192.168.1.11:8080 max_fails=3 fail_timeout=30s; # 策略 4:备用机 # backup:热备,只有当上面的服务器全线崩溃时,才会启用这一台 server 192.168.1.12:8080 backup; # 策略 5:停机维护 # down:手动标记某台服务器暂时不参与负载均衡 server 192.168.1.13:8080 down; # 策略 6:长连接保持 # keepalive:设置与后端服务器保持的空闲长连接最大数量,提高并发性能 keepalive 32; }- Server 块:站点服务与代理配置
server块负责监听端口、匹配域名,并决定请求该“读本地文件”还是“转给后端”。nginxserver { # --- 基础配置 --- listen 80; # 监听 IPv4 的 80 端口 server_name www.example.com; # 匹配的域名,支持多个,空格隔开 charset utf-8; # 设置响应编码,防止中文乱码 # --- 性能优化配置 --- client_max_body_size 20m; # 允许客户端上传文件的最大值,防止 413 报错 gzip on; # 开启 Gzip 压缩,减少网络传输流量 gzip_types text/plain application/javascript text/css; # 压缩的文件类型 # --- 日志配置 --- access_log /var/log/nginx/access.log; # 记录访问请求日志 error_log /var/log/nginx/error.log; # 记录错误信息日志 # --- 静态资源处理 (前端部署) --- location / { root /usr/share/nginx/html; # 项目在磁盘上的真实路径 #请求路径: http://example.com/static/logo.png #实际查找路径: /var/www/app/static/logo.png #即:root + location + 文件名 #注意区分 alias: 如果使用 alias,Nginx 会替换掉匹配到的路径。如果是 alias /var/www/app/;,同样的请 求会去 /var/www/app/logo.png 找(去掉了 /static/)。 index index.html index.htm; # 默认的入口文件名 # SPA 核心配置:如果路径不存在,重定向到 index.html,防止 Vue 路由刷新 404 try_files $uri $uri/ /index.html; # 缓存设置:对 html 不缓存,对静态资源(js/css)设置长缓存 if ($request_filename ~* .*\.(?:htm|html)$) { add_header Cache-Control "no-cache"; } } # --- 动态请求转发 (接口代理) --- location /api/ { # 转发目标:指向上方定义的 upstream 名称 proxy_pass http://my_backend; # 头部信息透传:确保后端能拿到客户端的原始信息 proxy_set_header Host $host; # 传递原始域名 proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链路 IP # 超时设置:防止后端卡死导致 Nginx 挂起 proxy_connect_timeout 60s; # 与后端建立连接的超时时间 proxy_read_timeout 60s; # 后端处理完毕返回数据的超时时间 proxy_send_timeout 60s; # 发送数据给后端的超时时间 } # --- 错误处理 --- error_page 404 /404.html; # 当出现 404 时显示的页面 error_page 500 502 503 504 /50x.html; # 当服务器报错时显示的页面 location = /50x.html { root /usr/share/nginx/html; } }- 查阅小清单 (Best Practices)
- 分文件管理:不要把所有
server都塞在nginx.conf里。建议在/etc/nginx/conf.d/目录下为每个项目创建一个.conf文件。 - 修改即测试:每次改完配置文件,必须执行
nginx -t检查语法。 - 平滑生效:使用
nginx -s reload代替restart,这样不会中断已经在运行的连接。 - 安全建议:在生产环境中,建议再增加一个
server块监听 443 端口,配置 SSL 证书(HTTPS)。
location匹配符(决定优先级)
匹配符 含义 优先级 备注 =精确匹配 1 (最高) 必须完全一致,如 location = /login^~优先前缀匹配 2 匹配成功后,立即停止往下搜索正则 ~区分大小写正则 3 按照在配置文件中出现的先后顺序匹配 ~\*不区分大小写正则 3 同上 /普通前缀匹配 4 (最低) 如果没有正则匹配中,最后才用它