當您的應用程式因網路環境受限(例如內網部署、防火牆隔離)而無法正常調用OpenAPI時,可以通過Proxy 伺服器實現外部網路訪問。阿里雲SDK提供了完整的代理配置支援,能夠靈活適配HTTP和HTTPS協議。通過設定Proxy 伺服器的地址、連接埠及認證參數,開發人員能夠實現OpenAPI請求的統一代理轉寄,從而成功調用OpenAPI。本文以使用Tengine配置代理為例,為您介紹在SDK中如何通過代理調用OpenAPI。
情境樣本
例如,如果您的應用程式部署在內網,並且需要通過Proxy 伺服器實現對公網的訪問,以下將通過VPC類型的ECS執行個體進行類比:
ECS執行個體A:部署應用程式,無法直接存取公網,僅能通過VPC內網訪問資源(私網IP:10.0.0.115)。
ECS執行個體B:作為Proxy 伺服器,可訪問公網,並與ECS執行個體A同屬一個VPC(私網IP:10.0.0.112)。
搭建Proxy 伺服器
本文選擇Tengine作為Proxy 伺服器並在ECS執行個體B部署。
安裝Tengine
下載並解壓。
wget https://tengine.taobao.org/download/tengine-3.1.0.tar.gz tar zxvf tengine-3.1.0.tar.gz更新升級依賴庫。
Alibaba Cloud Linux/CentOS
sudo yum update -yUbuntu/Debian
sudo apt-get update sudo apt-get upgrade -y安裝所需依賴。
Alibaba Cloud Linux/CentOS
sudo yum install pcre pcre-devel openssl openssl-devel zlib-devel -y sudo yum groupinstall "Development Tools" -yUbuntu/Debian
sudo apt-get install libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev build-essential -y編譯安裝。
cd tengine-3.1.0 ./configure --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --add-module=./modules/ngx_http_proxy_connect_module make && make install啟動Tengine。
通過以下命令查詢Tengine可執行檔位置,例如Tengine可以執行檔案位置為
/root/tengine-3.1.0/objs/nginx。find / -name nginx 2>/dev/null | grep tengine運行Tengine可執行檔啟動Tengine:
sudo /root/tengine-3.1.0/objs/nginx驗證是否啟動成功。
# 查看是否存在Tengine進程 ps aux | grep nginx
配置HTTP(S)代理
執行以下命令編輯Tengine設定檔。
vim /usr/local/nginx/conf/nginx.conf在設定檔
http模組中添加如下內容:警告以下僅作為參考,線上業務請根據具體的情境制定代理配置資訊。
# HTTPS proxy server { listen 8089; access_log /var/log/host.access.log; access_log "pipe:rollback /var/log/host.access_log interval=1d baknum=7 maxsize=2G"; # dns resolver used by forward proxying # forward proxy for CONNECT request proxy_connect; proxy_connect_allow 443 563; proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; # forward proxy for non-CONNECT request location / { proxy_pass $scheme://$http_host$request_uri; } } # HTTP proxy server { listen 8088; location / { proxy_pass $scheme://$http_host$request_uri; } }添加完成之後儲存檔案。
重新載入Tengine。
#關閉Tengine /usr/local/nginx/sbin/nginx -s stop #使配置生效 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #重新啟動Tengine /usr/local/nginx/sbin/nginx -s reload
使用SDK代理能力調用API
在ECS執行個體A中部署業務代碼,以下範例程式碼僅供測試使用。
# pip install alibabacloud_ecs20140526
import os
from alibabacloud_ecs20140526.client import Client as EcsClient
from alibabacloud_ecs20140526.models import DescribeRegionsRequest
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions
config = Config(
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
endpoint='ecs-cn-hangzhou.aliyuncs.com',
protocol='https', # 與代理類型保持一致,https對應HTTPS代理;http對應HTTP代理
)
ecs_client = EcsClient(config)
runtime_options = RuntimeOptions(
# http_proxy='http://10.0.0.112:8088', # HTTP代理,Proxy 伺服器IP及連接埠
https_proxy='http://10.0.0.112:8089' # HTTPS代理,Proxy 伺服器IP及連接埠
)
request = DescribeRegionsRequest(
accept_language='en-US',
)
response = ecs_client.describe_regions_with_options(request, runtime_options)
print(response.body)
調用結果如下:
