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

我用ubuntu 15.10 digital ocean为我的server 。 我有三个docker containersnginxweb (对于angular 2应用程序),和railsrails API

我打算如下设置nginxconfiguration文件:

port 443是由nginx proxy passed给我的web应用程序的proxy passed

之后,我有点困惑,我应该如何让外部访问的rails api ? 我应该通过subdomain访问rails api吗?如果是这样的话? 或者,我应该只使用相同的域作为我的web应用程序,虽然有不同的port

下一个问题是我需要一个ssl certificate连接到nginx层的ssl certificate吗? 或者我需要一个ssl certificateweb application和一个ssl certificaterails api

您可以将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做第二个子域名,但是你可能最终需要在nginxconfiguration中使用第三个代理来将yourdomain.com/api代理到api.yourdomain.com