全部產品
Search
文件中心

Server Load Balancer:ALB使用可程式化指令碼AScript實現精細化流量管理

更新時間:Mar 03, 2026

可程式化指令碼AScript是阿里雲應用型負載平衡ALB (Application Load Balancer) 推出的突出靈活性和功能性的指令碼語言,使得ALB執行個體能夠突破傳統負載平衡的局限,以自訂指令碼的方式精確地控制和調整流量管理原則。本文通過異常請求識別、自訂鑒權、定製化要求標頭和回應標頭控制,三個常用情境來對AScript做進一步的介紹。

AScript介紹

AScript支援自訂規則的執行,這些規則在處理用戶端請求的不同階段自動觸發,確保實現高度自訂化的流量管理。通過這種機制,您可以在請求和響應環節靈活地應用自訂指令碼,從而實現精細的商務邏輯管理。

AScript為ALB賦予了卓越的可程式化能力,助您在複雜多變的業務環境中持續最佳化服務效能和使用者體驗。無論是內容交付、安全性增強,還是效能最佳化,AScript都能靈活應對,實現負載平衡的智能化和個人化。

關鍵特性

  • 業務功能隔離:AScript規則將不同的業務功能和需求隔離在獨立的指令碼中,避免規則之間相互幹擾。

  • 控制規則的執行流:按照實際業務情境安排規則的優先順序和觸發時機。

  • 規則的執行位置:在不同的執行位置配置規則。

    • 請求方向規則執行前:適用於對請求路徑進行預先處理的情境,例如URI自動重寫、添加URI首碼、檔案尾碼統一轉為小寫等情境。

    • 請求方向規則執行後:適用於在標準轉寄規則處理後進一步對請求進行處理的情境,例如對檔案名稱和類型進行改寫等情境。

    • 回應程式向規則執行前:適用於在響應被發送回用戶端前做最後的處理的情境,例如修改HTTP頭部資訊或響應體的內容。

  • 監聽維度設計:AScript規則以監聽層級進行設計,確保規則緊密貼合實際的監聽流量模式。

使用限制

  • 僅標準版和WAF增強版的ALB執行個體支援AScript,基礎版不支援。

  • AScript可程式化指令碼行數預設免費額度為25行,超過免費額度的部分會被收費,具體計費規則可參考ALB計費規則

前提條件

  • 您已建立標準版或WAF增強版公網ALB執行個體,並為該ALB執行個體建立了伺服器組。請參見建立和管理ALB執行個體建立和管理伺服器組

  • 您已為該ALB執行個體配置了HTTP監聽並關聯該伺服器組。請參見添加HTTP監聽

  • 您已在伺服器組中分別添加ECS01和ECS02執行個體,並在ECS01和ECS02中均部署了應用服務。

    ECS01服務部署測試應用

    yum install -y nginx
    systemctl start nginx.service
    cd /usr/share/nginx/html/
    echo "Hello World ! This is ECS01." > index.html

    ECS02服務部署測試應用

    yum install -y nginx
    systemctl start nginx.service
    cd /usr/share/nginx/html/
    echo "Hello World ! This is ECS02." > index.html
  • 您已經註冊網域名稱並完成備案。請參見註冊阿里雲網域名稱ICP備案

情境樣本

AScript的強大自訂能力可以在各種情境下展現出關鍵優勢。無論是複雜的流量分發邏輯、特定的鑒權機制,還是對要求標頭和回應標頭的定製化控制,AScript都能提供高效的解決方案,使ALB的功能擴充和最佳化更加迅速便捷。本文通過以下三種情境來說明AScript可程式化指令碼規則的功能。

情境一:異常請求識別

某企業在阿里雲某地區使用ALB部署了業務,該企業發現頻繁遇到異常請求的問題。具體表現為大量的惡意請求和不明來源的流量對後端伺服器造成了較大的負擔,影響了正常業務的訪問速度和使用者體驗。

為瞭解決這個問題,該企業選擇利用ALB的能力來攔截異常請求。儘管ALB的標準轉寄規則可以根據網域名稱和路徑進行請求的路由,但在需要進行更深層次的使用者行為分析,例如檢測HTTP_User_Agent時,其判斷能力較為有限。為此,企業選擇了AScript來增強ALB的功能。

AScript 的自訂能力顯著增強了ALB的精細化處理能力,使其能夠深入匹配和分析HTTP要求標頭部的User-Agent欄位。通過編寫AScript規則,企業可以對請求中的User-Agent進行具體的邏輯判斷,從而識別異常或惡意行為(例如機器人或自動化指令碼的訪問)。如果請求被認定為異常,AScript可以返回自訂的錯誤資訊,從而阻斷潛在的安全威脅,保障服務的穩定性與資料的安全性。

