第10回【とあるサーバの下学上達〜サイエンスプログレンス〜】

今まで書いた記事が飛んでしまいました…
とてもやる気がそがれました……
2月20日に放送をしました。

今回勉強したのは
head ファイルの先頭10行表示する
tail ファイルの末尾を10行表示する
more テキストをページ単位で表示する
less moreより高性能のコマンド
grep 文字列を検索する

http://www.ustream.tv/channel/とあるサーバの下学上達放送

があったのですが、放送事故らしくlessが終わった段階で放送が切れてしまっていました。grepから次週やり直しますので、よろしくお願いします。

次週は、2月27日水曜日のPM9:03〜
よろしくお願いします。
http://www.ustream.tv/channel/とあるサーバの下学上達放送

はあ…なんて残念なんだ……

エックスサーバでwordpressのカスタムフィールドテンプレートが文字化けした

エックスサーバでwordpressのカスタムフィールドテンプレートが文字化けした。

エックスサーバでwordpressのカスタムフィールドテンプレートをいじる機会があった。カスタムフィールドテンプレートはわかりやすいマークダウン記法みたいな書き方でカスタムフィールドを色々と設定できる優れものなプラグイン。このプラグインなのだけれど開発環境から本番環境にアップロードすると使えなくなる現象に遭遇した。

具体的にはカスタムフィールドテンプレートでテンプレートをロードさせようとするとロードした文字が化けてしまっていること。
キャプチャ

これじゃあせっかくのテンプレートが使い物にならないです。
少し調べてみるとサーバからのレスポンスヘッダに文字コードが指定してある。


Content-Type: text/html; charset=Shift_JIS

これがどうにもこうにも原因らしい。

文字コードはすべてUTF-8で統一しているはずで、どこかにShift-JISなんて指定したか、とか思いながら確認してみた。

  • wordpressの管理画面にある文字コード
  • php.iniのmbstring.internal_encoding
  • プラグイン本体のコード

疑わしきは調べていったんだけれど解決できず。

で、テスト環境ではうまくいっているのだろうからこれはやっぱり本番環境のエックスサーバがおかしいのだろうということでさらに疑ってみた。php.iniが編集できる柔軟さは認めるのだけれど、Shift-JISを吐かれては困る。

色々調べたところapacheが.phpに対してheaderをデフォルトで吐き出す設定があることにたどり着いた。同時に湯バード先生からも同じトコロを指摘される。

通常この項目はapacheのhttpd.conf辺りで設定するのだけれど.htacessでも設定できるらしい。というわけで以下の項目をwordpressのドキュメントルートにある.htacess追記してみた。


AddDefaultCharset UTF-8

この設定で無事に治りました。

注意すべきは.htaccessはworpdressのカスタムURLストラクチャとかを書き換えることがあるのでその際には再度同じ文を書き加える必要があること、かな。忘れないようにしよう。

またこのような問題だとなかなか対処しづらいと思う。たまたまapacheのレスポンスヘッダから分かったのだけれど文字化けしたときにはmbstringを見て下さい、ってエックスサーバに書いてあったりして困る。これ恐らくデフォルトの文字コードをShift-JISで、とかに設定されたのかなと推測するけれどそれが困りました。たぶん問い合わせても対応できかねます、で終わっちゃうだろうし。しょんぼりっすね。

TeamSpeak3のserveradminのパスワードを忘れてしまった場合の対処法

TeamSpeak3のserveradminのパスワードを忘れてしまった場合の対処法について。

音声チャットソフトTeamSpeak3の管理用アカウントとしてserveradminがあるのだけれど、そのログインパスワードを忘れてしまったときの復旧方法について。管理用ログインを使うといろいろなことができるのだけれど、この管理用パスワードは恐らく初回インストール時、初回サーバログイン時に表示されてよくわすれちゃう。どこかのログに残っていそうなきがするのだけれど探しても見つからないし途方に暮れてしまっちゃう。で、そんなアナタに、そんなワタシにserveradminのパスワード復旧法。

まずは元になった記事の紹介。

A simple ts3 serveradmin password recovery script (win + linux)
というわけでパスワード復旧のスクリプトを配布してくれている人がいました。このスクリプトを使って復旧できます。

上記フォーラムの第一投稿にスクリプト(tar.gz)のリンクがあるのでダウンロードして解凍して実行。これでうまくいきます。中にはwindows用とlinux用のスクリプト、batファイルbashスクリプト、それからsqliteのバイナリが入っている。それぞれの環境で実行してやればうまくいくはず。

このスクリプトを実行すると管理者のパスワードをykN+zfqDに変えてくれる。これでこのパスワードを使ってログインする事ができる。管理者でのログイン方法については他の記事を参照してください

で、もちろん気をつけなければいけないことは、管理者用パスワードをログイン後に変えておくこと、が必要。これは絶対に必要。アナタのTeamSpeak3 serverを守るために必ず行っておいてください。

管理者用のパスワードの変え方については以下の通り。telnetでログインして上記のパスワードでログイン後、”clientsetserverquerylogin client_login_name=serveradmin”を実行する。これで新しいランダムなパスワードが発行される。このパスワードをメモしておきましょう。

login serveradmin ykN+zfqD
 error id=0 msg=ok</b>
 clientsetserverquerylogin client_login_name=serveradmin
 client_login_password=password
 error id=0 msg=ok

どんなスクリプトなの?

というわけで、管理者のパスワードを書き換えるという結構危ういスクリプトなので中身が気になりました。簡単なスクリプトなので中身を覗いてみることに。
中身はsqliteでのいくつかのSQLの発行している。clientsテーブルのclient_id=1な行をserveradminとしてそこのclient_login_passwordをupdateしている。


UPDATE clients
SET client_login_password = "r5oBZ3Z8s8IqjiEJ/k3o9dkSUgU="
WHERE client_id = "1";

更新している内容は恐らくmd5のハッシュだと思われる。ハッシュの元になっているのが先述の”ykN+zfqD”で、このハッシュにアップデートすることでパスワードを変更している。

なるほど、という感じでこれぐらいなら安心できることが確認できました。

FreeBSDとかだとsqliteのデータベースファイルの位置がわかりにくいのだけれど、そこへいって手動でsqliteを実行することでパスワードを更新できた。sudoで変更してあげれるようにしてやらないとダメだけど。

 

というわけで管理者で無事にログインできるようになります。

TeamSpeak3で管理者ログインする方法

TeamSpeak3で管理者ログインする方法について。

無料のボイスチャットソフト、TeamSpeak3。そのサーバを運営していると管理者でログインする必要がでてくる。管理者でのログインはわかりにくいのだけれどその方法についてのメモ。

過去のバージョンだとTeamSpeak3のクライアントから様々なクエリを使うとができていたと思うんだけれど、なぜだか現行バージョン(3.0.9.2)だと無理だったので他の方法で試してみた。
ちなみに過去のバージョンのやり方はTeamSpeak3 Wikiに載っているので参照されたし。

ログインしてクエリを実行するにはtelnetを行う必要がある。telnetは主にTCPを用いたいろいろなコマンドのやりとりをするもので、UNIX/Linuxに入っている。昔のWindowsには付いていたんだけれど最近のWindows 7とかだと見かけない。そういう場合にはTeraPadputtyを利用しよう。

telnetでのログイン

telnetでログインするにはIPアドレス又はホスト名、そしてポート番号が必要だ。IPアドレス、ホスト名についてはクライアントでログインするときに使用しているアドレス、ホスト名を入力しよう。ポート番号についてはデフォルトでは10011。TeamSpeak3では下記のようなポート番号を使っている。10011を3倍したものはファイル転送用だ。

サービス ポート番号
通常の音声チャット 9987 tcp
管理サーバクエリ接続 10011 tcp
ファイル転送用 30033 tcp

サーバ/クエリ


実際にtelnetで接続してみる。まずは “telnet ホスト名 10011″と入力する。接続が完了したら”login serveradmin password”としてログインしよう。

shell> telnet ts.l2tp.org 10011
Trying 192.168.11.1...
Connected to ts.l2tp.org.
Escape character is '^]'.
TS3
Welcome to the TeamSpeak 3 ServerQuery interface, type "help" for a list of commands and "help <command>" for information on a specific command.
login serveradmin passwork
error id=0 msg=ok

うまく接続できない場合にはIPアドレスが正しいかチェックしてみる。該当のホストでnetstat -natsockstat | grep teamspeakなどしてみよう。
ログインするときのserveradminのパスワードが分からない場合にはパスワードをリセットしましょう。

これでサーバへログインできたと思う。この先にはいろいろなことができるのでやってみましょう。

第9回【とあるサーバの下学上達〜サイエンスプログレンス〜】

こんばんは、高城梢です。今年は雪がよく降りますね。雪の日には、雪を見ながらこたつで暖かいお茶でも飲みながらゆっくりしたいです。

平成25年2月13日に第9回の放送をいたしました。

本日は、ディレクトリの操作を勉強しました。
復習回となりました。

lsコマンド
-a,-A,-lは、おなじみですが、下記のオプションはなじみがなかったです。使っていれば、意味がわかると思います。
-F ファイル種類記号を付加する
-d 指定ディレクトリ自身の情報を表示
-t 最近更新された順に表示
-R ディレクトリ以下のすべてのサブディレクトリの内容を表示
-1(イチ)1行ずつに表示
-C 1行に複数表示
-h 合計サイズとファイルサイズを単位付きの短い数字で表示

例えば、-R

./mydir:
file3 file4.txt

./mydir2:
file1 file2.txt file4.txt file7.txt filex
file10.txt file3 file5.txt file8.txt newfile
file11 file3.txt file6.txt file9.txt
ディレクトリごとに、なにが入っているかが表示されます

例えば、-C
mydir mydir2 mydir3 xxdir
このように、1行にディレクトリが表示されます

例えば、-h
toarusabanokagakujoutatsu-no-MacBook-701:nanaly kozue$ ls -lh mydir
total 16
-rw-r–r– 1 kozue staff 68B Dec 12 21:33 file3
-rw-r–r– 1 kozue staff 56B Dec 12 21:33 file4.txt
ここでは、mydirの中にあるファイルの合計サイズとファイルサイズを1行ずつにひとつずつ表示させました

cd,pwd 作業ディレクトリの移動と表示
cd チェンジディレクトリ
pwd 現在のディレクトリを表示

cd ~ ホームディレクトリに移動します
例えば、こんなかんじです
toarusabanokagakujoutatsu-no-MacBook-701:nanaly kozue$ cd ~
toarusabanokagakujoutatsu-no-MacBook-701:~ kozue$ pwd
/Users/kozue

初見のコマンド
pushd popd ディレクトリを行き来する
例えば、nanalyディレクトリにpushd . (pushdだけでは使用できなかったので.をつけました)
toarusabanokagakujoutatsu-no-MacBook-701:nanaly kozue$ pushd .
~/Desktop/nanaly ~/Desktop/nanaly
このあとに、ほかのディレクトリにどこまでも行ってもpopdすれば、
toarusabanokagakujoutatsu-no-MacBook-701:launch-SaFB0j kozue$ popd
~/Desktop/nanaly
toarusabanokagakujoutatsu-no-MacBook-701:nanaly kozue$
一瞬で戻って来れます。
どこかのディレクトリから cd nanaly することはできません。

du ディスク使用容量を調べる
-a ディレクトリ内のファイルの使用量も表示
-b バイト単位で表示する
-k キロバイト単位で表示する
-s 総計サイズのみ表示する

df ディスク容量情報を表示する

放送で省いたところ
mkdir ディレクトリを作成する
-p 途中のディレクトリも生成する
-m mode アクセス権を指定してディレクトリを生成する

rmdir ディレクトリを削除する
-p 途中のディレクトリも削除する
-r ディレクトリまるごと削除
-ri 確認しながら削除する

mv ディレクトリの名前の移動と名前の変更

次回は、head,tailファイルの先頭部分と末尾部分を表示する〜を2月20日水曜日U-streamの「とあるサーバの下学上達」で放送予定です。よろしくお願いします。

第8回【とあるサーバの下学上達〜サイエンスプログレンス〜】

こんばんは、3連休いかがお過ごしでしょうか。
平成25年2月6日に第8回とあるサーバの下学上達〜サイエンスプログレンス〜を放送しました。
本日の内容は、「ファイルの日付を変更、設定する」です。

date 現在時刻を表示する

日時を設定する
date 010203042012 1月2日3時4分2012年と設定される
2012のあとに.00で秒数も設定できる

sudo date 010203042012 1月2日3時4分2012年と設定される方法もある
その際に、パソコンのパスワードを聞かれる

インターネット時刻と同期して時刻設定ができるntpdateコマンドがある
sudo ntpdate ntp.nict.jp
独立行政法人 情報通信研究機構のサーバから時刻を取得する

パソコン内にntpdateコマンドがない場合にはインストールする必要があります。
ubuntuの場合 sudo apt-get install ntpdate
fedoraの場合 yum install ntpdate

touch ファイルの日付を変更する
ls -lで表示される rw-r–r–〜Dec 12 21:00 file1 などのファイルの詳細をtouchコマンドで変更することができます。ファイルの時刻情報のことをタイムスタンプといいます。
touch file1 タイムスタンプを現在時刻に変更できる

好きな時間に設定するとき
touch -t 201301011200 2013年1月1日12時00分に設定できる
ファイルのタイムスタンプを同じにしたいとき
touch -r file1 file2 ファイル1とファイル2のタイムスタンプを同じにできる

