NGINX設定 · 3 min read · Jan 24, 2026

HTTP(S)、SSH、MySQL/MariaDBのためのリバースプロキシをNGINXで運用するガイド

このガイドでは、複数の物理サーバー、仮想マシン、またはその両方を単一のパブリックIPアドレスの背後で運用できるようにするためのNGINXのインストールと設定について説明します。仮想マシン上で複数のWebサーバーを運用し、ローカルで管理することもできますし、SSHなどのリモートアクセスツールを使用して各ホストにアクセスする必要がある場合もあります。たとえば、通常の営業時間外にローカルアクセスが利用できない場合です。このガイドは、両方のシナリオをサポートします。

ここで示す設定は、利用可能なパブリックIPアドレスに制限があるホームラボや小規模ビジネスネットワークに最適です。ホスティングサービスからレンタルした複数のサーバーや仮想マシンがある場合、各サーバーやホストにパブリックIPアドレスが割り当てられるため、このような設定を運用する理由はほとんどありません。

NGINXをインストールし、HTTP(S)、SSH、FTP、およびMySQL/MariaDBのリバースプロキシとして機能するように設定する方法を示します。NGINXホストサーバーには、ローカルアクセスがあり、Ubuntu 18.04の新規インストールが行われており、Ubuntuサーバーのインストール手順中にSSHサーバーをインストールすることを選択したと仮定します。

この設定は私にはうまく機能しますが、あなたにもうまくいくことを保証することはできません。もちろん、何か問題があれば教えてください。修正できるようにします。始める前にガイド全体を読んでください。ストリームに関しては、管理方法を示す2つの方法があります。

始めに

このガイドでは、以下のホスト名とIPアドレスを使用します。

rproxy.example.com  192.168.1.1
web1.example.com    192.168.1.2
db1.exmple.com      192.168.1.3

標準のUbuntu 18.04サーバーインストールのために作成した非ルートユーザーアカウントをサーバーに持っている必要があります。NGINXをインストールするサーバーにそのユーザーでログインします。これはおそらくローカルサーバーであるため、最初にSSHサーバーを設定するために直接サーバーにログインする必要があります。これを行うには、もちろん、サーバーに接続されたキーボードとモニターが必要です。

注:私のようにVMWareなどのブラウザインターフェースを含む仮想化ソフトウェアを使用している場合、そのシステム内にコンソールがあり、このステップを「直接」アクセスせずに実行できます。このコンソール内でこの全設定を実行しようとすることもできますが、ブラウザベースのコンソールではコピー&ペーストなどの一部の機能が動作しないことがあるため、ブラウザ固有の問題かもしれませんので、試してみる価値はあります。

ホストサーバーの準備

コンソールシェル(ブラウザまたは直接接続)で

sudo nano /etc/ssh/sshd_config

行のコメントを外し、ポート番号を23456のようなものに変更し、ListenAddressを0.0.0.0に変更します。nanoに不慣れな方のために、CTRL + Xを押し、yと入力してEnterを押します。これにより、ファイルが保存されて閉じられます。ファイルに変更が加えられなかった場合、CTRL + Xは保存の確認なしにファイルを閉じます。コマンドプロンプトに戻ります。

このファイル内の他の設定については掘り下げません。すでにかなり長いガイドであり、SSHキーの使用やルートSSHログインの許可など、変更すべき設定を示すガイドが多数あります。これらのガイドはHowtoForgeのウェブサイトにもあります。

変更が完了したら、変更を有効にするためにSSHサーバーを再起動する必要があります。現在のログインはこの再起動の影響を受けません。

systemctl restart ssh

ローカルネットワーク内の別のコンピュータのターミナルからSSHでログインできることを確認します。

ssh [email protected] -p23456

SSHでのログインに成功した後、このターミナルを開いたままにして、コンソール/サーバーからログアウトします。このガイドの残りの部分では、もはやそれを使用する必要はありません。

この時点から、ターミナルからルートレベルのコマンドを実行します。次のコマンドは、以降のコマンドにsudoを前置きする必要を排除します。

sudo -s

Aptパッケージデータベースを更新し、Ubuntuをアップグレードして、最新のパッケージがインストールされていることを確認します。

