Nginx学习笔记初始化配置文件Nginx 配置主要由四部分组成main全局、events连接处理、httpHTTP服务、server虚拟主机。示例# --- main 块 (全局配置) --- user nginx; # 运行用户 worker_processes auto; # 工作进程数auto通常等于CPU核数 error_log /var/log/nginx/error.log warn; # 错误日志路径及级别 pid /var/run/nginx.pid; # 进程ID文件 # --- events 块 (连接模型) --- events { worker_connections 1024; # 单个进程最大连接数 use epoll; # Linux下推荐的高效IO模型 } # --- http 块 (核心服务) --- http { include /etc/nginx/mime.types; # 引入MIME类型定义 default_type application/octet-stream; # 日志格式定义 log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent; access_log /var/log/nginx/access.log main; sendfile on; # 开启高效文件传输模式 keepalive_timeout 65; # 连接超时时间 # --- server 块 (虚拟主机) --- server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } } }我们这里主要关心http块和其中的sever块中的内容其他内容简单说明其他内容简单说明user nginx;user用于权限管理include /etc/nginx/mime.types; # 引入MIME类型定义 default_type application/octet-stream;mime当客户端请求一个文件时Nginx 会根据后缀名查找mime.types文件中的映射关系根据这个决定如何解析和展示数据。这里引入后并设置了兜底策略如果mime中没找到对应文件后缀名就二进制处理。日志格式中引用的内置变量$remote_addr: 客户端IP$request_uri: 完整的请求URI含参数$uri: 当前请求的URI不含参数$args: 请求中的参数部分$host: 请求头中的Host字段log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent; access_log /var/log/nginx/access.log main;先定义一个叫main的日志格式然后设置日志文件路径并应用这个格式。反向代理将客户端请求转发给后端服务器并隐藏后端真实地址。基础反向代理常用将特定路径的请求转发到后端服务。server { listen 80; server_name api.example.com; location / { # 【核心指令】转发地址 proxy_pass http://127.0.0.1:8080; # 【推荐配置】传递真实客户端信息给后端 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; } }路径重写代理location /api/ { # 注意末尾的斜杠这会自动去掉匹配到的 /api/ 前缀 # 例如/api/user - http://localhost:8080/user proxy_pass http://127.0.0.1:8080/; }缓存代理proxy_cache_path /data/nginx/cache levels1:2 keys_zonemy_cache:10m max_size1g inactive60m; server { location /static/ { proxy_pass http://127.0.0.1:8080/; proxy_cache my_cache; # 启用缓存区为my_cache proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟 proxy_cache_valid 404 1m; # 404缓存1分钟 add_header X-Cache-Status $upstream_cache_status; # 调试用显示是否命中缓存 } }proxy_cache_path /data/nginx/cache levels1:2 keys_zonemy_cache:10m max_size1g inactive60m;levels1:2 是缓存目录的层级结构。1:2表示生成两级子目录第一级目录名长度为 1第二级长度为 2。Nginx 会根据缓存 Key 的 MD5 值自动将文件分散到类似/data/nginx/cache/a/bc/xxxx这样的路径中极大提升 I/O 检索效率。keys_zonemy_cache:10m 内存索引区。开辟一块名为my_cache、大小为10MB的空间专门用来存放缓存的 Key 和元数据如过期时间、状态码等。Nginx 判断一个请求是否命中缓存时不需要去查磁盘而是直接查这块内存速度极快。max_size1g 缓存磁盘容量上限。限制整个缓存目录在磁盘上占用的最大空间为 1GB。inactive60m 非活跃淘汰时间。如果某个缓存文件在 60 分钟内没有被任何请求命中访问无论它是否已经过期都会被 Nginx 自动删除。$upstream_cache_status有几个常见的值HIT命中缓存直接返回后端未受压。MISS未命中缓存去后端取数据并准备缓存。EXPIRED缓存已过期重新去后端取数据并更新缓存。STALE使用了过期的旧缓存通常发生在后端宕机时的降级处理。负载均衡将流量分发到多台后端服务器避免单点故障。需配合upstream模块使用。轮询默认策略主流upstream backend_cluster { server 192.168.1.10:8080; server 192.168.1.11:8080; server 192.168.1.12:8080; } server { location / { proxy_pass http://backend_cluster; } }权重轮询Weight主流upstream backend_cluster { server 192.168.1.10:8080 weight5; # 处理50%流量 server 192.168.1.11:8080 weight3; # 处理30%流量 server 192.168.1.12:8080 weight2; # 处理20%流量 }IP Hash会话保持upstream backend_cluster { ip_hash; # 开启IP哈希 server 192.168.1.10:8080; server 192.168.1.11:8080; }最少连接数least_connupstream backend_cluster { least_conn; # 开启最少连接 server 192.168.1.10:8080; server 192.168.1.11:8080; }响应最快least_timeupstream backend_cluster { least_time first_byte; # 根据接收第一个字节的时间来判断谁最快 server 192.168.1.10:8080; server 192.168.1.11:8080; }健康检查与备用机upstream backend_cluster { server 192.168.1.10:8080 max_fails3 fail_timeout30s; # 失败3次暂停30秒 server 192.168.1.11:8080 backup; # 仅当其他机器全挂时才启用 server 192.168.1.12:8080 down; # 标记为永久不可用维护中 }动静分离将静态资源HTML/CSS/JS/图片与动态请求API分开处理由 Nginx 直接响应静态资源极大提升速度。基于目录分离最直观主流server { listen 80; server_name www.example.com; # 1. 动态请求 - 转发给 Java/Node 后端 location /api/ { proxy_pass http://127.0.0.1:8080; } # 2. 静态请求 - Nginx 直接读取本地文件 location /static/ { alias /opt/web/static/; # root /opt/web/ expires 30d; # 浏览器缓存30天 access_log off; # 关闭静态资源日志减少IO } # 3. 首页兜底 location / { root /opt/web/dist; index index.html; try_files $uri $uri/ /index.html; # SPA应用必备防止刷新404 } }location /static/带斜杠仅匹配以/static/开头的请求。✅ 能命中/static/css/app.css、/static/js/main.js、/static/❌ 不能命中/static没有结尾斜杠、/statics拼写不同location /static不带斜杠匹配所有以/static开头的请求包括/static、/static/、/statics、/static123等。⚠️ 风险可能误匹配到非预期路径如/statics或/static_backup基于后缀名分离# 匹配常见静态资源后缀 location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2)$ { root /opt/web/assets; # 优先查找磁盘上预先压缩好的 .gz 文件 gzip_static on; # 如果没有压缩就压缩 gzip on; # 小于1kb的文件不压缩 gzip_min_length 1k; expires 7d; add_header Cache-Control public, max-age604800, no-transform; # 静态资源没必要记录日志 access_log off; }public允许所有节点缓存适用于对所有用户都完全相同的静态资源如果设置为private则只允许终端用户的浏览器缓存CDN 等共享缓存节点不能缓存通常用于包含用户个人敏感信息的页面max-age604800有效期为 7 天604800秒no-transform禁止中间节点修改内容防止二次压缩、防止视频/音频转码跨域资源共享CORS配置location /api/ { if ($request_method OPTIONS) { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, POST, OPTIONS; add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization; add_header Access-Control-Max-Age 1728000; add_header Content-Type text/plain; charsetutf-8; add_header Content-Length 0; return 204; # 预检请求直接返回204 } # 正常转发 proxy_pass http://backend; add_header Access-Control-Allow-Origin *; # 实际请求也要加 }