nginx Raspbian

nginxでリバースプロキシサーバを構築する手順を紹介

nginxを利用したリバースプロキシサーバの構築手順を紹介します。
今回構築した環境は以下の通りです。

環境

  • OS : Raspbian 10
  • nginx : 1.14.2

OSを見ていただくと分かるかもしれませんがRaspberry Piでnginxを動作させてみました。
モデルは第2世代なのでメモリが足りるか不安でしたが、無事に起動しております。

必要ファイルのインストール

nginxをインストールする

まずは、nginxをインストールします。
今回はソースからビルドしないので、aptでインストールしてゆきます。

$ 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サイトにも対応した設定なので、汎用的に使うことができます。

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>/<必要に応じてパス指定>;
	}
}
	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アドレスが全て
ルータなどのネットワーク機器になってしまいます。

正しいアクセス元IPアドレスを記録するには今回の設定が必要なんですね。

/etc/nginx/nginx.confを編集

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コマンドで設定適用

$ 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を立ち上げましょう。

$ 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

起動時にエラーがでなければ作業完了です。
お疲れ様でした。

-nginx, Raspbian
-, ,

© 2020 サーバ構築.net Powered by AFFINGER5