Warning: Error while sending QUERY packet. PID=28814 in /home/uls/public_html/wordpress/wp-includes/class-wpdb.php on line 2351 FreeBSDな生活

2007.01.13

Movabletype関係のperlライブラリー・・・(Movabletype)

昨年末にFreeBSDでswap領域を拡張する方法を書いた。
しかし、やはりHDDがあやしく、結局HDDを交換する羽目になった。
そこで、Movabletypeを動かすために、いくつかのperlライブラリーを入れる必要があるが、筆者はmysqlを使っているので、このためにも更にいくつかのperlライブラリーが必要である。
以前にも断片的にかいたが、ここで再度まとめておく。
下記は入れたperlライブラリーである。

(1) p5-Class-DBI-mysql          (/usr/ports/databases)
(2) p5-DBI-DBD                    (/usr/ports/databases)
(3) p5-Image-Info                  (/usr/ports/graphics)
(4) p5-Image-Size                  (/usr/ports/graphics)
(5) p5-SOAP-Lite                  (/usr/ports/net)
(6) p5-Crypt-DSA                 (/usr/ports/security)
(7) p5-POE-Component-Server-XMLRPC     (/usr/ports/devel)

これらをmake install clean で次々に入れる。
p5-SOAP-Liteはnet関係のライブラリーがたくさん含まれているので、post2blogは、
これとImage-Info, Image-Sizeを入れると動作可能となる。
あと、StyleCacherが動かなくて、はまってしまったが、設定は2箇所必要なのです。
 ・メインメニューのページでシステムメニューのところのプラグインをクリックして
  styleCacherを選択して設定
 ・個別エントリーの設定でプラグインでStyleCacherを選択して設定両方に

Theme Root URL: http://uls.fam.cx/mt/mt-static/
Theme Root URL: /web/data/mt/mt-static/themes

とすると、うまく動作した。


2006.12.18

Swapスペース不足・・・(FreeBSD)

10日ほど前から、下記のログが大量に出て、Apacheが落ちる問題に悩まされていた。

swap_pager_getswapspace: failed
swap_pager_getswapspace: failed
swap_pager_getswapspace: failed
          ・
          ・

最初、ハードディスクが壊れかかっているのだろうと思い込んで、新しいHDDを買ってきたが、新しく立ち上げる間の代替機でも同じ現象が発生した。
どうも、mysqlを5.0.27に上げてからのようで、これは本当にスワップ領域が足りないのではと思い、スワップ領域を増やしたらビンゴー!!。 ぴったり安定した。
実は、古いPCで380MBほどのメモリで、色々なサービスを起動していてスワップ領域も512MBなので、mysqlを新しくして、ついに足りなくなったのだろう。
しかし、スワップ領域は最初にインストールするときに確保するが、後から増やすことなどできるのか。
どうすればよいのか? 色々と調べたら簡単に増やせることがわかった。
まず、/usrに

# dd if=/dev/zero of=/usr/SWAPFILE bs=1m count=2000

として、2GBの領域を/usrに確保。 少し時間がかかる。 そして、/etc/rc.confに次の1行を追加した。

swapfile="/usr/SWAPFILE"

これだけである。 マシーンを再起動どうなったか調べるために次のコマンドを打つ

# pstat -s
Device          1K-blocks     Used     Avail Capacity
/dev/ad0s1b        524288      120   524288      0%
/dev/md0           2048000      136  2048000     0%
Total                   2572288      256  2572032     0%

となって、最初に確保してあった512MBも加わり2.5GBのスワップ領域となった。
1週間悩み続けたのが、簡単に氷解した。


2006.12.17

php5-5.2.0のインストール・・・(php)

(2012/1/30 FreeBSD 9.0へのインストールにともない以前の記述に加筆修正した)

mysqlのインストールが、なんとか終了したので、次にphpを入れることとした。

このphpも言語指定、2バイト文字の処理、perl互換の正規表現処理で幾度か苦労した。
まず、portsを最新にしてから/usr/ports/lang/php52に移動し、make configでオプションを指定

# cd /usr/ports/lang/php52
# make config

ここで、少なくともAPATCH, MULTIBYTEにチェックマークを入れ、

# make install clean

次いで、phph52-extensionsに移動してmake config

# cd ../php52-extensions
# make config

ここで、DBASE, MBSTRING, MYSQL, PCREにチェックを付けインストール

# make install clean

途中でエラーが出て、make deinstallしてmake installをやり直すか、FORCE_PKG_REGISTERをコマンドラインに使えとメッセージがでることがある。
make deinstallしてもinstallがうまく行かないので、FORCE_PKG_REGISTERを使って

# make FORCE_PKG_REGISTER=1 install

とするとうまく行った。

