Goは、オープンソースの汎用プログラミング言語です。C言語の能力を提供しつつ、Pythonの生産性に触発されて開発されました。元々は、Googleが自社のコードベースで直面していた課題(コードの複雑さと長いコンパイル時間)に対処するために開発されました。他の現代のプログラミング言語と同様に、Goはあらゆる目的に適しています。例えば、Web開発、コマンドラインスクリプト、ネットワークサーバーアプリ、フロントエンド開発などに利用できます。
このガイドでは、Ubuntu 22.04 LTS上にシンプルなGoウェブアプリケーションをデプロイする手順を順を追って説明します。 また、トラフィック負荷を処理するためにNginxリバースプロキシも実装します。
前提条件
このガイドで示されている手順を実行するには、以下のコンポーネントが事前に設定されている必要があります。
- 適切に設定されたUbuntu。詳細については、CloudSigmaでの独自のUbuntuサーバーのセットアップ.
- 必要な環境変数を備えたGoプログラミング環境( $GOROOT および $GOPATH)。次のガイドを参照してください:UbuntuでのGoプログラミング環境の設定.
- Nginx(リバースプロキシ用)。このガイドでは、以下について詳しく説明します:UbuntuでのNginxのインストールと設定.
- Goコードの作業に適したテキストエディタ、例えば、Atom, Sublime Text, Brackets, VS Code, Vimなど。このガイドでは、テキストエディタとしてVS Codeを使用します。
サービスにドメイン名でアクセスできるようにする場合は、サーバーを指すFQDNが必要です。その場合、NginxをSSLで保護することをお勧めします。詳細については、UbuntuでLet’s Encryptを使用してNginxを保護する方法についてのチュートリアル.
ステップ 1 – Goウェブアプリの作成
ドメインにアクセスしたときに画面に“Hello World”と表示する、シンプルなGoウェブアプリを構築します。さらに、このアプリは以下にアクセスしたときにユーザーを歓迎します。 <domain>/greet/<username>.
まずは、次の配下に新しいプロジェクトを作成します。 $GOPATH。プロジェクトディレクトリを作成します:
|
1 |
mkdir -pv $GOPATH/go-web |

カレントディレクトリを変更します:
|
1 |
cd $GOPATH/go-web |

次に、プロジェクトを初期化します:
|
1 |
go mod init <package_name> |

次に、以下を作成します。 main.go これはGoアプリケーションのルートとして機能します。ウェブアプリのソースコードを格納します:
|
1 |
touch main.go |
VS Codeでプロジェクトを開きます:
|
1 |
code . |
次のコードをファイルに貼り付けます main.go:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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プログラムを簡単に解説します:
- 用語 package main はアプリケーションのエントリーポイントとして機能します。また、Goコンパイラに対して、ファイルを共有ライブラリではなく実行可能ファイルとしてコンパイルするように指示します。
- The import ステートメントは、プログラムが動作するために必要なすべての追加モジュールをインポートします。ここでは、 fmt(テキスト出力用)および net/http (Webサーバーアプリケーション用)パッケージをインポートしています。
- 関数
http.HandleFuncを使用して、2つのルートを設定しました:
- 最初のルート /は、次の関数内の親ルートとして機能します: func main.
- 2番目のルート
/greet/ は、URLパラメータ(この場合は文字列)を受け取ります。その後、その文字列が挨拶メッセージとともに表示されます。
- URL Path は、 の後の値を格納するために使用されます。/greet/。その後、その値は、URLパラメータの name として渡されます。
- The http.ListenAndServe 関数はウェブサーバーを起動します。ここでは、ポート をリスニングしています。9990.
プログラムの準備ができたので、ファイルを実行可能ファイルにコンパイルします。
|
1 |
go build main.go |
Goコンパイラは、ファイルと同じ名前の実行可能ファイルを作成します。 出力結果を確認してみましょう。
|
1 |
ls -lh |
ステップ 2 – バックグラウンド実行用の systemd ユニットファイルの設定
これまでは、現在のユーザーがシステムからログアウトすると、Goウェブアプリの実行が停止してしまいました。それはウェブサーバーの設計としては好ましくありません。この問題を解決するために、ユーザーがサーバーからログアウトしてもバックグラウンドで実行を継続できるように、systemdユニットファイルを作成します。これにより、設定が本番環境レベルのデプロイに一歩近づきます。
専用の systemd ファイル goweb.service を以下の配下に作成します: /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
ユニットファイルに次のスニペットを追加します:
|
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=goweb [Service] Type=simple Restart=always RestartSec=5s ExecStart=/home/<username>/go/go-web/main [Install] WantedBy=multi-user.target |