空のファイルを作成する
touch newfile ファイルサイズ0のファイルができます
ファイルの場所だけでも確保したいときに使用するそうです

本日の内容は以上になります。
次の授業までの宿題がだされました。これから頑張らないと…
それでは、まだ放送日、平成25年2月13日水曜日お会いしましょう。
U-streamにて「とあるサーバの下学上達」と検索!
よろしくお願いします。

キャッシュを使ってwordpressを軽くしてみる

0. はじめに

冬真っ盛りですね、寒いですね。先日の成人式は東京も久方ぶりの大雪で混乱しましたが、降れば降ったでなんだか嬉しい気持ちになってしまいますね。

さて、ここ最近私の運営しているwordpressのサイトがひどく大変なことになっています。wordpressなサイトはいくつか複数運営しているのですが、今年に入って立ち上げたサイトも順調にアクセス数が増え、ついには限界点に近くなってきました。ウェブサイトはウェブサーバというサーバが提供してくれているのですがこのサーバが悲鳴を上げている感じです。CPUの使用率は100%に張り付き、ロードアベレージという負荷を表す数値も三桁突入でてんやわんやです。ちなみにロードアベレージは一桁(コア数以下)が正常値です。インフラ屋(サーバ屋)さんとしては辛い状況でもあり楽しい状況でもあるので感嘆を漏らすところですね。

さて、なんにしてもこのままではまずいです。実際に夜になると重くて重くてウェブサイトが見れない状態です。このままではアクセス数にも間違いなく影響があります。そんななかでまずは手っ取り早く、簡単な手順で負荷を軽減する術について書いてみたいと思います。

 

さてところでウェブサーバというのはどんな動きをしてるんでしょうか。
ウェブサイトを見たいというユーザのブラウザからのリクエストがあった場合、適切な返答をレスポンスとして返してあげる、ウェブサーバとはそんな動きをしているんですね。
ここでのレスポンスは通常HTMLが返答されます。ユーザのブラウザはそのHTMLを表示してあげてるんですね。それでウェブサイトを閲覧することになります。
HTMLをレスポンスとして返答する、のですがwordpressのようなPHPを使ったプログラムの場合にはまずプログラムを解釈し実行する必要があります。プログラムの実行、これはサーバに負荷を掛けます。ですのでウェブサーバを軽くしてあげるにはこのプログラムの処理をいかに軽くするか、またいかに減らすかというのがキモになってきます。
今回はこの処理を減らす方向で進めていきます。

プログラムを実行せずにレスポンスのみを返答するためにはキャッシュ機能が用いられます。いろいろなところで目にするキャッシュです。キャッシュを使えばプログラムが実行されること無く、事前に用意されて置いたキャッシュを返答することであたかもプログラムが動いたかのように見えるんですね。おかげでウェブサーバはPHPの実行が減るので軽くなります。
キャッシュはとても便利なのですがデメリットもあります。それは即時性に欠けることです。キャッシュは事前に用意しておくものですのでリアルタイムに変動する無いように対しては使うことができません。これは注意が必要ですね。

今回はトップページのみをキャッシュすることにしました。google analyticsやapachetopなどでまずは現状のアクセス状態を解析してみました。サイト全体のアクセスに対してトップページだけで7%ほどのアクセスがありました。これをキャッシュを使って表示させようというわけです。7%分のプログラム実行が減るわけですから、7%多くの他のプログラムを実行する余地が生まれるのですね。7%が多いか少ないかという判断については難しいですが、1%未満ではないので今回はキャッシュさせることにしました。

キャッシュの方法は至って簡単です。一時間おきなど決められたサイクルにトップページを取得しそれを置いておくだけです。wordpressの場合ですとhttp://www.example.com/index.phpへアクセスしてそれを置いておけば良いです。
外部からアクセスされる場合、最初のスラッシュ以降は空欄で来る場合が多いです。先ほどの例ですとhttp://www.example.com/でアクセスされることが多いのですね。この場合ウェブサーバはhttp://www.example.com/index.htmlを読んで返答します。(実際にはサーバの設定によります)。index.htmlはphpじゃないのでプログラムは実行されずにHTMLを返答するだけなんですね。なのでとても軽いです。CPU負荷はかけません。キャッシュ万々歳ですね。

さて、実際のやり方です。
ウェブサーバにログインしてcrontabを編集します。crontabに以下のようなコマンドを登録します

0       *       *       *       *       yousan  /usr/local/bin/wget -O /home/yousan/public_html/www.example.com/index.html http://www.example.com/index.php

