Vagrantで作ったローカル開発環境上のブログを更新しても反映されなかった問題とそれが解決した話(Apache案件)

今年の7月後半にハマって解消した話。ずっと忙しくてブログには書けなかったのだけど、このままだともし同じことが起こっても(大いにありうる)同じつらい思いをしそうだったので主に後の自分のために記しておきます。

結論

以下のブログの記事が大変参考になりました。
http://www.seeds-std.co.jp/seedsblog/1227.html

VagrantVirtualBoxの共有ディレクトリ機能を使っていて、さらそのマウントポイントをApacheのドキュメントルートとしている場合、静的ファイルの更新が反映されない(バグる)問題の対応方法。
結論から言えばApacheが問題で以下の設定を追加すればOKでした。

<Directory /path/to/public_html>
  EnableMMAP Off
  EnableSendfile Off
</Directory>

ありがとうございました。

前提

前提状況としては、僕はVagrantの共有フォルダ機能を使って、その中にブログツール「Riji」で作ったブログを置いていたんだけど、

※参考URL

Rijiによる記事ファイルの作成・更新じたいは上手く(というか正常に)できているらしいにもかかわらず、ブラウザをリロードしてもその内容が反映されない。「riji publish」によって出力された最新のhtmlファイルそのものを見ると更新されているんだけど、ブラウザ(FirefoxChrome等)では前の版のまま、という状況。

一応、「vagrant reload」してvagrantごと再起動すれば更新されることは確認したけど、いやいや、それは解ではないでしょ・・ということでしばらく悩み。
また、このRijiを使う前に同じようにVagrantで立ち上げたサーバー上にWordPressのローカルブログを作って数ヶ月使っていたのだけど、その時にはこういう問題は起こらなくて、ブログを更新したらその都度ブラウザのリロードでちゃんと最新記事を見ることができていたから余計に混乱した・・ということもあり。

後から知ったところでは、Rijiの方は静的、WPの方は動的に動作しているそうで、その違いがあるっぽいという・・曖昧な理解であれですが。

もう一つ前提的なことを言っておくと、このVagrantの環境はドットインストールの以下を参照して作ったので、
http://dotinstall.com/lessons/basic_local_development_v2/24802
CentOS6.4を使ってるということになると思われます。(&今同じことをやろうとしたら6.5になるっぽい)

解消

具体的な解消方法としては、問題の根はようはApacheにあるということで、

1)まず「vagrant ssh」で中に入って、
2)「/etc/httpd/conf」の中にある「httpd.conf」をエディタで開き、
3)「EnableMMAP」「EnableSendfile」をそれぞれoffにして更新。

で解決しました。
(追記: 自分の場合は「EnableSendfile」のみ対処するのでも大丈夫でした。追記ここまで)
(さらに具体的には上記のリンク先のブログ参照)

ただこの際、3)の書き換えにはルート権限が必要らしくてsudoしないでやったら「え、ダメじゃん・・」みたいになったので注意。(俺が)

さらにちなみに、書き換え後にはApacheを再起動したらそれで完了らしいのだけど、その方法(Apache再起動のためのコマンド)がよく分からなかったので、とりあえず「vagrant reload」したらそれで大丈夫でした。
(追記2: Apache再起動は「service httpd restart」ですかね。追記ここまで)

経緯

一連の解決篇においてはPerl入学式のサポーターの皆さんが親身に相談に乗ってくださって、それによって迅速かつ明快に解決に至ることができました。
以下のLingrアーカイブ・ページからザクっとその様子を見ることができます。
http://lingr.com/room/perlentrance_chats/archives/2014/07/23#message-19719923

僕は最初、この問題はRijiないしVagrantに起因するなにがしか、だと勝手に思っていたんだけど、いやそうじゃなくてApache(なるもの)の話だよね、とサクッと指摘されて、まったくそういう違いというか世界も分からなかったのに、平明なやり取りを通して不思議なほどあっけなく解決に導いてもらえたというのは本当にありがたいことでした。

あとサポーターさんだけでなく、僕のような生徒さん側の方からも超適切な指摘をもらったりして(上記のルート権限のこと)、それがなければさらに半日ほどわからないままだったかもしれず、その点もありがたかったです。

ちなみに上記のLingrは現在 idobata の方に移行して継続運用中ですので、Perl入学式の生徒さんやそれに限らずプログラミング学習初心者さんやそれを助けんとする方々はぜひどうぞ。
https://idobata.io/#/organization/perl-entrance/room/bbs

※idobataはLingrと違ってアカウントのない方はログを見れませんが、以下のInvitation URLからアカウント作成してもらえばそのまま入れます。
https://idobata.io/organizations/perl-entrance/rooms/bbs/join_request/5b474deb-feac-4cfd-8a37-9d1dd8026bff

終わりに

さて冒頭に書いたとおり、これは7月のことだったので本当はすぐ書いておきたかったんですが、今年の初めから作業していたプロジェクトがかなりキツくて後回しになっていて、しかしそれが今週あたりで収まってきたのでようやく書けて良かった。
そういう話題がまだいくつかあるので時間のあるうちに書けるといいですが、どうかな・・

付記

Vagrant関連では上記のことをやっていたのとほぼ同時期に2つ記事を書いていました。けっこうつながった話でもあります。

Vagrantで立ち上げたローカルブログに同じWifi環境内にある別端末からアクセスする(さわり) - the code to rock

RijiとVagrantでローカルブログを運用する - the code to rock

付記2

Nginxの場合の対処法に関する参考記事。
qiita.com
qiita.com

さしあたり必要なところだけ抜粋すると、Nginxで同様の対処をするには、nginx.confに記述されている

sendfile on;

sendfile off;

にしなければいけない。これが前者の記事に書かれてること。

で、そのnginx.confはどこにあるかというと、/etc/nginx/nginx.conf にある。
これが後者の記事に書かれていること。
(長大なのでわかりづらいが、「設定ファイル」という見出しのところに書かれている)