Martiniを使用してUbuntu上のNginxサーバーの背後にあるGoアプリケーションを提供する方法
ステータス:非推奨
この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。
理由: Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達しました and no longer receives security patches or updates. This guide is no longer maintained.
代わりに参照してください:このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。
序章
Webフレームワークは、Webアプリケーションの開発の苦痛を取り除くための優れたツールです。 多くの場合、アプリケーションの機能と表示に集中できるようにするために、低レベルの構成の一部を処理します。
Martiniは、これらの機能を実行するGoプログラミング言語のパッケージです。 ルーティング、静的ファイルサービング、エラー処理、ミドルウェアを提供し、既存のGoWeb機能にフックします。 これにより、既存のGoコードに簡単にプラグインして、ワークロードを簡素化できます。
このガイドでは、Martiniを使用してUbuntu12.04サーバーでGoWebアプリケーションをすばやく構築する方法について説明します。
GowithGVMをインストールします
Ubuntu 12.04ではデフォルトのリポジトリにGoパッケージをインストールできますが、Martiniが正しく機能するにはGoバージョン1.1以降が必要です。 リポジトリ内のバージョンは、この要件を満たしていません。
リポジトリからGoをインストールする代わりに、Goバージョンマネージャーであるgvmを使用して、最新バージョンのgoをインストールします。 ただし、これを行う前に、リポジトリからの依存関係がdo必要です。
sudo apt-get update sudo apt-get install curl git mercurial make binutils bison gcc
gvmの依存関係をインストールした後、プロジェクトのGitHubページからgvmインストールスクリプトをダウンロードして実行できます。
bash < <(curl -s https://raw.github.com/moovweb/gvm/master/binscripts/gvm-installer)
これにより、gvmスクリプトとファイルが.gvm
というホームフォルダ内の隠しディレクトリにインストールされます。 gvmを使用してGoバージョンをインストールするには、最初にスクリプトを入手して、現在のシェルセッションでスクリプトを使用できるようにする必要があります。
source ~/.gvm/scripts/gvm
現在のシェルでgvmコマンドを使用できるようになったので、次のコマンドを発行してGoバージョン1.2をインストールできます。
gvm install go1.2
これにより、Martiniと互換性のあるGoバージョンがインストールされます。 次のように入力して、これをデフォルトとして設定します。
gvm use go1.2 --default
Go環境をセットアップする
Goがインストールされたので、Go環境をセットアップする必要があります。 Goは、正しく構築するために物事が特定の方法で編成されることを期待しています。 bin、src、およびpkgサブディレクトリを持つプロジェクトディレクトリが必要です。
この構造をホームディレクトリに作成します。
cd ~ mkdir -p go/{bin,pkg,src}
次に、このプロジェクトディレクトリを反映するようにGoパスを設定し、go/bin
ディレクトリを通常のパスに追加して、Goプログラムを簡単に実行できるようにする必要があります。
export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin
これらを.bashrc
に追加して、ログインするたびに実行されるようにすることができます。
echo "export GOPATH=$HOME/go" >> ~/.bashrc echo "export PATH=$PATH:$GOPATH/bin" >> ~/.bashrc
これで、最初のMartiniアプリケーションで作業する準備が整いました。
最初のマティーニアプリケーションの作成
Martiniアプリケーションのいくつかの品質を示す「Helloworld」サンプルプログラムを簡単に作成できます。
プログラムをhello.go
と呼び、~/go/src
ディレクトリ内の同じ名前のアプリケーションディレクトリに配置します。
cd ~/go/src mkdir hello nano hello/hello.go
このファイルでは、メインプログラムの一般的なGoパッケージ宣言から始めます。 これに続いて、マティーニパッケージを取得できる場所をリストしてインポートします。
package main import "github.com/codegangsta/martini"
次に、プログラムの大部分を含むメイン関数を作成します。
package main import "github.com/codegangsta/martini" func main() { server := martini.Classic() server.Get("/", func() string { return "<h1>Hello, world!</h1>" }) server.Run() }
main()
関数に挿入したコードの機能を見てみましょう。
server := martini.Classic()
この行は、server
という変数を初期化し、それに「Classic」オブジェクトのインスタンスを割り当てます。 classic()
関数は、ほとんどのアプリケーションが恩恵を受けるいくつかのデフォルトと機能を含むMartiniのインスタンスを作成します。
server.Get("/", func() string { return "<h1>Hello, world!</h1>" })
コードのこの部分は、ルートURLの場所であるリソース「/」に対するHTTPgetリクエストに応答するURLハンドラーを設定します。 つまり、ユーザーがサーバーのベースIPアドレスまたはドメイン名を要求すると、コードの一部が実行されます。
この関数は文字列を返します。この文字列は応答の本文として返され、ユーザーのブラウザウィンドウに表示されます。
server.Run()
この行は、リクエストをリッスンしてトラフィックをルーティングするために、実際にMartiniサーバーを起動する行です。
終了したら、ファイルを保存して閉じます。
次に、Goが入力したプログラムを実行できるように、Martiniパッケージを取得する必要があります。
go get github.com/codegangsta/martini
これにより、パッケージがパスにダウンロードされ、Goがこのリソースを見つけて使用できるようになります。
最後に、次のように入力してプログラムを実行できます。
go run hello.go
Martiniはポート3000でアプリを提供するため、WebブラウザーでIPアドレスに続いてポート番号にアクセスすると、アプリケーションにアクセスできます。
http:// your_ip :3000
ルーティングとパラメータを追加する
「HelloWorld」プログラムの最初の反復は完了しましたが、Martiniのルーティング機能を利用することで改善できます。
ベースURLのリクエストを処理するルートをすでに1つ作成しました。 これは一般的なデフォルトとしてはうまく機能しますが、パーソナライズする場合は、ユーザーからの入力を受け取ることができる必要があります。
ユーザーから入力を取得する1つの方法は、URL自体を使用することです。 URLの一部を、関数の戻り値を設計するときに呼び出すことができるパラメーターとして設定できます。
ベースURLルートの下に、別のルートを追加しましょう。
. . . server.Get("/", func() string { return "<h1>Hello, world!</h1>" }) server.Get("/:who", func(args martini.Params) string { return "<h1>Hello " + args["who"] + "</h1>" }) . . .
新しいハンドラーは、別のスラッシュまでベースURLに続くすべてのリクエストに応答します。 特定のURL文字列を照合する代わりに、:who
というプレースホルダーを使用します。 このプレースホルダーは「who」と呼ばれるパラメーターであり、ユーザーが最初の「/」の後に入力した値を取得します。
また、関数宣言は、タイプmartini.Params
のargs
という引数を取るようになったことにも注意してください。 これにより、ユーザーが要求したURL値に設定される「who」パラメーターにアクセスできます。
ハンドラー内には基本的に同じ戻り文字列がありますが、構文args["who"]
を使用してパラメーターにアクセスします。 これにより、「who」の値が文字列に挿入されます。
これを保存して再度実行すると、前回ベースURLにアクセスしたときと同じページにアクセスできます。 ただし、ベースURLの後に「/ your_name
」が付いている場合は、名前で動的にユーザーに挨拶することもできます。
http:// your_ip :3000 / Peter
URLのスペースを「%20」に置き換えることで、複数の単語をつなぎ合わせることができます。
http:// your_ip :3000 / is%20a%20rather%20fine%20greeting
Nginxを介してアプリをプロキシする方法
Martiniサーバーはアプリケーションにサービスを提供するための優れた方法ですが、メインサーバーインターフェイスとして公開することを許可することはおそらくベストプラクティスではありません。 Nginxをリバースプロキシとして使用して、適切なパラメーターをアプリケーションに渡すことができます。
UbuntuのリポジトリからNginxをインストールして、開始できるようにします。
sudo apt-get install nginx
私たちの構成は比較的基本的なものになります。 リクエストをMartiniサーバーに直接渡します。
デフォルトのNginx構成ファイルを編集します。
sudo nano /etc/nginx/sites-enabled/default
内部で、server_name
宣言をIPアドレスまたはドメイン名と一致するように変更します。 ドメイン名を使用している場合は、必ずDigitalOceanコントロールパネルでホスト名を設定してください。
server_name your_ip_or_domain ;
次に、location /
宣言を変更して、リクエスト情報をMartiniアプリケーションに渡します。 デフォルトのlocation /
セクションを削除またはコメントアウトし、このパスを処理する新しいセクションを追加します。
location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:3000; }
これらの変更を行ったら、ファイルを保存して閉じます。
次に、サーバーを再起動して変更を実装します。
sudo service nginx restart
これで、フロントエンドサーバーが構成され、アプリケーションに接続を渡す準備が整いました。 これらの接続を受け入れるには、プログラムを開始する必要があります。
現在、次の構文を使用してプログラムを実行しています。
program_nameを実行します
代わりに、名前で実行できるようにプログラムをインストールする必要があります。 Goでインストールするプログラムを見つけるためのシステムパスはすでに設定されています。
次のように入力して、プログラムをインストールします。
go install hello
これにより、プログラムがコンパイルされ、~/go/bin
ディレクトリに保存されます。
これで、次のように入力するだけでプログラムを開始できます。
hello
これにより、Martiniサーバーが起動します。このサーバーは、いつものようにポート3000でリクエストをリッスンします。
コマンドラインにアクセスできるようにする場合は、代わりにバックグラウンドで開始する必要があります。 「CTRL-C」と入力してプログラムを停止し、次のように開始します。
hello &
これにより、アプリケーションが動作している間もコマンドを入力し続けることができます。
サーバーのIPアドレスまたはドメイン名にアクセスしてサーバーにアクセスする場合は、アプリケーションにルーティングされる必要があります。 ドメインの後にスラッシュと名前を付けると、次のように表示されます。
http:// your_ip_or_domain / John
結論
Martiniを使用すると、GoプログラムでWebリクエストを簡単に処理できます。 すべてを最初から書き直すのではなく、コアWebパッケージの既存のサーバー機能を論理的に拡張する機能を作成しようとします。
この記事では例はかなり単純ですが、Martiniははるかに複雑な構成を処理できます。 これは、他の機能を提供プロセスに注入するためのミドルウェアシステムを実装し、コミュニティの貢献を使用して拡張できます。 Martiniは、Webプロセスを簡素化して、アプリケーションのコア機能に集中できるようにします。