nginx + tomcat + ssl 配置 问题

stateCelebrateking 2013-09-09 01:55:23
直接入正题
在网上找了很多nginx+tomcat+ssl的文章
但是配置下来,都是http访问ok
https访问一直都是400 错误,
配置如下:
nginx.conf:
#定义Nginx运行的用户和用户组
#user nobody;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 1;
events {
worker_connections 1024;
}
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 120;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
upstream test_client_https.com{
server 192.168.2.120:9444;
}
upstream test_client_http.com{
server 192.168.2.120:9081;
}
map $scheme $fastcgi_https {
default off;
https on;
}
server {
listen 9080;
#域名可以有多个,用空格隔开
server_name localhost clientAuth Catalina;
charset utf-8;
location ~ ^/NginxStatus{
stub_status on;
}
location / {
proxy_pass http://test_client_http.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header SSL_CERT $ssl_client_cert;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允许客户端请求的最大单文件字节数
client_max_body_size 10m;
#缓冲区代理缓冲用户端请求的最大字节数,
client_body_buffer_size 128k;
#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 90;
#后端服务器数据回传时间(代理发送超时)
proxy_send_timeout 90;
#连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 90;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
#proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_buffers 4 32k;
#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 64k;
}
}
server {
listen 9443 ssl;
#域名可以有多个,用空格隔开
server_name localhost clientAuth Catalina;
charset utf-8;
#access_log logs/host.access.log main;
ssl on;
ssl_certificate E:/test/test/SSL/server/tomcat.key.crt;
ssl_certificate_key E:/test/test/SSL/server/tomcat.key.key;
ssl_client_certificate E:/test/test/SSL/client/client.cer;#双向认证
ssl_verify_client on; #双向认证

ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+PKCS12:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;

location ~ ^/NginxStatus{
stub_status on;
}
location / {
proxy_pass https://test_client_https.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header SSL_CERT $ssl_client_cert;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#允许客户端请求的最大单文件字节数
client_max_body_size 10m;
#缓冲区代理缓冲用户端请求的最大字节数,
client_body_buffer_size 128k;
#nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 90;
#后端服务器数据回传时间(代理发送超时)
proxy_send_timeout 90;
#连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 90;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
#proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_buffers 4 32k;
#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
#设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 64k;
}
}
}
tomcat -->server.xml
<?xml version='1.0' encoding='utf-8'?>
<Server port="9005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="9081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="9443" />
<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />
<Connector SSLEnabled="true" acceptCount="100" clientAuth="false"
disableUploadTimeout="true" enableLookups="false" maxThreads="25"
port="9444" keystoreFile="E:/test/test/SSL/server/tomcat.keystore" keystorePass="47ecf14f-7da6-4f7b-9843-1edaf1828fc6"
protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
secure="true" sslProtocol="TLS" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>
</Engine>
</Service>
</Server>
实例请求:http://192.168.2.120:9080/
返回的就是tomcat的信息
https://192.168.2.120:9443/
返回的就是空白,信息就是 400 Bad Request
小弟第一次配置nginx,很多不清楚,请大家指正。
...全文
309 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
stateCelebrateking 2013-09-11
  • 打赏
  • 举报
回复
以为以前只有tomcat服务器,有一些接口需要https,所有就会强制转为https, 我的这个配置基本上算对的 我根据你的说法,在nginx上配置https,tomcat不配置https 用nginx的https转向tomcat的http,在tomcat上添加黑白名单的方式来限制外网的访问。 这样就可以避免一些性能上的重复 protocol="org.apache.coyote.http11.Http11NioProtocol" 改为 protocol="HTTP/1.1" 在nginx的https转到tomcat的http时出现的400错误(至少这样配置之后就没有报400错误了,能够正常返数据) 还是谢谢你。
MiceRice 2013-09-10
  • 打赏
  • 举报
回复
你这个需求听起来比较奇怪啊,本来是http的请求,到了tomcat要强制转为https?这完全不能带来任何安全性的好处,平白浪费性能。。。 如果是为了提升客户安全性,应该是做个自动重定向跳转(302),让浏览器重新向 https 的地址发起请求才对。
stateCelebrateking 2013-09-10
  • 打赏
  • 举报
回复
那个死循环是这样的: 我一个http请求给nginx转给tomcat的http,在tomcat那需要强制转为https的, 所以tomcat转给了nginx的https,但是nginx的https也用的是tomcat的http, 这样就出现了死循环。 为了不出现这样的死循环,就只有在tomcat这取消掉强制转为https。 在nginx这做强转为https。 网上找了也没找到能用的。还在纠结这个问题。 现在用nginx提供http和https的端口,tomcat只提供http的端口。 三级域名分离现在还没做,现在只是在tomcat中加入了黑白名单的方式来限制访问。
MiceRice 2013-09-10
  • 打赏
  • 举报
回复
惭愧,只做过Apache+Tomcat关于HTTPS的,因为你这个问题曾经碰到过,所以提出推测。 所以只能提供点建议: ◎ 把https资源和http资源,分割清晰点,最好是三级域名级别分离,最差也要设法在ContextPath级别分离; ◎ https协议的处理,只到Nginx这里为止,代理转发直接为http,Tomcat不再提供https端口;这样也提升性能; 不太理解你的死循环是个啥意思。
stateCelebrateking 2013-09-09
  • 打赏
  • 举报
回复
引用 2 楼 ldh911 的回复:
配置好多,看不过来。 初步推测是:你用Nginx接收了HTTPS,转发给Tomcat后其实已经变成了HTTP,所以应该就将其发到Tomcat的HTTP端口。
最开始的时候,我使用的只是tomcat,所以把一些关键的连接,用的是强转为https, 这样的话,就会出现一个死循环,有什么好一点的解决方案呢?
MiceRice 2013-09-09
  • 打赏
  • 举报
回复
配置好多,看不过来。 初步推测是:你用Nginx接收了HTTPS,转发给Tomcat后其实已经变成了HTTP,所以应该就将其发到Tomcat的HTTP端口。
stateCelebrateking 2013-09-09
  • 打赏
  • 举报
回复
自己顶一个。

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