最近搭了一个双节点的服务,每个节点各自有静态文件目录,nginx访问这些静态目录就成了问题。当然我们可以搭建单独的文件服务器,但是那样成本太高了,接下来说一下当前场景的解决方案。
1. sshfs挂载静态文件目录
下面的挂载命令可以把多个其他服务器的media目录挂载到本地:
mkdir /local_path/media_1/
sshfs remote_user@remote_host:/remote_path/media/ /local_path/media_1/ -o allow_other
基于安全考虑,nginx不能使用root用户启动,默认使用www-data用户启动,sshfs挂载时候要加上“-o allow_other”参数,否则nginx的www-data用户没有访问挂载的目录的权限。
我们挂载另外两台服务器的media目录到本地,最终本地的目录结构如下:
/local_path/media/
/local_path/media_1/
/local_path/media_2/
2. 配置nginx的location
使用nginx的try_files功能查找多个静态文件目录,关于try_files的教程很多,这里就不赘述了。location配置如下:
location ~^/media/(.*)$ {
valid_referers server_names $server_name;
if ($invalid_referer) {return 403;} # 安全加固,防止文件盗链
proxy_read_timeout 5;
proxy_send_timeout 5;
proxy_connect_timeout 5;
autoindex off; # 安全加固,关闭目录浏览
add_header Cache-Control private;
root /local_path; # 申明静态文件根目录
try_files /media/$1 /media_1/$1 /media_2/$1 =404; # 查找多个子目录,多个子目录找不到返回404
}