Category Archives: インフラ技術

クラウド解約して自宅鯖に移行してよかった3つのこと

先日ブログがバズった話

先日 メイドカフェがプログラマーのノマド作業に最高な理由 という記事を書きました。そしたら、はてなブックマークのホットエントリーに載せていただいてしまい、5月6日から5月13日までの1週間で 23,428 回のページの訪問をしていただきました。

スクリーンショット 2015-05-17 22.13.58

ピークは5月7日の9時台で分間1915ページビューでした。グラフで見ると、その瞬間だけ針のように突き出しているのがわかります。

スクリーンショット 2015-05-17 22.15.24

はてブ数では、1週間で465人の方にブックマークしていただきました。自分の周りのブログを見渡してみても、100ブックマークくらいでそこそこ流行った部類のようなので、結構有名になってしまったようです。

ところでこの記事を配信する直前、このブログを配信しているサーバーを、Google Compute Engine (GCE) からいわゆる自宅鯖(自宅サーバー)に移行していました。今日はその話を書きます。

自宅鯖にしてよかったこと

使いたい時にさっとPCを使える

最近のPCは起動が早いとはいえ、ちょっとPCを使おうとした時にいちいち起動しているのは面倒くさいです。サーバーとして使用しているPCは落とさないので、ついでに、そのPCを使って音楽など聴いたり、Twitterをチェックしたりできます。

外出先からも、家のPCをリモートデスクトップで操作できる

リモートデスクトップを使えば、外出先からも家のPCを操作できます。MSのリモートデスクトップはかなり優秀で、モバイル回線でもサクサク動くし、音をアクセス元のPCで流すこともできます。

しかしリモートデスクトップを使うには肝心のPCを立ち上げておかなければならないので、サーバーとしてブログを配信するついでにリモートデスクトップのサービスも立ち上げておけば無駄がありません。

これで、いつでも自宅のプリンターを突然動かして家族を驚かせたり、MacなのにWindows美少女ゲームを動かしたりできます!

メモリなどのスペックが、最低料金GCEよりも良い

最近VPSや、IaaSクラウドは安くなっています。しかし、最低の料金で運用すると、GCEのf1-microだとメモリが0.6GBしかなく、ストレージも多く割り当ててしまうと高いので、僕は5GBだけストレージを使っていました。しかし、近年パソコンの性能は非常に高いので、サーバーとして使っても結構な高性能だったりします。

どんな構成で作ったのか

OS

ここまでの記述を見ていただいてわかる通り、マシンをサーバー用途専用に使っていません。音楽を聴くなどの普段用途でも使うので、OSはWindows 8.1 Professional を入れています。

サーバーをWindowsで運用するのは慣れていないので、その上に、Hyper VでUbuntu LTE 14.04をセットアップしました。

マシン

マシンはASUS F553ma という廉価版のノートPCを使っています。 Celeron N2830, メモリ4GB, HDD 500GB、15.6型ワイドTFTカラー液晶(1,366×768ドット)、何と言ってもコスパ最高だと思います。僕はヨドバシカメラで3万5千円で買いましたが(それでも安い!)、ASUS アウトレットで29,800で売られていました。(笑)

ミドルウェア

  • HHVM
  • Maria DB 5.5
  • WordPress

インストール方法は
GCE上のDebianに Nginx / HHVM で 23.5msecでレスポンスする 爆速WordPress立ててみた。 と同じです。

Ubuntuには初めからaptでMaria DBをインストールできたのですが、なぜだか、 MariaDB - Setting up MariaDB Repositories - MariaDB からインストールした方がパフォーマンスが段違いによかったです。my.confの設定などが違うのかと思ったのですが原因特定できていません。

WordPressは、ディレクトリごとGCEからSCPで持ってきました

ネットワーク、DNS

自宅用のISPは通常、固定グローバルIPが振られず定期的に切り替わります。それではWebサイトを配信することができませんが、Dynamic DNS サービスを使うとドメインのIPアドレスを動的に切り替えることで、Webサイトを自宅サーバーから配信できるようになります。今回は [MyDNS.JP] (http://www.mydns.jp/) を使用しました。

ドメインはすでにムームードメインで取得し、ムームーDNSを使用していました。いろいろ方法はあると思いますが、僕はCNAMEレコードを使用してmydnsのドメインの転送する方法を取りました。

スクリーンショット 2015-05-17 23.32.44

ただ、MyDNS.jpは認証にSSLを使っていないのが気持ち悪いので近いうちに 第334回 Route 53でダイナミックDNSを運用する:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社 のような方法に変えようと思います。

まとめ

VPSやIaaSクラウドもいいけど、自宅に固定回線引いてノートPC立ち上げっぱなしにするなら、自鯖もいいよ!って話でした。

WebIDE ICEcoderをセットアップしてみた

次の時代はクラウド開発環境が来るはず!

先の記事では Hack (Hacklang) の開発はFBIDEが本命だと書きました。しかし、まだリリースされていないので、当面vimかemacsを使わざるを得ません。せめて、Web IDEの雰囲気を味わってみたいので、そこそこ知名度のあるICEcoderをインストールしてみました。後の自分用にその手順を記載します。

導入手順

http://icecoder.netの説明に従ってgithubから最新のコードをダウンロード

$ git clone git@github.com:mattpass/ICEcoder
Cloning into 'ICEcoder'...
Warning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hosts.
Enter passphrase for key '/home/susumuis/.ssh/id_rsa':
remote: Counting objects: 6950, done.
remote: Total 6950 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6950/6950), 3.78 MiB | 796 KiB/s, done.
Resolving deltas: 100% (4136/4136), done.

