首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用https时基于主机的nginx代理

使用https时基于主机的nginx代理
EN

Stack Overflow用户
提问于 2013-08-20 01:34:42
回答 3查看 25K关注 0票数 16

我需要使用Nginx作为SSL代理,它根据子域将流量转发到不同的后端。

我似乎到处都认为应该定义多个"server {“部分,但这对SSL不起作用。这样做,我将始终在第一个虚拟主机中处理SSL,因为在处理https流量之前,服务器名称是未知的。

场景:

需要按如下方式访问的

  • One IP address
  • One SSL通配符the后端:

https://one.mysite.com/ -> http://localhost:8080 https://two.mysite.com/ ->

Nginx说"if“是邪恶的:http://wiki.nginx.org/IfIsEvil,但我还能做什么呢?

我已经尝试过了,但它不起作用,我得到了一个500错误,但在错误日志中什么也没有。

代码语言:javascript
复制
    server {
    listen 443;
    server_name *.mysite.com;

    ssl on;
    ssl_certificate ssl/mysite.com.crt;
    ssl_certificate_key ssl/mysite.com.key;

    location / {
        if ($server_name ~ "one.mysite.com") {
            proxy_pass http://localhost:8080;
        }
        if ($server_name ~ "two.mysite.com") {
            proxy_pass http://localhost:8090;
        }
    }

有没有人用Nginx做到了这一点?任何帮助/替代方案,链接,将非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-20 22:44:10

我找到了解决方案,基本上就是在"server“块之外定义SSL选项和SSL证书:

代码语言:javascript
复制
ssl_certificate ssl/mysite.com.crt;
ssl_certificate_key ssl/mysite.com.key;
ssl_session_timeout  5m;
ssl_protocols        SSLv3 TLSv1;
ssl_ciphers          ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+EXP;
ssl_prefer_server_ciphers   on;

server {
    listen 80;
    server_name *.mysite.com;
    rewrite ^ https://$host$request_uri? permanent;
}
server {
    listen 443 ssl;
    server_name one.mysite.com;

    ssl on;

    location / {
        proxy_pass http://localhost:8080;
    }
}
server {
    listen 443 ssl;
    server_name two.mysite.com;

    ssl on;

    location / {
        proxy_pass http://localhost:8090;
    }
}

关键点:

  • "ssl on;“是唯一需要在”服务器“块中监听https的东西,你也可以把它放在外面,但是是什么让在端口80监听的”服务器“块使用https协议而不是预期的http。
  • 由于"ssl_certificate","ssl_ciphers:”和其他"ssl_*“在”服务器“块之外,Nginx在没有server_name的情况下进行SSL卸载。这就是它应该做的,因为SSL解密不会基于任何主机名发生,因为在这个阶段URL是encrypted.
  • JAVA,curl现在不会失败。不存在server_name主机缺失匹配。
票数 28
EN

Stack Overflow用户

发布于 2013-08-21 00:13:25

简短的答案是使用Server Name Indication。默认情况下,这应该可以在常见的浏览器和cURL中工作。

票数 4
EN

Stack Overflow用户

发布于 2013-08-20 02:24:33

根据http://www.informit.com/articles/article.aspx?p=1994795的说法,您确实应该有两个“服务器”部分,具有两个不同的服务器名称。在每一个文件中,都应该包含ssl_*指令。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18319721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档