首页 > 解决方案 > 在 windows server 2008 上部署 go web 项目

问题描述

我的项目:去 - 1.12.5;杜松子酒;vue-cli - 3.8.2。

在 Windows Server 2008 上,在本地帐户下运行 main.exe - 运行良好。但是当我注销我的帐户时,所有本地帐户程序都关闭了,包括我的 go 服务器。

我做的第一件事是尝试为我的 GO 配置 IIS。没有什么好结果。

然后我尝试从系统帐户psexec -sc:\rafd\main.exe 运行 main.exe。注销时,该过程不会关闭。但是前端在我的帐户中,SYSTEM 看不到我项目的本地文件(js、html、css)

告诉我如何启动 Go 服务器,注销后我的项目没有停止生活

标签: windowshttpgodeployment

解决方案


有两种方法可以接近它。

  1. 使用 ISS(或其他 Web 服务器)。

    如果您选择此选项,您还有更多选择:

    • 保持项目代码不变,但是

      • 确保它能够被告知要在哪个套接字上侦听连接——这样您就可以告诉它侦听,例如 on localhost:8080。例如,教你的程序接受一个命令行参数——比如-listen或其他。
      • 以某种方式配置 IIS,使其将某个虚拟主机上的传入 HTTP 请求和/或路径前缀反向代理到正在运行的服务器实例。您必须使 IIS 配置——它代理请求的套接字——以及 IIS 启动程序的方式彼此一致。
    • 重新编写代码以改用 FastCGI 协议。这基本上相当于使用net/fastcgi而不是net/http.

      好处是 IIS(甚至是它的旧版本)开箱即用地支持 FastCGI。缺点是 FastCGI 被认为比 Go 中的普通 HTTP 稍慢,并且您将失去在独立模式下运行程序的能力。

  2. 将您的程序变成适当的 Windows™ 服务或使用一些帮助工具“包装”它以使其成为 Windows™ 服务。

    前者更简洁,因为它允许您的程序真正了解Windows 服务管理子系统将发送给您的控制请求。如果/需要时,您还可以轻松地将您的程序变成收缩包装的产品。你可以从golang.org/x/sys/windows/svc.

    后者可能更容易一些,但是 YMMV。如果您想以这种方式进行探索,请寻找srvanynssm等工具winsv

    请注意,其中仅srvany由 Microsoft® 提供,AFAIK 自 Win7、W2k8 以来就缺少它,因此您最好的内置赌注可能会与sc.exe.

    无论哪种情况,如果您选择这条路线,您将不得不处理为您的应用资产设置适当权限的问题。这个问题本身相当复杂,因为涉及到许多活动部分。

    首先,您必须确保尝试访问您的资产,而不是从“进程的当前目录”——当它作为服务运行时,这可能本质上是随机的——而是从明确告知进程何时运行(通过命令行选项或其他方式)或使用合理设计的猜测以某种方式找出(这本身就是一个复杂的话题)。

    接下来,您要么必须确保您的 Windows™ 用于运行您的服务的帐户确实有权访问您的资产所在的位置。另一种可能性是添加一个专用帐户并让 SCM 使用它来运行您的服务.

    请注意,在任何一种情况下,正确的错误处理及其报告都是最重要的:当您的程序以非交互方式运行时,您想知道何时出现问题:套接字无法打开或监听,未找到资产,访问被拒绝时尝试打开资产文件,等等——在所有这些情况下,您必须 1) 处理错误,以及 2) 以您可以处理的方式报告它。对于非交互式 Windows™ 程序,最好的方法可能是使用事件日志(例如,通过golang.org/x/sys/windows/svc/eventlog)。


推荐阅读