「nginx実践ガイド」の感想・備忘録3

スポンサーリンク
「nginx実践ガイド」の感想・備忘録2の続き

URLの書き換え

rewriteモジュール

  • URLの書き換えにはrewriteモジュールの機能を使うが、mainlineをインストールした場合はrewriteモジュールは最初から有効になっている。
  • Apacheではmod_rewriteだけで様々な処理に対応できるが、nginxではrewriteモジュールと他のディレクティブを組み合わせることで書き換えを行う。
  • URLの書き換えは「条件判定」と「URLの書き換え」の2つの処理に分類することができる。

条件判定

URLのホスト部やポート番号での判定

serverコンテキストのlisten, sever_nameディレクティブで指定する。

パス名での判定

locationコンテキストの中に書き換えディレクティブを記述することで、特定のパス名にマッチする場合のみURLの書き換えが行われるようになる。

ファイルやディレクトリの有無で判定

try_filesディレクティブを使う。
引数を前から順番に存在確認をしていき、見つかったところでその内容を返す。
なければ最後の引数を処理する。

条件式による判定

ifディレクティブで様々な条件判定ができる。

  • -f パス名
    ファイルが存在する場合
  • !-f パス名
    ファイルが存在しない場合
  • -d パス名
    ディレクトリが存在する場合
  • !-d パス名
    ディレクトリが存在しない場合
  • -e パス名
    ファイル・ディレクトリ・シンボリックリンクのいずれかが存在する場合
  • !-e パス名
  • ファイル・ディレクトリ・シンボリックリンクのいずれも存在しない場合

書き換え

リダイレクト

return 301 http://example.com
レスポンスコードを省略した場合は302となる。

rewriteディレクティブでの書き換え先は、同一のnginx上のパスでなければならない。
URLが指定された場合は、302でリダイレクトされる。

rewriteディレクティブによる書き換え

rewrite 正規表現 置換文字列 [フラグ];
フラグは以下のものを指定可能。

  • redirect
    302
  • permanent:
    301
  • last:
    同一コンテキストの書き換えを打ち切る。
    (次のコンテキストの書き換えに進む)
  • break
    全てのコンテキストの書き換えを打ち切る。
  • フラグなし
    書き換えをそのまま続ける。
    (次の行に進む)

思った通りに書き変わらない時は、rewite_log: on;を指定してエラーログに書き換えに関する情報を出力するとよい。
ただし、ログレベルはnoticeなので、エラーログの出力レベルもnoticeにする必要があるので注意。

WEBアプリケーション

接続方法

いくつかの接続方法がある。

  • FastCGI
    CGIは毎回プロセスを生成・終了するが、FastCGは終了しないため負荷が小さい。
    Webサーバーは外部プログラムは起動せず、デーモンとして常駐しているFastCGIサーバーへ独自プロトコルにより要求を送る。
  • SCGI(Simple Common Gateway Interface)
    FastCGIと似ている。FastCGIよりも単純で実装しやすい。
  • WSGI(Web Server Gateway Interface)
    PythonのWebアプリケーションとやりとりするためのプログラミングインターフェース。

PHP-FPM

  • Apacheにはモジュールmod_phpがあるが、nginxにはPHPのモジュールはない。
  • 代わりに、FastCGIのインターフェースを使ってPHPを動作させるPHP-FPM(FastCGI Process Manager)というプログラムを使って接続する。
  • PHP-FPMのデーモンを設定して起動したうえで、nginxにはFastCGIで接続するように設定をする。
  • PHP-FPMはプールと呼ばれるかたまりを複数作ることができ、使用するPHPアプリケーションごとにプールを作る。
    (PHPアプリが1つの場合はプールを1つ作るだけ)
  • プールごとに同時接続数やプロセスの数を指定でき、プロセスやソケットは別のものが使われる。
  • PHP-FPMもnginxと同様にmasterとworkerプロセるがあり、masterがworkerの起動や監視を行い、workerが処理を実行する。

PHP-FPMの設定

1. PHP-FPMのインストール

sudo yum install php-fpm
PHP-FPMはPHPの開発元が配布しているデーモンであり、CentOS7の標準リポジトリに含まれている。

2. 設定ファイルの編集

