Skip to content →

Nginx+Apacheの環境にて、PHPでクリアをキャッシュする

本日、サーバーを移転したんですが、ついでにこれまで不便だったNginxのキャッシュクリアをPHPからできるようにしてみました。

実は既に素晴らしいプラグイン「Nginx Cache Controller」があって、これでキャッシュの管理ができるのですが、こちらはFastCGIでPHPを動かしていないと使えません。そんなわけで、Nginx+Apacheの環境では使えるものがなかったため、自分用に作ることにしました。

Nginxのキャッシュをクリアするには

Nginxのキャッシュは/var/cache/nginx/に作られていきます。なので、このフォルダに入っているファイルを消せばクリアできます。

rm -rf /var/cache/nginx/*

ワードプレスで新しい記事を書いて公開したら、このキャッシュをクリアしないと、トップページに新しい記事がでてきません。なので、記事公開後にこれまではSSHでログインして、キャッシュをクリアしていたというわけです。ちょっと面倒です。

PHPでコマンドを実行する

ターミナルでログインするひと手間をはぶくため、PHPファイルにアクセスしたら

rm -rf /var/cache/nginx/*

を実行するようにしてみました。これだとSSHログインがないので、少し楽です。

PHPで実行するには

exec("/bin/rm -rf /var/cache/nginx/*");

とすればいいんですが、動きません。

execで実行するユーザーは「apache」、nginxフォルダの所有ユーザーは「nginx」となっているため、削除することができません。そこでsudoコマンドを使って実行できるように設定します。

sudoコマンドを使えるようにする

まず、apacheユーザーは通常パスワードが設定されていないはずなので

#passwd apache

で任意のパスワードを設定します。
(パスワードを設定しないとsudoできないようです)

次に、sudoコマンドを実行できるように設定します。

#visudo

↓コメントアウト
#Defaults    requiretty

↓一番下に追記
apache plus.vc=(ALL) NOPASSWD: /bin/sh (環境に合わせてパスを設定)nginx_clear.sh

:wq

通常はログインできるユーザーしかsudoできないようになっていますが、apacheはログイン出来ないユーザーです。それでも実行できるようにするため、requirettyをコメントアウトします。

記述しているのはapacheユーザーは特定のホスト(plus.vc)から(ALL)全てのユーザーに変身でき/bin/sh nginx_clear.shのみ実行できるという意味になります。NOPASSWDの後にコマンドを入れると、そのコマンドだけパスワード無しで実行できるようになります。

これでsudoコマンドが実行できるようになりました。

シェルスクリプトを作る

適当な場所にシェルスクリプトファイルを作ります。

#vi nginx_clear.sh

以下のコマンドを記述します。

#!/bin/sh
sudo rm -rf /var/cache/nginx/*

これで、後はPHPで

exec("sudo sh nginx_clear.sh");

を実行すると、キャッシュのクリアができるようになりました。

[sc name=”engeneer”]

Published in ビジネスハック 開発奮闘記

5 Comments

  1. showhey0705 showhey0705

    おー、これは便利そう。プラグインの公開、たのしみにしています。

  2. plusplus01 plusplus01

    サーバーの設定が必要なので、他の人が使うプラグインとしては公開できないんですが、自分用のやり方はこちらに書いてますので、ご参考にどうぞ!
    http://plus.vc/web/6748/

  3. miya0001 miya0001

    単純にApacheとNginxの実行ユーザーを同じにすれば、Nginx Cache Controllerでキャッシュをフラッシュできます。
    セキュリティ的にもそうするほうが安全ですよ。