跳转到内容

Java 放在 IIS/Nginx 后面:代理头、WebSocket 与内存

核验于 1 分钟阅读

把 Tomcat 放在 IIS ARR 或 Nginx 后面,转发真实 Host/proto/客户端 IP,保持 WebSocket,并按证据设 JVM 内存。

测试环境Standard / Datacenter · 版本号 26100.33650 · x64
E1
版本号
26100.33650
版本
Standard / Datacenter
架构
x64
支持
文档(E1)
证据
E1官方文档
核验日期
2026-10-29
页面类型
任务

IIS/Nginx 终止 TLS,反代到 127.0.0.1:8080 的 Tomcat:

  • 转发 Host、X-Forwarded-For、X-Forwarded-Proto;
  • 配 Tomcat RemoteIpValve,应用才看到真实客户端;
  • 允许 WebSocket 升级和长读超时;
  • JVM(-Xms/-Xmx)和 Tomcat 线程数分开算。
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
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_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 60s;
}

WebSocket:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 3600s;

map $http_upgrade $connection_upgrade 放 http 块。

  • 服务器场指向 127.0.0.1:8080。
  • 保留 Host;转发 X-Forwarded-For/X-Forwarded-Proto。
  • 长请求加大代理超时;需要时开 WebSocket。
  • 不要把 Tomcat 8080 直接暴露公网。

在 server.xml 的 Host 里启 RemoteIpValve:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
protocolHeader="x-forwarded-proto"
protocolHeaderHttpsValue="https" />

没有它,request.getRemoteAddr() 返回 127.0.0.1;连接器没配 scheme="https" 时 request.isSecure() 也可能为 false。

终端窗口
set "JAVA_OPTS=-Xms1g -Xmx1g -XX:+UseG1GC"
  • 专用内存服务器 -Xms = -Xmx,避免堆增长停顿。
  • 给 Metaspace、线程栈、direct buffer 和 OS 留余量。
  • Tomcat maxThreads 是请求并发,不是堆。加线程不修内存泄漏。
  • 改数字前看 GC 日志和 jcmd <pid> GC.heap_info。
终端窗口
curl.exe -I https://lab.example/
Get-Content C:\tomcat\logs\localhost.*.log -Tail 50
jcmd <pid> VM.system_properties | Select-String "java.home|java.version"

应用日志应显示真实客户端 IP 和 https;JVM 应是固定的 JDK。

E1。实验室没有跑 Tomcat 或 Java 应用;配置是 Server 2025 上待验证的代理模式。

来源