サイトアイコン 上尾市のWEBプログラマーによるブログ

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

「nginx実践ガイド」の感想・備忘録2の続き

URLの書き換え

rewriteモジュール

条件判定

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

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

パス名での判定

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

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

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

条件式による判定

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

書き換え

リダイレクト

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

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

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

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

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

WEBアプリケーション

接続方法

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

PHP-FPM

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とは

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は3つの証明書を発行する。

  1. サーバ証明書
    CSRに対して発行する証明書。
  2. 中間CA証明書
    CAを証明する証明書。
  3. クロスルート証明書
    ブラウザやOSによってルートCAが異なっていることに対応するための、他のルートCAが発行するルート証明書。
  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;
}
モバイルバージョンを終了