如何基于CentOS的ECS實(shí)例實(shí)現(xiàn)OSS反向代理
阿里云OSS的存儲(chǔ)空間(Bucket)訪問(wèn)地址會(huì)隨機(jī)變換,您可以通過(guò)在ECS實(shí)例上配置OSS的反向代理,實(shí)現(xiàn)通過(guò)固定IP地址訪問(wèn)OSS的存儲(chǔ)空間。
背景信息
阿里云OSS通過(guò)Restful API方式對(duì)外提供服務(wù)。最終用戶通過(guò)OSS默認(rèn)域名或者綁定的自定義域名方式訪問(wèn),但是在某些場(chǎng)景下,用戶需要通過(guò)固定的IP地址訪問(wèn)OSS:
某些企業(yè)由于安全機(jī)制,需要在出口防火墻配置策略,以限制內(nèi)部員工和業(yè)務(wù)系統(tǒng)只能訪問(wèn)指定的公網(wǎng)IP,但是OSS的Bucket訪問(wèn)IP會(huì)隨機(jī)變換,導(dǎo)致需要經(jīng)常修改防火墻策略。
金融云環(huán)境下,因金融云網(wǎng)絡(luò)架構(gòu)限制,金融云內(nèi)網(wǎng)類型的Bucket只能在金融云內(nèi)部訪問(wèn),不支持在互聯(lián)網(wǎng)上直接訪問(wèn)金融云內(nèi)網(wǎng)類型Bucket。
針對(duì)以上問(wèn)題,您可以通過(guò)在ECS實(shí)例上搭建反向代理的方式訪問(wèn)OSS。
操作步驟
您可以點(diǎn)擊一鍵部署通過(guò)ROS快速基于CentOS的ECS實(shí)例實(shí)現(xiàn)OSS反向代理,無(wú)需手動(dòng)執(zhí)行以下操作步驟。
創(chuàng)建一個(gè)ECS實(shí)例。
本文以和Bucket相同地域的CentOS 7.6 64位系統(tǒng)的ECS實(shí)例為例。
如何創(chuàng)建ECS實(shí)例,請(qǐng)參見選購(gòu)ECS實(shí)例。
連接ECS實(shí)例。
如何連接ECS實(shí)例,請(qǐng)參見 連接ECS實(shí)例。
執(zhí)行以下命令安裝Nginx。
sudo yum install -y nginx
Nginx文件的默認(rèn)安裝位置如下。目錄 說(shuō)明 /usr/sbin/nginx 存放主程序 /etc/nginx 存放配置文件 /usr/share/nginx 存放靜態(tài)文件 /var/log/nginx 存放日志 執(zhí)行以下命令打開Nginx配置文件nginx.conf。
sudo vi /etc/nginx/nginx.conf
參考以下說(shuō)明修改nginx.conf文件中的HTTP模塊。
重要本文僅提供演示環(huán)境??紤]到您的數(shù)據(jù)安全,強(qiáng)烈建議您在實(shí)際使用環(huán)境中配置HTTPS模塊。如何配置,請(qǐng)參見Nginx或Tengine服務(wù)器配置SSL證書。
以下配置方式只能代理訪問(wèn)一個(gè)Bucket。
server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass https://bucketname.oss-cn-beijing-internal.aliyuncs.com; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_connect_timeout 15s; proxy_read_timeout 15s; proxy_send_timeout 15s; proxy_set_header Connection ""; proxy_buffering off; proxy_request_buffering off; } }
參數(shù)
說(shuō)明
server_name
對(duì)外提供反向代理服務(wù)的IP,即ECS實(shí)例的外網(wǎng)地址。
proxy_pass
跳轉(zhuǎn)的域名。
當(dāng)ECS實(shí)例與Bucket在同一地域時(shí):填寫目標(biāo)Bucket的內(nèi)網(wǎng)訪問(wèn)域名。關(guān)于內(nèi)網(wǎng)訪問(wèn)域名的更多信息,請(qǐng)參見通過(guò)內(nèi)網(wǎng)訪問(wèn)OSS。
當(dāng)ECS實(shí)例與Bucket不在同一地域時(shí):填寫目標(biāo)Bucket的外網(wǎng)訪問(wèn)域名。關(guān)于外網(wǎng)訪問(wèn)域名的更多信息,請(qǐng)參見通過(guò)外網(wǎng)訪問(wèn)OSS。
您的用戶需通過(guò)瀏覽器預(yù)覽Bucket中的圖片或網(wǎng)頁(yè)文件:因OSS的安全設(shè)置,當(dāng)使用默認(rèn)域名通過(guò)瀏覽器訪問(wèn)OSS中的圖片或網(wǎng)頁(yè)文件時(shí),會(huì)直接下載。所以,如果您的用戶需通過(guò)瀏覽器預(yù)覽Bucket中的圖片或網(wǎng)頁(yè)文件,需為Bucket綁定自定義域名,并在此項(xiàng)中添加已綁定的域名。如何綁定自定義域名,請(qǐng)參見綁定自定義域名。
proxy_set_header Host
添加此項(xiàng)時(shí),Nginx會(huì)在向OSS請(qǐng)求的時(shí)候,將$host替換為ECS的訪問(wèn)地址。
遇到以下情況時(shí),您需要添加此項(xiàng)。
遇到簽名錯(cuò)誤問(wèn)題。
如果您的域名已解析到ECS實(shí)例的外網(wǎng)上,且您的用戶需要通過(guò)瀏覽器預(yù)覽Bucket中的圖片或網(wǎng)頁(yè)文件。您可以將您的域名綁定到ECS實(shí)例代理的Bucket上,不配置CNAME。在該情況下,proxy_pass項(xiàng)可直接配置Bucket的內(nèi)網(wǎng)或外網(wǎng)訪問(wèn)地址。如何綁定自定義域名,請(qǐng)參見綁定自定義域名。
說(shuō)明該選項(xiàng)針對(duì)自定義域名請(qǐng)求到代理服務(wù)器的場(chǎng)景。如果您使用IP地址直接請(qǐng)求訪問(wèn)代理服務(wù)器, 您需要在nginx.conf文件中注釋
proxy_set_header Host $host
。proxy_connect_timeout
設(shè)置與后端服務(wù)器(如 OSS)的連接超時(shí)時(shí)間。此超時(shí)配置決定了 Nginx 在建立與后端服務(wù)器的連接時(shí),最長(zhǎng)等待的時(shí)間。如果超時(shí),Nginx 將返回錯(cuò)誤響應(yīng)。
proxy_read_timeout
控制 Nginx 從后端服務(wù)器讀取響應(yīng)數(shù)據(jù)的超時(shí)時(shí)間。如果在此時(shí)間內(nèi)未能從后端服務(wù)器讀取到數(shù)據(jù),Nginx 將返回錯(cuò)誤響應(yīng)。這對(duì)于處理可能響應(yīng)時(shí)間較長(zhǎng)的請(qǐng)求非常重要。
proxy_send_timeout
設(shè)置 Nginx 向后端服務(wù)器發(fā)送請(qǐng)求數(shù)據(jù)的超時(shí)時(shí)間。此參數(shù)確保 Nginx 在等待請(qǐng)求數(shù)據(jù)發(fā)送到后端服務(wù)器期間保持連接,直到超時(shí)或連接顯式關(guān)閉。
proxy_set_header Connection
設(shè)置代理請(qǐng)求頭中的
Connection
字段為空字符串,表示在代理請(qǐng)求時(shí),Nginx 不會(huì)添加Connection
頭部。這樣可以避免 HTTP/1.1 持久連接問(wèn)題,確保與后端服務(wù)器的連接處理正確。proxy_buffering
控制Nginx是否緩存從后端服務(wù)器接收到的數(shù)據(jù)。設(shè)置為
off
意味著Nginx將立即轉(zhuǎn)發(fā)數(shù)據(jù)給客戶端,而不會(huì)進(jìn)行緩存,這可以降低延遲,但也可能增加帶寬消耗。proxy_request_buffering
決定 Nginx 是否在將請(qǐng)求體轉(zhuǎn)發(fā)給后端服務(wù)器之前等待整個(gè)請(qǐng)求體完全接收。設(shè)置為
off
表示Nginx將開始接收數(shù)據(jù)后立即轉(zhuǎn)發(fā),無(wú)需等待整個(gè)請(qǐng)求體接收完成,這有利于實(shí)時(shí)性要求較高的應(yīng)用場(chǎng)景。執(zhí)行以下命令進(jìn)入Nginx主程序文件夾。
cd /usr/sbin/
執(zhí)行以下命令啟動(dòng)Nginx。
sudo ./nginx
開放ECS實(shí)例的TCP 80端口。
Nginx默認(rèn)使用80端口,您需在ECS的安全組配置中,允許用戶訪問(wèn)TCP 80端口。
如何配置,請(qǐng)參見添加安全組規(guī)則。
測(cè)試使用ECS外網(wǎng)地址加文件訪問(wèn)路徑訪問(wèn)OSS資源。
本文跳轉(zhuǎn)的域名以OSS默認(rèn)域名為例。使用本地瀏覽器訪問(wèn)時(shí),OSS資源默認(rèn)會(huì)被下載。如果您需要實(shí)現(xiàn)訪問(wèn)OSS資源時(shí)預(yù)覽,您在配置proxy_pass時(shí)需要使用自定義域名。
說(shuō)明如果訪問(wèn)的文件讀寫權(quán)限為私有,文件URL中還需要包含簽名信息。詳情請(qǐng)參見簽名版本1。