#Nginx + #golang (FastCGI)+ #MySQL を使ったWebアプリケーションを書くための準備

Posted by kwmt on Wed, Oct 2, 2013

はじめに

下記の記事をみたら分かりやすいかもしれませんが、英語なので、実際にやった方法も交えてメモしておこうと思います。(似てるところもありますが、翻訳ではありません。)

Writing a Go (“golang”) Web App with nginx, FastCGI, MySQL, JSON

前提として、Go言語でWebサーバーをつくって動かすと言うと2種類の方法があります。

1つは、Go言語の“net/http”パッケージというのがありますので、これを使ってGo自体でWebサーバーを作ってしまうことができます。

もう1つは、ApacheやNginxなどのWebサーバー上で、CGI(正確にはFastCGI)としてGo言語を動かす方法です。これはNginx+PHP-FPMのようなもに近いイメージだと思います。

Nginxを使うか使わないかは、こちらのStackoverflowをみると、

Go HTTPサーバーはいいんだけど、Webサーバーを一から作るのは大変だよ、Nginxを使った方が簡単だよ

みたいな感じで、Nginxつかった方がいいよという結論になってます。

この記事では、2つ目の方法のNginx+golang(FastCGI)でWebアプリケーションを作る準備をメモしたいと思います。

データベースとしては、MySQLを使いたいと思います。

使用環境

1.Nginxをインストールする

まずは、CentOSにNginxをソースからインストールしたいと思います。(Nginx installリンク)

なぜソースからインストールするのかは、Web+DBにおすすめと書かれていたから(^o^;

ちゃんというとモジュール追加するには、make時にくっつけとかないといけないからで、必要なければ、rpmとかからインストールしてもいいと思います。

雑誌Web+DB pressのVol12.2013には下記のように指定してましたが、個人的にはデフォルトの方が分かりやすいため、特にオプション指定はしていません。

デフォルトでは、Nginxは/usr/local/nginxにインストールされます。

nginxのサービスを起動したりするコマンドは、/usr/local/nginx/sbinの中にあるnginxコマンドなので、PATHを設定しておくと楽になるかと思います。

さて、./configureの時点に少し戻ります。私の環境では、./configure時に下記の2つのエラーが出ましたので、それらについてのエラー内容と対策も書いておきたいと思います。

これで./configureが正常に終了したと思いますので、下記のようにしてインストールしましょう。

以上で、Nginxのインストールは終了です。

次に、Nginxの設定に行きたいところですが、インストールを終わらせてしまいましょう。

2.Go Toolsをインストール

基本的には本家サイトのGetting Startedをみてください。

簡単に言うと、こちらから環境にあったものをインストールするか、

https://golang.org/dl/

ソースからインストールする場合には、拙作ですが、gitが入っていれば数回のコマンド入力でgoがインストールできます。「Mercurialが入ってなければ、Mercurialをインストールする」というような工程はもう必要ありません。

https://github.com/kwmt/goinstall

こちらもお勧めです。(Linux,Macのみ対応しています。)

3.MySQLをインストールする

ググりましょう。

4.Nginxの設定をする

FastCGIを使うには、locationディレクティブに次のような感じで設定するようです。

この例だと、ポート8080にアクセスがきたら、ポート9000にアクセスするようになります。(作るアプリによっては実用的ではないかもしれません)

Basic認証を掛ける方法は、【Nginx】Basic認証をかけるを参考にさせて頂きました。

実際の設定としては次のようになります。

設定が終わったので、Nginxを起動させましょう。起動するには、

です。

再起動と停止は次のようにします。

5.Go言語プログラムをFastCGIとして動かすためには

何も出力しませんが、localhost:9000で接続要求を待ってくれます。この”9000″はNginx側の設定の9000と合わせる必要があります。

ちなみに、下記は“net/http/fcgi”パッケージのServe関数の翻訳です。Serve関数で何をやってるのかが分かるかと思います。

Serve関数はリスナーl(エル)上で、FastCGI接続を待ち受け、それぞれに対して新しいゴルーチンを作ります。

そのゴルーチンはリクエストを解釈し、リクエストに応答するhandlerをコールします。l(エル)がnilの場合、Serve関数は、os.Stdinからの接続を受け入れます。handlernilの場合、http.DefaultServeMuxが使われます。

6.Go言語からMySQLを使うには

ドライバを下記からインストールする必要があります。

http://golang.org/s/sqldrivers

上のリストをみると、MySQLのドライバは2つあるのですが、たとえば、go-sql-driver/mysqlをインストールするには次のようにします。

使い方については、下記が参考になると思います。

  • wikiにあるExamples
  • [Go言語] database/sqlパッケージを使ってみた

もう1つのドライバmymysqlについては、過去記事をご参照ください。

golangからMySQLを使うには

補足:mysqlから取得した日本語が文字化けする件

※Mac OSのみかもしれない.

【原因】

Server側とClient側の文字コードが異なっていたため。

【対策】

macでは

あとはmysqlを再起動する

(macの場合はシステム環境設定->MySQL->Stop MySQL Server ->Start MySQL Server)

※参考

fedora15 mysql5.5 default-character-setが原因で起動できない

補足:Go言語でクロスコンパイルするには

まだ試したことないですが、とりあえずメモがてら。ためして何か分かったら更新するかもです。

Go言語でクロスコンパイルする – memoメモ

おわりに

これでひとまずNginx+golang(fcgi)+MySQLの環境が整ったとおもいますので、あとは

Writing Web Applications(日本語訳)(スライド:Go言語によるwebアプリの作り方)

のような記事を読むと良いと思います。

参考リンク

  • Writing a Go (“golang”) Web App with nginx, FastCGI, MySQL, JSON
  • Stackoverflow:Webserver for Go (golang) webservices: using NGINX or not?
  • “net/http”パッケージ
  • “net/http/fcgi”パッケージ
  • Nginx installリンク
  • 64bit版CentOS 5.3にnginxをインストールしてみた – Umeyashikiの日記
  • 【Nginx】Basic認証をかける
  • Getting Started
  • https://golang.org/dl/
  • goinstall
  • SQLDrivers – go-wiki – SQL database drivers – Go Language Community Wiki – Google Project Hosting
  • wikiにあるExamples
  • [Go言語] database/sqlパッケージを使ってみた
  • golangからMySQLを使うには
  • fedora15 mysql5.5 default-character-setが原因で起動できない
  • Go言語でクロスコンパイルする – memoメモ


comments powered by Disqus