在Nginx上部署Golang网站web应用程序,

go语言现在越来越流程了,如何从零开始在nginx上面安装一个我们自己的web网站程序?

我们创建了一个简单的 Web 应用程序,提供“Hello world”路线。

对于那些被这种与我们常规编程的偏差所吸引的人来说,您可能会遇到的下一个逻辑问题是如何通过让其他人可以访问这些知识来使其变得“有用” 。

我们将继续利用上周的 Golang 势头来做到这一点:将用 Go 编写的 Web 应用程序部署到 Linux 主机(例如 Ubuntu)。我们将涵盖从安装 Go、创建 systemctl 服务和配置 Nginx 的所有内容。您所需要的只是一个 VPS。

安装

如果您还没有这样做,请确保您的 VPS 已安装 Nginx。

$ apt update
$ apt upgrade -y
$ apt install nginx

安装 Nginx

在 Linux 上安装 Go

我们将通过源代码安装 Go。从Go 下载页面(https://golang.org/dl/)选择适合您的 Linux 发行版需求的 Go 版本。

我们将其下载到/tmp文件夹,构建源代码,并将构建的源代码移动到它所属的位置:

$ cd /tmp
$ wget https://dl.google.com/go/go1.14.3.linux-amd64.tar.gz 
$ tar -xvf go1.11.linux-amd64.tar.gz
$ sudo mv go /usr/local

从源代码构建 Go。

我们刚刚解压了 Go 语言并将其移至 Linux 通常喜欢保留其编程语言的地方。该路径就是 Go 所说的GOROOT,其内容应如下所示:

/usr/local/go
├── AUTHORS
├── CONTRIBUTING.md
├── CONTRIBUTORS
├── LICENSE
├── PATENTS
├── README.md
├── SECURITY.md
├── VERSION
├── /api
├── /bin
├── /doc
├── favicon.ico
├── /lib
├── /misc
├── /pkg
├── robots.txt
├── /src
└── /test

GOROOT 的内容

将 GOPATH 和 GOROOT 添加到您的 Shell 脚本中

我们已经安装并解压了 Go,但是我们还没有给我们的操作系统提供一种方法来识别我们已经完成了这些工作。我们可以通过修改 shell 脚本来实现这一点,该脚本通常称为.profile:

$ vim ~/.profile

编辑~/.profile

在这里,我们将添加GOROOT和GOPATH文件路径。如果您还记得,GOROOT是我们的操作系统查找 Go 编程语言的地方,GOPATH是我们保存所有 Go 项目和依赖项的工作目录。我选择将GOPATH设置为/go,这是我们尚未创建的目录:

export GOPATH=/go
export GOROOT=/usr/local/go
export PATH=$PATH:$GOPATH
export PATH=$PATH:$GOROOT/bin

〜/.profile

保存更改并激活 shell 脚本:

$ source ~/.profile

激活~/.profile

我们现在可以验证一切是否已安装:

$ go version
>> go version go1.14.3 linux/amd64

验证安装

设置我们的 GOPATH 和项目

我们必须手动创建GOPATH,就像创建以下目录一样简单:

$ mkdir ~/go
$ mkdir ~/go/bin
$ mkdir ~/go/pkg
$ mkdir ~/go/src

现在我们有地方保存我们的 Go 项目了!为了方便起见,我将删除我们上周创建的“Hello world”项目:

$ cd /go
$ go get github.com/hackersandslackers/golang-helloworld

获取 go 项目

我也选择将 Github 存储库克隆到我的/src路径中,这使得我的GOPATH结构如下所示:

/go
├── /bin
│   └── golang-helloworld
├── /pkg
└── /src
    └── /github.com
        └── /hackersandslackers
            └── /golang-helloworld
                ├── README.md
                ├── go.mod
                ├── go.sum
                ├── golang-helloworld
                ├── main.go
                └── main_test.go

GOPATH 的内容

创建 Nginx 配置

您以前可能已经这样做过几次,但无论如何。我们将设置一个 Ngnix 反向代理来侦听我们的应用程序将在其上运行的端口,在我们的例子中恰好是端口9100 。当然,我们需要先确保该端口已启用:

$ sudo ufw allow 9100

打开一个端口

在 Nginx /sites-available文件夹中创建配置文件:

$ sudo vim /etc/nginx/sites-available/golang-helloworld.conf

创建 Nginx 配置

我们将在这里删除反向代理的标准样板。我恰好用于此应用程序的域是golanghelloworld.hackersandslackers.app。将其替换为您选择的域:

server {
   listen 80;
   listen [::]:80;

   server_name    golanghelloworld.hackersandslackers.app;

   location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:9100;
    }

    location ~ /.well-known {
        allow all;
    }

}

