簡體   English   中英

將Nginx配置為根據端口號將代理請求回退到后端服務器

[英]Configure Nginx to reverse proxy requests to backend server based on port number

我在端口8888、8088、8042和8890的一個ec2實例中運行了四個Web應用程序,其主機名為“ ip-10-176-225-83.us-west-2.compute.internal”。所有這些Web應用程序在HTTP上。

我們的安全團隊不允許打開從本地到AWS的http端口。 建議在同一VPC子實體中設置一個反向代理,該代理接受HTTPS請求,然后使用HTTP將其轉發到后端Web服務器。

我在同一子網中以主機名“ ip-10-176-225-84.us-west-2.compute.internal”創建了一個新實例,並安裝了Niginx Server。

我如何配置Nginx,使其如下所示

https://ip-10-176-225-84.us-west-2.compute.internal:8080致電http://ip-10-176-225-83.us-west-2.compute.internal: 8080並回復

其他端口相同

TL; DR:有多種方法可以完成您在此處尋找的內容。

堅持盡可能減少攻擊面的原則,除非絕對必要,否則通常最好不要將端口暴露給公共互聯網。 反向代理是完成此任務的絕佳方法。 通常,您希望所有后端Web應用通過端口443上的HTTPS進行反向代理,並且您可以訪問每個服務:

  • 具有不同的主機名,例如app1.example.comapp2.example.com
  • 具有不同的子目錄,例如example.com/app1example.com/app2

根據您選擇的方法,配置可能會有很大不同,前者方案有多個server塊,后者則有location塊。 無論哪種情況,我們都將使用upstreamproxy_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塊。 如果它們分別在不同的端口上服務,也將是這種情況。
  • 如果您在證書中定義了多個SAN ,則每個server塊中的ssl_certificatessl_certificate_key可以指向不同的證書,甚至指向同一證書。
  • 每個應用程序都可以通過自己的主機名訪問,這些主機名都指向前端服務器:
    • 應用程式1: https://app1.example.comhttps://app1.example.com
    • 應用程式2: https://app2.example.comhttps://app2.example.com
    • 應用程式3: https://app3.example.comhttps://app3.example.com
    • 應用4: https://app4.example.comhttps://app4.example.com

多個目錄

對於使用單個主機和端口進行配置,從子目錄提供后端應用程序的服務,將使用具有多個location塊的單個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 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/app1https://example.com/app1
    • 應用程式2: https://example.com/app2https://example.com/app2
    • 應用3: https://example.com/app3https://example.com/app3
    • 應用4: https://example.com/app4https://example.com/app4

TLS配置

在這兩種情況下,您都需要配置由公共CA或內部PKI(如果適用)簽名的SSL證書。 如果您的應用要面向公眾,則需要使用公共證書。 然后,將它們的位置添加到上述Nginx配置中。

進一步閱讀

舉一個真實的例子,您可以查看我用於Genieacs TR-069服務器的Nginx配置,該服務器實現SSL反向代理一些其他服務,盡管它們的原始端口不在443上。這可能很有用您想將它們保留在其原始端口上。

Nginx站點在反向代理基本配置方面也有不錯的介紹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM