会社の仕事で、ジンバブエのハラレに出張に行っています。
6/12に日本を出発し、6/13日ハラレに到着。Holiday Inn Harareにチェックイン。
南半球の現地はこれから冬なのだが、日向は暑いが日陰は涼しい。今の札幌より暑い。
現地の人はシャナ語と英語を話しているが、英語はネイティブではないせいか多少ゆっくり話してくれるのでまだ聞き取れる。
また合うたびに握手して挨拶をする。
WIFIによるInternetアクセスが提供されており、32kbps程度の速度だが、日本の自宅のPCとVPN接続し、RemoteDesktopで操作ができた。
ジンバブエ日記というページで、日本人の方が結構住んでいるらしい事は分かったので、その方達とも合えるかもしれません。
ジンバブエ1日目
会社の仕事で、ジンバブエのハラレに出張に行っています。
6/12に日本を出発し、6/13日ハラレに到着。Holiday Inn Harareにチェックイン。
南半球の現地はこれから冬なのだが、日向は暑いが日陰は涼しい。今の札幌より暑い。
現地の人はシャナ語と英語を話しているが、英語はネイティブではないせいか多少ゆっくり話してくれるのでまだ聞き取れる。
また合うたびに握手して挨拶をする。
WIFIによるInternetアクセスが提供されており、32kbps程度の速度だが、日本の自宅のPCとVPN接続し、RemoteDesktopで操作ができた。
ジンバブエ日記というページで、日本人の方が結構住んでいるらしい事は分かったので、その方達とも合えるかもしれません。
IPv6 Days
6/8はIPv6 Daysとして大手WebサイトがIPv6を有効にしてテストをしていたが大きなトラブルも起きていないようだった。このWebサイトもIPv6対応しているが、訪れた人のIPv6の割合は通常と変わらず5%もいない。
ここ一年の間にIPv6でアクセスする人が増えると思うが、スムーズに移行できることを願っています。
APC-3.1.8のバグ
PHP高速化のために、5/2にstableとしてリリースされたAPC-3.1.8を入れてみた。
http://pecl.php.net/package/APC/
環境は、CentOS5.5 + Apache 2.2.3 + PHP5.1.6。
ところが、バグっているようで、巷で騒がれているWordPressのほうは問題なかったが、PowerAdminがconfig.inc.phpをincludeできないというerrorを出した。
http://www.maido3.com/server/zousan/nikki264.html
APC-3.1.6, APC-3.1.7, APC-3.0.19 と試してみたが、試した範囲では問題なさそうだったので、問題がおきなさそうな3.0.19を利用することにした。
なお、以下の様にインストールを行った。
[code]
# yum install php-devel httpd-devel gcc gcc-c++ pcre pcre-devel php-pear
# pecl install APC-3.0.19
downloading APC-3.0.19.tgz …
Starting to download APC-3.0.19.tgz (115,735 bytes)
…………………….done: 115,735 bytes
47 source files, building
running: phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20050922
Zend Extension Api No: 220051025
Use apxs to set compile flags (if using APC with Apache)? [yes] :
※取り合えずデフォルトのままとした。
~~~~
Build process completed successfully
Installing ‘/var/tmp/pear-build-sysadmin/install-APC-3.1.8//usr/lib64/php/modules/apc.so’
Installing ‘/var/tmp/pear-build-sysadmin/install-APC-3.1.8//usr/include/php/ext/apc/apc_serializer.h’
install ok: channel://pecl.php.net/APC-3.1.8
You should add "extension=apc.so" to php.ini
[/code]
■ 2. /etc/php.d/apc.iniに設定
[code]
3.1系の場合
# vi /etc/php.d/apc.ini
extension=apc.so
[APC]
apc.enabled = 1
apc.shm_size = 32M
apc.gc_ttl = 3600
apc.ttl = 3600
3.0系の場合、Mを書かない
# vi /etc/php.d/apc.ini
extension=apc.so
[APC]
apc.enabled = 1
apc.shm_size = 32
apc.gc_ttl = 3600
apc.ttl = 3600
[/code]
■ 3. apacheの再起動
[code]
# /etc/init.d/httpd restart
[/code]
■ 4. キャッシュ状況の確認
[code]
# mkdir /var/www/html/apc/apc.php
# ln -s /usr/share/pear/apc.php /var/www/html/apc/apc.php
[/code]
最後にブラウザから確認する。
http://www.furelo.jp/apc/apc.php
※Basic認証などで、外部から参照できないようにすること。
VirtualDomain別のWebDAV設定を自動化
ホスティングサービスのftpアカウントサービスのようなものを、ftpの代わりにWebDAVで実装できないかいろいろ試してみたところ、出来たのでまとめておく。
やりたいことは、「/webdav/{VirtualHost名}/」でサーバにアクセスすると、DBに保存してあるVirtualHostに対応したBasic認証のID/PWでログインでき、他のディレクトリは参照出来ないというもの。
厄介なのはmod_vhostsを使ってVirtualHost設定を自動化していたため、「%v」でVirtualHostが取れない点。
以下はCentOS5.5の環境で、mod_vhostsとmod_davとmod_auth_mysqlを組み合わせた場合の手順になります。
[code]
# yum install mod_auth_mysql
# vi /etc/httpd/conf.d/webdav.conf
<Location /webdav/>
Dav On
Order deny,allow
Deny from all
### 管理用サーバのIPからは、一覧表示を許可
Allow from 192.168.11.100
</Location>
<LocationMatch /webdav/*/>
### Basic認証もしくは、管理用サーバのIPからのみ許可。
Satisfy any
AuthName "Please enter your ID and password"
AuthType Basic
equire valid-user
AuthMySQLSocket /var/lib/mysql/mysql.sock
AuthMySQLUser apacheuser
AuthMySQLPassword apachepass
AuthMySQLDB auth
AuthMySQLNameField user_name
AuthMySQLPasswordField user_passwd
AuthMySQLUserTable users
AuthMySQLUserCondition "’%U’ REGEXP CONCAT(‘^/webdav/’,virtual_domain,’/’)"
AuthMySQLNoPasswd Off
AuthMySQLPwEncryption none
AuthMySQLEnable On
</LocationMatch>
[/code]
Apacheを再起動して設定を読み込み、後はユーザー情報を保存するDBを作成する。
[code]
# mysqladmin create auth -p
# mysql -u root -p auth
CREATE TABLE users (
user_name CHAR(30) NOT NULL,
user_passwd CHAR(20) NOT NULL,
virtual_domain CHAR(64) NOT NULL,
PRIMARY KEY (user_name, virtual_domain)
);
GRANT SELECT ON auth.users TO apacheuser IDENTIFIED BY ‘apachepass’;
GRANT SELECT ON auth.users TO <a href="mailto:’apacheuser’@’localhost’">’apacheuser’@’localhost'</a> IDENTIFIED BY ‘apachepass’;
FLUSH PRIVILEGES ;
[/code]
そして以下のようにして、アカウントを登録する。
[code]
INSERT INTO users (user_name, user_passwd, virtual_domain) VALUES (‘admin’, ‘testadmin’, ‘www.sample.com’);
INSERT INTO users (user_name, user_passwd, virtual_domain) VALUES (‘admin2’, ‘testadmin2’, ‘www2.sample.com’);
[/code]
動かないときは、my.cnfにlogオプションを追加し、実行されているクエリをしらべます。
CentOS 5.6 がリリースされました
気づくのが遅れましたが、4/7あたりにCentOS 5.6がリリースされていました。
http://wiki.centos.org/Manuals/ReleaseNotes/CentOS5.6/Japanese
さて各VMアップデートしないと。
カテゴリー: Technology
コメントする
XenServerのSRとしてGlusterFSを利用する
GlusterFSの設定が完了したので、XenServerのSRとして設定する。
各サーバにSR用のBRICK用ディレクトリを作成。
[code]
[gluster1]# mkdir /var/brick/sr-mount
[gluster2]# mkdir /var/brick/sr-mount
[/code]
GlusterFSにSR用のボリュームを設定する。
[code]
# /usr/local/sbin/gluster volume create SR_VOL \
replica 2 \
transport tcp \
gluster1.furelo.jp:/var/brick/sr-mount \
gluster2.furelo.jp:/var/brick/sr-mount
# /usr/local/sbin/gluster volume start SR_VOL
# /usr/local/sbin/gluster volume info
[/code]
NFSマウントできればOK。
[code]
# mount -t nfs -o mountproto=tcp localhost:/SR_VOL /mnt
# umount /mnt
[/code]
ここで問題なのが、これらのメールによると、XenServerのNFS SR機能は、Portmapperからポート番号を取得せずに2049に決め打ちらしい。
http://gluster.org/pipermail/gluster-users/2010-November/005751.html
http://gluster.org/pipermail/gluster-users/2010-November/005755.html
対応策として2つの方法がある。
1.GlusterNFSのポート番号を2049に固定する。
[code]
# vi /etc/glusterd/nfs/nfs-server.vol
以下のように、option nfs.port の行を追加すればいいらしい。
volume nfs-server
type nfs/server
option nfs.port 2049
option nfs.dynamic-volumes on
option rpc-auth.addr.BACKUP_VOL.allow *
option nfs3.BACKUP_VOL.volume-id 44fb814c-f2e7-48b3-bd2b-7533e04c3703
option rpc-auth.addr.SR_VOL.allow *
option nfs3.SR_VOL.volume-id a3a74863-60c9-4929-9f0c-dcc1d49791fe
subvolumes BACKUP_VOL SR_VOL
end-volume
※ただし、Glusterの現在のバージョン(3.1.2)では、CLIで操作したときにこのファイルはデフォルトの内容に上書きされる。デーモンを再起動しても上書きされてしまうようだ。
[/code]
2.ポート転送プログラムを動かす
gluster nfsのポート番号はtcpの38467番ポートになるようなので、tcpの2049番ポートに来たパケットを中継するように設定する。
[code]
# zypper install socat
# rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 3 tcp 38465 mountd
100005 1 tcp 38466 mountd
100003 3 tcp 38467 nfs
# socat TCP-LISTEN:2049,reuseaddr,fork TCP:localhost:38467 &
# vi /etc/init.d/after.local
以下の行を追加
socat TCP-LISTEN:2049,reuseaddr,fork TCP:localhost:38467 &
[/code]
XenCeneterからNew Storage -> NFS VHDを選択し、以下のパラメータで登録する。
[code]
Name: GlusterNFS virtual disk storage
Share Name: gluster2.furelo.jp:/SR_VOL
[/code]
※それぞれのサーバでCreate a new SRとする。
GlusterFSでクラスタファイルシステムを構築
以前、クラスタストレージであるGlusterFSを、Maildir形式のメールサーバ使えないか調べていたが、1000Base-Tのネットワーク環境では、システムコールに非常に時間がかかる(キャッシュされない)ことが分かり、あきらめた。
しかしながら、少数のファイルしかない VMイメージの保存用には問題ないと思われる。またGlusterFS v3.1.2から、GlusterのNFS領域をXenServerで利用できるようになったらしい。
そこで、XenServer上のVM (OpenSUSE)でGlusterFSを動作させ、それをXenServerのSR (Storage Repository)として利用したいと思う。
※無駄が多いけど、VM上で構築しておけばノードの追加が楽なので。
※試して使い物にならない程遅ければ、XenServer上に直接GlusterFSをインストールすることにする。
※なお、Oracle VM Server for x86 2.2.1で試している方がいましたので、それを参考にします。
http://nkjmkzk.net/?p=1691
開発用ツールをインストール
[code]
# zypper install autoconf automake libtool gcc make flex bison readline-devel
[/code]
GlusterFSのソースのダウンロード
[code]
# cd /usr/local/src
# wget http://download.gluster.com/pub/gluster/glusterfs/3.1/LATEST/glusterfs-3.1.2.tar.gz
# tar zxvf glusterfs-3.1.2.tar.gz
[/code]
コンパイル
[code]
# cd glusterfs-3.1.2
# ./configure
~~~略~~~
GlusterFS configure summary
===========================
FUSE client : yes
Infiniband verbs : no
epoll IO multiplex : yes
argp-standalone : no
fusermount : no
readline : yes
# make
# make install
※デフォルトでは、/usr/local/ 以下にインストールされる。
[/code]
ldconfigコマンドで共有ライブラリのキャッシュを作り直す。
[code]
# /sbin/ldconfig
# /usr/local/sbin/glusterfs –version
glusterfs 3.1.2 built on Mar 6 2011 15:26:49
Repository revision: v3.1.1-64-gf2a067c
Copyright (c) 2006-2010 Gluster Inc. <http://www.gluster.com>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GlusterFS under the terms of the GNU Affero General Public License.
[/code]
引き続き初期設定を行う。
各サーバで、以下のデーモンが起動されるようにしておく
[code]
※なぜか起動しなかったため、起動スクリプトに以下の修正を行った。
# diff -u /tmp/glusterd glusterd
— /tmp/glusterd 2011-03-06 11:44:37.077995074 +0900
+++ glusterd 2011-03-06 11:43:23.375896074 +0900
@@ -24,7 +24,8 @@
start()
{
echo -n $"Starting $BASE:"
– startproc $GLUSTERD
+ $GLUSTERD
+ # startproc $GLUSTERD
return $?
}
# /sbin/chkconfig glusterd on
# /etc/init.d/glusterd start
# vi /etc/hosts
192.168.11.102 gluster1.furelo.jp gluster1
192.168.11.103 gluster2.furelo.jp gluster2
[/code]
各サーバ間のpeerを張る。(片方向にpeerを張るだけで良い。自身とのpeerは不要。)
[code]
[gluster1]# /usr/local/sbin/gluster peer probe gluster2.furelo.jp
Probe successful
[/code]
peer状況を確認する。
[code]
# /usr/local/sbin/gluster peer status
Number of Peers: 1
Hostname: gluster2.furelo.jp
Uuid: 7ecd445c-601a-4cc7-bd48-568f97d3ee14
State: Peer in Cluster (Connected)
[/code]
各サーバで、GlusterFSが利用する領域(BRICK)を作成する。
[code]
# mkdir /var/brick
# mkdir /var/brick/backup
※任意のディレクトリをBRICKに指定できるが、今回は、/var/brick ディレクトリに大容量のパーティションをマウントし、このサブディレクトリを各用途で利用することにする。
[/code]
任意の一台で、以下のコマンドを入力し、バックアップ領域をRAID1構成にする。
[code]
# /usr/local/sbin/gluster volume create BACKUP_VOL \
replica 2 \
transport tcp \
gluster1.furelo.jp:/var/brick/backup \
gluster2.furelo.jp:/var/brick/backup
# /usr/local/sbin/gluster volume info
# /usr/local/sbin/gluster volume start BACKUP_VOL
# /usr/local/sbin/gluster volume info
[/code]
各サーバでglusterfs をfuseでマウントする。
[code]
# mount -t glusterfs localhost:BACKUP_VOL /var/backup
※もし、NFSでマウントする場合、GlusterのNFS機能がTCPのみのサポートなので、以下の様に行う。
# mount -t nfs -o mountproto=tcp localhost:/BACKUP_VOL /var/backup
[/code]
認識されているか確認する。
[code]
# df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/system-root
6631976 2277552 4017528 37% /
devtmpfs 509812 108 509704 1% /dev
tmpfs 524464 4 524460 1% /dev/shm
/dev/xvda1 69410 23664 42162 36% /boot
/dev/xvdb1 516054864 1565272 488275532 1% /var/brick
localhost:BACKUP_VOL 412843904 203136 391669632 1% /var/backup
[/code]
※なお、既存データがある場合、self-heal機能を使って同期を行う必要がある。
※self-heal機能を使うには、一度すべてのファイルにアクセスすればいい。
[code]
# du /var/backup/
[/code]
問題なければ、起動時に自動マウントするようにする。
[code]
# vi /etc/hosts
※GlusterFSでマウントする場合、以下の様な設定を追加する
localhost:BACKUP_VOL /var/backup glusterfs acl,user_xattr,_netdev 3 0
※NFSでマウントする場合、以下の様な設定を追加する。
localhost:/BACKUP_VOL /var/backup nfs _netdev,mountproto=tcp,rsize=8192,wsize=8192 3 0
[/code]
NFSやCIFSの場合だと、専用に起動スクリプト S05nfs や S04cifs があるので自動マウントしてくれるようなのだが、
GlusterFSの様な、その他のネットワークファイルシステムについては考慮されてないようだ。
適当に以下の様に行った。
[code]
# vi /etc/init.d/after.local
/bin/mount -a -t nfs
/bin/mount -a -t glusterfs
# chmod a+x /etc/init.d/after.local
[/code]
しかし、NFSの場合、以下のエラーが出てマウントされなかった。
GlusterFSでは問題なかったので、GlusterFSを使うことにし、原因は調べてない。
[code]
Master Resource Control: Running /etc/init.d/after.local
mount.nfs: mounting localhost:/BACKUP_VOL failed, reason given by server:
No such file or directorydone
[/code]
※なお、一度作ったボリューム設定を削除したい場合以下の様に行う。
[code]
# /usr/local/sbin/gluster volume stop BACKUP_VOL
# /usr/local/sbin/gluster volume delete BACKUP_VOL
[/code]
qmailとDNSSEC
以前furelo.jpドメインをDNSSECに対応させたが、メール転送がされないメールサーバがあることに気づいた。
転送されないメールサーバはqmailで構築されており、そのqmailのエラーログを見ると、以下ようなDNSが引けないというエラーが出ていた。
[code]
deferral: CNAME_lookup_failed_temporarily._(#4.4.3)/
[/code]
digコマンドでmxを引いても問題なく引け、またIPv6アドレスをMXにしていないので問題ないのにと思っていた。
googleで検索すると、qmailは以下のようなANYタイプでDNSを引いているらしいことがわかった。
[code]
$ dig @dns1.furelo.jp furelo.jp ANY +noall +answer
;; Truncated, retrying in TCP mode.
; <<>> DiG 9.7.2-P3 <<>> @dns1.furelo.jp furelo.jp ANY +noall +answer
; (2 servers found)
;; global options: +cmd
furelo.jp. 3600 IN SOA dns1.furelo.jp. tmaki.furelo.jp. 2011022101 0 300 900 86400
furelo.jp. 3600 IN NS dns1.furelo.jp.
furelo.jp. 3600 IN NS dns2.furelo.jp.
furelo.jp. 3600 IN MX 20 mail.furelo.jp.
furelo.jp. 3600 IN TXT "google-site-verification=tUEEpNgMQUbnOEBKcJ0z3oX37FtLaCWMjtP_-OJxax0"
furelo.jp. 3600 IN TXT "v=spf1 a mx -all"
furelo.jp. 86400 IN DNSKEY 257 3 8 AwEAAcE4YUHSmVQqFtMa0XxS8dqy4sMLIaZmiLidzOejwajwYNNEKO8m 9EB1Pzjrme/Gco8BjhZ2A+GarhSaT7Fs2H0Z93pLO3CQ9ScpNVzTDKuX o7G/eA8JJFFMqJwxrhVDrvTZs0rGhFVJE+jYvJgJA9J8hYJppcwHiX2f 7/Xtx0NW+5Bc3/Fk5CdPX2lfkmVa3g2eeH+NbTCwJq4Ky1ERdM2thdHS eg/Ia9ZLmtQHc+6EjM9mapHAWq/dNIPw/PQK+vN7gsQUldtP8mrslsRo AEkzM8wr7UJXII9RitKvoXKm3MoYA56ppiKqEfj4KovtBNtltGfiUvIE ZpK5SNyWdTM=
furelo.jp. 86400 IN DNSKEY 256 3 8 AwEAAeehfViBaakd7ron8kkuaNOIOAKD+skjyLwRG1uOLoST2urf/k1h SWj9yzHShZKruVyTXSmo9lxyjg2yW6ZTyy8lzxeMUbA5eYGgqeAsuxVj IZj95Y1EjBJES00wPtP8b3OGB/oUSn0FJe31YcR81+Ed+r/ndhj1ZVf5 rSbGvSU3
furelo.jp. 86400 IN DNSKEY 256 3 8 AwEAAdOJi9b2YeaRA+IdLcHjFgKwcu+qnBqOAW4Usi49UJOIr73/zq3H vDcenH/uEJclIJSwn6smxLzZk0GOXz2laa42EU9Af2ZD2wc+4otBOlh9 DNXJ/thDkxGPjgFyXswcN3kVtyyQIj9xYMelBEG8ODagAvR0UQSbuxiw CNL0+Giz
[/code]
DNSSEC関連のレコードが追加され、見事に512byteUDPパケット問題に引っかかっていた。
なお、DNSキャッシュサーバ(pdns-recursor)に対し、ANYタイプを引いてもDNSSECのレコードは出てこない。
[code]
$ dig @localhost furelo.jp ANY +noall +answer
; <<>> DiG 9.7.2-P3 <<>> @localhost furelo.jp ANY +noall +answer
; (1 server found)
;; global options: +cmd
furelo.jp. 76119 IN NS dns2.furelo.jp.
furelo.jp. 76119 IN NS dns1.furelo.jp.
[/code]
ここで問題なのが、以下の2点
1.jpドメインがDNSSEC対応したことで、順次DNSSEC対応のメールサーバが増えていくこと
2.メールがなぜ届かないのか原因が分かりにくいこと
パッチがあたっていないqmailでメーリングリストを運用している場合など、特に問題となる。
512ByteUDPパケット問題は、IPv6のときに表面化すると思っていたが、それ以前にDNSSEC対応で問題となっていた。
カテゴリー: DNSSEC, IPv6, Technology
コメントする
socatを使ってみる
複数台のWebサーバ(Apache)が動作している環境で、
アクセスログを簡単に集約できないか調べていた。
アクセスログを、netcat(ncコマンド)を利用して、UDPパケットとしてブロードキャストに投げ、
それをログ収集サーバが受け取ることができないか調べていたが、CentOS付属のnetcatでは出来なかった。
※詳しくは調べていないが、UDPで待ちうけるように設定した場合、一回通信が開始されると、その待受けポートがなくなってしまう模様。
代わりのものを調べていたら、socatというnetcatの高機能版のようなツールがあった。
TCP/UDPだけではなく、IP,SCTP,PTY,EXEC等多数のプロトコルを扱える。
EPELにsocatパッケージとして登録されている。
[code]
# yum install –enablerepo=epel socat
[/code]
●利用方法
サーバ側は以下のようにして待受けポートを指定。
[code]
# socat UDP-LISTEN:6666 STDOUT
[/code]
クライアント側は以下のようにして宛先サーバと宛先ポートを指定する。
[code]
# socat STDIN UDP-SENDTO:localhost:6666
[/code]
すると、クライアント・サーバ間で任意の通信のやり取りが出来る。
ここで、宛先サーバとしてブロードキャストアドレスを指定してあげれば、マルチキャストのように利用できる。
※ブロードキャストアドレスを指定するには broadcastオプションが必要。
※クライアントからサーバ方向への片方向通信に制限するには、サーバ側、クライアント側のどちらかに-uオプションをつける。
※複数回の接続を受け付けるにはforkオプションが必要。
サーバ側
[code]
# socat -u UDP-LISTEN:6666,fork STDOUT
[/code]
クライアント側
[code]
# socat -u STDIN UDP-SENDTO:{ブロードキャストアドレス}:6666,broadcast
[/code]
socatはシリアル回線からの入出力も可能なため、netconsoleの代わりが出来る。
netconsoleではbondingデバイスで利用できない制限があるが、socatにはその制限がない。
通信負荷がかかるので、なるべくならL3スイッチなどでブロードキャストドメインを小さくしたほうがいいかと思う。
カテゴリー: Technology
コメントする
node.jsを試す
サーバサイドjavascript実装のnode.jsを試してみる。
インストール手順は以下のページに記載されている。
https://github.com/ry/node/wiki/Installation
1.node.jsのインストール
[code]
# cd /usr/local/src
# wget http://nodejs.org/dist/node-v0.4.0.tar.gz
# tar zxvf node-v0.4.0.tar.gz
# cd node-v0.4.0
# ./configure
# make
# make install
[/code]
2.NPM ( Node Package Manager )のインストール
さすがに、ネットワークからダウンロードしたシェルスクリプトをそのまま実行するのは怖いので、内容を確認して実行。
[code]
# curl http://npmjs.org/install.sh > npm-install.sh
# less npm-install.sh
# sh npm-install.sh
[/code]
あとは必要なプログラムを npm searchで探し、npm installでインストールする。
今回はサンプルを実行してみる。
[code]
$ mkdir sample
$ cd sample/
$ vi server.js
var http = require(‘http’);
http.createServer(function (request, response) {
response.writeHead(200, {‘Content-Type’: ‘text/plain’});
response.end(‘Hello World\n’);
}).listen(8080);
console.log(‘Server running at http://www.furelo.jp:8080/’);
$ node server.js
[/code]