golang-helloworld.conf

我们通过从sites-available到sites-enabled中的文件创建符号链接来激活此配置:

$ sudo ln -s /etc/nginx/sites-available/golang-helloworld.conf /etc/nginx/sites-enabled/golang-helloworld.conf

符号链接 Nginx 配置

最后,这些更改将在 Nginx 重新启动时应用。如果以下命令没有产生任何输出,那么您就没有问题了:

$ sudo service nginx restart

重启 Nginx

SSL 与 Certbot

添加 SSL 可能超出了本教程的重点范围,但无论如何。Certbot使添加 SSL 变得非常简单,我们可以在不到一分钟的时间内完成它。

在我们实际安装 Certbot 之前,我们需要添加正确的存储库:

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update

添加 Certbot PPA 存储库

现在我们可以真正安装 Certbot 了:

$ sudo apt-get install certbot python3-certbot-nginx

安装证书机器人

Certbot CLI 能够接受一个--nginx标志,该标志会扫描我们在计算机上设置的配置:

$ certbot --nginx

根据您的 Nginx 配置创建证书。

这将列出您计算机上的每个Nginx 配置,并提示您要使用 SSL 设置哪个应用程序。我的 Ubuntu 机器恰好托管着一堆站点。如果您愿意,请随意查看其中任何一个:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: broiestbro.com
2: www.broiestbro.com
3: consider.pizza
4: stockholm.ghostthemes.io
5: hackersandslackers.app
6: hackersandslackers.tools
7: django.hackersandslackers.app
8: flaskblueprints.hackersandslackers.app
9: flasklogin.hackersandslackers.app
10: flasksession.hackersandslackers.app
11: flasksqlalchemy.hackersandslackers.app
12: flaskwtf.hackersandslackers.app
13: plotlydashflask.hackersandslackers.app
14: www.hackersandslackers.tools
15: hustlers.club
16: www.hustlers.club
17: toddbirchard.app
18: golanghelloworld.hackersandslackers.app
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

Certbot CLI

我正在寻找的配置是#18。选择此选项后将提示我们是否要将 HTTP 流量重定向到 HTTPS,这是您绝对应该做的事情(甚至有理由不这样做吗?请在下面的评论中告诉我,并记得像这样粉碎它)按钮)。

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Certbot CLI

选择选项2。

查看 Certbot 如何修改我们原来的golang-helloworld.conf Nginx 配置:

server {

   server_name    golanghelloworld.hackersandslackers.app;

   location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:9100;
    }

    location ~ /.well-known {
        allow all;
    }

    listen [::]:443 ssl;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/golanghelloworld.hackersandslackers.app/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/golanghelloworld.hackersandslackers.app/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

}

server {

    if ($host = golanghelloworld.hackersandslackers.app) {
        return 301 https://$host$request_uri;
    }

   listen 80;
   listen [::]:80;

   server_name    golanghelloworld.hackersandslackers.app;
    return 404;

}

golang-helloworld.conf

这就是我们喜欢看到的。

创建 Systemctl 服务

如果您以前从未使用过 Systemctl 服务,那么“服务”就是我们希望在服务器上持续运行的东西(例如,Nginx本身就是一个服务)。我们将为 Go 应用程序创建一个服务,以确保我们的应用程序始终运行,即使我们的服务器重新启动:

$ vim /etc/systemd/system/golanghelloworld.service

添加服务

Linux 服务的语法遵循.ini文件格式。这里有很多内容,我们稍后将进行剖析:

[Unit]
Description=golanghelloworld.hackersandslackers.app
ConditionPathExists=/go/src/github.com/hackersandslackers/golang-helloworld
After=network.target

[Service]
Type=simple
User=root
Group=root

WorkingDirectory=/go/src/github.com/hackersandslackers/golang-helloworld
ExecStart=/go/src/github.com/hackersandslackers/golang-helloworld/golang-helloworld

Restart=on-failure
RestartSec=10