本文以如下情境為例,企業通過AScript配置了特定的商務邏輯:當請求訪問ALB執行個體時,ALB會根據配置的AScript規則檢查請求中的以下資訊:

  • 來自特定的主機名稱example.com

  • URI以/order/create開頭。

  • HTTP要求標頭部的User-Agent中不包含trusted字串。

如果以上條件均滿足,AScript將設定狀態代碼為403,並返回自訂響應訊息The order data is abnormal。否則ALB將正常轉寄請求到後端服務。

對應的AScript規則

if and(eq($host,'example.com'),eq(get(split($request_uri, '?'),1),'/order/create')){
    if not(match_re($http_user_agent,'.*trusted.*')){
        exit(403,'{"code":10063,"msg":"The order data is abnormal","data":{}}')
    }
}
image

操作步驟

步驟一:添加AScript可程式化指令碼定義的轉寄規則

  1. 登入應用型負載平衡ALB控制台

  2. 執行個體頁面,單擊目標執行個體ID。

  3. 單擊監聽頁簽,然後單擊已建立的目標監聽ID。

  4. 單擊轉寄規則頁簽,在請求方向轉寄規則頁簽,單擊在規則執行前添加可程式化指令碼

    說明

    選擇回應程式向轉寄規則時,只允許在規則執行前添加可程式化指令碼

  5. 添加可程式化指令碼頁面添加規則,然後單擊確定

    參數

    描述

    規則名稱

    輸入自訂規則名稱。

    規則代碼

    輸入規則代碼。本文輸入以下程式碼範例。

    if and(eq($host,'example.com'),eq(get(split($request_uri, '?'),1),'/order/create')){
        if not(match_re($http_user_agent,'.*trusted.*')){
            exit(403,'{"code":10063,"msg":"The order data is abnormal","data":{}}')
        }
    }

    執行位置

    規則執行位置,不可更改。本文為請求方向規則執行前

    啟用狀態

    規則啟用狀態。本文使用預設開啟。

    進階配置

    本文選擇預設不選擇。

步驟二:設定網域名稱解析

複製ALB執行個體對應的DNS名稱,完成以下步驟,為您的自有網域名稱添加1條指向ALB執行個體DNS名稱的CNAME記錄。

  1. 登入網域名稱解析控制台

  2. 網域名稱解析頁面單擊添加網域名稱

  3. 添加網域名稱對話方塊輸入您的主機網域名稱,然後單擊確認

    重要

    您的主機網域名稱需已通過TXT記錄驗證。

  4. 在目標網域名稱的操作列單擊解析設定

  5. 解析設定頁面,單擊添加記錄

  6. 添加記錄面板,配置以下資訊完成CNAME解析配置,然後單擊確認

    配置

    說明

    記錄類型

    在下拉式清單中選擇CNAME

    主機記錄

    您的網域名稱的首碼。

    解析請求來源

    選擇預設。

    記錄值

    輸入欄位名對應的CNAME地址,即您複製的ALB執行個體的DNS名稱。

    TTL

    全稱Time To Live,表示DNS記錄在DNS伺服器上的緩衝時間,本文使用預設值。

步驟三:結果驗證

  1. 測試正常網路請求。

    以任意一台可以訪問公網的用戶端為例。

    1. 瀏覽器訪問http://<訪問地址>可以正常訪問後端服務。多次重新整理瀏覽器,返回內容可以在ECS01和ECS02之間切換。

    2. 開啟用戶端的cmd視窗,多次執行以下命令,響應報文在ECS01和ECS02之間切換。

      curl http://<訪問地址>

      image

  2. 測試異常網路請求。

    執行以下命令,響應報文為{"code":10063,"msg":"The order data is abnormal","data":{}},表明添加AScript可程式化指令碼定義的轉寄規則已生效。

    curl -v  -H "Host:example.com" -H "User-Agent:suspicious test" http://<訪問地址>/order/create

    image

情境二:自訂鑒權

某企業在阿里雲某地區使用ALB部署了業務,後端伺服器組包含了多台已部署應用的伺服器。該企業遇到了一個挑戰:使用者在訪問多個應用時需要多次登入,這不僅降低了使用者體驗,還增加了管理的複雜性。因此,該企業希望能夠在訪問應用時使用統一的身份鑒權憑證,從而實現單點登入(Single Sign-On,SSO)。