apt update && apt -y upgrade

アップグレード中に新しいカーネルがインストールされるというメッセージが表示された場合、aptのアップグレードが完了したら再起動する必要があります。

リバースプロキシサーバーのホスト名を設定する。

hostnamectl set-hostname rproxy.example.com

仮想サーバーを運用している場合、ここで設定したホスト名を保持するために修正が必要なcloud.cfgという名前のファイルがあるかもしれません。次のコマンドを実行すると、内容が表示されるファイルがあるか、空のページが表示されます。空のページが表示された場合は、CTRL + Xを押してこのステップをスキップできます。

nano /etc/cloud/cloud.cfg

保持するホスト名の行をtrueに変更し、ファイルを閉じて保存します。

現在ローカルのみのシステムの場合、他のサーバー/仮想ホストがどこにあるかをこのサーバーに示す必要があります。
nano /etc/hosts

ホストファイルは、変更後に次のようになります。IPアドレスとホストは、あなたのインフラに一致する必要があります。

127.0.0.1 localhost
127.0.1.1  rproxy.example.com
192.168.1.2    web1.example.com
192.168.1.3    db1.example.com

# 以下の行は、IPv6対応ホストにとって望ましい
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

NGINXのインストール

apt install -y nginx

インストール後、NGINXのバージョンを確認してください。SSHおよびMySQL/MariaDBのリバースプロキシを許可するには、バージョン1.9以上が必要です。

nginx -v

ご覧の通り、私はUbuntu 18.04のデフォルトであるNGINXバージョン1.14をインストールしています(2019年10月10日)

nginx version: nginx/1.14.0 (Ubuntu)

NGINXをリバースプロキシとして機能させる準備

この設定では、リバースプロキシホストサーバーから直接ウェブサイトを提供することはありません。/etc/nginx/の下に新しいディレクトリ構造を作成します。これにより、後でこれらの変更を元に戻したり、このホストから直接ウェブサイトを提供したりすることを希望する場合に、デフォルトのNGINX設定が保持されます。デフォルトの設定とこれらのリバースプロキシ設定を同時に実行することも可能ですが、Apache2が同じサーバーにある場合は、リッスンするための別のポートが必要であり、このApache2のインスタンスが提供するウェブサイトをリバースプロキシする必要があります。

リバースプロキシディレクトリ構造の構築

cd /etc/nginx && mkdir rproxy && cd rproxy && mkdir http http/available http/enabled stream stream/available stream/enabled

構造が整ったので、設定ファイルの作成に進むことができます。私はnanoを使用しますが、あなたが快適に感じるエディタを使用できます。nanoは保存時にファイルを作成/更新します。

進む前に、コンピュータ上で空のドキュメントを開くか、設定するポートをメモするためにペンと紙を用意してください。

ウェブサーバーリバースプロキシの設定(http)

ウェブサイトのhttp設定ファイルを作成し、適宜調整します。

nano http/available/example.com.conf

サーバーブロックをターミナルで開いたページにコピーし、適宜調整します。

# ポート80と443をメモしてください

server {
    server_name example.com www.example.com;
    listen 80;
    set $upstream 192.168.1.2;
    location / {
         proxy_pass_header Authorization;
         proxy_pass http://$upstream;
         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_http_version 1.1;
         proxy_set_header Connection "";
         proxy_buffering off;
         client_max_body_size 0;
         proxy_read_timeout 10000s;
         proxy_redirect off;
     }
}

SSH、MySQL/MariaDBリバースプロキシの設定(ストリーム)

進む前に、ホストごとに使用するか、サービスごとに使用するかを決定します。ホストごとに、各ホストの設定を迅速に変更するための設定を作成します。サービスごとに、すべてのサーバーのサービスポートをファイルにまとめます。SSH、MySQL/MariaDB、FTPのために。

サービスごとの設定を使用

SSHの設定を追加します。

nano stream/available/ssh.conf
# リッスンポートをメモしてください

upstream web1-ssh {
  server 192.168.1.2:22;
}

server {
  listen 22002;
  proxy_pass web1-ssh;
}

upstream db1-ssh {
  server 192.168.1.3:22;
}

server {
  listen 22003;
  proxy_pass db1-ssh;
}

# リモートアクセスSSHサーバーに必要なだけupstream/serverブロックペアを追加します。

MySQL/MariaDBの設定を追加します。

nano stream/available/db.conf
# リッスンポートをメモしてください

upsteam db1-mysql {
  server 192.168.1.3:3306;
}

server {
  listen 33063;
  proxy_pass db1-mysql;
}

# リモートアクセスMySQL/MariaDBサーバーに必要なだけupstream/serverブロックペアをこのファイルに追加します。

次に、FTPリバースプロキシの設定を作成します。

nano stream/available/ftp.conf
upstream web1-ftp {
  server 192.168.1.3:21
}

server {
  listen 21002;
  proxy_pass web1-ftp;
}

# リモートアクセスFTPサーバーに必要なだけupstream/serverブロックペアを追加します。

ホストごとの設定ファイルを使用

nano /etc/nginx/rproxy/stream/available/web1.example.com.conf
# リッスンポートをメモしてください

upstream web1-ssh {
  server 192.168.1.3:22;
}

server {
  listen 22002;
  proxy_pass web-ssh;
}

db1.example.comのホストファイルを作成します。

nano /etc/nginx/rproxy/stream/available/db1.example.com.conf
# リッスンポートをメモしてください

upsteam db1-mysql {
  server 192.168.1.3:3306;
}

server {
  listen 33063;
  proxy_pass db1-mysql;
}

upstream db1-ssh {
  server 192.168.1.3:22;
}

server {
  listen 22003;
  proxy_pass db1-ssh;
}

ご覧の通り、少し独特です。パブリックポートを非標準の方法で使用しており、必要なポートを選択してNGINXにポイントしています。これは通常のことですが、リモートアクセスしたい各サーバーの各サービスに対して異なるポートを使用しています。これは、SSHを例にすると、SSHが有効なホストごとに異なるポート番号(22、222、2222、22222など)を使用することを意味します。

ウェブサイトのリバースプロキシに関しては、NGINXがウェブサイトのためのサーバー設定を定義している限り、ポート80と443だけを転送すれば正しく機能します。

この時点で、HTTPの手順を使用してストリームの手順をスキップし、複数のサービスのために複数のポートを適切なサーバー/IPアドレスに転送することができることに気付いたかもしれません。確かに、これは可能です。しかし、サーバーの数が増えるにつれて、各サーバーのSSH、MySQL、FTPのデフォルトポートを変更する必要があるため、もう一つの複雑さの層が追加され、維持が難しくなります。この設定はすでに複雑ですが、希望すれば実行できます。

私が示した方法でこれらのサービスのリバースプロキシを使用すると、これらの設定変更を行うための単一の場所を提供することで、複雑さが大幅に減少し、インフラ全体でポートを変更する必要がなくなります。

この設定の追加の利点として、インフラ内の他のサーバーは、好みに応じてローカルインターフェースとデフォルトポートでリッスンするだけで済みます。ローカルで管理している場合、必要なサービスにアクセスするためにローカルIPアドレスとデフォルトサービスポートを使用できるため、正しいポートを思い出すためにメモを参照する必要はありません。IPアドレスとログイン資格情報を知っているだけで済みます。

すべてをまとめる

NGINXリバースプロキシ設定を使用するには、メイン設定ファイルにいくつかの編集を行う必要があります。httpブロック内の現在のinclude行をコメントアウトします(NGINXから直接ウェブサイトを提供していない場合)。

cd /etc/nginx && nano 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 {

        ##
        # 基本設定
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

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

        ##
        # SSL設定
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # SSLv3を削除、参照:POODLE
        ssl_prefer_server_ciphers on;

        ##
        # ロギング設定
        ##

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

        ##
        # Gzip設定
        ##

        gzip on;

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascri$

        ##
        # 仮想ホスト設定
        ##

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

        # リバースプロキシhttp設定ファイル。
        include /etc/nginx/rproxy/http/enabled/*.conf;
}

stream {

    # リバースプロキシストリーム設定ファイル。
    include /etc/nginx/rproxy/streams/enabled/*.conf;
}


#mail {
#       # サンプル認証スクリプトを参照:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
# 
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
# 
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
# 
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}
    

リバースプロキシ設定を有効にする。

まず、すべてのhttp設定を有効にします。

ln -s /etc/nginx/rproxy/http/available/*.conf /etc/nginx/rproxy/http/enabled

すべてのストリーム設定を有効にします。

ln -s /etc/nginx/rproxy/stream/available/*.conf /etc/nginx/rproxy/stream/enabled

NGINXのリバースプロキシ設定が正しいかどうかを確認するテストを実行します。

nginx -T

出力には、成功メッセージとともに、以前に行ったすべてのカスタム設定が表示されるはずです。

リバースプロキシ設定を実行するためにNGINXを再起動します。

systemctl restart nginx

NGINXがすべての設定されたポートでリッスンしていることを確認します。メモと照らし合わせて、すべてのポートが結果に表示されていることを確認してください。

netstat -tulpn | grep nginx

出力は次のようになります。

tcp        0      0 0.0.0.0:22           0.0.0.0:*               LISTEN      4964/nginx: master  
tcp        0      0 0.0.0.0:22002           0.0.0.0:*               LISTEN      4964/nginx: master  
tcp        0      0 0.0.0.0:22003           0.0.0.0:*               LISTEN      4964/nginx: master

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4964/nginx: master  
tcp        0      0 0.0.0.0:33062           0.0.0.0:*               LISTEN      4964/nginx: master  
tcp        0      0 0.0.0.0:33063           0.0.0.0:*               LISTEN      4964/nginx: master  
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      4964/nginx: master  

サーバーをトラフィックに開放する

NGINXがリッスンしており、接続を許可する準備が整ったので、次の手順を進める間、UFWを一時的に無効にします。正常に動作していない場合のトラブルシューティングが容易になります。

ufw disable

ポートの転送

残念ながら、ここでのガイダンスを提供することはできません。ルーターのマニュアルを参照するか、オンラインでルーターを調べて、これを学ぶ必要があります。ただし、要約すると、NGINXがリッスンしている各ポートをNGINXホストマシンに転送する必要があります。私の特定のルーターでは、カスタム「アプリケーション」を設定できます。

これにより、未割り当てのポートまたはポート範囲をカスタムアプリケーションに割り当て、その後、LAN IPアドレスまたはホスト名で識別された特定の接続デバイスに割り当てることができます。いずれにせよ、これにより、ネットワーク上の任意のホストにカスタムアプリケーションに割り当てられたすべてのポートを切り替えることができ、すべてのポートを削除して再割り当てする必要がなくなります。これは非常に優れたオプションであり、これをサポートするルーターを選ぶことを強くお勧めします。

ルーターのファイアウォールにあるこの小さくて非常に便利な機能により、アクティブなリバースプロキシの設定をミラーリングする2番目のリバースプロキシをインストールすることにしました。電源を切っており、発見から3分以内にポートを切り替えることができます。プロのホスティング会社が災害復旧のためにそのターンアラウンドタイムを満たすのに苦労することを想像します。すべては、ホームネットワーク上で複数のサーバーを運用したいという欲求から生まれました。

リバースプロキシサーバー用の無料Letsencrypt SSL

CertbotとCertbot NGINXプラグインをインストールします。このステップは、証明書を作成する前に、すべての(サブ)ドメイン名のDNSが機能しており、HTTP経由でドメインに接続できる必要があるため、ここで実行されます。ポートをリバースプロキシに転送した後にこれを完了すると、設定の追加のテストとしても機能します。ドメインに到達できないために証明書が失敗した場合、出力に意味のあるエラーメッセージが表示されます。

最新のcertbotバージョンを取得するために、インストールする前にcertbotリポジトリを追加します。Ubuntuリポジトリはしばしばソフトウェアのバージョンよりも1つ以上古いことがあり、できるだけ最新の安定版ソフトウェアを取得したいと思います。

add-apt-repository ppa:certbot/certbot  
apt install -y certbot python-certbot-plugin

Certbotとcertbot nginxプラグインがインストールされたので、NGINX用の証明書を作成できます。

このコマンドは、SSLを提供したいすべてのドメインおよびサブドメインに対して繰り返し実行する必要があります。これが初めてのcertbotの実行であれば、利用規約に同意する必要があります。

certbot --nginx -d example.com -d www.example.com

上流ホストにSSLが機能するサーバーがある場合、ここで選択したオプションがホストサーバーのものと一致することを確認する必要があります。特に、上流サーバーでhttpsにリダイレクトする場合は、ここでもそうする必要があります。

明確にするために、example.comは別のサーバーに存在し、ISPConfig内でhttpをhttpsにリダイレクトすることを選択したため、ここでもそれを選択します。設定ファイルが更新され、Certbotが独自の設定を追加したことがわかります。

すべてが機能することを確認する。

リバースプロキシにトラフィックが流れるようになったので、すべてが意図した通りに機能しているかどうかを確認する必要があります。ウェブサイトが正常に機能しているかどうかを確認し、SSH、FTP、およびMySQL/MariaDBの接続とタスクを実行します。すべてが正しく動作していることに満足したら、UFWを有効にし、各ポートを許可するルールを追加します。

リバースプロキシサーバーのセキュリティ

ufw enable

どこからでも80および443を許可し、SSH、FTP、およびMySQL/MariaDBをIPアドレスまたはホスト名に制限する必要があります。どのサービス/サーバーにポートを割り当てたかを迅速に特定するために、ルールにコメントを追加できます。

ufw allow 80  
ufw allow 443  
 ufw allow from 1.2.3.4 to any port 22002 comment 'web1 SSH'  
 ufw allow from somehost.domain.com to any port 33061 comment 'db1 MySQL/MariaDB'  
  
 ufw reload  
 ufw status numbered

Apache2の更新

リバースプロキシの背後で実行している場合、Apache2のログファイルには、ウェブサイト訪問者のIPアドレスではなく、リバースプロキシサーバーのIPアドレスが記録されます。Apache2に正常なIPアドレスのログ記録を復元するためのモジュールが利用可能です。

Apache2インスタンスがインストールされている各ウェブサーバーで次の手順を実行します。

sudo apt install -y libapache2-mod-rpaf

Apache2が正しいIPアドレスを記録するようにするために、rpaf.confファイルに小さな変更を加えます。Ubuntu 18.04では、すでにファイルが作成されているため、強調表示されたIPアドレスをNGINXリバースプロキシホストのものに変更するだけです。

nano /etc/apache2/mods-available/rpaf.conf

    RPAFenable On

    # 有効にすると、受信したX-Hostヘッダーを取得し、
    # 仮想ホスト設定をそれに応じて更新します:
    RPAFsethostname On

    # 正しいX-Forwarded-Forヘッダーを送信するフロントエンドプロキシのIPを定義します:
    RPAFproxy_ips 127.0.0.1 ::1

    # デフォルトのX-Forwarded-Forから解析するヘッダー名を変更します。
    # お好みの名前に変更してください:
#   RPAFheader X-Real-IP

最終ノート

同じホスト上のNGINXとApache2

サーバーまたは仮想マシン内で同じポートでリッスンできるサービスは2つありません。NGINXがApache2ウェブサーバーと同じサーバーまたは仮想マシンにインストールされている場合、Apache2がリッスンするポートを変更する必要があります。NGINXはHTTP(S)機能を実行するためにポート80と443を必要とします。これらはHTTPおよびHTTPSのデフォルトポートです。

このガイドのhttpセクションに戻り、ネットワーク内の他のサーバーと同様に、このApache2インスタンスによって提供されるウェブサイトのリバースプロキシ設定を追加してください。

Apache2のリッスンポートの変更

ISPConfigなどのサーバー管理システムがインストールされている場合、このシステムはApache2のvhostファイルを管理するため、Apache2がリッスンするポートを変更する方法を調査する必要があります。ISPConfigフォーラムを検索し、必要に応じて調整を行ってください。そうでない場合は、UbuntuフォーラムやApache2のウェブサイトでこれらの変更を実行する方法を調べてください。

注:サーバーまたは仮想マシンにインストールされている唯一のウェブサーバーである場合、Apache2のポートを変更する必要はありません。
Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。