· 1.2 rc1 golang Go言語 MySQL net/http/fcgi Nginx

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

  • このエントリーをはてなブックマークに追加

はじめに

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

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を使いたいと思います。

使用環境

サーバOS:CentOS release 6.4
Webサーバ:nginx-1.4.1
データベース:mysql  Ver 14.14 Distrib 5.5.27

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

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

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

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

# wget http://nginx.org/download/nginx-1.4.1.tar.gz
# tar zxvf nginx-1.4.1.tar.gz
# ls
nginx-1.4.1
# cd nginx-1.4.1
# ./configure

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

# ./configure --prefix=/usr/local --conf-path=/etc/nginx/nginx.conf 

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

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

bashの場合 .bashrcに下記を記入
export PATH=/usr/local/nginx/sbin:$PATH

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

【./configure時のエラー1】
./configure: error: the HTTP rewrite module requires the PCRE library.
【対策】
# yum -y install pcre pcre-devel

【./configure時のエラー2】
./configure: error: the HTTP gzip module requires the zlib library.
【対策】
# yum -y install zlib-devel

※参考
64bit版CentOS 5.3にnginxをインストールしてみた - Umeyashikiの日記 

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

# make
# make install

以上で、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にアクセスするようになります。(作るアプリによっては実用的ではないかもしれません)

server {
    listen       8080;
    server_name  localhost;

    location / {
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi.conf;
    }
}

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

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

location /admin {
            auth_basic "members onry";
            auth_basic_user_file "/etc/nginx/.htpasswd";
            fastcgi_pass 127.0.0.1:9000;
            include fastcgi.conf;
        }

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

# nginx

です。

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

# nginx -s reload //再起動
# nignx -s stop   //停止

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

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

package main
import (
    "net/http"
    "net/http/fcgi"
)
func main(){
    l,_:= net.Listen("tcp",":9000")
    mux := http.NewServeMux()
    fcgi.Serve(l,mux)
}

ちなみに、下記は“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をインストールするには次のようにします。

$ go get github.com/go-sql-driver/mysql

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

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

golangからMySQLを使うには

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

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

【原因】

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

Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8

【対策】

macでは

/etc/my.conf
[client]
default-character-set=utf8
...
[mysqld]
character-set-server=utf8 #ここだけ 違うので注意
...
[mysqldump]
...
default-character-set=utf8  
[mysql]
...
default-character-set=utf8

あとはmysqlを再起動する

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

※参考

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

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

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

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

おわりに

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

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

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

参考リンク

[1]: http://d.hatena.ne.jp/nightmare_tim/20110530/1306704112

  • このエントリーをはてなブックマークに追加
  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket