Golang学习日志 ━━ 现阶段go与iis的最完美结合(不再考虑端口、窗口,不同语言的应用可共用一个iis)

摸石头过河

虽然说go自带web服务器,但实际运行时并不能完全符合非功能上的要求。比如很多客户喜欢在一台服务器的一个端口(:80)上运行很多不同语言的web应用,例如php、c#、java,甚至asp等等,那么使用iis肯定是第一选择。

  • 反向代理
    针对go语言,网上流行的做法是利用iis的反向代理实现go与iis的结合。其原理相当于iis把请求分发到不同的端口,由go服务器接收处理后再返回,所以当遇到多个go应用时,每个go应用需要占用不同的端口。万一哪天go崩溃了,还得上服务器去重开,窗口默认也得开着…虽然大部分问题都可以解决,但总是缺少那种酣畅淋漓的感觉。
    《IIS 反向代理 golang web开发》

  • CGI
    接着想到了参考 php 搞一个cgi ,应用以源码形式放在服务器~~go也确实自带了cgi包,但实践证明这并非我想要的。
    《Go中的CGI包使用》

  • HttpPlatformHandler模块
    查到某篇文章说反向代理已经过时了…iis7.5以后可以利用 HttpPlatformHandler 模块来实现,不过我没有成功。
    《Announcing the Release of the HttpPlatformHandler Module for IIS 8+》
    《如何使用IIS10管理第三方網頁》

  • .net core module
    在查找HttpPlatformHandler模块失败原因的时候,出现了转机:那就是2016年微软推出的.net core跨平台框架。

  1. 首先是这篇帖子在询问为什么他的HttpPlatformHandler模块无法运行go —— 《Run go web application on IIS》
  2. 随后看到这条提示回复。好家伙,原来HttpPlatformHandler也过时了,我这几年是错过了多少东西。。。

HttpPlatformHandler module doesn’t work for me. I found this post by Sutean Rutjanalard on Medium very helpful, which use ASP.NET Core Module instead.”

  1. 关键字划重点:ASP.NET Core Module,这是2016年就发布的一个iis模块《HttpPlatformHandler has been replaced by ASP.NET Core Module》,最新一次修改也已经是2019年了。
  2. 配置方法:
    《How to config HTTPPlatformHandler of IIS for Server Sent Event (SSE, EventStream)》
    《go - 如何为服务器发送事件(SSE,EventStream)配置IIS的HTTPPlatformHandler》

Golang学习日志 ━━ 现阶段go与iis的最完美结合(不再考虑端口、窗口,不同语言的应用可共用一个iis)_第1张图片

正式开始

一、下载 ASP.NET Core Module 安装

《下载aspnetcoremodule_x64_x86_en.zip》
Golang学习日志 ━━ 现阶段go与iis的最完美结合(不再考虑端口、窗口,不同语言的应用可共用一个iis)_第2张图片
《ASP.NET Core IISIntegration》

二、微调 golang 代码

go生成exe文件,本例名称是 goWeb.exe

如果监听端口不由go决定,那么建议直接使用iis中该站点的端口。
其实就是利用了安插在iis上的 asp.net core module 实现一次无间道(后面再无间道一次把请求引导到goWeb.exe上)。
这样未来go就无需考虑端口号问题,直接获取iis配置即可;如果确定了端口号是80之类的,那么写死也无妨。

// 1. 安装ASP.NET Core Module后,获取iis中该站点实际端口,这样以后再也不用管某个应用的端口号是什么了
port := os.Getenv("ASPNETCORE_PORT")
// 2. 常用端口号
// port := "80"

err := http.ListenAndServe(":"+port, nil)
if err != nil {
	fmt.Println("服务器启动错误:", err)
}
三、配置 web.config

这是最重要的一步

  1. iis创建一个站点;
  2. goWeb.exe 拷贝到指定目录下 (本例中为该站点根目录);
  3. 在该站点根目录的 web.config 中添加请求处理方式 asp.net core module
  4. 该请求处理方式由程序 goWeb.exe (本例中程序所在路径为站点根目录)执行。

<configuration>
    <system.webServer>
        <handlers>
            <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
        handlers>
        <aspNetCore processPath=".\goWeb.exe" />
    system.webServer>
configuration>
四、运行

在浏览器里打开该站点,页面顺利展现!

此时在任务管理器的进程中能看到 goWeb.exe 这个进程,且没有打开任何窗口。
过一段时间后,该进程会消失,只有当再次打开该站点时才会再次出现(和iis上的站点设置、应用程序池有关)。
这时go应用真正变成了由iis操控的程序。
Golang学习日志 ━━ 现阶段go与iis的最完美结合(不再考虑端口、窗口,不同语言的应用可共用一个iis)_第3张图片

五、实测
  1. php站点
    如果在站点根目录中有一个a.phpa.html页面,那么打开localhost/a.phplocalhost/a.html,浏览器能分别显示.php.html页面的内容。

  2. go站点
    如果站点目录中有一个goWeb.exea.html,go程序没有设定a.html路由,那么打开localhostlocalhost/a.html,浏览器只能是go程序中设置的默认页,即都是localhost内容,而不会显示a.html页面内容。

这印证了“所有请求的处理都是交给go,怎么处理都由go决定”这句话,iis只是一个发包单位,页面只能根据go程序内设置好的路由进行显示。

你可能感兴趣的:(Golang,服务器,go,golang,iis,.netcoremodule,web)