Ngix + Tomcat + HTTPS

本文介绍了一种配置方案,即浏览器与Nginx间使用HTTPS通讯,而Nginx与Tomcat间则采用普通HTTP连接。文章详细展示了Nginx端的配置过程,并强调了ssl_certificate和ssl_certificate_key配置的重要性。
最终配置的方案是浏览器和 Nginx 之间走的 HTTPS 通讯,而 Nginx 到 Tomcat 通过 proxy_pass 走的是普通 HTTP 连接。

下面是详细的配置(Nginx 端口 80/443,Tomcat 的端口 8080):

Nginx 这一侧的配置没什么特别的:


upstream tomcat {
server 127.0.0.1:8080 fail_timeout=0;
}

# HTTPS server
server {
listen 443 ssl;
server_name localhost;

ssl_certificate /Users/winterlau/Desktop/SSL/oschina.bundle.crt;
ssl_certificate_key /Users/winterlau/Desktop/SSL/oschina.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
proxy_connect_timeout 240;
proxy_send_timeout 240;
proxy_read_timeout 240;
# note, there is not SSL here! plain HTTP is used
proxy_pass http://tomcat;
}
}

其中最为关键的就是 ssl_certificate 和 ssl_certificate_key 这两项配置,其他的按正常配置。不过多了一个 proxy_set_header X-Forwarded-Proto https; 配置。

最主要的配置来自 Tomcat,下面是我测试环境中的完整 server.xml:

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443"
proxyPort="443"/>

<Engine name="Catalina" defaultHost="localhost">

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"
/>
<Context path="" docBase="/oschina/webapp" reloadable="false"/>
</Host>
</Engine>
</Service>
</Server>

上述的配置中没有什么特别的,但是特别特别注意的是必须有 proxyPort="443",这是整篇文章的关键,当然 redirectPort 也必须是 443。同时 <Value> 节点的配置也非常重要,否则你在 Tomcat 中的应用在读取 getScheme() 方法以及在 web.xml 中配置的一些安全策略会不起作用。
### Nginx 中 KeepAlive 功能的配置与使用 #### 1. 基础概念 Nginx 的 `keepalive` 参数主要用于 HTTP 和 TCP 协议下的连接复用机制。通过启用该功能,客户端和服务器之间的连接可以在多个请求间重复利用,减少每次建立新连接的时间开销以及资源消耗。 对于 HTTP 请求而言,`keepalive` 可以显著提升性能,尤其是在处理大量短时间内的连续请求时[^1]。 --- #### 2. 配置方法 ##### (1) **HTTP 上游模块中的 KeepAlive** 当使用 `upstream` 定义一组后端服务器时,可以通过设置 `keepalive` 来控制上游连接池的行为: ```nginx http { upstream backend { server 192.168.1.1:80; server 192.168.1.2:80; keepalive 32; # 设置最大空闲连接数为 32 } server { listen 80; location / { proxy_pass http://backend; proxy_http_version 1.1; # 启用 HTTP/1.1 支持持久连接 proxy_set_header Connection ""; # 清除默认关闭连接头信息 } } } ``` 上述配置中: - `keepalive 32`: 表示每个 worker 进程最多维护 32 个到后端服务器的空闲连接。 - `proxy_http_version 1.1`: 确保使用的是支持持久连接的 HTTP/1.1 版本。 - `proxy_set_header Connection ""`: 移除了可能导致连接被立即关闭的头部字段[^3]。 --- ##### (2) **TCP 或 UDP 流量中的 KeepAlive** 在流模式下(Stream Module),也可以针对 TCP 或 UDP 数据包启用类似的保持活动功能: ```nginx stream { upstream tcp_backend { server 192.168.1.1:22; server 192.168.1.2:22; keepalive 16; # 每个工作进程保留的最大空闲连接数量 } server { listen 12345; proxy_pass tcp_backend; } } ``` 此部分特别适合于需要长期维持会话的应用场景,比如 SSH、FTP 等服务[^4]。 --- #### 3. 使用注意事项 - **超时时间调整**: 默认情况下,Nginx 对闲置连接有严格的限制,默认值通常较低(如 75 秒)。为了更好地发挥 `keepalive` 效果,可能还需要适当延长这些时限参数,例如修改 `proxy_read_timeout`, `send_timeout` 等。 - **负载均衡策略影响**: 如果启用了轮询或其他动态调度算法,则需要注意如何平衡各节点间的活跃状态变化对整体效率的影响[^2]。 - **监控健康状况**: 结合外部工具如 Keepalived 实现更高级别的故障转移方案,在某些条件下自动切换主备实例来保障业务连续性。 --- ### 示例代码片段展示完整的 nginx.conf 文件结构 以下是综合以上要点的一个典型例子: ```nginx worker_processes auto; events { multi_accept on; } http { include mime.types; default_type application/octet-stream; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65s; # 调整全局范围内的长链接存活周期长度 upstream app_servers { server 10.0.0.1:8080 weight=5 max_fails=3 fail_timeout=30s; server 10.0.0.2:8080 backup; keepalive 64; # 设定每 Worker Process 所能保存的最大未使用的 Upstream Connections 数目 } server { listen 80; server_name example.com www.example.com; access_log logs/example.access.log main; root html; index index.html index.htm; location /api/ { proxy_pass http://app_servers/; 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 Connection ""; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; } } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值