HTTP代理配置实践

更新时间:
重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

当您的应用程序因网络环境受限(例如内网部署、防火墙隔离)而无法正常调用OpenAPI时,可以通过代理服务器实现外部网络访问。阿里云SDK提供了完整的代理配置支持,能够灵活适配HTTPHTTPS协议。通过设置代理服务器的地址、端口及认证参数,开发者能够实现OpenAPI请求的统一代理转发,从而成功调用OpenAPI。本文以使用Tengine配置代理为例,为您介绍在SDK中如何通过代理调用OpenAPI。

场景示例

例如,如果您的应用程序部署在内网,并且需要通过代理服务器实现对公网的访问,以下将通过VPC类型的ECS实例进行模拟:

  • ECS实例A:部署应用程序,无法直接访问公网,仅能通过VPC内网访问资源(私网IP:10.0.0.115)。

  • ECS实例B:作为代理服务器,可访问公网,并与ECS实例A同属一个VPC(私网IP:10.0.0.112)。

    说明

    若实例AB不在同一VPC,可通过VPC对等连接企业版转发路由器实现内网互通。

搭建代理服务器

本文选择Tengine作为代理服务器并在ECS实例B部署。

安装Tengine

  1. 下载并解压。

    wget https://tengine.taobao.org/download/tengine-3.1.0.tar.gz
    tar zxvf tengine-3.1.0.tar.gz
    
  2. 更新升级依赖库。

    Alibaba Cloud Linux/CentOS

    sudo yum update -y
    

    Ubuntu/Debian

    sudo apt-get update 
    sudo apt-get upgrade -y
    
  3. 安装所需依赖。

    Alibaba Cloud Linux/CentOS

    sudo yum install pcre pcre-devel openssl openssl-devel zlib-devel -y
    sudo yum groupinstall "Development Tools" -y
    

    Ubuntu/Debian

    sudo apt-get install libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev build-essential -y 
    
  4. 编译安装。

    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
  5. 启动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
  6. 验证是否启动成功。

    # 查看是否存在Tengine进程
    ps aux | grep nginx

配置HTTP(S)代理

  1. 执行以下命令编辑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;
            }
        }

    添加完成之后保存文件。

  2. 重新加载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代理,代理服务器IP及端口
    https_proxy='http://10.0.0.112:8089'  # HTTPS代理,代理服务器IP及端口
)
request = DescribeRegionsRequest(
    accept_language='en-US',
)
response = ecs_client.describe_regions_with_options(request, runtime_options)
print(response.body)

调用结果如下:

image