ここで、/usr/local/etcにあるphp.ini-distをphp.iniに名前を変えて編集

# cd /usr/local/etc
# cp php.ini-dist php.ini
# chmod +w php.ini
# vi php.ini

まず、Language OptionsのShort oen tagをOnに修正

short_open_tag = On
   これでphp文の始まりの<?phpを<? で済ませられる。 

次に[mbstring]の項目を下記に修正

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.encoding_translation = On
mbstring.detect_order = auto

ここで、Apacheのhttpd.confのLoadModuleに下記の1行が追加されていることを確認し、AddTypeとしてphpを追加

LoadModule php5_module        libexec/apache2/libphp5.so ← 確認
    Addtype application/x-httpd-php .php ← 追加

そして、apacheを再起動し、check.phpの名前で以下の1行を書いたファイルを作りwebから見える位置においてアクセス。

<?php phpinfo(); ?>

phpの設定状態の表示画面が出て、無事成功。mbstringの項目も表示されていることも確認する。


2006.12.10

mysql-5.0.27のインストール(obsolete)・・・(Database)

(obsolete) MySQL バージョン5.5.6 を御覧ください
11月の中旬にmysqlとphpを用いた頼まれもののアプリを書いているときに、うっかりmysqlを壊してしまった。
最初は簡単に復帰でいるだろうと思っていたが、日本語処理でトラブルがでて、大変な目に会ってしまった。
解ってしまえば簡単なことであったのだが、時間に追われる中で混乱を来たし、私のところのサーバでブログを開設している5人ほどの人にも大変な迷惑をかけてしまった。
前置きはこれぐらいで、本筋に戻るが、どうせ壊れたのだからmysql-4.1をmysql-5.0.27に上げようと、/ports/databases/mysql50-serverとmysql50-clientを入れようとした。
調べるとEUCを使うにはコンパイルオプションで以下のように、デフォルトの文字コードのujis(EUC)とその他の文字を以下のように指定すれば良いことが分かった。

# make WITH_CHARSET=ujis WITH_XCHARSET=all install clean

次に/etcにmy.cnfを作って、修正

# cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf
# cd /etc
# chmod +w my.cnf
# vi my.cnf
[mysqld]
datadir = /usr/db/mysql
port            = 3306
socket          = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

mysqlをuserとgroupに追加

#vipwして次の1行を追加

mysql:*:88:88::0:0:MySQL Daemon:/nonexistent:/sbin/nologin

次に/etc/groupにmysqlを追加

# vi /etc/group して次の1行を追加

mysql:*:88:

そして、DBをインストールして起動

# mkdir /usr/db
# mysql_install_db
# chown -R mysql /usr/db/mysql
# cd /usr/local/etc/rc.d
# cp /usr/local/share/mysql/mysql.server ./mysql-server.sh
# ./mysql-server.sh start

無事起動したら、mysql-clientからパスワードを設定

# mysql -u root
mysql > use mysql;
mysql > set password for root@localhost=password('xxxxx');
mysql> flush privileges;
mysql > exit;

パスワードの設定は以前は set password for root=password(‘xxxxx’); で良かったが、今回は
root@localhost=password(‘xxxxx’); と
@localhostが必要であった。
最初の起動でrootのパスワードの設定を行わずに抜けると、後からloginできず酷い目に会う。
筆者も、うっかりやってしまって、大変な思いをした。
一応loginが出来なくなった場合の対処方法を下記に書いておく。

# mysqld_safe --skip-grant-tables &
# mysql -u root mysql
mysql > UPDATE user SET Password=PASSWORD('mynewpassword')
      -> WHERE User='root';
mysql > flush privileges;

この後、mysql;を停止(kill)して、正規に立ち上げる。
さて、無事にインストールして念のために文字コードを調べたら、

# mysql -u root -p
Password xxxxxxx
mysql > SHOW VARIABLES LIKE 'character_set_%';
+----------------------------------+-------+
| Variable_name                 | Value  |
+----------------------------------+--------+
| character_set_client          | latin1 |
| character_set_connection    | latin1 |
| character_set_filesystem             | binary |
| character_set_database       | latin1 |
| character_set_results           | latin1 |
| character_set_server         | latin1 |
| character_set_system         | utf8   |
+----------------------------------+--------+
6 rows in set (0.00 sec)

ujis(EUC)になっていないので、/etc/my.cnfで指定するのだろうと思って、[mysqld]の中で、[mysqld]のセクションに、

default-character-set=ujis

を入れて、起動しようとすると、ujisなんて無いよと怒られる。
だって、WITH_CHARSET=ujisを入れたじゃないかと叫んでも、どうにもならない。
結局、http://www.mysql.com からソースをダウンロードして自前でコンパイルして入れることにした。
サイトのダウンロードページには、WindowsやLinuxのPrecompiled Binaryのファイルがずらっと並んでいるが、一番下に、Tarball (in 5.1 both Unix & Windows, tar.gz)があったので、これをダウンロードする。
そして、以下のようにしてインストール、

