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

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

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: 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 线程数分开算。

## Nginx

```nginx
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：

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

`map $http_upgrade $connection_upgrade` 放 `http` 块。

## IIS ARR

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

## Tomcat 看到代理

在 `server.xml` 的 `Host` 里启 `RemoteIpValve`：

```xml
<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。

## 内存与线程

```bat
set "JAVA_OPTS=-Xms1g -Xmx1g -XX:+UseG1GC"
```

- 专用内存服务器 `-Xms` = `-Xmx`，避免堆增长停顿。
- 给 Metaspace、线程栈、direct buffer 和 OS 留余量。
- Tomcat `maxThreads` 是请求并发，不是堆。加线程不修内存泄漏。
- 改数字前看 GC 日志和 `jcmd <pid> GC.heap_info`。

## 验证

```powershell
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。

> **警告: 不要信任来自公网的转发头**
>
> 客户端能直连 Tomcat 时 `X-Forwarded-For` 可伪造。Tomcat 绑 localhost/私网，只信任代理的头。

## 实验室边界

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

## 来源

- [Apache Tomcat — Valve](https://tomcat.apache.org/tomcat-10.1-doc/config/valve.html)
- [Apache Tomcat — HTTP connector](https://tomcat.apache.org/tomcat-10.1-doc/config/http.html)
- [nginx — WebSocket 代理](https://nginx.org/en/docs/http/websocket.html)

---

来源页面: https://winbook.fyi/zh/server/runtimes/java-proxy/
