从 nginx 作为反向代理连接到 Tomcat 服务器

从 nginx 作为反向代理连接到 Tomcat 服务器

我有一台 Tomcat 服务器为 Web 应用程序提供服务,并且在其前面运行一台 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 配置似乎是罪魁祸首。如何纠正?

答案1

为了回答这个问题,我假设以下 IP

Nginx 192.168.0.1
Tomcat192.168.0.2

配置 tomcat 服务器

将以下行更改address="127.0.0.1"address="192.168.0.2"- 这将告诉 Tomcat 监听本地 IP 而不是环回地址。

然后我们要配置 IPtables。我使用了生成器这里

以下规则是“安全的”,它们不会锁定您的远程访问(我已允许在端口 22 上使用 SSH,假设您的 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。例如,如果上面的 FQDN 是,myapp.example.com您需要配置另一个 FQDN,例如,tomcat.example.com并将其解析为,192.168.0.2然后您可以192.168.0.2在上面的 nginx 配置中将其替换为tomcat.example.com

相关内容