Nginx 单IP下 配置多个server https 的问题

我们的负载均衡架构是这样的:

请求 —> 网络 —> LVS集群 —> Nginx 集群 —> APP

LVS使用FULLNAT模式,每台Nginx 机器只有一个IP(内网IP),LVS也是把流量转到这个IP。如果Nginx想对多个域名使用https,比如两个域名 wandoujia.com 和 wandoulabs.com ,是可能有问题的。

看下面的配置(两个server写在不同文件中,用 include * 加载):

server {

listen 80;

listen 443 ssl;

server_name test.wandoujia.com;

ssl_certificate wandoujia.crt;

ssl_certificate_key wandoujia.key;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers HIGH:!aNULL:!MD5;

...

}

server {

listen 80;

listen 443 ssl;

server_name test.wandoulabs.com;

ssl_certificate wandoulabs.crt;

ssl_certificate_key wandoulabs.key;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers HIGH:!aNULL:!MD5;

...

}

这样你访问 https://test.wandoujia.com 或者 https://test.wandoulabs.com,都可能报证书有问题,这是为什么。

事实上,SSL运行在TCP之上(SSL/TLS协议),ssl通过四次握手和服务器(这里是Nginx,LVS纯转发,可忽略)的IP + PORT(443)建立ssl连接,建立连接之后浏览器才会发送HTTP请求。所以在Nginx收到HTTP请求之后才知道Host,才知道转到哪个server 去处理,所以在SSL连接建立的时候Nginx是不知道用哪个 Server 的SSL配置的,在这种情况下,Nginx会使用它加载到的第一个SSL配置(需验证)。当然如果你在listen 443的后面加上 default_server,Nginx就会使用此SSL配置,即:

listen 443 default_server ssl;

那么对于单域名的https,我更喜欢把SSL配置写在http配置里,在server只需要加上 listen 443 ssl;,类似:

http {

...

ssl_certificate wandoujia.crt;

ssl_certificate_key wandoujia.key;

#ssl_certificate wandoulabs.crt;

#ssl_certificate_key wandoulabs.key;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers HIGH:!aNULL:!MD5;

...

}

server {

listen 80;

listen 443 ssl;

server_name test.wandoujia.com;

...

}

#server {

#    listen 80;

#    listen 443 ssl;

#    server_name test.wandoulabs.com;

#    ...

#}

那么怎么才能实现多域名的 https 呢,是有办法的,叫做 TLS Server Name Indication extension(SNI, RFC 6066),它允许浏览器在SSL握手的时候发送请求的server name,也就是 Host,这样 Nginx 就能找到对应server 的SSL配置。

但是要浏览器支持SNI 才可以,支持SNI的浏览器有:

Opera 8.0;

MSIE 7.0 (but only on Windows Vista or higher);

Firefox 2.0 and other browsers using Mozilla Platform rv:1.8.1;

Safari 3.2.1 (Windows version supports SNI on Vista or higher);

and Chrome (Windows version supports SNI on Vista or higher, too).

同样,在服务器端 openssl 要支持SNI,编译的时候加上–enable-tlsext 即可,不过从 0.9.8j 版本开始编译的时候默认会加。openssl 支持了SNI,Nginx 才可以work,确认是否OK:

$ ./nginx -V

...

TLS SNI support enabled

...

所以,如果想要实现多域名https,要确认你的Nginx 支持 TLS SNI support,然后在server 单独配置SSL, 但是要注意,某些浏览器会有问题,而且因为Nginx加载server 的顺序不同(特别是每个server在同一目录的不同文件中,然后在nginx.conf主配置文件中用 include * 包含),可能会出现奇怪的问题,我是遇到过的。

时间: 2024-08-07 21:18:32

Nginx 单IP下 配置多个server https 的问题的相关文章

nginx在windows下配置缓存服务器缓存静态资源+Tomcat集群

nginx安装目录 修改nginx.conf文件配置负载均衡配置Tomcat集群并设置动静分离 #user nobody; error_log logs/error.log; worker_processes 2; worker_rlimit_nofile 1024; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request&quo

thinkphp5.0 +nginx在contos7下配置访问

Nginx vhost配置:server{listen 80;server_name lp.t1.com t1.com;index index.php;#根目录设置到Public下root /home/wwwroot/lp.t1.com/public; #定义变量 set $root /home/wwwroot/lp.t1.com/public; location ~ [^/]\.php(/|$) { try_files $uri =404; fastcgi_pass unix:/tmp/php

Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站

文章来源:http://blog.csdn.net/jiftlixu/article/details/11676081 http://www.cnblogs.com/zhongweiv/archive/2013/01/07/https.html 目录 配置环境 了解HTTPS 配置CA证书服务器 新建示例网站并发布在IIS 新建自签名证书并配置HTTPS 故障排除 其它机器无法通过访问 配置环境 Windows版本:Windows Server 2008 R2 Enterprise Servic

Nginx下配置网站SSL实现https访问本站就是用的这方法

本文出至:新太潮流网络博客 第一步:服务器环境,lnmp即Linux+Nginx+PHP+MySQL,本文中以我的博客为例,使用的是阿里云最低档的ECS+免费的Linux服务器管理系统WDCP快速搭建的lnamp环境,具体安装以及使用方法都可以在其官方论坛找到详细的操作文档. 第二步:创建你的网站,使用lnamp环境创建你的网站,已有网站的,确保你的程序在lnamp下能够正常的运行,以wordpress为例,lamp跟lnamp下的伪静态规则是不同的,有过更换的,要记得切换. 第三步:申请免费的

IIS7.0 Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站

配置环境 Windows版本:Windows Server 2008 R2 Enterprise Service Pack 1 系统类型: 64 位操作系统 了解HTTPS 为什么需要 HTTPS ? 在我们浏览网站时,多数网站的URL都是以HTTP开头,HTTP协议我们比较熟悉,信息通过明文传输; 使用HTTP协议有它的优点,它与服务器间传输数据更快速准确; 但是HTTP明显是不安全的,我们也可以注意到,当我们在使用邮件或者是在线支付时,都是使用HTTPS; HTTPS传输数据需要使用证书并对

Nginx + django windows下配置

1.下载nginx, 去http://nginx.org/en/download.html 下载,我下载的是1.8 stable版本. 2.配置文件/conf/nginx.conf #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { wo

Windows环境nginx在phpStudy下配置https

Nginx配置文件内容如下 #power by www.php.cn #user  nobody; worker_processes  1; #error_log  logs/error.log; #error_log  logs/error.log  notice; #error_log  logs/error.log  info; #pid        logs/nginx.pid; events { worker_connections  1024; } http { include  

linux系统下配置tomcat 服务端https加密

原理:将证书(也可以叫公钥)+私钥转化成 jks类型的keystore文件,在tomcat的server.xml中配置开启踩坑:1.多数文章都是针对自己生成证书,配置双向加密,其过程有生成,合并,导出,配置服务端,配置客户端等等,看的一塌糊涂2.多数文章都是以实验为参考,误以为生成的keystore文件名可以随意命名,直接使用拷贝命令的方式生成了一个tomcat.keystore文件正确的命令方式应该是(证书名.keystore),或者说是生成证书时的CN名称3.clientAuth="true

mac下nginx的安装和配置,已经相关设置(转帖)。

mac下nginx的安装和配置: 链接:https://www.jianshu.com/p/026d67cc6cb1 前端项目中nginx 本地反向代理配置: 链接:https://www.jianshu.com/p/5c23b09d443f 原文地址:https://www.cnblogs.com/sidianok/p/12204020.html