配置Nginx訪問阿里云OSS資源踩坑之路
朋友那邊有個需求要在阿里云OSS上綁定一個自定義的域名,但是此域名已經在DNS解析那邊有了A記錄,OSS綁定域名需要在DNS解析那邊加個CNAME,這樣就沖突了。但是朋友那邊就一定要使用這個域名,想了想也只能通過Nginx的一個二級目錄來反向代理這個OSS了。
話不多說,我先配置了如下:
http {
# ... 其他全局配置 ...
upstream oss_backend {
server <OSS_ENDPOINT>; # OSS訪問內網域名
keepalive 32; # 保持連接數,可按需調整
}
server {
listen 80; # 或者 listen 443 ssl; 如果使用HTTPS
server_name apitest.xxxx.com; # 域名
location /static {
proxy_pass http://oss_backend; # 代理到OSS
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
很常用的一個反向代理oss,然而當我?問對應oss里的靜態資源的時候,錯誤提示:
<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<RequestId>613A63CA4771F3ddds602364</RequestId>
<HostId>apitest.xxxx.com</HostId>
<Key>static/test/1.png</Key>
<EC>0026-0000001</EC>
<RecommendDoc>https://api.aliyun.com/troubleshoot?q=0026-00000001</RecommendDoc>
</Error>
Nginx到OSS的代理工作正常,但請求的文件在OSS中不存在或路徑不正確。仔細檢查了下路徑是對的,這說明我們Nginx寫法有問題,到OSS那邊的確是沒有 static/test/1.png 這個文件,所以我們需要在Nginx里加個配置去掉 static 前綴。
改正之后的具體配置如下:
location /static {
rewrite ^/static(/.*)$ $1 break; # 去掉"/static"前綴
proxy_pass http://oss_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
我們使用 rewrite 指令去除請求路徑中的/static前綴,然后再將處理后的路徑傳遞給 proxy_pass 指令。
這樣,訪問 https://apitest.xxxx.com/static/k1.png 時,Nginx就會將請求轉發到 http://oss_backend/k1.png,OSS將查找Object鍵(Key)為 /k1.png 的文件。
測試可行。