Martiniを使用してUbuntu上のNginxサーバーの背後にあるGoアプリケーションを提供する方法

提供:Dev Guides
移動先:案内検索

ステータス:非推奨

この記事では、サポートされなくなったバージョンの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.Paramsargsという引数を取るようになったことにも注意してください。 これにより、ユーザーが要求した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プロセスを簡素化して、アプリケーションのコア機能に集中できるようにします。

ジャスティン・エリングウッド