Nginxで初めてのプロキシ設定

この記事で紹介すること

  • nginxの設定ファイルの書き方
  • proxy_pathを利用した、プロキシ設定方法
  • 上記をするまでにつまづいたところ

などを紹介する予定です。

OSなど環境

nginxの設定ファイル

nginxには主に以下のファイルがインストール時点で存在しています。

  • /etc/nginx/nginx.conf
  • /etc/nginx/sites-enabled/default(Ubuntuでapt installするといる)
  • /etc/nginx/conf.d/default.conf(dockerのnginxイメージだとこっちがデフォルトファイル)

基本的には/etc/nginx/nginx.confに記載されている設定内容で実行されるのですが、nginx.confにinclude句を付けることで、
そのほかのディレクトリ配下に存在する設定ファイルを読み取って利用することもできます。
こういうやつですね。

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

Ubuntuでnginxをインストールしたときのnginx.confを載せます(コメント行のいくつかは削除しました)。

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

すべては説明するのは大変なので、簡単に設定ファイルの見方をご紹介します。

スペース区切りでkey value形式で、最後に;(セミコロン)で終わっているものを単純ディレクティブと呼びます。 以下でしたらアクセスログのパスや、含めたい設定ファイルのパスを指定しています。

access_log /var/log/nginx/access.log;
include /etc/nginx/conf.d/*.conf;

{}(波かっこ)で括られている範囲はブロックディレクティブと呼びます。
ブロックディレクティブは複数の単純ディレクティブを含めることができます。
このブロックディレクティブ内に、nginxにしてもらいたい仕事の種類や挙動を単純ディレクティブを使って記載していくイメージです。
※仕事の種類とは、Webサーバーで合ったりロードバランサー、(リバース)プロキシサーバーなどのことを指しています。

http {
        ##
        # Logging Settings
        ##
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Virtual Host Configs
        ##
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

プロキシ実行のための環境(構成図)

図のProxyサーバーへのHTTPリクエストを、Webサーバーにプロキシする設定を入れたいと思います。

includeファイルの削除(つまづき①)

今回はProxyの設定行うため、httpのブロックディレクティブを編集していきます。
実は最初の引っ掛かりポイントとして、デフォルトファイルをincludeしていると、そちらのserverディレクティブとnginx.confのserverディレクティブが競合してしまい、nginxを起動することができません。 そのため

  • includeディレクティブで指定されているパスのファイルを削除
  • includeディレクティブを削除

のどちらかを行います。
今回はファイルを削除しました。

nginx.confの編集

/etc/nginx/nginx.confのhttpディレクティブ内に以下を追記します。

location / {
                        # 最低限proxy_passだけでも動きます
                        proxy_pass http://10.1.0.20;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header X-Forwarded-Proto $scheme;
                }

locationで/を指定しているのは、このProxyサーバーへのHTTPリクエストをすべて10.1.0.20へプロキシさせるために指定しています。
(そのほかのヘッダに関するものは割愛します)

そのほかのつまづきポイント

ファイルの権限不足

実行したときに以下のエラーが出ました。

nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)

読んだらわかるのですが、nginxがエラーログファイルへの権限が不足していました。
nginxがファイル操作をするときのユーザーはwww-dataなので、以下のコマンドでファイルの所有者とパーミッションを設定しました。

sudo chown -R www-data:www-data /var/log/nginx
sudo chmod -R 755 /var/log/nginx:[

特権ユーザー権限で実行しなさい警告

2024/05/22 19:48:45 [warn] 1212#1212: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:1

特権ユーザーの権限で実行しないとuserディレクティブが無視されてしまうらしいので、以下で再起動。

sudo nginx -s reload

実際に動作したのは見たが...

それぞれのマシンのIPアドレスがどうで、表示されているindex.htmlがどちらのだからとかを説明すると万一出しちゃいけない情報を出すとまずいので、検証は自分ではできたということさせてください。

参考

nginx.org docs.nginx.com

感想

ロードバランサーやキャッシュサーバー(CDNサーバー)の勉強をしたくて本を読み始めて、自分で作ってみたくでnginxを触ったのですが、案外confファイルの設定の仕方がわかりやすくて意外でした。
ただ、nginxはやれることが多い分ドキュメントも大量に合って、さすがに全部は読めませんでした。
初めの一歩ということでプロキシ設定を入れてみたけど、ロードバランサーとキャッシュサーバーも作ってみたいなとは思っています。
マネジメント志向なのでそれ系の本も読まないとなのですが...
時間足りないなー。