Webサーバをapacheからnginxに移行
今までapacheで動かしていたWebサーバをnginxにようやく切り替えた。 その中でしたnginxの設定とか詰まったところとかメモ。
nginxの設定
全体に関わる設定
http://www.nametake.info
のように、特に設定をしていないサブドメインに
アクセスがあっても、全部nametake.infoのページと同じ内容が表示されるようにしたい。
ということで、以下のようにdefault.conf
ファイルを書いて、デフォルトのバーチャルホストを設定する。
また、server_name
を_
にすることで、catch-allサーバとして設定。
default.conf
server { listen 80 default_server; server_name _; root /var/www/html; ~~~略~~~ }
あとは、nginxのバージョン番号とかOSの情報をレスポンスヘッダに含めたくないので、以下をnginx.conf
に追記。
nginx.conf
http { ~~~略~~~ server_tokens off; }
SSLに関わる設定
やりたかったこと
nametake.info
のサブドメインで動かしているownCloudとかampacheの通信経路を暗号化したい- 設定ファイルはサービスごとに分割したい
owncloud.conf
とかampache.conf
とかに証明書の情報をいちいち書きたくない
やったこと
以下のようにSSL全体の設定も記述(と言ってもほとんどexample_ssl.confのまんま)。 サーバ証明書と秘密鍵は、apacheを設定した時に作成したオレオレ証明書があるので、それをそのまま流用。
変更したのはlisten
の部分のdefault_server
と、server_name
の部分のバーチャルホスト。
ssl.conf
server { listen 443 ssl default_server; server_name .nametake.info; ssl_certificate /my/cert/file; ssl_certificate_key /my/cert/key/file; ~~~略~~~ }
上記のようにssl.conf
としてSSL全体の設定ファイルを作成することで、それぞれのサービスで
SSLを使用するときは、以下のように記述するだけでOK。
owncloud.conf
server { # 80番ポートでアクセスしてきたら443番ポートにリダイレクト listen 80; server_name cloud.nametake.info; # enforce https return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name cloud.nametake.info; ~~~略~~~ }
SSL通信したいサーバでlisten 443 ssl
と書くだけ。これで個別のファイルに証明書の情報を書かなくてよくなる。
サービスごとの細かいnginxの設定は[nginx (サービス名)]
とかで検索して出てきた結果をコピペ。
詰まったところ
ownCloudのログイン画面でリダイレクトループする
原因
/var/lib/php/session/
のパーミッションがapache:apache
のままになっていた。
解決策
/var/lib/php/session/
のパーミッションをnginx:nginx
に変更。
こんなところのパーミッションの設定もapacheになっていたのは想定外だった…… (serverのrootに指定したディレクトリの所有者がapacheのままになっていたのに気付かなくて30分ぐらい悩んだのは内緒)