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