Home › Category Archives › サーバー管理

期待されたら裏切れって俺が言ってた!!

そりゃ俺人に期待されるの嫌いですからね。期待されたら裏切りますよ、俺は。
とはいえ、今回も実はそれなりに書くことたまってます。3740文字を超えることはないと思いますが、それなりの長さにはなるかも?
しかもある程度専門的な話になりますので、ご興味のない方はうふふんの曲でも聞いててください

それでは早速行きましょう。お題は、「VMWare Serverによる仮想環境の構築と外部からのアクセス」です。

今俺が仕事で作ってるシステムって、具体的な内容は省きますが、Windowsで動く携帯向けシステムなんですよ。
皆さんご存知かはわかりませんが、実はWindowsって普通にWEBサーバー(この場合アプリケーションサーバーですが)として動かす機能があったりするんです。IIS(インターネットインフォメーションサービス)でググれば詳細が分かると思います。
普通にっていうのは、別にWindows Serverである必要はないってことです。Windows XPでも十分WEBサーバーにできますよ。
まあ、実際に「サーバー」として動かすためには、複数のユーザーが同時にアクセス出来たりする必要があるので、これはあくまでWEBサーバーとしての運用が出来るのみでしかありませんが。
話が盛大にそれましたが、ともかくWindowsのIISというサーバーで動くシステムを作ってるわけです。
ところで、現在仕事を請け負ってる先というのがとても小さな会社なんですが、外部に向けたテストサーバーが存在しないんですよ。
普通の仕事だったらそれで事足りるのですが、今回作ろうとしているのは携帯向けのシステム。最終的には携帯でアクセスをしてテストしなければなりません。実際、PCでは動いたけど携帯では動かなかったということが何回かありました。
携帯でVPNとか使って内部からアクセスなんて真似は出来ません。そのため、外部からアクセス可能なサーバーが必要だったのですが、それが本番環境しかないという有様でした。
幸いなことにお客さん(仕事を請け負った会社に依頼をした会社)もそれを理解してくれたので、本番環境兼テスト環境という形で仕事を進めてくることが出来ました。
しかし、少し考えればわかることだと思いますが、これって非常に危うい環境です。まだリリースにはなっていないから出来ていますが、これがシステムリリースという形になったら、何があってもミスは出来ないということになってしまいます。
たとえばテストソースにPCでは動くけれど携帯では動かない部分があったとしましょう。それを本番環境に適用した瞬間、ユーザーにとっては重大な不具合という形で発現してしまいます。そしてそれはシステムのユーザー離れを誘発することになります。
勿論手間という面もあります。お客さん先のサーバーに俺はアクセスできません。ソースをアップしておいて、サーバーに適用してもらうよう依頼するしかありません。
なので、俺の手元で動かせる外部アクセス可能なテスト用Windowsサーバー環境が欲しかったわけです。