これで毎時0分にキャッシュを生成してくれます。wgetのパスなどが違う場合があります。その際にはwhich wgetなどしてパスを確認してください。wgetは-Oオプションで取得したファイルの置く位置を決めることができます。これでキャッシュをドキュメントルートの直下におけます。
これできっと軽くなるはずです。

最後にキャッシュがちゃんと効いているか確認してみます。themesにあるindex.phpへテストコードを埋め込んでキャッシュが効いているか確認します。


<!-- time <?php echo time(); ?> -->

上記のコードはヘッダーより下の安全なところに埋め込みます。phpで現在時刻を秒数で出力しているのですね。キャッシュが無い状態でアクセスすると上のコメント部分の時刻がアクセス毎に変動します。が、キャッシュを生成すると時刻がキャッシュ生成時の時刻になります。終わったら消しておきましょう。

最後に

wordpressは便利です。でも残念ながら重いです。月間で100万PVを越える辺りから限界に近くなります。ノーマルwordpressだとまず最初に直面する上限値かもしれません。wordpressにはいろいろなキャッシュプラグインがあるのでそういったプラグイン、またテクニックを駆使してアクセスを伸ばしてやる必要があります。プラグインにも公式が配布しているキャッシュシステムにも非常に有用なものがあるのですが今回は簡単なキャッシュをまずは取り入れてみました。よかったら使ってみて下さい。

MySQL接続で起こった怪奇現象

今日も引き続いてzabbixの設定をしてました。そのなかでmysqlコマンドを利用してzabbixに接続をさせてあげたかったんです。で、その時のテスト時に不可解な現象が、理解不能な現象が起きました。

MySQL上でzabbixという名前のユーザを作り、ローカルホストのログインのみパスワード無しで接続可能にしたんですね。つまりTCP/IPとかの接続はダメでローカルのsock通信のみOK、ローカルからのmysqlコマンドでつなげばOKと。

ユーザを追加したので鼻歌でも歌いながら接続試験をしてみました。

mysqlhost> sudo -u zabbix mysql
ERROR 1045 (28000): Access denied for user 'hogetan'@'localhost' (using password: NO)

が、繋がらない。見てみるとaccess deniedしてる対象ユーザがsudo元のhogetanになってる!

これじゃ繋がらないよね。でもおかしい。通常sudoすればバイナリを実行するユーザは切り替わるはずなのに切り替わってないご様子。環境変数にその辺りが入ってるのかと思いチェックしてみるも…。

mysqlhost> sudo -u zabbix env| grep hogetan
SUDO_USER=hogetan

うーんむ、怪しい感じではないなぁ。USERとかはちゃんとzabbixになってたし。しょうがないのでnologinを解除してsuしてログインしてやってみることに。

mysqlhost> sudo su - zabbix; env | grep zabbix;
mysqlhost> mysql
ERROR 1045 (28000): Access denied for user 'hogetan'@'localhost' (using password: NO)
mysqlhost> env | grep hogetan

うーむ……。最後のenvはhogetanにヒットするものが無かった。一体ドコの情報を参照しながら元のsudoユーザ名でmysqlコマンドをつなごうとしてるのだろうか。

結局、結局結局、mysqlコマンドに-uでつながせることで落着はしそうなのですが、何とも腑に落ちない結末でした。

ちなみにですがsudoをするユーザをfugatanとかにすると確かに今度はfugatanでrejectされてるんですね。なのでmysqlコマンドがかならずhogetanユーザになる、というわけでもなさそうです。またmysqlホスト、sudoを行う場所をlinuxで試してみたらこれはちゃんと所望の結果が得られました。

FreeBSD特有の挙動なのかなぁと思いながら今夜も寝れなさそうです。

解決やお心当たりのある方は是非教えて下さい。

sedを使ってファイルの中身を置換する

sedを使ってファイルの中身を置換したかった。
ヒトクセあるsedだけどコマンドラインでさっくり置換してくれるのは魅力。
置換となるとファイルの中身を書き換えて欲しかったりするんだけどファイル自身を書き換えるときのオプションを調べたのでメモ。二回目なのでメモ。忘れていたのでメモ。

FreeBSDはオプションがLinuxなどの GNU sed と違うらしい。ファイル自身を書き換えるオプションがGNU sedなら-iでいける。でもFreeBSDであれば-iは引数を伴いそのファイル名で出力する、というものなのだ。で、ファイル自身に書き出したいときにはシングルクォートで引数に空文字を渡してやればそれ自身を書き換えることができる。めもめも。

shell> sed -i '' 's/hoge/fuga/g' inputfile