博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx 单IP下 配置多个s…
阅读量:4045 次
发布时间:2019-05-24

本文共 2234 字,大约阅读时间需要 7 分钟。

很早之前就遇到类似的问题,今天写下来以防忘记。

 

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

请求 —> 网络 —> 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;
    ...
}
这样你访问 或者 ,都可能报证书有问题,这是为什么。

事实上,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 * 包含),可能会出现奇怪的问题,我是遇到过的。

 

 

参考:

转载地址:http://qgqdi.baihongyu.com/

你可能感兴趣的文章
Ubuntu 13.10使用fcitx输入法
查看>>
pidgin-lwqq 安装
查看>>
mint/ubuntu安装搜狗输入法
查看>>
C++动态申请数组和参数传递问题
查看>>
opencv学习——在MFC中读取和显示图像
查看>>
Matlab与CUDA C的混合编程配置出现的问题及解决方案
查看>>
如何将PaperDownloader下载的文献存放到任意位置
查看>>
C/C++中关于动态生成一维数组和二维数组的学习
查看>>
JVM最简生存指南
查看>>
Java的对象驻留
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
如何构建高扩展性网站
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>