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サーバーにデプロイします。
前提条件
このチュートリアルに従うには、次のものが必要です。
- この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アプリケーションの構築
このステップでは、Hello World
をyour_domain
で表示し、ユーザーにyour_domain/greet/
で挨拶するサンプルのGoWebアプリケーションを作成します。 Goでのプログラミングの基本について詳しく知りたい場合は、Goで最初のプログラムを作成する方法の記事を確認してください。
まず、 GOPATH ディレクトリに新しいディレクトリを作成して、ソースファイルを保持します。 フォルダには任意の名前を付けることができますが、このチュートリアルではgo-web
を使用します。
- mkdir $GOPATH/go-web
前提条件のチュートリアルGoをインストールしてUbuntu18.04にローカルプログラミング環境をセットアップする方法で提案されたファイル構造に従って、これによりディレクトリに~/go/go-web
のパスが与えられます。
次に、以下を実行して、ディレクトリをGOPATH
に新しく作成したフォルダに変更します。
- cd $GOPATH/go-web
nano
またはお好みのテキストエディタを使用して、main.go
という名前のファイルを作成します。このファイルには、Webアプリケーションのソースコードが含まれています。
- nano main.go
Hello World
アプリケーションの機能を作成するには、新しく作成したmain.go
ファイルに次の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)
}
次に、最初の行から始めて、前述のコードスニペットが何をするかを見ていきましょう。
まず、アプリケーションにエントリポイントを書き込みました。
package main
...
package main
は、このファイルを共有ライブラリとしてではなく実行可能プログラムとしてコンパイルするようにGoコンパイラに指示します。
次に、import
ステートメントがあります。
...
import (
"fmt"
"net/http"
)
...
このスニペットは、このコードが機能するために必要なモジュールをインポートします。これには、Webサーバーの標準のfmt
パッケージとnet/http
パッケージが含まれます。
次のスニペットは、main
関数で最初のルートを作成します。これは、Goアプリケーションのエントリポイントです。
...
func main () {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World")
})
...
}
...
親ルート/
がfunc main
内に作成され、要求されるとテキストHello World
が返されます。
次のスニペットに示されている2番目のルートは、挨拶とともに表示するURLパラメーター(この場合は名前)を受け入れます。
...
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パラメーターから名前として渡します。
最後に、サーバーをインスタンス化します。
...
func main () {
...
http.ListenAndServe(":9990", nil)
}
上記のスニペットはサーバーを起動し、Goの組み込みhttp
サーバーを使用してポート9990
を介してアプリケーションを公開します。
main.go
のコードの調査が終了したら、ファイルを保存してテキストエディタを終了します。
次に、以下を実行して、アプリケーションのバイナリ実行可能ファイルをビルドします。
- go build main.go
上記のコマンドは、main.go
をコンパイルして、main
というタイトルの実行可能ファイルを生成します。
サンプルのGoWebアプリケーションを作成しました。 次に、systemdユニットファイルを作成して、サーバーにアクセスしていないときでもアプリケーションをバックグラウンドで実行し続けます。
ステップ2—Systemdユニットファイルの作成
このステップでは、 systemd ユニットファイルを作成して、ユーザーがサーバーからログアウトした場合でもアプリケーションをバックグラウンドで実行し続けるようにします。 これにより、アプリケーションが永続的になり、実稼働グレードのデプロイメントに一歩近づくことができます。
まず、nano
またはお好みのテキストエディタを使用して、/lib/systemd/system
ディレクトリにgoweb.service
という名前の新しいファイルを作成します。
- sudo nano /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サービスを開始します。
- sudo service goweb start
サービスが実行されているかどうかを確認するには、次のコマンドを使用します。
- 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
ディレクトリに変更します。
- cd /etc/nginx/sites-available
アプリケーションを公開するドメインの名前で新しいファイルを作成します。 このチュートリアルでは、your_domain
を使用します。
- sudo nano your_domain
次の行をファイルに追加して、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_domain
とwww.your_domain
です。
次に、次のコマンドを実行して、sites-enabled
フォルダーにこのNginx構成のシンボリックリンクを作成します。
- sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/your_domain
シンボリックリンクは、別の場所にあるファイルのショートカットです。 新しく作成されたショートカットは、編集が行われたときに更新に合わせて調整するために、常に元のファイルを参照します。 Nginxでは、両方のディレクトリに構成のコピーが必要です。
次に、reloadコマンドを実行してNginx構成をリロードします。
- 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でのコーディング方法を参照してください。