nginxを利用したリバースプロキシサーバの構築手順を紹介します。
今回構築した環境は以下の通りです。
環境
- OS : Raspbian 10
- nginx : 1.14.2
OSを見ていただくと分かるかもしれませんがRaspberry Piでnginxを動作させてみました。
モデルは第2世代なのでメモリが足りるか不安でしたが、無事に起動しております。
必要ファイルのインストール
nginxをインストールする
まずは、nginxをインストールします。
今回はソースからビルドしないので、aptでインストールしてゆきます。
1 2 3 |
$ sudo apt update $ sudo apt upgrade $ sudo apt install nginx |
リバースプロキシ向け設定反映
リバースプロキシサーバを構築するために、
下記2つの設定ファイルを編集していきます。
- /etc/nginx/sites-available/default
- /etc/nginx/nginx.conf
/etc/nginx/sites-available/defaultを編集
virtualhostの設定を行っておけば
後からサイトを増やす時も楽なのですが、今回は適用しません。
なお、HTTPSサイトにも対応した設定なので、汎用的に使うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
server { listen 443 ssl; ssl_certificate <証明書のフルパス>; ssl_certificate_key <証明書発行に使った鍵ファイルのフルパス>; root /var/www/html; index index.html index.php; server_name <サーバのドメイン名(FQDN)>; set_real_ip_from 192.168.XXX.XXX/24; #外部からの通信をNATしているネットワーク機器があるので設定 real_ip_header X-Forwarded-For; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location /money/ { proxy_pass http://<バックエンドのサーバIP or FQDN>/<必要に応じてパス指定>; } } server { listen 80; root /var/www/html; index index.html index.php; server_name <サーバのドメイン名(FQDN)>; set_real_ip_from 192.168.XXX.XXX/24; real_ip_header X-Forwarded-For; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location /money/ { proxy_pass http://<バックエンドのサーバIP or FQDN>/<必要に応じてパス指定>; } } |
1 2 |
set_real_ip_from 192.168.XXX.XXX/24; real_ip_header X-Forwarded-For; |
なお、上記の設定項目は、
・アクセス元が"192.168.XXX.XXX/24"の時
・X-Forwarded-Forヘッダの最後についているIPをreal_ip_header
とする設定になります。
ロードバランサやリバースプロキシ環境では、
外部からアクセスしてきた際に送信元IPアドレスが変わってしまうので、
本当のアクセス元IPアドレスをログに記録することができなくなってしまいます。
例えば、自宅でWebサーバを構築して、
ルータのNAT機能などを使っている場合も
今回の設定をしておかないと、アクセス元IPアドレスが全て
ルータなどのネットワーク機器になってしまいます。
/etc/nginx/nginx.confを編集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
user nginx; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; } http { 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_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; log_format main \'$remote_addr - $remote_user [$time_local] "$request" \' \'$status $body_bytes_sent "$http_referer" \' \'"$http_user_agent" "$http_x_forwarded_for"\' \'"$proxy_protocol_addr"\'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; gzip on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } |
ここで重要なのは、リバースプロキシとして動作させるときに必要となりやすい
X-FORWARDED-FORというヘッダの値です。
log_format main という部分に記載している通り、
$http_x_forwarded_for の値を出力するように指示しています。
※自分の環境ではインストール時より既に記載がありました。
この設定があることで、ログファイルにアクセス元の正しいIPアドレスが記録されます。
ファイアウォール設定反映
サービスを立ち上げる前にファイアウォールの設定を行っておきましょう。
必要なポートを洗い出す
今回の設定では、80/tcpと443/tcpの2つをサービスするので、
これら2つをファイアウォールの設定に追加することとします。
あとは、sshを使って管理しているので22/tcpも開けておきましょう。
ufwコマンドで設定適用
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo ufw allow 80/tcp $ sudo ufw allow 443/tcp $ sudo ufw allow 22/tcp $ sudo ufw status Status: active To Action From -- ------ ---- 80 ALLOW Anywhere 443 ALLOW Anywhere 22 ALLOW Anywhere 80 (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6) 22 (v6) ALLOW Anywhere (v6) |
サービスを立ち上げて作業完了
systemctlコマンドで起動
さて、nginxを立ち上げましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ sudo systemctl start nginx $ sudo systemctl status nginx ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2020-03-01 12:00:50 JST; Docs: man:nginx(8) Process: 15684 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 15686 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 15687 (nginx) Tasks: 5 (limit: 2200) Memory: 3.1M CGroup: /system.slice/nginx.service ├─15687 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; ├─15688 nginx: worker process ├─15689 nginx: worker process ├─15690 nginx: worker process └─15691 nginx: worker process |
起動時にエラーがでなければ作業完了です。
お疲れ様でした。