如何解决NGINX反向代理环境下符号链接symlink被缓存的问题
问题本质
你之前在FastCGI架构下的符号链接缓存是Nginx读取本地文件时的open_file_cache机制导致,用$realpath_root可以强制解析符号链接的真实路径。切换到反向代理架构后,你使用的是Laravel Octane常驻内存服务,符号链接不生效的核心原因大部分情况下不是Nginx反向代理的缓存,而是Octane启动后会将代码一次性加载到内存中,修改符号链接不会更新已加载的代码。
可行解决方案
1. 处理Nginx静态文件缓存(仅针对静态资源不更新的场景)
如果你的站点静态资源存放于符号链接指向的目录,且Nginx配置了静态资源直接返回,需要关闭静态资源路径的符号链接缓存:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { root /你的站点根目录/current/public; # 关闭Nginx的文件缓存,避免符号链接指向的路径被缓存 open_file_cache off; try_files $uri =404; }
如果你的Nginx全局开启了open_file_cache,也可以针对站点根目录配置强制解析真实路径:
server { set $root_path /你的站点根目录/current/public; root $realpath_root; }
2. 平滑重载Octane服务(核心解决方案,针对PHP代码不更新的场景)
Octane是常驻内存服务,替换符号链接后需要平滑重启工作进程才能加载新代码,不会导致服务中断:
部署步骤调整为:
- 拉取最新代码到新目录
- 将
current符号链接指向新目录 - 执行平滑重载命令:
php artisan octane:reload
所有工作进程会在处理完当前请求后退出,主进程会启动新的工作进程加载新目录的代码,完全实现零停机部署。
3. 处理Nginx反向代理缓存(仅针对开启了proxy_cache的场景)
如果你在Nginx中配置了proxy_cache缓存动态请求,可以在部署完成后清理对应缓存目录的文件,或者调整proxy_cache_key加入版本标识避免跨版本缓存。
内容的提问来源于stack exchange,提问作者Andrea Marco Sartori
相关产品推荐
相关产品推荐

