TL; DR:有完成你的幾種方法在這裏尋找。
在可能的情況下,堅持減少attack surface的原則,通常最好不要將端口暴露給公共互聯網,除非絕對必要。反向代理是實現這一目標的絕佳方式。一般情況下,你會希望所有的後端的網絡應用程序是在端口443上的反向代理通過HTTPS,你會訪問每個服務之一:
- 具有不同的主機名稱,如
app1.example.com
和app2.example.com
,或
- 有不同的子目錄,如
example.com/app1
和example.com/app2
根據您選擇的方法,該配置可以爲前者的情況而變化顯著,無論是與多個server
塊,或後者的location
塊。無論哪種情況,我們都會使用upstream
和proxy_pass
指令。我將舉兩個場景的例子。
多臺主機
如果您正在使用針對前端多個主機名(或多個端口),你需要爲他們創建多個server
塊:
# Nginx reverse-proxy configuration
upstream app1 {
server 10.176.225.83:8888;
}
upstream app2 {
server 10.176.225.83:8088;
}
upstream app3 {
server 10.176.225.83:8042;
}
upstream app4 {
server 10.176.225.83:8890;
}
server {
listen 443 ssl;
server_name app1.example.com;
ssl_certificate_key /path/to/your/ssl-key.pem;
ssl_certificate /path/to/your/ssl-cert.pem;
location/{
proxy_pass http://app1;
}
}
server {
listen 443 ssl;
server_name app2.example.com;
ssl_certificate_key /path/to/your/ssl-key.pem;
ssl_certificate /path/to/your/ssl-cert.pem;
location/{
proxy_pass http://app2;
}
}
server {
listen 443 ssl;
server_name app3.example.com;
ssl_certificate_key /path/to/your/ssl-key.pem;
ssl_certificate /path/to/your/ssl-cert.pem;
location/{
proxy_pass http://app3;
}
}
server {
listen 443 ssl;
server_name app4.example.com;
ssl_certificate_key /path/to/your/ssl-key.pem;
ssl_certificate /path/to/your/ssl-cert.pem;
location/{
proxy_pass http://app4;
}
}
有幾件事要注意:
- 所有的已使用
upstream
指令在頂部定義了後端,現在可以按名稱引用它。
- 如果你不想做這種方式,可以省略
upstream
塊和proxy_pass
線是這樣的:proxy_pass http://10.176.225.83:8888;
- 因爲每個應用程序被送達不同的主機名,每個獲得它自己的
server
塊。如果他們各自在不同的港口服務,情況也是如此。
ssl_certificate
和ssl_certificate_key
中的每個server
塊都可以指向不同的證書,甚至是相同的證書,如果在證書中定義了多個SANs。
- 每個應用將可以從它自己的主機名,其中所有點到前端服務器:
- 應用1:
https://app1.example.com
- 應用2:
https://app2.example.com
- 應用3:
https://app3.example.com
- 應用4:
https://app4.example.com
個
多個目錄
使用單個主機和端口的配置,從服務子目錄中的後端應用程序,你將使用一個單一的server
塊多location
塊:
# Nginx reverse-proxy configuration
upstream app1 {
server 10.176.225.83:8888;
}
upstream app2 {
server 10.176.225.83:8088;
}
upstream app3 {
server 10.176.225.83:8042;
}
upstream app4 {
server 10.176.225.83:8890;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate_key /path/to/your/ssl-key.pem;
ssl_certificate /path/to/your/ssl-cert.pem;
location /app1 {
proxy_pass http://app1;
}
location /app2 {
proxy_pass http://app2;
}
location /app3 {
proxy_pass http://app3;
}
location /app4 {
proxy_pass http://app4;
}
}
一還有幾件事值得注意:
- 我們仍然定義所有四個
upstream
服務,如之前。如果你更喜歡直接路線,你仍然可以省略它們。該指令在複雜的配置中更加有用。
- 因爲所有的應用程序都是由相同的主機名提供服務的,所以它們共享一個
server
塊,但它們各自的子目錄有單獨的location
塊。
- 由於它們全部共享相同的主機名,因此在這種情況下,多個SAN對於服務器證書不是必需的。
- 每個後端應用程序將可從所述前端服務器上的子目錄:
- 應用1:
https://example.com/app1
- 應用2:
https://example.com/app2
- 應用3:
https://example.com/app3
- 應用4:
https://example.com/app4
TLS配置
在這兩種情況下,您將需要配置SSL證書,或者由公共CA或內部PKI,簽署(如果適用)。如果您的應用程序要面向公衆,您需要使用公共證書。然後你將他們的位置添加到上面的Nginx配置中。
進一步閱讀
對於現實世界的例子,你可以檢查出我使用的Genieacs TR-069服務器Nginx的配置,implements SSL和reverse proxies一些其他服務,雖然他們原來的端口,而不是443.如果你想保留它們原來的端口,這可能會很有用。
Nginx網站在反向代理基本配置上也有decent primer。