服务器设置:用于API的子域或不同端口以及用于docker,nginx,web和api设置的单个或多个ssl证书?
我用ubuntu 15.10
digital ocean
为我的server
。 我有三个docker containers
: nginx
, web
(对于angular 2
应用程序),和rails
的rails API
。
我打算如下设置nginx
configuration文件:
port 443
是由nginx
proxy passed
给我的web
应用程序的proxy passed
。
之后,我有点困惑,我应该如何让外部访问的rails api
? 我应该通过subdomain
访问rails api
吗?如果是这样的话? 或者,我应该只使用相同的域作为我的web
应用程序,虽然有不同的port
?
下一个问题是我需要一个ssl certificate
连接到nginx
层的ssl certificate
吗? 或者我需要一个ssl certificate
的web application
和一个ssl certificate
的rails 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
。