nginx + nodejsでhttps経由のアクセスにする
はじめに
node.jsで80や443を占有してしまうと以下の問題が発生するのでその部分を楽するためにブラウザとの接続をnginx経由にする選択肢もあります
- 1024番ポート以下はrootで起動し他ユーザーで使う場合にはプログラム内でswitchする必要がある
- SSLの証明書を入れ替えるのにちゃんと入れ替え用のコードを組まないと再起動する必要が出てくること
- 負荷が上がるとSSLの処理にイベントループを食われてパフォーマンスが落ちること
- リソースとアプリケーションサーバーのURLを共有するとルーティングの機能を組む必要があること
nginxのインストール
yum install -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install -y nginx
自己署名した証明書をつくる
※証明書が別途ある場合はそちらを使う
openssl genrsa 2048 > cert.key
openssl req -new -key cert.key > req.csr
openssl x509 -days 3650 -req -signkey cert.key < req.csr > cert.pem
nginxの設定
- sslの設定
- URLルーティングの設定
- WEBSOCKET対応の設定
- 接続数のリミットを増やす設定
/etc/nginx/nginx.conf
worker_rlimit_nofile 10240;
worker_connections 10240;
/etc/nginx/conf.d/ssl.conf
server {
listen 443 default ssl;
ssl on;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/cert.key;
server_name yourdomainname;
server_tokens off;
ssl_prefer_server_ciphers on;
ssl_session_timeout 5m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';
index index.html;
root /var/www;
access_log /var/log/nginx/ssl-access.log;
error_log /var/log/nginx/ssl-error.log;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
node.js側の設定
特に暗号化せずにポートを3000番で起動するだけ(nginx側の設定と合わせる)
接続可能アドレスはローカルホストに限定したほうがいいかも