Apache2 mod_rewrite と AllowOverride

仮想マシン上の WordPress でパーマリンクをデフォルトの (?p=番号) 形式以外にすると動かない件、考えてみるに、

  • Apache mod_rewrite

が入っていないのかもしれません。

仮想マシンは Ubuntu 10.04 desktop に tasksel で Apache、PHP、MySQL を入れたもので、WordPress の動作要件を調べていませんでした。

Apache の mod_rewrite が入っているかどうかの調べ方ですが、ターミナルで httpd -l としたら、そんなコマンドはありませんと言われてしまいました。

$ ps -e

でプロセスを調べたら、 apache2 という名前でした。

$ apache2 -l

Compiled in modules:
core.c
mod_log_config.c
mod_logio.c
prefork.c
http_core.c
mod_so.c

ということで、静的には mod_rewrite が入っていません。しかし、 mod_so があるので動的にロードしているかもしれません。

動的なモジュールも表示してくれる apache2 -M は受け付けてくれませんでした。どうやら、 apache2ctl というコマンドを使うようです。

$ apache2ctl -v  (バージョン)
$ apache2ctl -V (バージョン、環境)
$ apache2ctl -l  (静的モジュール)
$ apache2ctl -M  (静的・動的モジュール)

どれも実行可能でした。

$ apache2ctl -v
Server version: Apache/2.2.14 (Ubuntu)
Server built:   Sep 28 2010 12:52:38

Apache2 のバージョンは 2.2.14 ということです。

「動的共有オブジェクト (DSO) サポート」というそうですが、今動いているモジュールを調べると、

$ apache2ctl -M
apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
Loaded Modules:
core_module (static)
log_config_module (static)
logio_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
alias_module (shared)
auth_basic_module (shared)
authn_file_module (shared)
authz_default_module (shared)
authz_groupfile_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
cgi_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
mime_module (shared)
negotiation_module (shared)
php5_module (shared)
reqtimeout_module (shared)
setenvif_module (shared)
status_module (shared)
Syntax OK

残念ながら mod_rewrite は入っていないようです。

それで、モジュールをどうやって有効にするのか。

Google 「ubuntu apache2 mod_rewrite」

と検索したら、

$ sudo a2enmod rewrite

とするようです。man a2enmod で調べると、逆は a2dismod だそうです。実行すると、

$ sudo a2enmod rewrite
[sudo] password for … :
Enabling module rewrite.
Run ‘/etc/init.d/apache2 restart’ to activate new configuration!

ということで、apache2 を再起動です。

$ sudo /etc/init.d/apache2 restart
$ apache2ctl -M

rewrite_module (shared)

mod_rewrite を有効にして再起動に成功したらしいので、WordPress を動かしてみます。

まだパーマリンクがデフォルトの (?p=数字) 形式しか動きません。

よく見ると、404 Not Found のページが WordPress ではなく Apache/2.2.14 から報告されています。これはどうやら Apache の設定をいじらなければならないような雰囲気です。WordPress が動き始めたときも、ルートの index.php が有効にならずに index.html が優先されたままだったので、おかしいなとは思っていました。 これは、.htaccess が有効になっていません。

などで検索。

これらを参考に、Apache の設定ファイル 「/etc/apache2/sites-available/default」 を sudo gedit で開き、AllowOverride のところを None から All へ変更。

<Directory /var/www/>
	Options Indexes FollowSymLinks MultiViews
#	AllowOverride None
	AllowOverride All
	Order allow,deny
	allow from all
</Directory>

それから、apache2 を再起動

$ sudo /etc/init.d/apache2 restart

これでルートディレクトリの .htaccess が有効になり、WordPress が生成する動的なページ群が有効になりました。日付 + スラッグ のページ指定できちんと見えます。

(2010.11.13)

WordPressの引越―仮想マシンにクローンを作る

ローカルの仮想マシンに WordPress を引っ越してみます。ふつう逆だろうという突っ込みをしたくなりますね。ローカルでテストしてからインターネットに公開するのが手順というものです。それだといつまでたっても、こんどまた、で永遠に取りかかりそうになかったので…

に沿ってやればできそうです。

データのバックアップについては WordPress のバックアップ でやったとおり。

次が wp-config.php の編集になっていますが、その中身を見ると、MySQL の設定情報です。先にローカルの仮想マシンで、MySQL を最低限は設定してやらなければならないということですので、

を参照します。仮想マシンの phpMyAdmin は、ゲストの仮想マシン上では

http://localhost/phpmyadmin/

や、ホストマシンからなら

