• Daily Archives: 2016年9月28日

Nginx SSL+tomcat集群,request.getScheme() 取到https正确的协议

最近做的一个项目, 需要使用 tomcat 集群, 且项目需要使用https协议

但是,明明是https url请求, 但是java里的 request.getScheme() 的输出却是 http

request.getRequestURL() 输出出来的 一直是
http://xxxxxxxxx/abc?value=123
但是浏览器中的URL却是
https://xxxxxxxxx/abc?value=123
查阅了一些资料,找到了解决方案:
解决方法很简单,只需要分别配置一下 Nginx 和 Tomcat 就好了,而不用改程序。
配置 Nginx 的转发选项:
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;

配置Tomcat server.xml 的 Engine 模块下配置一个 Valve:

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

配置双方的 X-Forwarded-Proto 就是为了正确地识别实际用户发出的协议是 http 还是 https。

这样以上5项测试就都变为正确的结果了,就像用户在直接访问 Tomcat 一样。

 

参考资料:

http://www.th7.cn/Program/java/201608/929190.shtml

http://blog.csdn.net/pwq296306654/article/details/51760844

http://feitianbenyue.iteye.com/blog/2056357

使用nginx 反向代理实现负载均衡解决HTTPS 证书问题

由于项目需要 负载均衡由NBL 转成nginx 反向代理。考虑都是https模块,所以证书成了个难题。

解决方案:

1.下载openssl(windows 安装包)

2.打开bin/下面的openssl.exe

3.再原来的IIS上面把证书导出.pfx(域服务器证书申请,主要适用域内)

4.利用openssl 进行转化:

openssl pkcs12 -in server.pfx -nodes -out server.pem # 生成明文所有内容
openssl rsa -in server.pem -out server.key # 取 key 文件
openssl x509 -in server.pem -out server.crt # 取证书

5.nginx 上面开始配置:

upstream backend
{
#ip_hash;
server 10.1.0.245:81;
server 10.1.0.42:81;
}
    server {
        listen     80;
        listen     443 ssl;
        server_name  office.dahuatech.com;
        ssl_certificate      server.crt;
        ssl_certificate_key  server.key;
        #ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        #ssl_prefer_server_ciphers  on;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;

      location / {
        proxy_pass  http://backend;
        #Proxy Settings
        proxy_redirect     off;
        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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
        }

按照上面配置就可以。这样域内所有的用户都可以在信任证书内。

记录下 送给需要的人

OPENSSL 安装包下载:Win32OpenSSL-0_9_8l.zip

CentOS 6/7 下使用yum安装nginx

Ubuntu下安装nginx,直接apt-get install nginx就行了,很方便。

但是今天装了CentOS6.2,直接yum install nginx不行,要先处理下源,下面是安装完整流程,也十分简单:

1、运行并安装源:

CentOS 7 下使用这个命令

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

CentOS 6 下使用这个命令

rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

2,查看yum的nginx信息

[]# yum info nginx

Loaded plugins: fastestmirror

Determining fastest mirrors

 * base: mirror.esocc.com

 * extras: mirror.esocc.com

 * updates: mirror.esocc.com

base                                                     | 3.7 kB     00:00     

base/primary_db                                          | 4.4 MB     00:28     

extras                                                   | 3.5 kB     00:00     

extras/primary_db                                        |  19 kB     00:00     

nginx                                                    | 2.9 kB     00:00     

nginx/primary_db                                         |  22 kB     00:00     

updates                                                  | 3.5 kB     00:00     

updates/primary_db                                       | 2.1 MB     00:10     

Installed Packages

Name        : nginx

Arch        : x86_64

Version     : 1.4.0

Release     : 1.el6.ngx

Size        : 874 k

Repo        : installed

From repo   : nginx

Summary     : nginx is a high performance web server

URL         : http://nginx.org/

License     : 2-clause BSD-like license

Description : nginx [engine x] is an HTTP and reverse proxy server, as well as

            : a mail proxy server

3,安装nignx
[root@server ~]# yum install nginx

4,启动nginx

CentOS 7 下使用这个命令:

systemctl start nginx

CentOS 6 下使用这个命令

service nginx start

4,然后进入浏览器,输入http://xxxxxxx/测试,如果看到

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

恭喜你,你成功了!

5、设置为开机启动

CentOS 7 下使用这个命令

systemctl enable nginx.service

CentOS 6下使用这个命令

chkconfig nginx on

 

close