web-dev-qa-db-ja.com

リバースプロキシとしてnginxからTomcatサーバーに接続します

Webアプリケーションを提供するTomcatサーバーがあり、その前でリバースプロキシとしてNginxサーバーが実行されています。以前の質問( nginxリバースプロキシの背後にあるTomcatサーバー-サーバーへの直接アクセスをブロックする方法? )への回答として、Tomcatインスタンスをファイアウォールで保護するように提案されましたが、さまざまなフォーラムでの調査結果に基づいています、Tomcatをlocalhostをリッスンするように制限するのが道のりのようでした。 Tomcatが他のIPをリッスンしないようにするために、コネクタ構成に「address = 127.0.0.1」を追加しました。コネクタブロック全体は次のようになります-

<Connector port="8080" 
address="127.0.0.1" 
maxThreads="150" 
minSpareThreads="25" 
connectionTimeout="20000" 
enableLookups="false" 
maxHttpHeaderSize="8192" 
protocol="HTTP/1.1" 
useBodyEncodingForURI="true" 
redirectPort="8443" 
acceptCount="100" 
disableUploadTimeout="true"
proxyName=<FQDN> 
proxyPort="80"/> 

Nginxサーバーには、サーバー構成用のこれらの行があります。

server {
        listen  80 default_server;
        listen  [::]:80 default_server ipv6only=on;

        server_name <FQDN>;
        location / {
        proxy_pass <FQDN>;
        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;
}
}

さて、FQDNを使用してWebアプリケーションにアクセスしようとすると、ChromeはERR_CONNECTION_REFUSEDを報告します。私のNginx構成は、私が理解したことに基づいて原因のようです。どうすれば修正できますか?

3
Chethan S.

質問の目的のために、私は次のIPを想定します

Nginx 192.168.0.1
Tomcat 192.168.0.2

Tomcatサーバーを構成します

次の行をaddress="127.0.0.1"からaddress="192.168.0.2"に変更します-これにより、TomcatはループバックアドレスではなくローカルIPをリッスンするようになります。

次に、IPtablesを構成します。ジェネレーターを使用しました ここ

以下のルールは「安全」であり、リモートアクセスからロックアウトされることはありません(sshポートがデフォルトであると仮定して、ポート22でSSHを許可しました)が、おそらくそうあるべき/可能性があるほど制限的ではありません。少し時間を取って、それらを確認してください。また、現在のルールも削除されます

#!/bin/sh

# iptables script generated 2016-04-20
# http://www.mista.nu/iptables

IPT="/sbin/iptables"

# Flush old rules, old custom tables
$IPT --flush
$IPT --delete-chain

# Set default policies for all three default chains
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

# Enable free use of loopback interfaces
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# All TCP sessions should begin with SYN
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -s 0.0.0.0/0 -j DROP

# Accept inbound TCP packets
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -s 0.0.0.0/0 -j ACCEPT # Accepts SSH from everywhere
$IPT -A INPUT -p tcp --dport 8080 -m state --state NEW -s 192.168.0.1/32 -j ACCEPT # Accepts connection to port 8080 only from the Nginx Server

# Accept inbound ICMP messages
$IPT -A INPUT -p ICMP --icmp-type 8 -s 0.0.0.0/0 -j ACCEPT
$IPT -A INPUT -p ICMP --icmp-type 11 -s 0.0.0.0/0 -j ACCEPT

Nginxサーバーを構成します

サーバー構成を少し編集する必要があります。ここで、ローカルIPでTomcatサーバーにプロキシします。

server {
        listen  80 default_server;
        listen  [::]:80 default_server ipv6only=on;
        server_name <FQDN>;

location / {
        proxy_pass http://192.168.0.2:8080;
        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;
        }
}

FQDNにプロキシできますが、Nginxサーバーを指すものとは別のFQDNを構成する必要があります。たとえば、上記のFQDNがmyapp.example.comの場合、Tomcat.example.comなどの別のFQDNを構成し、それを192.168.0.2に解決して、上記のnginx構成の192.168.0.2Tomcat.example.comに置き換えることができます。

3
Drifter104