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》

在这里插入图片描述

正式开始

一、下载 ASP.NET Core Module 安装

《下载aspnetcoremodule_x64_x86_en.zip》
在这里插入图片描述
《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 (本例中程序所在路径为站点根目录)执行。
<?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操控的程序。
在这里插入图片描述

五、实测
  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程序内设置好的路由进行显示。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值