开始

这篇文章的最终目标如下:

  1. 不考虑网站内容,网页只显示 hello world
  2. 强制 https 访问
  3. 用 golang 构建并将其部署在以 Nginx 作为反向代理的 Ubuntu 18.04 服务器上
/uploads/2020/02/golang_web_app_00.png

前期需要准备的内容如下:

  1. 一个可用的域名
  2. 一台可用的 Ubuntu 服务器(这里推荐使用 Vultr 的服务器)
  3. 在自己的 PC 上安装 Xshell 和 Xftp

ubuntu 上安装 golang

rootGOPATH/root

只要在 Xshell 中输入下方代码即可在 ubuntu 上安装 golang:

sudo apt-get install golang-go

看一下安装成功没?

go version

查看 GOPATH 位置:

go env
GOPATH

上传 go 文件

GOPATH~/go/go-webGOPATHmain.go
package main  //编译成可执行文件

import (  //导入包
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World")
    })    //建立路由,即当访问:“主域名” 时即返回“hello world”

    http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) {
        name := r.URL.Path[len("/greet/"):]
        fmt.Fprintf(w, "Hello %s\n", name)
        })  //建立路由,即当访问:“主域名/greet/自定义” 时即返回“hello 自定义”

    http.ListenAndServe(":9990",nil)
}
~/go/go-web~/go/go-web
cd /root/go/go-web  #前方的root应当根据GOPATH而变
  1. 输入下方代码进行编译:
go build main.go

创建 Systemd Unit 文件

goweb.service
[Unit]
Description=goweb

[Service]
Type=simple
Restart=always
RestartSec=5s
ExecStart=/root/go/go-web/main

[Install]
WantedBy=multi-user.target
/rootGOPATH
/lib/systemd/systemgoweb.service
cd
  1. 启动网络服务
sudo service goweb start
  1. 查看服务状态
sudo service goweb status
Active: active (running)

安装 Nginx

在 Ubuntu 下安装 Nginx:

sudo apt-get install nginx

域名添加解析

新手引导

配置 ssl 证书

搞一个真实的 ssl 证书

一般来说现在的域名提供商处都会提供免费的 ssl 证书申请。这里推荐一个我一直使用的免费 ssl 证书提供商:freessl.cn。在其官网上经过简单的操作即可获得域名的 ssl 证书。

将该网站所提供的证书下载下来备用,具体步骤可以查看这篇文章。

/uploads/2020/02/golang_web_app_01.png

一些准备工作

.crt.keymain.go

修改 Nginx 配置文件

你的域名xd.sh.cn

下方代码仅配置了 http,无法使用 https 访问网站。

server {
    server_name xd.sh.cn www.xd.sh.cn;

    location / {
        proxy_pass http://localhost:9990;
    }
}

下方代码仅配置了 https,无法使用 http 访问网站。

server {
    listen 443 ssl;
    ## listen 80;   ##加上这句http和https均能访问
    server_name xd.sh.cn www.xd.sh.cn;
    ssl                  on;
    ssl_certificate     /root/go/go-web/server.crt;
    ssl_certificate_key  /root/go/go-web/server.key;

    ssl_session_timeout  5m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        proxy_pass http://localhost:9990;
    }
}
return 301$server_name$request_uri
server {
    listen 80;
    server_name xd.sh.cn www.xd.sh.cn;
    return 301 https://$server_name$request_uri;

    location / {
        proxy_pass http://localhost:9990;
     }
}


server {
    listen 443 ssl;
    server_name xd.sh.cn www.xd.sh.cn;
    ssl                  on;
    ssl_certificate     /root/go/go-web/server.crt;
    ssl_certificate_key  /root/go/go-web/server.key;

    ssl_session_timeout  5m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        proxy_pass http://localhost:9990;
    }
}
/etc/nginx/sites-available/etc/nginx/ sites-enabled
sudo ln -s /etc/nginx/sites-available/your_domain  /etc/nginx/sites-enabled/your_domain
  1. 重新加载 Nginx
sudo nginx -s reload

大功告成

https://your_domainhttps://xd.sh.cnHello Worldhttps://your_domain/greet/your_nameHello your_namehttps://

参考资料