序章

Go は汎用プログラミング言語であり、徐々に最も人気のあるWebバックエンドプログラミング言語の1つになりつつあります。 Goの設計者は、シンプルさに焦点を当てることで、並行性により一度に複数のリクエストを処理できるなどの効率的な機能を活用して、習得が容易で、Webアプリケーションの他の多くの言語よりも高速な言語を作成しました。 このため、GoにWebアプリケーションをデプロイすると、多くのバックエンド開発者にとって便利になります。

Nginx は、リソースの使用量が軽く、負荷がかかった状態での信頼性が高いため、世界で最も人気のあるWebサーバーの1つです。 インターネット上で最大かつ最もトラフィックの多いサイトの多くは、コンテンツの提供をNginxに依存しています。 デプロイでは、Nginxは、セキュリティを強化し、アプリケーションをより堅牢にするために、ロードバランサーまたはリバースプロキシとしてよく使用されます。 Nginxは、Go Webバックエンドと組み合わせて、強力で高速なWebアプリケーションを提供できます。

このチュートリアルでは、 Hello World GoのWebアプリケーションを使用して、Nginxをリバースプロキシとして使用してUbuntu18.04サーバーにデプロイします。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • このUbuntu18.04チュートリアルの初期サーバーセットアップに従ってセットアップされた1つのUbuntu18.04サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。
  • Goプログラミング言語はGoのインストール方法とUbuntu18.04でのローカルプログラミング環境のセットアップ方法に従ってインストールされます。
  • Nginx は、 Ubuntu18.04にNginxをインストールする方法に従ってインストールされます。 ステップ5–サーバーブロックの設定に従わないでください。 このチュートリアルの後半で、Nginxサーバーブロックを作成します。
  • DigitalOcean でホスト名を設定する方法で説明されているように、サーバーを指すドメイン名。 このチュートリアルでは、 your_domain 全体を通して。 これは、WebサイトのSSL証明書を取得するために必要です。これにより、TLS暗号化を使用してアプリケーションを安全に提供できます。

さらに、Go Webアプリケーションの本番環境での展開を実現するには、TLS/SSL証明書をインストールしてサーバーを安全に保つことが重要です。 このステップは強く推奨されます。 Go Webアプリケーションを保護するには、このチュートリアルのステップ3の後にUbuntu18.04でLet’sEncryptを使用してNginxを保護する方法に従って無料のTLS/SSL証明書を取得します。

ステップ1—GoWebアプリケーションの構築

このステップでは、表示されるサンプルのGoWebアプリケーションを作成します Hello Worldyour_domain でユーザーに挨拶します your_domain/greet/. Goでのプログラミングの基本について詳しく知りたい場合は、Goで最初のプログラムを作成する方法の記事を確認してください。

まず、 GOPATH ディレクトリに新しいディレクトリを作成して、ソースファイルを保持します。 フォルダには好きな名前を付けることができますが、このチュートリアルでは go-web:

  1. mkdir $GOPATH/go-web

前提条件のチュートリアルGoをインストールしてUbuntu18.04にローカルプログラミング環境をセットアップする方法で提案されたファイル構造に従って、これによりディレクトリに次のパスが与えられます。 ~/go/go-web.

次に、以下を実行して、ディレクトリをに新しく作成したフォルダに変更します。 GOPATH:

  1. cd $GOPATH/go-web

使用する nano または、お好みのテキストエディタで次の名前のファイルを作成します main.go、Webアプリケーションのソースコードが含まれます。

  1. nano main.go

の機能を作成するには Hello World アプリケーションで、新しく作成したGoコードに次のGoコードを追加します main.go ファイル:

〜/ go / go-web / main.go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "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)
	})

	http.ListenAndServe(":9990", nil)
}

次に、最初の行から始めて、前述のコードスニペットが何をするかを見ていきましょう。

まず、アプリケーションにエントリポイントを書き込みました。

〜/ go / go-web / main.go
package main
...

The package main このファイルを共有ライブラリとしてではなく実行可能プログラムとしてコンパイルするようにGoコンパイラに指示します。

次に、あなたは import ステートメント:

〜/ go / go-web / main.go
...

import (
	"fmt"
	"net/http"
)
...

このスニペットは、このコードが機能するために必要なモジュールをインポートします。これには、標準が含まれます。 fmt パッケージと net/http Webサーバー用のパッケージ。

次のスニペットは、最初のルートを作成します main Goアプリケーションのエントリポイントである関数:

〜/ go / go-web / main.go
...
func main () {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello World")
	})
  ...
}
...

親ルート / 内に作成されます func main、テキストを返します Hello World 要求されたとき。

次のスニペットに示されている2番目のルートは、挨拶とともに表示するURLパラメーター(この場合は名前)を受け入れます。

〜/ go / go-web / main.go
...
func main () {
  ...
	http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) {
		name := r.URL.Path[len("/greet/"):]
		fmt.Fprintf(w, "Hello %s\n", name)
	})
...
}
...

これはGoを使用します URL.Path 直後に値を保存する /greet/ URLパラメータから名前として渡します。

最後に、サーバーをインスタンス化します。

〜/ go / go-web / main.go
...
func main () {
  ...
  http.ListenAndServe(":9990", nil)
}

上記のスニペットはサーバーを起動し、ポートを介してアプリケーションを公開します 9990 Goの内蔵を使用 http サーバ。

コードの調査が終了したら、 main.go、ファイルを保存して、テキストエディタを終了します。

次に、以下を実行して、アプリケーションのバイナリ実行可能ファイルをビルドします。

  1. go build main.go

上記のコマンドはコンパイルされます main.go タイトルの実行可能ファイルを生成します main.