# tar xvzf mysql-5.0.27.tar.gz
# cd mysql-5.0.27
# ./configure --prefix=/usr/local --with-charset=ujis 
--with-extra-charset=all --with-mysqld-user=mysql

無事configureが終わり、いよいよインストール

# make install

clientは問題なさそうなので、早速起動して文字コードを調べてみる。

mysql> SHOW VARIABLES LIKE 'character_set_%';
+----------------------------------+--------+
| Variable_name                 | Value  |
+----------------------------------+--------+
| character_set_client                   | ujis       |
| character_set_connection          | ujis       |
| character_set_database        | ujis       |
| character_set_filesystem            | binary  |
| character_set_results                 | ujis       |
| character_set_server                 | ujis       |
| character_set_system         | utf8      |
+----------------------------------+--------+

systemはデフォルトでutf8、filesystemはbinaryで問題ないとのことなので、無事ujsi(EUC)が使えるようになっている。
早速ブログ用のmtdbを作って(mysqlの導入参照)、念のために再立ち上げして文字コードを調べる。

mysql > use mtdb;
mysql> SHOW VARIABLES LIKE 'character_set_%';
+------------------------------------+---------+
| Variable_name                  | Value   |
+-------------------------------------+--------+
| character_set_client            | ujis       |
| character_set_connection       | ujis       |
| character_set_database          | latin1   |
| character_set_filesystem                | binary  |
| character_set_results            | ujis       |
| character_set_server             | ujis      |
| character_set_system              | utf8     |
+-------------------------------------+-------+

databaseがlatin1(うろ覚えなのでbinaryだったかも知れない)になっている。
どうも、以前の古いデータを参照しているようなので、一度 mtdbを破棄して、改めて作成する。
そして、文字コードを調べる。

mysql> SHOW VARIABLES LIKE 'character_set_%';
+------------------------------+--------+
| Variable_name                     | Value   |
+------------------------------+--------+
| character_set_client             | ujis       |
| character_set_connection    | ujis       |
| character_set_database       | ujis       |
| character_set_filesystem      | binary   |
| character_set_results           | ujis        |
| character_set_server            | ujis       |
| character_set_system           | utf8      |
+------------------------------+--------+

めでたし、めでたしsystemとfilesystemを除き、全てujsiになっている。
しかし、ブログのデータを飛ばしたのは申し訳ないことをした・・・


2006.10.17

spamメール対策(その2)・・・(mail)

前のエントリーでスパム対策として、accessに加えてGreeting pauseの設定について書きました。
しかし、次々に すり抜けて来ます。
こうなったら、Spam Assasinでも入れるかと考えたのですが、ただ入れただけではスパムが判定できても、スパムメールを受けた旨の通知は届くので、これならThunderbirdのスパム判定とあまり変わりなく、キッチリと機能させるためには、Procmailと組み合わせて自動的に捨てる仕組を作る必要があります。
チョット厄介だなぁーと思って二の足を踏んでいたのですが、世の中にはRBL(Real Time Black List)というものがあり、適宜Black Listを更新してくれています。
しかし、海外のRBLはNiftyがRBLに登録されたり(NiftyをかたってSpamを出すのもあるので)で、あまりよろしくないなぁーと思っていたら、日本発の”all.rbl.jp”というのがあり、手堅く運営している(それだけすり抜けよいが)ようなので,これを使ってみることにしました。
設定は、いたって簡単で、以前にメール設定ファイルのfreebsd2.mcに入れたGreeting Pauseの設定の前にでも、1行追加するだけです。

FEATURE(dnsbl,`all.rbl.jp')dnl
FEATURE(`greet_pause',`5000')dnl

入れたら、前回と同じで、次のようにmakeして出来たfreebsd2.cfをsendmail.cfとしてコピーします。

# make freebsd2.cf
# cp freebsd2.cf sendmail.cf

あとはsendmailを再起動しておしまいです。
maillogを見ると次のように、引っ掛かっています。 Spamの5〜7割りぐらいは防げてます。

Oct 16 21:46:14 uls sm-mta[6129]: ruleset=check_relay,
arg1=[222.170.195.25], arg2=127.0.0.4, relay=[222.170.195.25],
reject=550 5.7.1 Rejected: 222.170.195.25 listed at all.rbl.jp
Oct 16 21:46:36 uls sm-mta[6130]: ruleset=check_relay,
arg1=[222.170.195.25], arg2=127.0.0.4, relay=[222.170.195.25],
reject=550 5.7.1 Rejected: 222.170.195.25 listed at all.rbl.jp