ここまで前置き。ここからが今回の本題です。
うちには自宅サーバーがあります(皆さんが読んでるこの日記も、っていうかこのサイト自体うちのサーバー上にあるものです)。そして、そこに入っているOSはLinuxです。
何故Linuxを選んだかというと、純粋にサーバーとしての利用を考えた場合、Windowsよりもはるかに軽いからです。サーバーを立てる上で、俺は軽さを重要視しました。
今回必要となっているOSはWindows系。しかしサーバーに入っているOSはLinuxです。では、どうやってLinuxが入っているサーバーにWindowsを入れればいいでしょうか。
その答えとなるのが、今回のお題の一つである「仮想環境の構築」です。
仮想PCという言葉は、そろそろ皆さんも馴染んでいる頃かと思います。Windows7ではWindows Virtual PCという仮想環境構築ソフトがあり、XPモードというものも存在します。
今回やろうとしたのは、それをLinux上で動かすということです。
実を言うと、俺は以前VMWareでなく「Xen」というLinuxの仮想化ソフトを利用しようとしたことがあります。これはあえなく失敗し、HDDの不具合が発生したときに、ともに闇の彼方へと葬り去られました。
今回は前回の失敗を活かし、Windows・Linuxともに広く使われている仮想環境構築ソフト「VMWare Server」を利用することにしました。
こちらは広く使われているだけあって、解説サイトも親切なものが多数存在しています。
VMの構築で難しいところは何一つありませんでした。rpmを使ってVMWareをインストールし、vmware-config.plというコマンドを叩き、あとはほとんど空エンターでしたから。
サービスを登録し、SSLでポート8333にアクセスし、VMWare Server Consoleにアクセスすることが出来ました。これで下準備完了です。
これからVM(Virtual Machine)を構築します。Consoleのメニュー「Virtual Machine」から「Create Virtual Machine」を選択します。
ここで最初にOSを選ぶことになるのですが、注意が必要です。何かと言うと、構築できるVMは「インストールディスクを持っているOS」に限られます。俺も最初それでWindows Server選んで失敗しました。
今回ほしいのはWindows系なので、もともとサーバー筐体に入っていたWindows XP Professionalを選択。あとは適当なHDD容量やメモリ設定をします。
VMの設定が完了したら、サーバー筐体にWindows XPのインストールディスクをセットし、VMを起動します。
すると、Console画面から子ウィンドウが開き、昔見慣れたXPのインストール画面が立ち上がりました。
これを見た瞬間俺は思いました。「なるほど、これは確かに『仮想マシン』だ」と。
つまり、その子ウィンドウこそがVMのディスプレイであり、操作をする端末であるというわけです。実体としての筐体があるわけではなく、仮想的にマシンを作り上げている、そんな感じです。
後は普通のXPのインストールと同じです。ガンガン進めて行きます。
と、ここで問題発生。どうやらこのVM、ネットワークにつながっていないようです。
解説サイトではVMのネットワークアダプターをBridgeに設定していましたが、うちの環境には適合しなかったようです。三つある選択肢、「Bridge」「Host Only」「NAT」からNATを選択しなおします。すると、VMがネットワークにつながりました。
VMが更新プログラムやIISをインストールしている間に、VMのWEBサーバーを外部接続する方法を調べます。
どうやら、VMWareには「ポートフォーワード」という機能が存在するようです。本体であるサーバーの特定ポートへのアクセスを、VMの指定したポートへのアクセスに変換する機能です。
これを使えばVMのIISに外部からアクセスできるようです。というわけで、早速Consoleから操作……って、そんなメニューねえぞ。
調べに調べ、とうとう英語サイトにまで手を出しました。要約すると、「Linux版には便利なメニューないから、手作業で設定しようぜ!」とのこと。Linux版の風当たりが強い。
あとは手探りで設定ファイルを探し当てました。VMWare設定フォルダにあるvmnat8/nat/nat.confというファイルです。
ここに既にテンプレートとしてポートフォーワード文が書かれてコメントアウトされていました。コメントアウトを解除し、VMWareを再起動。
この間にIISとかのインストールや設定を終え、テストプロジェクトをInetpub\wwwrootに配置。PCからhttp://サーバーIP:指定ポート/テストプロジェクト/にアクセスしてみました。
諸事情あって画像は出せませんが、ちゃんとアクセスすることが出来ました。どうやら設定は成功のようです。これでWindows外部向けサーバーが構築できました。
喜び勇み、携帯を取り出しEZWeb起動。さっきと同じアドレスを入力し、wktkして待つことしばし。
……つながらねえじゃねっかよう。
ポートフォーワード設定も、IISの設定も出来ています。考えられるのは、このポートへのアクセスが拒否されているということ。一体何が原因で……。
これで丸一日ぐらい悩みました。で、昨日チャットで消せるでっていうKeceldettyさんに助力を求めました。
「ケディー、こいつを見てくれ。こいつをどう思う?」
「凄く……ファイアウォールです」
「Oh…」
ということで、結論はファイアウォールで弾かれているということでした。今まで意識したことなかったけど、ちゃんと機能してたのねファイアウォール。
自分の備忘用に、どのコマンドでポートに穴をあけたのか記しておきます。
iptables -I INPUT -p tcp –dport 指定ポート -j ACCEPT_COUNTRY
ポートを閉めるときは以下の通り。
iptables -D INPUT -p tcp –dport 指定ポート -j ACCEPT_COUNTRY
これで本当に外部向けIISサーバーを構築することが出来ました。嗚呼疲れた……。

というわけで、VMWareで仮想サーバーを立てるときの留意事項。
・ポートフォーワードを使いましょう
・ファイアウォールに穴をあけましょう
以上です。
たったこれだけのためにどんだけ時間使ってんだとか言わない。

これがこの2日間ぐらいの仕事内容なわけですが。

4,000文字……だと……?

……期待は……裏切れなかったよ……。

こうなったら無茶振りするしか。
=INT(RAND()*3)=1ということで、次はシグマさん。一番いい画像を頼む。

オーッス!オーッス!!

というわけで、ちょっと投コンのTwitter連携でNet::Twitter::Liteモジュール脱却を目指すときに苦心した点の備忘メモなどを。

TwitterはOAuthという仕組みを用いてアプリケーション連携を認証します。OAuth自体については特に語りません。それ関係の記事なんてネット上にそれこそ腐るほどありますからね。
で、投コンは以前からTwitter連携は可能でしたが、それには上記の専用モジュールが必要でした。必然、モジュールがインストールされていないサーバーでは利用できない機能となります。そしてこんなマイナーモジュール入れてるレンタルサーバーなんて早々ないでしょう。
んが、今回ver3にアップデートするに当たり、データベース対応との二本柱にすべく、Twitter連携をこのマイナーモジュールへの依存を断ち切ることにしました。それに当たり、OAuth認証という奴を自前で行う必要が出てきました。

