オープンソースこねこね

Webプログラミングなどについてあれこれ。

nginxでerror_log出力先を設定ファイルで指定しても`/var/log/nginx/error.log`を読みにいってしまう件

nginx.conf

error_log  /path/to/error.log;

とか書いて、デフォルトと異なる場所にエラーログを出力するようにしてみたら、起動時に

nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)

とか警告が出てしまってました。なんで出力先変更したのに/var/log/nginx/error.logを読みに行ってしまうのか〜、と調べていたら いつものようにStackOverflowで質問が見つかって、ありがとうございます、と。

なんでも、起動してコンフィグファイルを読みに行くまでの間にnginxはコンパイル時に指定したエラーログ出力先(私の環境の場合(CentOS)は/var/log/nginx/error.log)を使うとのこと。

How to turn off or specify the nginx error log location? - Stack Overflow

上記から、リンクされている公式ドキュメントにもちゃんと記載がありました。

CoreModule - Nginx Community

というわけで、起動時のエラーも/var/log/nginx/error.log以外に向けたい場合はconfigureオプションを指定してソースから入れなおすしかないわけだけど、個人的にやりたくないんですよねソースからのインストール。悩ましいぃぃ。

sambaでファイルを修正するとnginxがResource temporarily unavailableでエラーになる件

以前の記事で書いたように自分のメインの開発環境はローカルにVirtualBoxで構築したCentOSの仮想環境+sambaでのファイルシステム共有を利用しているのですが、nginxで読まれるcssファイルなどをこの環境で修正すると、

failed (11: Resource temporarily unavailable)

なエラーをだします。それでググったら解決法がでてきたのですがピンポイントな情報(nginx+samb+ファイル修正)は英語しかなさそうなので、ちょっとメモっときます。解決法が書いてあるサイトはこちら↓

http://www.carloscastillo.com.ar/2011/08/handling-open-11-resource-temporarily.html

oplocks = no

をsambaの設定に追加しとけばいいってだけです。そんなわけで以前書いた記事にあるsambaの設定も修正しましたよっと。

バックエンドのアプリケーションサーバでHTTPSリクエストを判定するための設定

サーバの構成として、軽量なリバースプロキシをフロントに置きバックエンドにPHPなどが動くアプリケーションサーバを配置する構成はよく使われると思います。この場合、リバースプロキシとアプリケーションサーバ間の通信は通常HTTPでおこなわれているので、リバースプロキシがクライアントとHTTPS通信をおこなっていてもバックエンドのアプリケーションではそれがわかりません。

でも、たまにアプリケーションのロジックとしてHTTPSかHTTPかを判断して処理を切り分けたい時などがあります。そんな時は以下のようにフロントのリバースプロキシにHTTPのヘッダ変数の設定をしてやればOKです。

Apacheの場合

<VirtualHost *:443>
  DocumentRoot "/your/documentroot"
  ...
  RequestHeader set X_SSL On
  ...
</VirtualHost>

nginxの場合

server {
  root /your/documentroot;
  ... 
  proxy_set_header    X-SSL           On;
  ...
}

んでアプリケーションサーバで動くPHPでは以下のように判定できる

if ($_SERVER['HTTP_X_SSL'] === 'on') {
  // httpsのときの処理
} else {
  // httpのときの処理
}