http://192.168.56.102/phpmyadmin/

でアクセスできるようにしました。「仮想マシンに LAMP を入れる tasksel」や「VirtualBox “ホストオンリー ネットワーク インターフェースの作成に失敗しました”」 で苦労したとおりです。

WordPress の解説に戻ると、「データベース」から「新規データベースを作成する」。次に「特権」から「新しいユーザを追加する」で追加して、特権をデータベース固有にするらしいのですが、何をやっているのか今ひとつよくわからないので、そのまま引用しておきます。

  1. WordPress 用のデータベースが左側のデータベースドロップダウンリストになければ、作成します:
    1. WordPress データベースの名前を決めて (例えば ‘wordpress‘)、新規データベースを作成するフィールドに入力し、作成をクリックしてください。
  2. 左上のホームアイコンをクリックしてメインページに戻り、特権をクリックしてください。もし WordPres s用のユーザーがまだ存在しなければ、作成します。
    1. 新しいユーザーを追加するをクリックしてください。
    2. WordPress のユーザー名を決めて (例えば ‘wordpress‘)、ユーザー名フィールドに入力します (テキストフィールドの値を利用するがドロップダウンメニューから選ばれていることを確認してください)。
    3. 推測しづらいパスワードを決めて (大文字、小文字、数字、記号を組み合わせたものが理想的です)、パスワードフィールドに入力してください(テキストフィールドの値を利用するがドロップダウンメニューから選ばれていることを確認してください)。それからもう一度入力してくださいフィールドにパスワードを再入力してください。
    4. ユーザー名とパスワードをメモしておきましょう。
    5. グローバル特権のすべてのオプションはデフォルトのままにしておきましょう。
    6. 実行するをクリックしてください。
  3. 特権画面に戻ったら、先ほど WordPress 用に作成したユーザー名の右にある特権を編集アイコンをクリックしてください。データベースに固有の特権セクション内にあるデータベースに特権を追加ドロップダウンから、先ほど作成したデータベース名を選択してください。ページはそのデータベース用に更新されます。すべてチェックするをクリックしてすべての特権を選択したら、実行をクリックしてください。
  4. 結果ページで、ページの上部にあるサーバ:の後に続くホスト名を確認してください (通常は localhost)。

となっていますが、4 の localhost は、2 でユーザを追加するときに、「ローカル」 localhost を明示的に指定するからそうなるのではないかと思われます(解説には書いてありません)。

さて、MySQL の設定がうまくいっているのかどうかわかりませんが、ファイルと SQL の編集に移ります。

wp-config.php を編集します。

データベースの .sql ファイルをエディタで開き、 www.makisima.org を localhost に置換します。今回はローカルホストで動かしてみることが目的なのでこれでかまいませんが、もともと存在したであろう localhost と区別がつかなくなるので、あまりよい方法ではありません。ユニークな文字列になっていたほうがよいですね。また、 URL としてではなく地の文で www.makisima.org と言及している部分を判別するのは困難です。正規表現を駆使すればできるのかもしれませんが。このあたりの書き分けは、今後、文章を書くときにも考慮したほうがよさそうです。

WordPress のファイルを仮想マシンにアップロードします。

アップロード… FTP サーバを入れていませんでした。FTP (に類似のサーバ)を入れてもいいですし、ホストマシンとファイルを共有してもかまいません。ホストとのファイル共有は別項 「ホスト Windows 7 の VirtualBox でゲスト Ubuntu とファイル共有(Guest Additions 導入)」 にて。

SQL のほうは

にしたがって行います。ログインは上で作った wordpress 用のアカウントです。

phpMyAdmin でデータベース名を選択します。その後でインポートする .sql ファイルを選択、アップロード実行します。

phpMyAdmin でデータベースを選択、さらに ‘wp-options’ テーブルを選択し、’site_url’ と ‘home’ の値を確認します。必要に応じて書き換えます。

