はじめに
下記の記事をみたら分かりやすいかもしれませんが、英語なので、実際にやった方法も交えてメモしておこうと思います。(似てるところもありますが、翻訳ではありません。)
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をみてください。
簡単に言うと、こちらから環境にあったものをインストールするか、
ソースからインストールする場合には、拙作ですが、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
からの接続を受け入れます。handler
がnil
の場合、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メモ