您现在的位置是:网站首页> Go语言

Golang学习日志 ━━ 现阶段go与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跨平台框架。


首先是这篇帖子在询问为什么他的HttpPlatformHandler模块无法运行go —— 《Run go web application on IIS》

随后看到这条提示回复。好家伙,原来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.”


关键字划重点:ASP.NET Core Module,这是2016年就发布的一个iis模块《HttpPlatformHandler has been replaced by ASP.NET Core Module》,最新一次修改也已经是2019年了。

配置方法:

《How to config HTTPPlatformHandler of IIS for Server Sent Event (SSE, EventStream)》

《go - 如何为服务器发送事件(SSE,EventStream)配置IIS的HTTPPlatformHandler》

正式开始

一、下载 ASP.NET Core Module 安装

《下载aspnetcoremodule_x64_x86_en.zip》

1.png

《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

这是最重要的一步。


iis创建一个站点;

把 goWeb.exe 拷贝到指定目录下 (本例中为该站点根目录);

在该站点根目录的 web.config 中添加请求处理方式 asp.net core module ;

该请求处理方式由程序 goWeb.exe (本例中程序所在路径为站点根目录)执行。

<?xml version="1.0" encoding="UTF-8"?>

<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操控的程序。

2.png


五、实测

php站点

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


go站点

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


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



Top