ExecStartPre=/bin/mkdir -p /var/log/golang-helloworld
ExecStartPre=/bin/chown syslog:adm /var/log/golang-helloworld
ExecStartPre=/bin/chmod 775 /go/src/github.com/hackersandslackers/golang-helloworld/golang-helloworld

[Install]
WantedBy=multi-user.target

golanghelloworld.service

以下是上面设置的值得注意的值:

  • User& Group:可能不是最好的主意,但这告诉我们的服务以 Ubuntu root 用户身份运行我们的应用程序。请随意将其更改为其他 Linux 用户。

  • WorkingDirectory:我们将从中提供应用程序服务的工作目录。

  • ExecStart:我们的Go项目编译后的二进制文件。

  • Restart& RestartSec:这些值对于确保我们的应用程序始终运行且可用非常有用,即使在因不可预见的情况崩溃后也是如此。这两个值告诉我们的服务检查我们的应用程序是否每 10 秒运行一次。如果应用程序恰好关闭,我们的服务将重新启动应用程序,因此Restart的失败值。

  • ExecStartPre:每一行都包含一个在启动我们的应用程序之前运行的命令。我们设置了三个这样的命令:前两个确保我们的应用程序正确记录到名为/var/log/golang-helloworld 的目录。第三个(也是更重要的)命令设置 Go 二进制文件的权限。

保存您的服务文件。下面我们注册对系统服务所做的更改,启动新服务,并使我们的服务在系统启动时运行:

$ systemctl daemon-reload
$ service golanghelloworld start
$ service golanghelloworld enable

启动服务

让我们检查一下事情进展如何:

$ service golanghelloworld status

检查服务状态

如果您非常幸运,您将看到如下所示的 SUCCESS 输出:

golanghelloworld.service - golanghelloworld.hackersandslackers.app
   Loaded: loaded (/etc/systemd/system/golanghelloworld.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-05-29 01:57:02 UTC; 4s ago
  Process: 21454 ExecStartPre=/bin/chmod 775 /go/src/github.com/hackersandslackers/golang-helloworld/golang-helloworld (code=exited, status=0/SUCCESS)
  Process: 21449 ExecStartPre=/bin/chmod 775 /var/log/golang-helloworld (code=exited, status=0/SUCCESS)
  Process: 21445 ExecStartPre=/bin/chown syslog:adm /var/log/golang-helloworld (code=exited, status=0/SUCCESS)
  Process: 21444 ExecStartPre=/bin/mkdir -p /var/log/golang-helloworld (code=exited, status=0/SUCCESS)
 Main PID: 21455 (golang-hellowor)
    Tasks: 6 (limit: 4915)
   CGroup: /system.slice/golanghelloworld.service
           └─21455 /go/src/github.com/hackersandslackers/golang-helloworld/golang-helloworld

服务状态

调试 Systemctl 服务

创建 Linux 服务的一个不幸的事实是,有很多移动部件在起作用。我认为我从来没有在第一次尝试时就没有出现某种错误的新服务。这些错误包括权限错误、不正确的文件路径或端口冲突。好消息是,每个问题都很容易解决。

调试服务的第一道防线是journalctl检查任何服务的日志输出:

$ journalctl -u golanghelloworld.service

检查服务的日志

调试问题不可或缺的工具是能够grep让进程查看它们是否正常运行。我们可以按名称或端口搜索活动进程。如果输出端口9100正在使用的journalctl错误,您可以通过以下方式找到该进程:

$ ps aux | grep 9100

通过端口号搜索进程

我们可以杀死任何返回的进程kill -9 [PID]。

或者,我们可以通过进程名称 grep 检查我们的应用程序是否正在运行:

$ ps aux | grep golang-helloworld

按名称搜索进程

如果需要,我们可以使用 终止该进程pkill -9 golang-helloworld。

如果您需要对.service文件进行更改,请记住运行systemctl daemon-reload以获取更改,然后service golanghelloworld restart再试一次。

结束

我相信您会解决这些问题并成功启动并运行您的 Go 应用程序。我自己也花了一些时间,但我那该死的你好世界已经建立起来,并在这里生活得很荣耀。


文章来源地址https://www.toymoban.com/diary/golang/347.html

到此这篇关于在Nginx上部署Golang网站web应用程序,的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/golang/347.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
上一篇 2023年10月05日 18:04
下一篇 2023年10月06日 23:39

相关文章

  • Asp .Net Web应用程序(.Net Framework4.8)网站发布到IIS

    开启IIS 如果已开启跳过这步 打开控制面板-程序  打开IIS 发布Web程序(.Net Framework 4.8 web网页) 进入IIS管理器新建一个应用池 新建一个网站 网站创建完毕 为文件夹添加访问权限  如果不添加访问权限,运行时将会得到如下错误 设置权限   勾选上面添加的账户的修改权限 

    2024年01月21日
    浏览(29)
  • War包:Java Web应用程序打包与部署

    在Java Web开发中,war包(Web Archive)是一种常见的文件格式,用于打包和部署Java Web应用程序。本篇博客将介绍war包的概念、作用以及使用方法,并根据相关资料来详细回答相关问题。 引言 WAR包的概念与作用 创建和打包WAR包 3.1 编写Java Web应用程序 3.2 配置部署描述符 3.3 打包

    2024年02月06日
    浏览(24)
  • ASP.NET Core Web应用程序项目部署流程

    目录 一、准备ASP.NET Core应用程序部署文件 二、环境配置 三、测试 ASP.NET Core Web 应用程序 四、部署后访问失败问题 以下部署流程都是基于Windows服务器环境下进行的。 一、准备ASP.NET Core应用程序部署文件 使用 Visual Studio 开发工具创建 ASP.NET Core 的Web应用程序,利用VS工具发布

    2024年02月05日
    浏览(23)
  • 本地部署Python Flask并搭建web问答应用程序框架实现远程访问

    Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务,本期教程我们使用Python Flask搭建一个web问答应用程序框架,并结合cpolar内网穿透工具将我们的应用程序发布到公共网络上,实现可多人远程进入到该web应用程序访问。 在操作上我们将使用

    2024年02月05日
    浏览(22)
  • 如何在 2022 年为 Web 应用程序选择技术堆栈

    选择最佳的 Web 应用程序堆栈并非易事:它必须在资源和质量方面达到最佳。 Web 应用程序开发所需的质量、成本和时间将取决于您的选择。 这就是为什么选择技术堆栈可能需要比您预期更多的时间。 在本文中,我将帮助您选择最有效的 Web 开发技术栈。 我将解释哪些技术可

    2024年02月01日
    浏览(22)
  • Web 应用程序攻击:它是什么以及如何防御它?

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 在过去几年中,Web 应用程序攻击是一种日益严重的网络安全威胁。 在2022 年全球网络攻击增加38%,估计 46%的网站 在应用程序级别存在安全漏洞。 因此,您的网站很可能容易受到这种类型的攻击,这就

    2024年02月10日
    浏览(25)
  • 解释 RESTful API,以及如何使用它构建 web 应用程序。

    RESTful API是一种利用HTTP协议进行通信的Web API设计风格,它采用了一组统一且可缓存的操作,包括GET、POST、PUT、DELETE等,通过URL来定位资源,以及使用JSON、XML等格式来传输数据,以实现系统之间的数据交互和资源共享。 使用RESTful API构建Web应用程序,首先需要设计API的URL、

    2024年02月11日
    浏览(28)
  • 解释 RESTful API,以及如何使用它构建 web 应用程序

             RESTful API stands for Representational State Transfer Application Programming Interface. It is a set of principles and guidelines for building web services that provide data in a standard format, typically JSON or XML. RESTful API emphasizes on uniformity, scalability, reliability, performance, and flexibility. It operates on HTTP and follo

    2024年02月14日
    浏览(26)
  • PowerBI(一) : 如何将powerBI报表嵌入内部web应用程序?

    最近做了一个PowerBI报表嵌入内部web应用系统的项目,分享一下主要步骤以及踩坑记录。 微软官网完整教程这里:https://learn.microsoft.com/zh-cn/power-bi/developer/embedded/embedded-analytics-power-bi 以下是我自己总结的主要步骤(仅供大家参考): 1. 你要付费买一个powerBI的账号。 2. 用这个

    2023年04月24日
    浏览(20)
  • 如何在树莓派部署Nginx并实现无公网ip远程访问内网制作的web网站

    安装 Nginx(发音为“engine-x”)可以将您的树莓派变成一个强大的 Web 服务器,可以用于托管网站或 Web 应用程序。相比其他 Web 服务器,Nginx 的内存占用率非常低,可以在树莓派等资源受限的设备上运行。同时结合cpolar内网穿透工具即可实现无公网IP远程访问。 在树莓派安装

    2024年03月12日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包