nginxとapacheについて設定の違いをまとめる

ウェブサーバーをapacheからnginxに移行した。
簡単に移行できたと思ったが、動作を確認すると不具合はあった。
私的に重要な点をまとめる。
apacheで
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!RC4
と設定した部分をnginxで
ssl_ciphers AESGCM:HIGH:!aNULL:!MD5:!RC4;
とする。
AESGCMがないとFirefoxでの閲覧は拒否されたw
SSLに関する設定を次のようにする。
  • listen 443 ssl http2;
  • add_header Strict-Transport-Security 'max-age=31536000;';
  • ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
  • ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
  • ssl_dhparam /etc/letsencrypt/csr/dhparam.pem;
  • ssl_session_cache shared:SSL:1m;
  • ssl_session_timeout 5m;
  • ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  • ssl_ciphers AESGCM:HIGH:!aNULL:!MD5:!RC4;
  • ssl_prefer_server_ciphers on;
ここでLet's Encryptで発行したSSL/TLSの証明書を使用した。
また、DH鍵交換で使うファイルを
openssl dhparam -out /etc/letsencrypt/csr/dhparam.pem 2048
で生成した。
データの圧縮を使用した場合のログの設定で、nginxの$gzip_ratioはapacheの%{ratio}nと異なる。
送信するデータについて、ヘッダーを除いておおよそ
apache
%{ratio}n = [圧縮済みのサイズ] / [元のサイズ] x 100
nginx
$gzip_ratio = [元のサイズ] / [圧縮済みのサイズ]
の関係がある。
apacheで使っていたログのフォーマット
LogFormat "%h\t%u\t%{%Y/%m/%d %H:%M:%S}t\t%v\t%r\t%>s\t%b\t%{outstream}n/%{instream}n(%{ratio}n%%)\t%{Referer}i\t%{User-Agent}i" deflated
の代わりに、nginxで
log_format deflated "$remote_addr\t$remote_user\t$time_iso8601\t$http_host\t$request\t$status\t$body_bytes_sent\t$gzip_ratio\t$http_referer\t$http_user_agent";
と設定した。
httpブロック(http{}の記述)に
fastcgi_buffers 8 8M;
fastcgi_buffer_size 8M;
を追加する。
バッファーを8Mと十分に確保するw
この値が小さいとデータの取得に失敗した…
$_SERVER['PHP_SELF']はapacheとnginxとで異なることがある。
これはディレクトリごとに設定したfastcgi_paramに依存するようだ。
apacheの$_SERVER['PHP_SELF']はルートからのパス(先頭に/を含む)だ。
nginxの$_SERVER['PHP_SELF']は、ルートでは先頭に/が付くスクリプト名だが、ディレクトリがあるとスクリプト名だけ(先頭に/なし)になる。
ルートにおいて双方の$_SERVER['PHP_SELF']は同じだ。
ディレクトリやファイルのアクセス権限を確認する。
nginxに限らないが、私はよく忘れるw
デフォルトの設定は
ウェブサーバーusergroup
apacheapacheapache
nginxnginxnginx
だ。
アクセス権限が適切でないとファイルの書き込みができない。
SQLiteは、データを格納するファイルだけでなく、そのファイルが入るディレクトリの権限も関係する。
2016/08/23 21:55
タグ