Published on

逆引きnginx

Authors
  • avatar
    Name
    Kikusan
    Twitter

参考

nginx実践ガイド

起動設定

systemctl start nginx # 開始
systemctl stop nginx # 停止
systemctl restart nginx # 再起動
systemctl reload nginx # 設定の再読み込み
systemctl status nginx # 起動状態とログ表示

nginx.conf設定

nginx.confは /etc/nginx にある設定ファイル。

include によって他の設定ファイルを読み込める。デフォルトではmime.typesと、conf.d/*.confが読み込まれる。

user  nginx; # workerプロセスユーザ名。masterプロセスはrootで動く
worker_processes auto; # workerプロセス数。autoはコア数と同数。
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid; # プロセスIDを記述したファイル

events {
  # イベント待ち関連のパラメーター
  worker_connections  1024; # 1つのworkerが同時に受け付けられる接続数
}

http {
  # Webサーバー全体の設定
  include       /etc/nginx/mime.types; # mime設定 includeで別ファイルを読み込む
  default_type  application/octet-stream; # mimeの未定義分設定

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /var/log/nginx/access.log  main;

  sendfile        on; # ファイルの送信方式。性能向上
  #tcp_nopush     on; 

  keepalive_timeout  65; # 第一引数はサーバ側のタイムアウト、第二引数はクライアントに通知するタイムアウト

  #gzip  on;

  include /etc/nginx/conf.d/*.conf;

    # 静的サーバ
    server {
      listen 80; # 待ち受けるport番号
      server_name localhost; バーチャルホストのサーバ名

      location / { # urlでマッチしたら割り振る
        alias /data/; # aliasは / が /data/ を参照するようにする。
      }

    }
}

ログファイル

デフォルトでは、
/var/log/nginx/access.log及び/var/log/nginx/error.logに格納される。
毎日ローテートされ、52日で古いものから削除される。

uWSGI設定(django)

参考:

django設定

# djangoをインストール
pip install django
# siteディレクトリをプロジェクトフォルダとして作成
cd ~/site
django-admin startproject config .

uwsgi設定

# uwsgiをインストール
pip install uwsgi
# :8001で待ち受けるuWSGIを起動
cd ~/site
uwsgi --socket :8001 --module config.wsgi

uwsgiの起動は、uwsgi --ini uwsgi.iniみたいに起動オプションをiniファイルに書いて起動もできる。

app_nginx.conf

conf.d/app_nginx.confを配置する。

server {
    listen      80;
    server_name localhost;
    charset     utf-8;

    location / {
        uwsgi_pass  127.0.0.1:8001; # TCPsocketで接続
        include     uwsgi_params; # nginxデフォルトのuwsgi_paramsを使用
    }
}

HTTPS設定

SSL/TLSプロトコルの仕組み

  1. スリーウェイハンドシェイクによりTCPセッションを開始する。
  2. クライアント: Client Helloメッセージを送る
  3. サーバ: Server Helloメッセージwithサーバー証明書and公開鍵を送る
  4. クライアント: 送られてきたサーバ証明書を有効か検証する
  5. クライアント: プリマスタシークレットを送信する
  6. サーバ: プリマスタシークレットを秘密鍵で復号する
  7. 双方で共通鍵を生成する。
  8. 共通鍵で暗号化し通信を行う。

スリーウェイハンドシェイク: SYN, SYN ACK, ACKと3つのメッセージをやり取りするコネクション確立方法

プリマスタシークレット: サーバから送られた公開鍵で暗号化した共通鍵の元となるデータ。
暗号化アルゴリズムを決めていれば、同じプリマスタシークレットから同じ共通鍵を生成できる。

サーバ証明書の生成

  1. 秘密鍵の生成 + CSRの生成

CSRには公開鍵が含まれる。

openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr
---
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:(都道府県を英字で入力)
Locality Name (eg, city) [Newbury]:(市区町村を英字で入力)
Organization Name (eg, company) [My Company Ltd]:(組織名を英字で入力)
Organizational Unit Name (eg, section) []:(部署名を英字で入力)
Common Name (eg, your name or your server's hostname) []:sehippocampus.work(コモンネームを英字で入力)
Email Address []:(空白、エンターのみ入力)
---
  1. CSRの署名依頼

生成されたcsrファイルをCAに送ることで、審査後にサーバ証明書を発行してもらえる。

# pem形式の証明書確認
openssl x509 -in server.crt -text -noout
  1. 証明書と秘密鍵の配置

基本的に証明書はサーバ証明書・中間CA証明書・クロスルート証明書があるので、それらをまとめて1ファイルとして配置する。

cat server.crt chain.crt crossroot.crt > combined.crt
sudo chown combined.crt
sudo chmod 400 combined.crt

confにはssl_certificatessl_certificate_keyで証明書と密鍵を指定する。

server {
    listen 443;
    server_name  sehippocampus.work;

    ssl on;
    ssl_certificate combined.crt;
    ssl_certificate_key server.key;

}