ホーム
記事一覧
プライバシーポリシー
免責事項
お問い合わせ

Nginx設定

2018-09-01

nginx をリバースプロキシとして使う際の設定を書き残しておく。 参考にした書籍や web サイトは最後に記載する。

やりたいこと

基本的な設定はインストール時にだいたい行われている。 それ以外で新たに加えたい設定は以下の通り。

  • https 通信の設定

  • log の記録

  • API サーバへのプロキシ

https 通信は今時のサイトならセキュリティ上当たり前なので採用した。log に関してもセキュリティや保守性の観点から必須。API サーバへのプロキシについては、今後動的コンテンツを配信する際に利用する予定のため。

基本事項

自分用のメモとして nginx の設定の基本事項についてまとめておく。今回は CentOS7 に nginx をインストールした。 インストール方法については説明しているサイトが多数あるためここでは割愛する。

まず、nginx の特徴について述べる。nginx では、マルチプロセス構成を取っている。 プロセスには Workaer Process と Master Process がある。Master Process は一つに対して、Worker Process は複数定義できる。Master Process の役割は、Worker Process の制御と管理を行うことある。 各 Worker Process は複数のリクエストを処理できる。

次に利用する nginx のヴァージョンを確認する。ヴァージョンはターミナルでコマンドnginx -Vで確認できる。

nginx -V
nginx version: nginx/1.14.0

ヴァージョン情報の他にも configure arguments が表示される。nginx の起動はsudo nginxで行われる。デフォルトでは 80 番ポートを bind している。ちなみに 80 番ポートは Web サーバの HTTP 通信のためのポートである。

nginx の設定

nginx の設定ファイルん nginx.conf は/etc/nginx/nginx.confにある。 nginx.conf では、ディレクティブと呼ばれるものに設定を定義していきます。 例えば、

worker_process 1;

これはworker_processがディレクティブにあたり、1 がパラメータと呼ばれる値になる。そして文末は必ずセミコロンをつける。また、以下のように中括弧を用いた設定方法もある。

server {
    #設定
}

このようにすることで server ディレクティブのみで有効なディレクティブを設定できる。この中括弧で囲まれた有効範囲をコンテキストと呼ぶ。

設定ファイルは分割して保存し、それを include して用いることもできる。include は設定ファイル内の include したい箇所に次のように書くことで利用できる。

include /パス/読み込みたいファイル名.conf

このようにすることで共通部分を切り出したり、可読性をあげることができる。

以下の nginx.conf には基本的な nginx の設定がに記述されている。

# master process以外を起動できるユーザを指定。nginxにするとnginxで起動する。
user  nginx;
#ワーカのプロセス数を制御CPUのコア数と同じにするのが良い
worker_processes  1;

#errorを出力するファイルパスの指定、第二パラメータのwarnはエラーレベルを表す
error_log  /var/log/nginx/error.log warn;

#pidはPID(プロセスの番号)ファイルの出力先を指定
pid        /var/run/nginx.pid;

#ワーカのイベント駆動方式に関するディレクティブ(省略不可)
#worker_connectionはワーカが処理するコネクション数を指定。
events {
    worker_connections  1024;
}

#httpサーバ関連の設定を記述
http {
    #MINEタイプの設定
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    #アクセスログのフォーマット指定
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #アクセスログの出力先 第二パラメータはlog_formatで指定したフォーマット名
    access_log  /var/log/nginx/access.log  main;

    # ファイル送信にsendfile()システムコールが使用される(効率がいいらしい)
    sendfile        on;

    # sendfikeディレクティブが有効な場合に送信パケット数を最小化できる
    tcp_nopush     on;

    # クライアントに対するタイムアウト時間の設定
    keepalive_timeout  65;

    # キャッシュの最大数と有効時間(値は適当)
    open_file_cache max=100 inactive=10s;

    # さらに詳細な設定の読み込み。以下のパス内*.confに記述
    include /etc/nginx/conf.d/*.conf;
}

コメント内の単語の解説

単語 解説
Master Process      nginx 全体のプロセスを管理している
Worker Process      アクセスを処理するプロセス数

以下は/etc/nginx/conf.d/default.conf

server {
    # http用に80番もリッスン
    listen        80;
    server_name   hoge.com;
    # httpsのポートにリダイレクト
    return 301 https://$host$request_uri;
}

server {
    # SSLを利用
    listen       443 ssl;

    # サーバ名(ドメイン名にした)
    server_name  hoge.com;

    # SSL証明書の場所
    ssl_certificate /etc/letsencrypt/live/hoge.com/fullchain.pem;
    # SSL鍵の場所
    ssl_certificate_key /etc/letsencrypt/live/hoge.com/privkey.pem;

    # 使用可能な暗号化スイートの指定(Mozilla wiki参照)
    ssl_ciphers ;#暗号化スイート。長いので割愛

    # サーバの暗号化スイートを優先
    ssl_prefer_server_ciphers on;

    # 使用するプロトコルの明示化
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # DHパラメターのパス(生成opensslコマンドで可能)
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    # SSLのセッションキャッシュ
    ssl_session_cache shared:SSL:5m;

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

    # URIごとの設定を記述
    location / {
        # 同ホスト内のTCP8080ポートにプロキシ
        proxy_pass http://127.0.0.1:8080;
    }

    # redirect server error pages to the static page /50x.html
    error_page  404              /404.html;

    error_page   500 502 503 504 /50x.html;

以上が、nginx の基本的な設定になる。

今後検討したい設定

  • gzip

  • OCSP ステープリング

  • プロキシ周りの設定

  • fastcgi

まとめ

情報がたくさん web にあったので調べながらなんとか進めることができた。 できれば、公式サイトのドキュメントを読んで理解できるように基本的な web サーバの知識を身に付けたい。 あとはセキュリティに関する知識もつけていきたい。

参考

nginx 実践入門 久保 龍彦(著)、道井 俊介(著)

github