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
文章来源地址https://www.toymoban.com/diary/golang/347.html
到此这篇关于在Nginx上部署Golang网站web应用程序,的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!