我正在digital ocean
使用ubuntu 15.10
用于server
。我有三个docker containers
:nginx
,web
(适用于angular 2
应用),rails
适用于rails API
。
我打算按如下方式设置nginx
配置文件:
port 443
proxy passed
nginx
web
到我的rails api
应用。
之后我对如何允许外部访问rails api
感到有些困惑?我应该通过subdomain
访问web
吗?如果可以的话?或者我应该使用与port
应用相同的域,尽管使用不同的ssl certificate
?
下一个问题是,我需要一个nginx
用于连接ssl certificate
图层的外部世界吗?或者web application
需要一个ssl certificate
而rails api
需要一个Session::getId()
吗?
答案 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
。