為了實現該功能,企業決定利用AScript的自訂能力。通過AScript編寫自訂規則,對Authorization和Cookie等要求標頭進行詳細的檢查和操作,通過這種方式,可以將Cookie中的SSO令牌轉化為統一的鑒權憑證。此外,AScript還可以在回應標頭中注入詳細的日誌資訊,為調試和跟蹤認證流程提供便利。這種可程式化的日誌功能超越了傳統負載平衡器,顯著提升了ALB在維護系統安全性方面的能力。

本文以如下情境為例,企業通過AScript配置了特定的商務邏輯:當請求訪問ALB執行個體時,ALB會根據配置的AScript規則檢查要求標頭中是否存在Authorization:

  • 如果存在,使用日誌記錄Authorization的長度和相關情境。

  • 如果不存在,接著檢查Cookie中是否存在SSO_token。

    • 如果存在,記錄其長度,並將其作為Bearer Token注入到Authorization要求標頭中,同時記錄該情境。

    • 如果SSO_token也不存在,則僅記錄該情境。

對應的AScript規則

#判定給定的值是否缺失
def is_missing(val){
    if val{
        return or(null(val),le(len(val),1))
    }else{
        return true
    }
}
#在HTTP回應標頭中添加一條日誌資訊,鍵由參數key指定,訊息內容由參數msg提供
def log_on_rsp_header(key, msg) {
    add_rsp_header(concat('ascript-log_', key), msg) 
}
#主體判斷邏輯
#判斷要求標頭中是否存在Authorization,如果存在,記錄其長度
if $http_authorization {
    log_on_rsp_header('authorization', concat('len=', len($http_authorization)))
}
#判斷請求的Cookie中是否存在SSO_token,如果存在,記錄其長度
if $cookie_sso_token {
    log_on_rsp_header('sso_token', concat('len=', len($cookie_sso_token)))  
}
if is_missing($http_authorization) {
    if not(is_missing($cookie_sso_token)) {
       #要求標頭中Authorization不存在且Cookie中SSO_token存在時,將SSO_token作為Bearer Token注入到Authorization要求標頭中,並記錄該情境
       add_req_header('authorization', concat('Bearer ',$cookie_sso_token))      
       add_rsp_header('ascript-log', 'use sso_token as authorization in request header') 
    } else {
       #要求標頭中Authorization不存在且Cookie中SSO_token不存在時,記錄該情境
       add_rsp_header('ascript-log', 'authorization is missing and cookie sso_token is missing too')         
    }  
} else {
    #如果要求標頭中Authorization存在時,記錄該情境
    log_on_rsp_header('miss-authorization', 'val = false')
}
image

操作步驟

步驟一:添加AScript可程式化指令碼定義的轉寄規則

  1. 登入應用型負載平衡ALB控制台

  2. 執行個體頁面,單擊目標執行個體ID。

  3. 單擊監聽頁簽,然後單擊已建立的目標監聽ID。

  4. 單擊轉寄規則頁簽,在請求方向轉寄規則頁簽,單擊在規則執行前添加可程式化指令碼

    說明

    選擇回應程式向轉寄規則時,只允許在規則執行前添加可程式化指令碼

  5. 添加可程式化指令碼頁面添加規則,然後單擊確定

    參數

    描述

    規則名稱

    輸入自訂規則名稱。

    規則代碼

    輸入規則代碼。本文輸入以下程式碼範例。

    def is_missing(val){
        if val{
            return or(null(val),le(len(val),1))
        }else{
            return true
        }
    }
    def log_on_rsp_header(key, msg) {
        add_rsp_header(concat('ascript-log_', key), msg) 
    }
    
    if $http_authorization {
        log_on_rsp_header('authorization', concat('len=', len($http_authorization)))
    }
    if $cookie_sso_token {
        log_on_rsp_header('sso_token', concat('len=', len($cookie_sso_token)))  
    }
    
    if is_missing($http_authorization) {
        if not(is_missing($cookie_sso_token)) {
           add_req_header('authorization', concat('Bearer ',$cookie_sso_token))      
           add_rsp_header('ascript-log', 'use sso_token as authorization in request header') 
        } else {
           add_rsp_header('ascript-log', 'authorization is missing and cookie sso_token is missing too')         
        }  
    } else {
        log_on_rsp_header('miss-authorization', 'val = false')
    }

    執行位置

    規則執行位置,不可更改。本文為請求方向規則執行前

    啟用狀態

    規則啟用狀態。本文使用預設開啟。

    進階配置

    本文選擇預設不開啟。

