服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

云服务器|WEB服务器|FTP服务器|邮件服务器|虚拟主机|服务器安全|DNS服务器|服务器知识|Nginx|IIS|Tomcat|

服务器之家 - 服务器技术 - IIS - 在IIS上部署Go API项目

在IIS上部署Go API项目

2022-08-30 17:24taadis IIS

这篇文章介绍了在IIS上部署Go API项目的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

问题场景

我这边原先的技术栈主要是 .NET(Core), 所以服务器基本上都是 Windows Server + IIS.

这次有个 API 服务用 Go 重写, 但是部署有点不美, 直接执行黑框框不好看, 也容易丢, 做成服务又不方便更新维护, 想着能不能继续挂载在 IIS 下.

于是乎...

首先想到的是 IIS 下有个 FastCGI 支持, 以前还在 IIS 下部署过 PHP 项目.

搜到 Go 中有个 net/http/fcgi 库, 写个简单服务验证一下, 代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main
 
import (
    "net"
    "net/http"
    "net/http/fcgi"
)
 
func handler(resp http.ResponseWriter, req *http.Request) {
    resp.Write([]byte("hello"))
}
 
func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", handler)
 
    l, err := net.Listen("tcp", ":0")
    if err != nil{
        panic(err)
    }
    err = fcgi.Serve(l, mux)
    if err != nil{
        panic(err)
    }
}

执行 go run main.go 命令后, 程序没有任何异常或输出直接就结束了...

资料搜了一圈看到这玩意基本已被遗忘在不知道哪个旮旯里了...

然后搜到 Azure 前些年用 HttpPlatformHandler Module 在 IIS 上支持 Java/Node/... 应用程序.

试了下基本也是废了.

解决方案

最后溜达了一圈, 发现 HttpPlatformHandler 已被 ASPNETCore Module 宿主模块取代.

那么就跟我们在 IIS 上部署 ASP.NET Core 应用程序一样, 首先下载并安装 ASP.NET Core Hosting Bundle, 了解更多可参阅 ASP.NET Core Module

然后新建对应的站点, 应用程序池调整成 无托管代码

在IIS上部署Go API项目

IIS 这边已经准备就绪.

来看看我们代码和配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// main.go
package main
 
import (
    "fmt"
    "net"
    "net/http"
    "os"
)
 
func handler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Go running on IIS"))
}
 
func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", handler)
 
    // 获取由 ACNM 设置的环境变量
    port := "0" // default
    envPort := os.Getenv("ASPNETCORE_PORT")
    if envPort != "" {
        port = envPort
        fmt.Println("get env ASPNETCORE_PORT", port)
    }
 
    l, err := net.Listen("tcp", ":" + port)
    if err != nil{
        panic(err)
    }
    defer l.Close()
    fmt.Println("listening on", l.Addr().String())
    err = http.Serve(l, mux)
    if err != nil{
        panic(err)
    }
}

关键点就是代码中要通过获取 ACNM 提供的端口环境变量, 也就是 ASPNETCORE_PORT, 熟悉 ASP.NET Core 的小伙伴对这个应该不陌生了.

然后构建我们的可执行文件 xxx.exe

?
1
go build

然后配置 web.config 内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
<!-- web.config -->
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath=".\your.exe" arguments="" stdoutLogEnabled="true" stdoutLogFile=".\stdout" />
    </system.webServer>
  </location>
</configuration>

把 xxx.exe 和 web.config 扔到前面新建的站点中即可.

后续更新升级直接替换 exe 即可.

Go 写的程序体积比较小, 构建后也只有单个执行文件, 清爽多了.

在IIS上部署Go API项目

最后来个效果图

在IIS上部署Go API项目

注意事项

如出现以下错误信息, 可能是端口号已被占用, 换个端口号试试

[ERROR] listen tcp :8080: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接

原文链接:https://www.cnblogs.com/taadis/p/how-to-deploy-go-api-on-iis.html

延伸 · 阅读

精彩推荐