Nginx實現圖片服務器動態路由

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

步驟

一、啓動服務器A的圖片服務(192.168.1.100)

服務器A需安裝Nginx,安裝步驟略.net

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;
    }
    
    ...
}

啓動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配置
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配置,以下blog

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,實現內部重定向。

博客

https://my.oschina.net/gmarshal/blog/3067945rem

歡迎關注個人我的微信訂閱號:(聽說這個頭像程序猿專用)

輸入圖片說明

相關文章
相關標籤/搜索