開発者ドキュメント

Ubuntu18.04でNginxを使用してGoWebアプリケーションをデプロイする方法

著者は、 Write forDOnationsプログラムの一環として寄付を受け取るためにTechEducationFundを選択しました。

序章

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

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

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

前提条件

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

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

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

このステップでは、Hello Worldyour_domainで表示し、ユーザーにyour_domain/greet/で挨拶するサンプルのGoWebアプリケーションを作成します。 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アプリケーションの機能を作成するには、新しく作成したmain.goファイルに次の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
...

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

次に、importステートメントがあります。

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

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

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

次のスニペットは、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)
}

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

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

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

  1. go build main.go

上記のコマンドは、main.goをコンパイルして、mainというタイトルの実行可能ファイルを生成します。

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

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

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

まず、nanoまたはお好みのテキストエディタを使用して、/lib/systemd/systemディレクトリにgoweb.serviceという名前の新しいファイルを作成します。

  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

ExecStart=/home/user/go/go-web/main変数は、このサービスのエントリポイントが/home/user/go/go-webディレクトリにあるmain実行可能ファイルを経由することを指定します。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リバースプロキシを設定します。

まず、作業ディレクトリをNginxsites-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 を使用して、localhostとして示されるサーバーのIPアドレスでGoWebアプリケーションを提供し、ポート9990で実行します。 server_nameは、IPアドレスにマッピングされたドメイン名を示します。この場合はyour_domainwww.your_domainです。

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

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

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

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

  1. sudo nginx -s reload

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

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

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

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

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

お好みのWebブラウザを開き、https://your_domainにアクセスします。

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

次に、2番目のルートhttps://your_domain/greet/your-nameにアクセスして、your-nameをアプリに挨拶する名前に置き換えてみてください。

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

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

結論

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

モバイルバージョンを終了