2013年3月30日土曜日

Go言語でWebサーバを立てる 第3回 サーバマシンにWebサーバアプリをサービス登録する


こんにちは。scarvizです。

今回は前回までに作成したWebサーバアプリをサーバマシンにサービス登録してみようと思います。
サーバマシンを触るだけなので、Go言語はほとんど出てきません。

今回はサーバマシン(CentOS6.4)とクライアントマシン(Win7)を使います。




■サービス起動/終了スクリプトを作成する
実行ファイル(gowebserver)をサーバマシンの任意の場所に配置します。
今回は/usr/local/にgowebserverディレクトリを作成し、その下に配置しました。
もし前回の時に、gowebserverのカレントディレクトリを実行ファイルのディレクトリにしていた場合は、/usr/local/gowebserverに変更してください。

func main(){
 (省略)
 
 // ここでカレントディレクトリを実行ファイルのディレクトリにしておくと後々困らない
 // hogehogeを実行ファイルのディレクトリに置き換えてください
 os.Chdir("/usr/local/gowebserver")
 
 (省略)
}

まずはサーバマシンから、下記コマンドでgowebserverディレクトリを作成します。
※権限が必要になるので、あらかじめrootユーザになっておいてください。

mkdir /usr/local/gowebserver

すでに実行ファイルをサーバマシンのカレントに移していた場合は、下記コマンドを実行してください。

mv gowebserver /usr/local/gowebserver/

まだ実行ファイルを移していない場合は、Go開発マシン(Ubuntu12.04)から下記コマンドを実行して転送することもできます。
転送先はどこでも構いませんが、/usr/local/gowebserverに移すには権限が必要になるので、とりあえずホームディレクトリに配置してから移動させれば良いと思います。

Go開発マシンから以下コマンドを実行します。
scp gowebserver (ユーザ名)@(ホスト名またはIPアドレス):/home/(ユーザ名)

サーバマシンで以下コマンドを実行します。
mv /home/(ユーザ名)/gowebserver /usr/local/gowebserver/

また、実行ファイルの権限を変更しておきます。
chmod 755 /usr/local/gowebserver/gowebserver

/etc/init.d/以下にスクリプトを作成します。
スクリプト名は実行ファイルと同じ名前にしています。
下記コマンドを実行してください。

vi /etc/init.d/gowebserver

スクリプトの内容は下記のようにします。

#!/bin/bash
#
# chkconfig: 2345 86 16
# descripton: go web server
# processname: gowebserver
# pidfile: none
# config: none
#

# source function library
. /etc/rc.d/init.d/functions

PATH=$PATH:/usr/local/gowebserver
PROG=/usr/local/gowebserver/gowebserver
PROGNAME=`basename $PROG`

[ -f $PROG ] || exit 0

case "$1" in
start)
  echo -n $"Starting $PROGNAME: "
  daemon $PROG
  echo
;;
stop)
  echo -n $"Stopping $PROGNAME:"
  killproc $PROGNAME
  echo
;;
status)
  status $PROGNAME
;;
restart)
  echo -n $"Stopping $PROGNAME:"
  killproc $PROGNAME
  echo
  echo -n $"Starting $PROGNAME: "
  daemon $PROG
  echo
;;
*)
  echo $"Usage: $PROGNAME {start|stop|status|restart}" >&2
  exit 1
;;
esac
exit 0

スクリプトも権限を変更しておきます。

chmod 755 /etc/init.d/gowebserver

このスクリプトはランレベルの3と5を有効にしているので、起動スクリプトとして登録すれば、OS起動時に自動的にサービスを起動してくれるようになっています。
また、「/etc/init.d/gowebserver xxxxx」のように実行することで、gowebserverの実行/停止などを行うことが出来ます。
xxxxxの部分をstartで実行すると起動、stopは停止、restartは再起動、statusは状態確認になります。

■スクリプトの登録とサービスの起動
OS起動時に自動的にサービスを起動させるために、スクリプトを下記コマンドで登録します。

chkconfig --add /etc/init.d/gowebserver

statusでgowebserverの状態がわかります。
現在は停止中なので、結果は下記のように表示されます。

/etc/init.d/gowebserver status
gowebserver は停止しています

startでgowebserverを起動します。
正常に起動できた場合は、結果は下記のように表示されます。

/etc/init.d/gowebserver start
Starting gowebserver:                          [  OK  ]

statusでgowebserverの状態をもう一度確認してみます。
実行中なので、結果は下記のように表示されます。xxxxxはPIDになります。

/etc/init.d/gowebserver status
gowebserver (pid xxxxx) を実行中...

stopでgowebserverを停止します。
正常に停止できた場合は、結果は下記のように表示されます。

/etc/init.d/gowebserver stop
Stopping gowebserver:                           [  OK  ]

今度はブラウザで確認するため、もう一度startで起動させます。

/etc/init.d/gowebserver start

サーバマシンから下記にアクセスすると、ちゃんと「Welcome!!」と表示されていると思います。
http://localhost:8080/

■ポートを開放する
ifconfigコマンドでサーバマシンIPアドレスを調べ、クライアントマシンから下記にアクセスしてみます。
http://(IPアドレス):8080/

エラーが表示されると思います。
8080番ポートが閉じているため、アクセスできなくなっています。
なので、外からアクセスするには8080番ポートを開放する必要があります。
ポートを開放するには/etc/sysconfig/iptablesを編集します。
下記コマンドを実行してください。

vi /etc/sysconfig/iptables

デフォルトで下記のような記述がされていると思います。
※もしなければ、下記内容でそのまま新規作成してください。

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

「-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT」の部分がポートを開放しているところになります。ここでは22番を解放しています。
22番のように、22番の記述の下に8080番を追記します。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

変更した場合は下記コマンドで再起動し、変更を有効にします。

service iptables restart

■ポートをウェルノウンポート(80番)に変更する
今回はHTTPなのでウェルノウンポートの80番にしておく方が良いと思います。
main関数でListenAndServe関数の引数で「":8080"」としていたところを、以下のように変更してください。

// Webサーバを80ポートで開始する
err := http.ListenAndServe("", nil)

あとは上記と同じ手順で配置し、80ポートを開放して、クライアントマシンから下記にアクセスすると、「Welcome!!」が表示されると思います。
http://(IPアドレス)/


以上で「Go言語でWebサーバを立てる」は終わりです。
今回は紹介していませんが、htmlファイルやjsファイル、cssファイルを登録したりも出来るので、今までの資産をGoのWebサーバに流用することも可能と思います。
僕はそういう資産がまったく無かったのですが、作ってみたかったので、ちょっとしたWebサービスを作ってみました。
『AZサーチ』(あずさーち)というATNDとZusaarのイベント検索が一括で出来るものです。
良かったらちょっと触ってみてください。
http://gosrv.scarviz.net/azsearch
※サーバ借りたばかりで、そのままIPアドレスになってますが、現在ドメイン取得中です。そのうち書き換えます。→変更しました!(4/4)
※AZサーチを作成する上で、やしさん(http://kwmt27.net/)に色々アドバイス頂きました!ありがとうございます!

次回はAZサーチを作成している時に色々気付いた事などを紹介したいと思っています。
「Go言語でWebサーバを立てる」の補足編みたいな感じです。

0 件のコメント:

コメントを投稿