/etc/php-fpm.iniにログ出力先などの基本設定がある。
/etc/php-fpm.d/*.confにプールごとの設定ファイルが置かれる。
デフォルトでがwwwという名前のプールで/etc/php-fpm.d/www.confに設定がある。

sudo vi /etc/php-fpm.d/www.conf

listenはデフォルトでTCPソケットになっているので、Unixドメインソケットに変更する。
workerプロセスの実行ユーザーをnginxにし、nginxとの権限の違いによるファイルアクセスのトラブルを回避する。

listen = /var/run/php-fpm.sock
// 省略
user = nginx
group = nginx
3. nginxの設定
location ~ [^/]\.php(/|$) {
    try_files $uri =404;
    index index.php;
    include fastcgi_params; # FastCGIでよく使われる変数を設定した/etc/nginx/fastcgi_paramsの読み込み。
    fastcgi_index index.php; # FastCGIのディレクトリインデックス。
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # SCRIPT_FILENAME変数の設定
    fastcgi_pass unix:/var/run/php-fpm.sock; # 待受アドレスの指定。PHP-FPMのプールのlistenで指定したアドレスを指定する。Unixドメインソケットの場合はunix:を先頭に付ける。
}
location / {
    try_files $uri $uri/ /index.php?$args; # ファイルでもディレクトリでもなかったら/index.phpにアクセスされる。
}

SSL/TLS

SSL/TLSとは

  • HTTPSは、SSL/TLSによる接続のうえでHTTPプロトコルで通信を行う。
    (SSL/TLSはメールなどでも使われる)
  • SSLはバージョン1.0から3.0まであるが、すべて脆弱性があるため現在は使われていない。
  • TLSは1.0から始まり最新版は1.3であるが、1.0と1.1には脆弱性があるため現在は使われていない。

CSRの作成

1. 秘密鍵の作成

cd /etc/pki/tls/certs && sudo make your-server.key

2. CSR(Certificate Signing Request)の生成

DV証明書(ドメイン認証)の場合はCommon Name(ホスト名)だけ入力すればよい。
cd /etc/pki/tls/certs && sudo make your-server.csr umask 77
/usr/bin/openssl req -utf8 -new -key your-server.key -out your-server.csr

CSRの内容はopenssl reqコマンドで確認することができる。
(CSRには秘密鍵に対応する公開鍵が含まれている)
sudo /usr/bin/openssl req -utf8 in your-server.csr -text

3. パスフレーズの解除

秘密鍵のパスフレーズを解除しないとnginx起動時に入力を求められてしまう。
sudo /usr/bin/openssl rsa -in your-server.key -out your-server.nopass.key
sudo chmod 400 your-server.nopass.key

4. 作成したCSRをCA(認証局)に送って証明書を発行してもらう

  • 証明書にはCAの情報や有効期限、ドメイン情報、公開鍵などが含まれている。
  • DERでバイナリ形式に、またはPEMでbase64にエンコードされていて、openssl x509というコマンドで内容を見ることができる。
    /usr/bin/openssl x509 -in your-server.crt -text-noout
  • デフォルトはPEM形式であり、DER形式の場合は-inform derを追加する

証明書の設定

CAは3つの証明書を発行する。

  1. サーバ証明書
    CSRに対して発行する証明書。
  2. 中間CA証明書
    CAを証明する証明書。
  3. クロスルート証明書
    ブラウザやOSによってルートCAが異なっていることに対応するための、他のルートCAが発行するルート証明書。
  • nginxに設定するのは証明書と秘密鍵の2ファイルであり、3つの証明書は1つのファイルにまとめる必要がある。
  • nginxが扱える証明書はPEM形式のテキストファイルで、1つにまとめるときはPEM形式の証明書を単純に後ろにつなげる。
  • 順番はサーバ証明書、中間証明書、クロスルート証明書、の順とする。
  1. cat server.crt chain.crt crossroot.crt > your-server.crt
  2. sudo cp your-server.crt /etc/pki/tls/certs
  3. sudo chown root:root /etc/pki/tls/certs/your-server.crt
  4. sudo chmod 400 /etc/pki/tls/certs/your-server.crt

次に、nginxの設定ファイルのhttpコンテキストまたはserverコンテキストに秘密鍵と証明書ファイルの設定を追加する。
共にmasterプロセスが読み込めるパーミッションにしておく。(通常はrootユーザー)
また、listenディレクティブを443 sslにする。

server {
    listen 443 ssl;
    ssl_certificate_key /etc/pki/tls/certs/your-server.crt;
    ssl_certificate /etc/pki/tls/certs/your-server.key;
    root /usr/share/nginx/html;
}

コメント