【问题标题】:Deploy go web project on windows server 2008在 windows server 2008 上部署 go web 项目
【发布时间】:2019-10-22 04:30:30
【问题描述】:

我的项目:go - 1.12.5;杜松子酒; vue-cli - 3.8.2.

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

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

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

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

【问题讨论】:

  • 最后一个选项可能是最接近的。您只需将必要的文件放在具有正确权限的位置,以便运行它的帐户访问它们。
  • @Adrian 我在代码中写了 GO full path dist (html, css, js) 并且运行良好

标签: windows http go deployment


【解决方案1】:

最简单的解决方案是使用 windows schedular。

在后台以最高权限在系统登录时启动您的 exe 文件。因此,每当您的系统登录时,它都会启动您的 exe 并在后台运行。

你可以参考这个答案, How do I set a Windows scheduled task to run in the background?

【讨论】:

    【解决方案2】:

    两种处理方式。

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

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

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

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

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

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

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

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

      请注意,其中只有 srvany 是由 Microsoft® 提供的,并且,AFAIK,自 Win7、W2k8 以来它就丢失了,因此您最好的内置赌注可能会与 sc.exe 混淆。

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

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

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

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

    【讨论】:

    • 在任何情况下权限都是一个问题。默认情况下,IIS 和 Windows 服务都作为系统帐户运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多