You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure中创建自定义App Service站点扩展?Golang可行吗?

Azure App Service 自定义站点扩展开发指南(流量拦截场景)

一、Go语言开发可行性

可以用Golang开发Azure App Service自定义站点扩展。App Service站点扩展本质是可执行部署包,只需将Go代码编译为对应环境的可执行文件(Windows为.exe,Linux为二进制文件),即可嵌入到App Service的请求管道中实现流量拦截。

二、核心实现思路

要拦截并修改HTTP流量,需结合App Service的运行环境特性:

  • Windows环境:Go无法直接实现.NET的IHttpModule接口,因此适合编写独立反向代理进程,监听本地端口后,配置App Service的WEBSITE_PORT指向该代理端口,让所有流量先经过Go代理。
  • Linux环境:利用默认的nginx反向代理,修改配置将流量转发到Go代理服务;或直接将Go服务作为主应用,处理流量后转发到实际业务服务。

三、Go语言示例代码(反向代理+流量处理)

以下是实现请求预检查、响应内容修改的反向代理示例:

package main

import (
	"bufio"
	"bytes"
	"fmt"
	"io"
	"net/http"
	"net/http/httputil"
	"net/url"
)

type CustomProxy struct {
	target *url.URL
	proxy  *httputil.ReverseProxy
}

func NewCustomProxy(target string) (*CustomProxy, error) {
	targetURL, err := url.Parse(target)
	if err != nil {
		return nil, err
	}

	proxy := httputil.NewSingleHostReverseProxy(targetURL)
	// 请求预检查逻辑
	proxy.Director = func(req *http.Request) {
		req.URL.Scheme = targetURL.Scheme
		req.URL.Host = targetURL.Host
		req.URL.Path = targetURL.Path + req.URL.Path
		req.Host = targetURL.Host

		// 示例:验证请求头Token
		token := req.Header.Get("X-Auth-Token")
		if token == "" {
			req.Header.Set("X-Proxy-Check", "TokenMissing")
		} else {
			req.Header.Set("X-Proxy-Check", "TokenValid")
		}
	}

	// 响应内容修改逻辑
	proxy.ModifyResponse = func(resp *http.Response) error {
		bodyBytes, err := io.ReadAll(resp.Body)
		if err != nil {
			return err
		}
		resp.Body.Close()

		// 示例:替换响应文本
		modifiedBody := bytes.Replace(bodyBytes, []byte("Original Content"), []byte("Modified by Go Proxy"), -1)
		resp.Body = io.NopCloser(bytes.NewBuffer(modifiedBody))
		resp.ContentLength = int64(len(modifiedBody))
		resp.Header.Set("X-Proxy-Modified", "true")

		return nil
	}

	return &CustomProxy{target: targetURL, proxy: proxy}, nil
}

func (p *CustomProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	p.proxy.ServeHTTP(w, r)
}

func main() {
	// 目标业务服务地址(App Service内部实际服务,如本地的Node.js/.NET服务)
	target := "http://localhost:3000"
	proxy, err := NewCustomProxy(target)
	if err != nil {
		panic(err)
	}

	// 代理监听端口,需配置App Service的WEBSITE_PORT为此值
	fmt.Println("Starting proxy server on :8080")
	http.ListenAndServe(":8080", proxy)
}

四、部署步骤

  1. 编译Go程序:
    • Windows:GOOS=windows GOARCH=amd64 go build -o proxy.exe main.go
    • Linux:GOOS=linux GOARCH=amd64 go build -o proxy main.go
  2. 打包扩展:
    创建如下目录结构:
    MyProxyExtension/
    ├── bin/
    │   └── proxy.exe (Linux下为proxy)
    └── manifest.json
    
    manifest.json示例:
    {
      "id": "MyCustomTrafficProxy",
      "version": "1.0.0",
      "name": "Custom Traffic Interception Proxy",
      "description": "Intercepts and modifies HTTP traffic for App Service",
      "runtime": "custom",
      "installCommand": "start bin/proxy.exe" // Linux下改为 "./bin/proxy"
    }
    
    将目录打包为ZIP文件。
  3. 部署到App Service:
    • 门户方式:进入App Service的「扩展」选项卡,上传ZIP包安装。
    • Kudu API方式:POST ZIP包到https://<app-name>.scm.azurewebsites.net/api/siteextensions。
  4. 配置App Service:
    • 设置应用设置WEBSITE_PORT为代理监听端口(如8080)。
    • Linux环境需将启动命令改为./bin/proxy。

五、注意事项

  • 确保Linux环境下的可执行文件有执行权限(添加chmod +x proxy步骤)。
  • 反向代理会增加请求延迟,需优化Go代码的并发处理能力。
  • 日志可输出到stdout/stderr,通过Kudu或Azure门户查看排查问题。

内容的提问来源于stack exchange,提问作者Brijesh Valera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 17:07:03