步驟二:設定網域名稱解析

複製ALB執行個體對應的DNS名稱,完成以下步驟,為您的自有網域名稱添加1條指向ALB執行個體DNS名稱的CNAME記錄。

  1. 登入網域名稱解析控制台

  2. 網域名稱解析頁面單擊添加網域名稱

  3. 添加網域名稱對話方塊輸入您的主機網域名稱,然後單擊確認

    重要

    您的主機網域名稱需已通過TXT記錄驗證。

  4. 在目標網域名稱的操作列單擊解析設定

  5. 解析設定頁面,單擊添加記錄

  6. 添加記錄面板,配置以下資訊完成CNAME解析配置,然後單擊確認

    配置

    說明

    記錄類型

    在下拉式清單中選擇CNAME

    主機記錄

    您的網域名稱的首碼。

    解析請求來源

    選擇預設。

    記錄值

    輸入欄位名對應的CNAME地址,即您複製的ALB執行個體的DNS名稱。

    TTL

    全稱Time To Live,表示DNS記錄在DNS伺服器上的緩衝時間,本文使用預設值。

步驟三:結果驗證

  1. 測試網路請求。

    以任意一台可以訪問公網的用戶端為例。開啟用戶端的cmd視窗,執行以下命令。由於要求標頭中不存在Authorization,Cookie中不存在SSO_token,可以看到回應標頭輸出日誌為authorization is missing and cookie sso_token is missing too

    curl -v http://<訪問地址>

    image

  2. 測試Cookie中攜帶SSO_token發送請求。

    執行以下命令,向要求標頭中Cookie中添加SSO_token。可以看到回應標頭中輸出日誌為ascript-log_sso_token: len=13use sso_token as authorization in request header

    curl -v -b "sso_token=ah$sgdj#sgava" http://<訪問地址>

    image

  3. 測試要求標頭中攜帶Authorization發送請求。

    執行以下命令,向要求標頭中添加Authorization。可以看到回應標頭輸出日誌ascript-log_authorization: len=20ascript-log_miss-authorization: val = false

    curl -v -H "authorization: Bearer ah$sgdj#sgava" http://<訪問地址>

    image

根據以上測試結果表明:鑒權憑證的內容、格式,以及如何替換或增強這些憑證,都能通過AScript來完成。您可以根據實際情境編寫自訂的鑒權規則。

情境三:定製化要求標頭和回應標頭控制

某企業在阿里雲某地區使用ALB部署了業務,後端伺服器組包含了多台已部署應用的伺服器。該企業因業務發展,現在需要實現跨域資源共用(CORS)。具體來說,不同網域名稱的前端應用需要訪問這些伺服器上託管的資源和服務。由於同源策略的限制,跨域請求被預設阻止,導致資源無法正常載入,從而影響了使用者體驗和商務程序的流暢性。此外,企業還需要根據不同要求標頭實現靈活的跨域策略,以滿足多種跨域訪問需求。

ALB的標準轉寄規則在處理複雜的跨域策略時顯得不夠靈活,無法在同一條轉寄規則中針對不同要求標頭實現有效跨域策略。為解決這一問題,企業利用AScript的強大自訂能力來增強ALB的靈活性。

通過AScript,企業能夠實現以下功能:

  • 判斷請求是否來自合法的跨域要求標頭。

  • 識別請求源 (Origin 或 Referer),確定請求是否來自被允許的網域。

  • 動態地添加Access-Control-Allow-Origin和其他相關的跨域資源共用回應標頭,以允許來自特定域的跨域請求。

  • 提供更精細的控制,諸如限制可用的HTTP頭部和幀選項。

本文以如下情境為例,企業通過AScript配置了特定的商務邏輯:當請求訪問ALB執行個體時,ALB會根據配置的AScript規則檢查請求源是否來自特定域(例如example.com,example.org或test.com)。如果匹配成功,ALB將動態添加與跨域資源共用相關的回應標頭,從而支援合法請求的跨域互動。

對應的AScript規則

h = $http_origin
if not(h) {
    h = $http_referer
}

pcs = capture_re(h, '^(.*?)(\.example\.com|\.example\.org|\.test\.com)(:\d+)?')
sec1 = get(pcs, 1)
sec2 = get(pcs, 2)
sec3 = get(pcs, 3)