OAuth認証で大事なのは以下の点です。
・HTTPヘッダーの一つであるAuthorizationヘッダーに必要なパラメータを記載する(callback、consumer_key、nonce、timestamp、token、signature、signature_method、verifier、version)
・HTTPの送信メソッド(GET、POST)とアクセスしたいAPIのURLをURLエンコードしたもの、上記のsignatureを除いたパラメータをパラメータ名を照準にparam=value&…の形で連結しURLエンコードしたものを&で結び、signature_methodで指定した方法で暗号化(鍵はCONSUMER KEYとNULL、REQUEST TOKEN SECRET、ACCESS TOKEN SECRETのいずれかを&で連結したもの)し、さらにURLエンコードして、signatureを作る(updateなど、Authorizationヘッダー以外にも送信情報がある場合は、それもパラメータに連結する)
 分かりにくいので例を記載:POS&https%3A%2F%2Ftwitter%2Ecom%2Foauth%2Frequest_token&oauth_callback%3Dxxxx%26…→暗号化→URLエンコード
 これでも分かりにくいとは思いますが、これは実際にやってみないと分からないもんです。やれば大体わかります。
 あと、最大限注意すべき点として、空白のURLエンコードは+ではなく%20です。これで二日ぐらいはまってました。
・処理の流れとしては、REQUEST TOKENの取得→verifierの取得→ACCESS TOKENの取得→API利用で、ユーザーにやってもらわなければいけないのはverifierの取得のみ(Callback URLさえ指定していれば認証ボタン一つでOK)
あと、最初ドはまりした点なのですが、どうにもTwitterは設定次第でHTTPSアクセスしか受け付けなくなるらしく、その場合通常のHTTPアクセスのつもりでデータを受け取ろうとすると失敗するようです。
なので投コンでは最初からHTTPSアクセス行うようにしているのですが(こっちのが安全ですしね)、これにもモジュールが必要な模様。Net::SSLeyというものです。
調べてみるとperlのコアモジュールではないようですが、Net::Twitter::Liteに比べれば圧倒的に依存モジュールが少ないです。なので、これを利用することにしました(ver3配布予定のファイルの中にこれは含まれているので、モジュールがインストールされていないサーバーでも使えるはずです)。
まあ、以前一言コメントでも呟きましたが、この認証に外せないDigest::SHA1というモジュールすらコアモジュールではないですからね。多少の追加ファイルは仕方がないところ。SHA1暗号化を自前とかないわー。

まー色々ありましたが、現在は何とか稼働してるようです。こんなものが自前で大丈夫かしらとは思いましたが、確認用も兼ねて作った時報ボットは極めて正常に稼働しているようです。多分問題ないでしょう。
あとはMySQLのバグをつぶして、通常の運用に耐えうるだけの確認が取れたら、投稿コンテンツクリエイターver3.0.0をリリースしたいと思います。多分3月頭ぐらいですかね。
大体そんな感じ。

それはそうと、SSの方が完全に筆止まってるんですよね。頭がパーン開発者行っちゃってるから仕方がない。
とはいえ、これ以上ダラダラしててもしょうがないのも事実。なので、そろそろ書き始めたいと思います。GMDの方を。
いやね、オリジナルの方も進めたいとは思ってるんですがね。あっちの方は、いかんせん話の作り方が難しいせいで、モチベーショnが上がりにくいんですよ。もっと単純なバトル物とかにすりゃよかったかもしんね。
というわけで、オリジナルとGMD交互にとか言ってましたが、早速GMDに逃げたいと思います。頭空っぽの方が夢詰め込める。
GMDには何も詰まっていないという証明。所詮は二次創作だもの、ショウガナイネ。

日記なんだか開発なんだかサーバー管理なんだか。全ての要素を包含してるな。ショウガナイネ。

次はー=INT(RAND()*3)=2だったので、燃さん。よろしゅうに。

バックアップ方式の変更

したからどうだっていうわけではないんですが、自分のための備忘録として。

最近サーバーに置いてるファイルの量が多くて(主に動画とかのせい)、バックアップファイルが2GBを越してたんですね。
んで、Linuxで扱えるファイルのサイズの限界がどうやら2GBらしくて、ファイル監視とかでファイルサイズ超過エラーが発生してたんですよ。
これをどうにかしたかったので、バックアップファイルを分割することにしました。
Linuxにはsplitというファイル分割コマンドがありますが、tar圧縮したファイルをsplitで分割するという方法を取りました。
具体的には、バックアップ実行スクリプトの中に、次の一文を組み込みました。

split -b 1024m バックアップファイル

意味としては、バックアップファイルを1024MB=1GB毎に分割する、ということです。
現在のバックアップファイルが約2.5GBになっているので、1GBのファイル二つと0.5GBのファイルが一つ作られます。
今後容量が増えて、分割ファイルが4つ、5つと増えていったら、スクリプトの修正とかが必要になってしまいましたが、これらに関しては今後何とかする方法を考えようと思います。
さあ、これで心置きなく大容量ファイルとかがアップ出来るぞ。

サーバーメンテナンス(多分)まで、あと3日。