Nginx实现图片服务器动态切换
业务背景
目前公司有个项目,以前的附件服务器是单机的,最近磁盘空间满了,磁盘又没法无伤扩容,现须要将后续的附件存入另一个服务器,且代码不易快速修改;nginx
面临问题:服务器
以往存储的附件地址都是相对地址(若是是绝对地址就不用这么麻烦了),访问附件都是当前项目的域名直接加上/uploads/时间/图片.jpg,如http://www.xxx.com/upload/20190701/demo.jpg;
新的附件服务器的读存不能影响旧的附件服务器的读取;
实现思路
为了方便演示,这里用192.168.1.100替代 www.xxx.com微信
服务器 存储地址 访问地址
服务器A /usr/local/upload/ 192.168.1.100:8080/upload
服务器B /usr/local/upload/ 192.168.1.101:8080/upload
仍旧访问原来的对外地址,http://192.168.1.100:8080/upload/demo.jpg;
当原地址访问404时,自动访问服务器B对应的附件,URL地址不变;
步骤
一、启动服务器A的图片服务(192.168.1.100)
服务器A需安装Nginx,安装步骤略.net
# 服务器B的nginx配置
server {
listen 8080;
server_name localhost;
# 例如访问 http://192.168.1.101:8080/upload/demo.jpg
location ^~ /upload/ {
# 至关于访问 /usr/local/upload/demo.jpg
root /usr/local;
}
}
启动nginx,访问 http://192.168.1.100:8080/upload/demo.jpg,如今能正确访问服务器A的/usr/local/upload/demo.jpg代理
二、启动服务器B的图片服务(192.168.1.101)
服务器B一样安装Nginx,安装步骤略code
服务器B的nginx配置
# 服务器B的nginx配置
server {
listen 8080;
server_name localhost;
# 例如访问 http://192.168.1.101:8080/upload/demo.jpg
location ^~ /upload/ {
# 至关于访问 /usr/local/upload/demo.jpg
root /usr/local;
}
}
启动nginx,访问 http://192.168.1.101:8080/upload/demo.jpg,如今能正确访问服务器B的/usr/local/upload/demo.jpgserver
三、修改服务器A的nginx配置
服务器A中的nginx配置,以下
server {
listen 8080;
server_name localhost;
# 例如访问 http://192.168.1.100:8080/upload/demo.jpg
location ^~ /upload/ {
# 至关于访问 /usr/local/upload/demo.jpg
root /usr/local;
# 若是访问不到,则尝试访问新的路径,$uri至关于/upload/demo.jpg,即将uri也传递至@new_uploads
try_files $uri @upload_B;
}
location @upload_B {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 代理服务器B的地址
proxy_pass http://192.168.1.101:8080;
}
}
从新启动服务器A的nginx,并删除服务器A对应的图片,访问 http://192.168.1.100:8080/upload/demo.jpg,会发现获得的是服务器B的图片,即成功实现图片的动态“切换”,完成业务目标。图片
总结
利用nginx的 try_files $uri @upload_B,实现内部重定向。

浙公网安备 33010602011771号