ここでは、
- 変数 ExecStart は、プロジェクトディレクトリ( $GOPATH/go-web) 内にあるメインの実行可能ファイルを介したサービスのエントリポイントを示します。なお、 を指定する代わりに、$GOPATH、実行可能ファイルへのフルパスを入力しました。これは、 $GOPATH 変数がユーザーにのみ表示されるためです。
- 変数 Restart は、 systemd に対し、プログラムの実行が停止した場合に何を行うかを指示します。値 always は、 systemd に対し、プログラムが停止するたびに毎回再起動するように指示します。
- 変数 RestartSec は、 systemd に対し、プログラムの再起動を試みる前に特定の時間待機するように指示します。ここでは、値は 5s (5秒)に設定されています。
- ステートメント WantedBy=multi-user.target は、どのような状態で systemd がサービスを有効にするかを指定します。
ファイルを保存してエディタを閉じます。サービスを起動します:
|
1 |
sudo service goweb start |

サービスが起動して実行中であることを確認します:
|
1 |
sudo service goweb status |

出力が示すように、アプリケーションは起動して実行されています。これで、Nginxをリバースプロキシとして使用する準備が整いました。
ステップ 3 – Nginxをリバースプロキシとして設定する
次に、Nginxがリバースプロキシとして機能するためのサーバーブロックを作成します。ウェブアプリは、リバースプロキシを介してインターネットに公開されます(パフォーマンスとセキュリティを向上させるため)。
現在のアクティブディレクトリを以下に変更します sites-available:
|
1 |
cd /etc/nginx/sites-available |

次に、アプリケーションを公開するドメイン名のファイルを作成します。デモンストレーションでは、以下を使用します。 example.com:
|
1 |
sudo nano example.com |
ブロックファイルに次のコードを入力します:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

ここでは、 proxy_pass を使用して、サーバーのIPアドレス(localhost)のポート でGoウェブアプリを提供します。9990.
Nginxブロックを有効にするには、ファイルのシンボリックリンク(ソフトリンクとも呼ばれます)をsites-enabledフォルダに作成します:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

変更を反映するためにNginxの設定を再読み込みします:
|
1 |
sudo nginx -s reload |
ステップ 4 – 検証
すべてが期待通りに機能していれば、ウェブアプリケーションは現在、 localhost:9990 および設定したドメインでアクセス可能になっているはずです。ウェブブラウザで次のURLを開きます:
|
1 |
localhost:9990 |

期待通り、アプリケーションは画面に“Hello World”を表示しています。これはプライマリルートの役割です。次に、以下のURLにアクセスして2番目のルートをテストします:
|
1 |
localhost:9990/greet/<名前> |

アプリケーションは、URLから受け取ったパラメータの名前を含むシンプルな挨拶メッセージを正常に返しています。
ご覧の通り、ローカルサーバーへのGoウェブアプリケーションのデプロイに成功しました!
最後に
このガイドでは、Go標準ライブラリを使用してシンプルなGoウェブアプリケーションをデプロイする方法を実演しました。また、Nginxを使用したリバースプロキシもデプロイしました。デモンストレーションはローカルサーバーで行われましたが、公開サーバーにおいては、SSL証明書を実装してインターネットに安全に公開することが強く推奨されます。Goプログラミングの詳細については、次のチュートリアルをご覧ください:Goプログラムのビルドとインストール.
ハッピーコンピューティング!


コメント
コメントはまだありません。最初のコメントを投稿しましょう。