サンプルのGoWebアプリケーションを作成しました。 次に、systemdユニットファイルを作成して、サーバーにアクセスしていないときでもアプリケーションをバックグラウンドで実行し続けます。

ステップ2—Systemdユニットファイルの作成

このステップでは、 systemd ユニットファイルを作成して、ユーザーがサーバーからログアウトした場合でもアプリケーションをバックグラウンドで実行し続けるようにします。 これにより、アプリケーションが永続的になり、実稼働グレードのデプロイメントに一歩近づくことができます。

まず、で新しいファイルを作成します /lib/systemd/system 名前の付いたディレクトリ goweb.service を使用して nano またはあなたが好むテキストエディタ:

  1. sudo nano /lib/systemd/system/goweb.service

サービスのパラメータを設定するには、次のスニペットをファイルに追加します。

/lib/systemd/system/goweb.service
[Unit]
Description=goweb

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

[Install]
WantedBy=multi-user.target

The ExecStart=/home/user/go/go-web/main 変数は、このサービスのエントリポイントが経由することを指定します main にある実行可能ファイル /home/user/go/go-web ディレクトリ、ここで user サーバーの非rootsudoアカウントのユーザー名です。 Restart=always systemdが停止した場合、常にプログラムの再起動を試みるようにします。 次の行で、 RestartSec=5s 再起動の試行の間に5秒の待機時間を設定します。 WantedBy=multi-user.target サーバーがサービスを有効にする状態を指定します。

ファイルを保存して終了します。

サービスユニットファイルを作成したので、次を実行してGoWebサービスを開始します。

  1. sudo service goweb start

サービスが実行されているかどうかを確認するには、次のコマンドを使用します。

  1. sudo service goweb status

次の出力が表示されます。

Output
● goweb.service - goweb Loaded: loaded (/lib/systemd/system/goweb.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2019-07-17 23:28:57 UTC; 6s ago Main PID: 1891 (main) Tasks: 4 (limit: 1152) CGroup: /system.slice/goweb.service └─1891 /home/user/go/go-web/main

systemdユニットファイルの操作の詳細については、Systemdユニットとユニットファイルについてを参照してください。

アプリケーションを起動して実行したので、Nginxリバースプロキシを設定できます。

ステップ3—Nginxを使用してリバースプロキシを設定する

このステップでは、Nginxサーバーブロックを作成し、アプリケーションをインターネットに公開するためにNginxリバースプロキシを設定します。

まず、作業ディレクトリをNginxに変更します sites-available ディレクトリ:

  1. cd /etc/nginx/sites-available

アプリケーションを公開するドメインの名前で新しいファイルを作成します。 このチュートリアルでは、 your_domain:

  1. sudo nano your_domain

次の行をファイルに追加して、の設定を確立します your_domain:

/ etc / nginx / sites-available / your_domain
server {
    server_name your_domain www.your_domain;

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

このNginxサーバーブロックは、 proxy_pass を使用して、次のように示されるサーバーのIPアドレスでGoWebアプリケーションを提供します。 localhost ポートで実行する 9990. server_name この場合、IPアドレスにマッピングされたドメイン名を示します your_domainwww.your_domain.

次に、このNginx構成のシンボリックリンクを sites-enabled 次のコマンドを実行してフォルダを作成します。

  1. sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/your_domain

シンボリックリンクは、別の場所にあるファイルのショートカットです。 新しく作成されたショートカットは、編集が行われたときに更新に合わせて調整するために、常に元のファイルを参照します。 Nginxでは、両方のディレクトリに構成のコピーが必要です。

次に、reloadコマンドを実行してNginx構成をリロードします。

  1. sudo nginx -s reload

展開が機能していることを確認するには、次のWebサイトにアクセスしてください。 http://your_domain ブラウザで。 HelloWorldテキスト文字列が表示されます。

注:前提条件のセクションで説明したように、この時点で、サーバーでSSL/TLSを有効にすることをお勧めします。 これにより、アプリケーションとその訪問者の間のすべての通信が暗号化されます。これは、アプリケーションがログインやパスワードなどの機密情報を要求する場合に特に重要です。 Ubuntu 18.04でLet’sEncryptを使用してNginxを保護する方法に従って、Ubuntu18.04でNginxの無料SSL証明書を取得してください。 SSL / TLS証明書を取得したら、戻ってこのチュートリアルを完了してください。

これで、ドメイン名でアプリケーションを公開するようにNginxリバースプロキシを設定し、GoWebアプリケーションをSSL/TLSで保護しました。 次のステップでは、安全な接続を介してアプリケーションをテストします。

ステップ4—アプリケーションのテスト

このステップでは、安全な接続を介してアプリケーションをテストし、すべてが機能していることを確認します。

お好みのウェブブラウザを開き、にアクセスしてください https://your_domain:

あなたは簡単な Hello World メッセージ。 使用時にこのメッセージを受信する https:// URL内は、アプリケーションが安全な接続を介して提供されていることを示します。

次に、2番目のルートにアクセスしてみてください https://your_domain/greet/your-name、交換 your-name アプリに挨拶させたい名前:

アプリケーションは、と一緒に簡単な挨拶を返します your-name、これはURLに渡されたパラメータに基づいています。

これらの結果を受け取ったら、GoWebアプリケーションを正常にデプロイしました。

結論

このチュートリアルでは、標準ライブラリを使用してGoで簡単なWebアプリケーションを作成し、Nginxを使用してリバースプロキシを設定し、ドメインでSSL証明書を使用してアプリを保護しました。 Goの詳細については、公式ドキュメントを確認してください。 また、この効率的な言語でのプログラミングの詳細については、シリーズGoでのコーディング方法を参照してください。