if (sec2) {
    add_rsp_header('cross-origin-resource-policy', 'cross-origin')
    add_rsp_header('access-control-allow-methods', 'GET,PUT,POST,DELETE,UPDATE,OPTIONS')
    add_rsp_header('access-control-allow-credentials', 'true')
    add_rsp_header('access-control-allow-headers', 'Cookie,Set-Cookie,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Host,Origin,csrf-token-fe1a2a3s12,xhrFields')
    if not(sec3) {
        add_rsp_header('access-control-allow-origin', concat(sec1, sec2))
        add_rsp_header('x-frame-options', concat('ALLOW-FROM ', sec1, sec2))
    } else {
        add_rsp_header('access-control-allow-origin', concat(sec1, sec2, sec3))
    }
}
image

操作步驟

步驟一:添加AScript可程式化指令碼定義的轉寄規則

  1. 登入應用型負載平衡ALB控制台

  2. 執行個體頁面,單擊目標執行個體ID。

  3. 單擊監聽頁簽,然後單擊已建立的目標監聽ID。

  4. 單擊轉寄規則頁簽,在請求方向轉寄規則頁簽,單擊在規則執行前添加可程式化指令碼

    說明

    選擇回應程式向轉寄規則時,只允許在規則執行前添加可程式化指令碼

  5. 添加可程式化指令碼頁面添加規則,然後單擊確定

    參數

    描述

    規則名稱

    輸入自訂規則名稱。

    規則代碼

    輸入規則代碼。本文輸入以下程式碼範例。

    h = $http_origin
    if not(h) {
        h = $http_referer
    }
    
    pcs = capture_re(h, '^(.*?)(\.example\.com|\.example\.org|\.test\.com)(:\d+)?')
    sec1 = get(pcs, 1)
    sec2 = get(pcs, 2)
    sec3 = get(pcs, 3)
    
    if (sec2) {
        add_rsp_header('cross-origin-resource-policy', 'cross-origin')
        add_rsp_header('access-control-allow-methods', 'GET,PUT,POST,DELETE,UPDATE,OPTIONS')
        add_rsp_header('access-control-allow-credentials', 'true')
        add_rsp_header('access-control-allow-headers', 'Cookie,Set-Cookie,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Host,Origin,csrf-token-fe1a2a3s12,xhrFields')
        if not(sec3) {
            add_rsp_header('access-control-allow-origin', concat(sec1, sec2))
            add_rsp_header('x-frame-options', concat('ALLOW-FROM ', sec1, sec2))
        } else {
            add_rsp_header('access-control-allow-origin', concat(sec1, sec2, sec3))
        }
    }

    執行位置

    規則執行位置,不可更改。本文為請求方向規則執行前

    啟用狀態

    規則啟用狀態。本文使用預設開啟。

    進階配置

    本文選擇預設不選擇。

步驟二:設定網域名稱解析

複製ALB執行個體對應的DNS名稱,完成以下步驟,為您的自有網域名稱添加1條指向ALB執行個體DNS名稱的CNAME記錄。

  1. 登入網域名稱解析控制台

  2. 網域名稱解析頁面單擊添加網域名稱

  3. 添加網域名稱對話方塊輸入您的主機網域名稱,然後單擊確認

    重要

    您的主機網域名稱需已通過TXT記錄驗證。

  4. 在目標網域名稱的操作列單擊解析設定

  5. 解析設定頁面,單擊添加記錄

  6. 添加記錄面板,配置以下資訊完成CNAME解析配置,然後單擊確認

    配置

    說明

    記錄類型

    在下拉式清單中選擇CNAME

    主機記錄

    您的網域名稱的首碼。

    解析請求來源

    選擇預設。

    記錄值

    輸入欄位名對應的CNAME地址,即您複製的ALB執行個體的DNS名稱。

    TTL

    全稱Time To Live,表示DNS記錄在DNS伺服器上的緩衝時間,本文使用預設值。

步驟三:結果驗證

  1. 使用沒有被允許的請求源進行測試。

    以任意一台可以訪問公網的用戶端為例。開啟用戶端的cmd視窗,執行以下命令。佈建要求源為http://www.example.cn,可以看到回應標頭中未添加Access-Control-Allow-Origin 和其他相關的 CORS 回應標頭。

    curl -H "Origin: http://www.example.cn" -v http://<訪問地址>

    image

  2. 使用被允許的請求源進行測試。

    執行以下命令,將請求源設定為http://www.example.com,可以看到回應標頭已添加了與跨域相關的回應標頭。

    curl -H "Origin: http://example.com" -v http://<訪問地址>

    image

相關文檔