下記のようにダウンロードされた

$ cd ICEcoder/
$ ls
CodeMirror-4.2  LICENSE.md  README.md  backups  editor.php  farbtastic  favicon.png  files.php  images  index.php  jshint  lang  lib  plugins  processes  test  test.php  tmp
$ cd /etc/nginx/

nginxで公開する。

$ sudo vim sites-available/icecoder

下記のように編集した。今回は80番ポートは使用せず、httpsだけで配信する。とりあえずオレオレ証明書作っとく。

server {
        listen 443;
        server_name 公開するドメイン;
        root ICEcoderのディレクトリ;
        index index.php;

    include hhvm.conf;
        ssl on;
        ssl_certificate /etc/ssl/certs/icecoder.crt;
        ssl_certificate_key /etc/ssl/certs/icecoder.key;
        ssl_session_timeout 5m;
        ssl_protocols SSLv3 TLSv1;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
        ssl_prefer_server_ciphers on;
        location / {
                #try_files $uri $uri/ =404;
                try_files $uri $uri/ /index.php;
        }
}

オレオレ証明書の作り方は毎回忘れるので簡単にメモっとく。

$ cd
$ sudo openssl genrsa 2048 > icecoder.key
$ openssl req -new -key icecoder.key > icecoder.csr

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Tokyo
Organization Name (eg, company) [Internet Widgits Pty Ltd]:組織名
Organizational Unit Name (eg, section) []:susumuis
Common Name (e.g. server FQDN or YOUR name) []:ドメイン名
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
$ openssl x509 -days 3650 -req -signkey icecoder.key < icecoder.csr > icecoder.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Tokyo/O=組織名/OU=susumuis/CN=ドメイン名
Getting Private key
$ rm icecoder.csr
$ sudo mv icecoder.* /etc/ssl/certs/
$ cd /etc/nginx/sites-enabled/
$ sudo ln -s //etc/nginx/sites-available/icecoder icecoder
$ sudo /etc/init.d/nginx reload
Reloading nginx configuration: nginx.

調べながらやったのでここまでで1時間くらいかかった。lnコマンドはどっちが先かとか毎回調べてしまうの何とかしたい。

この状態でWebでアクセスしたら

Couldn't create config-icecoder_*******.php. Maybe you need write permissions on the lib folder?

とか言われました。パーミッションが正しくないらしい。これはこれで、ちゃんとユーザと権限が適切になっている証拠なので、必要なディレクトリだけwww-dataユーザに権限を渡せば良い。

$ cd ICEcoder/
$ chown -R www-data .
$ chmod g+w backups/ lib/ plugins/ test/ tmp/

こうしてアクセスしてみると下記のようにパスワードを求められる。

初期画面

パスワードを入力するとログイン後の画面が表示された。

ログイン後

初期状態ではICEcoder自体のソースコードが表示されるようだ。これでは使いづらいので、プロジェクトルートのようなフォルダを作ってルートディレクトリをそのフォルダに指定するような設定が必要だろう。

GCEが再起動しててブログが落ちてた

突然のアラートメール

Monitor is DOWN: susumuis.info (http://www.susumuis.info/)

このブログは、GCEを使って動かしていますが、Uptime Robot というサービスを使って死活監視をしています。いいよ!このサービス無料で死活監視できます!(・∀・)イイネ!!

先日のエントリで書いたとおり、nginx + hhvmでWordPressホストしているのだけど、僕の設定が悪いのか、hhvmがまだ枯れていないのか、単にメモリが足りないのか、月に一回くらいダウンしちゃうので、いつもはこのコマンドで一瞬で復旧しています。

$ sudo /etc/init.d/hhvm restart

またいつものかーwと思って、上記コマンドを打っても、サイトにアクセスすると

404 File Not Found

となるだけです。んーnginxが落ちちゃったのかなあ?と思って見たら

$ sudo /etc/init.d/nginx restart

どうも、そうでもない。ん、どうしてだろうと思ってみると、どうも、GCEの永続ディスクのマウントポイントにファイルがない。

Diskが消えてしまったΣ(・∀・;)

と、焦りましたが、Developer Consoleを見てみるとちゃんとディスクがありますし、Compute EngineにAttachされています。

どうも単にアンマウントされているようです。まだ何があったかわかりませんが、インスタンスが再起動された形跡を見つけました。落とすつもりなかったんで、ブート時にマウントする設定をしていなかったんですね。>< アリエネ

ずっと問題なく動いていたのでマウントのやり方忘れてたので、とりあえず、自分のために打ったコマンド履歴残しときます。

susumuis@instance-4:~$ sudo mount /dev/disk/by-id/scsi-0Google_PersistentDisk_disk-1 /mnt/pd0

あと、mysqlデーモンもディスクがなくて落ちてたので、再起動しときます。

susumuis@instance-4:~$ sudo /etc/init.d/mysql restart

これで復旧。ε-(´∀`*)ホッ
(ずさんな管理状況が露呈してしまったので、なんとかしときます。)