デフォルトの index.html があると、apache がそちらを優先して表示する設定になっているかもしれません。その場合、とりあえずは index.html の名前を変えてブラウザのキャッシュを消去すれば WordPress の index.php が表示されるようになります。実際には、Apache の設定で AllowOverride None になっていて .htaccess が有効になっていない可能性が高いと思われます。(cf. Apache2 mod_rewrite と AllowOverride

WordPrss がサブディレクトリにインストールされていて、それでもトップになるようにしている場合、つまり、

のようになっている場合は、サブディレクトリの URL に相当するアドレスのほう( http://localhost/wp/ )で WordPress にログインできるかもしれません。ログインは WordPress のユーザ名で行います。WordPress の管理画面になれば、とりあえず再設定できるようになります。仮想マシンの localhost のルート (/var/www)  に .htaccess や index.php をきちんとコピーして設定する必要があります。

.sql をアップロードしたあとの設定方法は、なんとなくやっているうちに WordPress が動くようになったので、何がどう功を奏しているのかわかりません。クローンが仮想マシンで動いたので結果オーライということで…  🙂

サブディレクトリに配置した頃のメモ書きは wiki (第2巻)のほうです。

さて、すくなくとも、バックアップの方法が間違っていないこと、バックアップから復元できること、サーバの引越ができることは確認できました。これで、テスト用のサーバとして仮想マシンが使えます。

と喜んでいたら、パーマリンクが「デフォルト」 (?=数字)でないと動きません。とほほ。ということで、続きます……

(2010.11.13)

ホスト Windows 7 の VirtualBox でゲスト Ubuntu とファイル共有(Guest Additions 導入)

VirtualBox にファイルの共有があります。ホスト OS と ゲスト OS でファイルを共有できます。

仮想マシンをシャットダウンした状態で、仮想マシンの設定にファイル共有が現れます。ホスト OS 側の適当なフォルダを選択します(パスに日本語や空白を 含まないほうが無難かもしれません)。共有フォルダ名をメモしておきます。今回は “share_VirtualBox” ですが、クリップボードにコピーしておくと便利です。

共有設定すると、ゲストの Linux でのマウントの方法と、それには Guest Additions がインストールされていなければならないことが表示されます。

仮想マシンを起動すると、仮想マシンのウィンドウに「デバイス」があり、「Guest Additions のインストール…」という項目があります。これを選択すると、インストーラのファイル類が仮想の CD-ROM としてマウントされます。/media にマウントされます。ターミナル(端末)を起動して VBOXADDITIONS~ ディレクトリの中に入ります。今回は、

$ CD /media/VBOXADDITIONS_3.2.10_66523

でした。その中に各種 OS 用のインストーラがあります。今回は Ubuntu 10.04 desktop (32bit) なので、VBoxLinuxAdditions-x86.run を選びます。

$ sudo ./VBoxLinuxAdditions-x86.run

これでいいのかどうかよくわからないのですが、動いたようです。インストールにはしばらく時間がかかります。root 権限がいるので、ファイル・ブラウザでファイルを直接ダブルクリックしても実行できません。Windows ユーザは、Linux で実行ファイルを実行するときにはカレントディレクトリの ./ を付加しなければいけないことを忘れがちですね。

再起動を要求するメッセージが表示されるはずなので、仮想マシンを再起動します。

仮想マシンのウィンドウが広くなりました。Guest Additions を導入すると、ホスト側のディスプレイ情報をゲストに渡すようです。また、ホスト側 Windows とゲスト側 Ubuntu とでコピー&ペーストできるようになります。

Guest Additions が動いているので、上で設定した共有フォルダ “share_VirtualBox” を /mnt 直下にマウントしてみます。

$ sudo mount -t vboxsf share_VirtualBox /mnt

エラーがなければ成功しています。ためしに、

$ ls /mnt

すると、Windows 側のファイルが見えています。

ファイルをコピーするには cp コマンドに再帰オプション -r でもかまいませんが、ファイル・ブラウザを使ったほうがエクスプローラ風に扱えて楽です。ただし、ファイル・ブラウザで「隠しファイルを表示する」設定にしておかないとドットファイル( .htaccess など)が漏れてしまうので注意が必要です。

(2010.11.13)

(追記 2011/7/25)

久々に、(ホスト)Windows 7 + VirtualBox 4.1 + (ゲスト)Ubuntu 11.04 Desktop 日本語 でやってみました。

Guest Additions のインストール

VirtualBoxのウィンドウ上部の「デバイス」メニューから 「Guset Additions のインストール」 を選択、促されるままに「はい」「はい」進めると、GUI だけで Guset Additions のインストールが完了しました。ホスト・ゲスト間でコピー&ペーストできます。

ホスト・ゲスト間の共有フォルダ

いったんゲストのUbuntuをシャットダウン。「Oracle VM VirtualBox マネージャー」ウィンドウからゲストマシンを選び、「共有フォルダ」をクリック、「新規共有フォルダを追加」アイコンから、ホストのフォルダを指定。このとき「自動マウント」にチェックを入れておきます。ゲストマシン Ubuntu の電源を入れると、ログイン直後に共有フォルダがマウントされた状態になっています。場所は /media の下。

(2011/7/25) (2011/9/29)