关键在于确保Nginx能读取软链接指向的真实文件:需在location块中配置disable_symlinks off,优先使用alias而非root,并保证Nginx用户对软链接及其目标路径、所有父目录具备r-x权限,同时兼顾SELinux/AppArmor策略。
要让 Nginx 正确访问静态资源路径中的软链接,关键不是“让 Nginx 解析软链接”,而是确保它最终能读取到软链接指向的真实文件——这取决于权限配置、指令选择和安全策略的协同。
Nginx 默认禁止跟随软链接,这是出于安全考虑(防路径遍历)。若 location 中使用了软链接路径,必须显式关闭该限制:
location 块内,不能放在 server 或 http 级别alias 或 root 同级,且仅对该 location 生效location /static/ { alias /data/releases/current/; disable_symlinks off; }
alias 是更清晰、更可控的选择。它直接替换路径,不拼接 URI,软链接只需放在 alias 指向的位置即可:
/data/releases/current → /data/releases/v2.3.1
/static/js/app.js 会映射到 /data/releases/current/js/app.js,再由系统解析为真实路径root 会把 URI 追加到路径后,容易导致语义错位(如 root /data/releases; + 请求 /static/ → 查找 /data/releases/static/)Nginx worker 进程(如 www-data)需要对以下三类路径都有执行(x)和读取(r)权限:
/data/releases)/data/releases/v2.3.1)/data、/ 等,直到根目录)/home/user)默认无其他用户执行权,常是 403 的根源即使文件权限正确,强制访问控制机制仍可能拒绝读取:
setenforce 0 关闭 SELinux,看是否恢复访问semanage fcontext -a -t httpd_sys_content_t "/data/releases(/.*)?"restorecon -Rv /data/releases