服务器设置:API的子域或不同端口以及docker,nginx,web和api设置的单个或多个ssl证书?

时间:2016-01-16 22:03:06

标签: ubuntu ssl nginx docker digital-ocean

我正在digital ocean使用ubuntu 15.10用于server。我有三个docker containersnginxweb(适用于angular 2应用),rails适用于rails API

我打算按如下方式设置nginx配置文件:

{p> port 443 proxy passed nginx web到我的rails api应用。

之后我对如何允许外部访问rails api感到有些困惑?我应该通过subdomain访问web吗?如果可以的话?或者我应该使用与port应用相同的域,尽管使用不同的ssl certificate

下一个问题是,我需要一个nginx用于连接ssl certificate图层的外部世界吗?或者web application需要一个ssl certificaterails api需要一个Session::getId()吗?

1 个答案:

答案 0 :(得分:1)

您可以将nginx用作两个端点的负载均衡器。这样的事应该没问题:

upstream web {
    server webcontainer1:8080;
    server webcontainer2:8080;
}

upstream api {
    server apicontainer1:5000;
    server apicontainer2:5000;
}

server {
    <your_server_directives>
    ...

    location /api {
        proxy_pass http://api;
    }

    location / {
        proxy_pass http://web;
    }
}

您还可以使用单独的nginx执行子域。在这种情况下,您将设置另一个server指令并在同一端口或另一个API特定端口上执行虚拟主机,例如:

upstream api {
    server apicontainer1:5000;
    server apicontainer2:5000;
}

server {
    listen 5500;
    server_name api.mydomain.com;

    location /api {
        proxy_pass http://api;
    }
}

在第一个场景中,是的,您可以只使用一个SSL证书作为API,并且Web将位于一个端口(一个域名)上。在第二种情况下,您需要一个通配符证书或两个证书,一个用于主网站(yourdomain.com)和api(api.yourdomain.com)。

值得注意的是,第二种情况可能会遇到恼人的CSRF问题,因为SSL页面通常不允许当前域之外的XHR请求。因此,您可以为API执行第二个子域,但您可能最终需要在nginx配置中使用第三个代理来将yourdomain.com/api代理到api.yourdomain.com