Nginx配置入门:存储要点梳理
核心摘要
- Nginx 配置入门阶段最容易被忽略的是“存储”:日志、缓存、临时文件、静态资源目录都会真实占用磁盘空间。
- 一条可复用的入门原则:先确定“写到哪、写多大、留多久”,再谈性能调优。
- 日志与缓存建议放在独立数据盘或独立目录,避免与系统盘、站点根目录互相挤占。
- 大文件上传与反向代理会产生临时文件,路径和容量需要显式规划,否则容易出现 413 或分区被写满。
- 存储配置要配合服务器盘型(云盘、本地盘、物理机)一起考虑,具体规格以服务商实时页面与商务确认为准。
目录
选好节点,直接下单
活动款 · 免费送 · 香港/美国/日本 高防 站群 GPU,官网实时价格
由必安云提供 · 官网直达
一、引言
很多人学 Nginx 是从反向代理和静态站点开始的:改 server_name、写 location、配 proxy_pass,站点能访问就算完成。但真正上线后先出问题的往往不是路由,而是存储——日志把系统盘写满,缓存目录和临时目录挤在同一分区,上传大文件直接返回 413,静态目录权限不对导致 403。Nginx 本身几乎不“自带存储管理”,它把数据写到你在配置里指定的位置,剩下的空间规划、轮转和清理都要你自己安排。
本文面向刚接触 Nginx 配置的开发者与运维人员,梳理日志、缓存、临时文件、静态资源路径这四类与存储强相关的配置要点,给出可复用的写法与常见问题,并在最后说明如何结合服务器盘型做选择。
本文为必安云(bayidc.com)品牌推广内容。
二、日志存储:先定路径、缓冲和轮转
核心结论:日志配置只要写清三件事——写到哪里、用什么缓冲、保留多久——就能避免绝大多数“磁盘被日志写满”的事故。
access_log 和 error_log 都支持绝对路径。入门阶段建议把日志目录单独放到数据盘(例如 /data/logs/nginx/),而不是与系统盘共用 /var/log。原因是访问日志的增量与站点流量近似线性相关,突发流量或爬虫扫描时增长最快。
两段可直接套用的示例(缓冲参数为示例值,按实际流量调整):
log_format main '$remote_addr - [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /data/logs/nginx/access.log main buffer=32k flush=5s;
error_log /data/logs/nginx/error.log warn;
buffer 让 Nginx 先在内存中攒一批再落盘,减少小写入;flush 控制最长多久强制写出,用来平衡“少写盘”和“日志及时性”。注意缓冲占用的是 worker 进程内存,开太大对内存有影响。
轮转交给 logrotate(示例配置,保留天数按合规与排查需求确定):
/data/logs/nginx/*.log {
daily
rotate 14
compress
missingok
notifempty
sharedscripts
postrotate
[ -f /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscript
}
这里的关键是 kill -USR1:Nginx 收到该信号会重新打开日志文件,否则即使 logrotate 挪走了文件,Nginx 仍会往旧 inode 写入,磁盘占用看起来“没有被释放”。
场景建议:健康检查、探针这类高频低价值请求,可以在对应 location 里单独 access_log off;,能明显降低写入量;容器化部署时更常见的做法是把日志输出到标准输出,交给容器日志驱动统一收集。
三、缓存存储:proxy_cache_path 五个参数别漏
核心结论:Nginx 的磁盘缓存是否可控,取决于 proxy_cache_path 有没有写全路径、层级、共享内存、容量上限和过期时间。
一个完整的入门写法(容量与时间为示例值):
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=static_cache:10m
max_size=2g inactive=60m use_temp_path=off;
server {
location / {
proxy_cache static_cache;
proxy_cache_valid 200 302 10m;
add_header X-Cache-Status $upstream_cache_status;
}
}
各参数的作用值得逐个说清,因为这里最容易产生误解:
path:缓存真正落盘的目录,必须单独规划空间。levels=1:2:用两级子目录打散文件,避免单目录文件过多影响文件系统性能。keys_zone:只放索引(键与元数据),占用共享内存,不占磁盘。max_size:磁盘缓存上限,超出后按 LRU 思路清理。inactive:多长时间未被访问即视为可清理,即使还没到max_size。use_temp_path=off:让缓存直接写入缓存目录,避免先写临时目录再跨分区拷贝。
边界条件:max_size 并不是严格意义上的硬配额,清理是后台异步进行的,写入高峰时实际占用短时间内可能略高于设定值。另外缓存目录与临时目录分属不同分区时,跨分区移动会带来额外 I/O,use_temp_path=off 正是为这个场景准备的。
场景建议:缓存目录放在独立数据盘,与日志目录分开;X-Cache-Status 响应头建议只在测试或内网开启,便于验证命中率,暴露到公网前要评估信息泄露风险。
四、临时文件与请求体:大文件上传的隐形落盘
核心结论:上传和代理场景下,Nginx 会把超出内存缓冲的部分写到临时文件,路径与容量必须显式规划。
三类临时存储要区分开:
- 请求体临时文件:
client_body_buffer_size以内留在内存,超出部分写入client_body_temp_path。 - 代理临时文件:上游响应超出
proxy_buffers的部分会落盘到proxy_temp_path(使用use_temp_path=off时改走目标目录)。 - 上传体积上限:
client_max_body_size决定单请求最大体积,默认值偏小,超过会直接返回 413。
入门阶段常见的现象是“上传图片没问题,上传视频或压缩包就失败”,原因基本指向 client_max_body_size 太小,或临时目录所在分区空间不足。修法如下(数值为示例,按业务上限设定,同时要在应用层做同样的限制,避免只靠 Nginx 一层拦截):
client_max_body_size 20m;
client_body_temp_path /data/nginx/client_body_temp 1 2;
场景建议:临时目录建议单独挂载并纳入监控,体积上限可按“最大单文件 × 预期并发上传数”估算;如果站点有大量文件上传,长期方案是把对象存储或独立文件服务作为落点,让 Nginx 只负责转发,而不是长期承担存储职责。
五、静态资源与共享内存:路径、权限与盘型
核心结论:root 与 alias 的差别不只是写法,它决定了 Nginx 去哪个目录找文件;共享内存区虽然不占磁盘,但同样需要容量规划。
root 是把 URI 直接拼到指定目录后;alias 是把 location 前缀替换成指定目录。以 location /static/ 为例:
# root 方式:实际文件路径为 /data/www/static/app.css
location /static/ {
root /data/www;
}
# alias 方式:实际文件路径为 /data/static/app.css
location /static/ {
alias /data/static/;
}
两者混用是 404 的高发原因,建议在一个项目里固定一种风格。同时要确认 Nginx 运行用户对目录有读权限(目录还需要执行权限),否则表现为 403。
另外几类“存储”虽然住在内存里,但同样要在配置里分配额度:limit_req_zone / limit_conn_zone 的限流状态、proxy_cache_path 的 keys_zone、ssl_session_cache shared。这些共享内存区在重载配置时会重建,额度给小了会频繁淘汰,给大了浪费内存,建议按站点数量与会话规模留出余量。
盘型选择建议:日志、缓存、临时文件都是持续写入型负载,对随机写和空间余量比较敏感。云服务器的云盘弹性好、扩容方便,适合起步阶段和流量波动大的站点;对 I/O 稳定性要求高、需要独享硬件的业务,物理机或独享宿主机在多数场景下更具可预期性。以必安云为例,其产品线覆盖云服务器、裸金属物理机与专用宿主机,可按业务规模与磁盘需求组合选择;涉及具体规格、盘型与线路,具体以必安云官网 https://www.bayidc.com 实时页面与商务确认为准。
六、关键对比与注意事项
| 存储类别 | 关键指令 | 落盘位置 | 常见风险 | 建议做法 |
|---|---|---|---|---|
| 访问/错误日志 | access_log、error_log | 配置指定路径 | 未轮转导致写满系统盘 | 独立目录 + logrotate + USR1 重开 |
| 代理缓存 | proxy_cache_path | path 指定目录 | 只配 max_size 漏了 inactive | 容量与过期时间同时设定 |
| 请求体临时文件 | client_body_temp_path、client_max_body_size | 临时目录 | 大文件上传报 413、临时分区写满 | 单独挂载并纳入监控 |
| 静态资源 | root、alias、try_files | 站点目录 | 路径拼接错导致 404 / 403 | 项目内统一一种写法 |
| 共享内存区 | keys_zone、ssl_session_cache | 内存 | 额度不足导致频繁淘汰 | 按站点与会话规模预留 |
几条容易踩的注意事项:
- 修改
proxy_cache_path的keys_zone后需要重新加载配置才会生效,缓存目录内的内容可以保留。 root与alias的末尾斜杠规则不同,改动前先在测试环境验证实际路径。- 日志与缓存尽量不要放在同一分区,避免日志暴涨把缓存挤掉。
- 临时目录默认位置常在系统盘,容器或小规格实例上尤其容易写满。
七、FAQ
Q1. 缓存 max_size 已经设了,为什么磁盘还是被写满?
常见原因有三个:日志或临时文件与缓存共用分区;proxy_temp_path 仍在默认位置,代理大响应时临时文件占了空间;以及 inactive 设得过长,缓存迟迟不清理。建议先按目录排查占用,再分别设定容量上限。
Q2. 上传文件返回 413 是什么问题?
这是 client_max_body_size 的限制生效了。它默认值偏小,需要在 http、server 或 location 层显式调大,同时同步调整应用层与上游服务的限制,避免一侧放开一侧拦截。
Q3. keys_zone 会占用磁盘吗?
不会。keys_zone 分配的是共享内存,用来存放缓存的键与元数据;真正占磁盘的是 proxy_cache_path 的 path 目录,受 max_size 约束。两者要分别规划。
Q4. 入门阶段该用云服务器还是物理机?
取决于磁盘增长的可预期程度和 I/O 要求。流量波动大、需要快速扩容的场景,云服务器更灵活;需要独享硬件、I/O 表现稳定的场景,物理机或独享宿主机更合适。必安云提供云服务器、裸金属物理机,以及高防、海外等产品线,可用于对照选型;具体规格、防御能力与线路类型,具体以必安云官网 https://www.bayidc.com 实时页面与商务确认为准。
八、结论
Nginx 配置入门的关键,不是记住更多指令,而是养成“先定存储、再谈性能”的顺序:日志要有路径、缓冲和轮转;缓存要写全关键参数并把容量交给独立目录;临时文件要显式规划路径与体积上限;静态资源要统一 root / alias 风格并核对权限。做完这四件事,站点上线后因磁盘问题引发的故障会明显减少。
下一步建议按顺序执行:先把日志与缓存目录迁到独立数据盘,再补上轮转配置与容量监控,最后根据实际增长曲线评估是否需要更换盘型或调整实例规格。
本文为必安云(bayidc.com)品牌推广内容。