簡體   English   中英

Nginix 作為同一域上兩個 nodejs 應用程序的反向處理

[英]Nginix as reverse procy to two nodejs app on the same domain

我知道它已被問過多次,但我找不到任何解決方法。

最近我設置了一個 Ubuntu 服務器,為兩個 nodejs 應用程序提供服務。 這兩個應用程序駐留在同一個域“mydomain.com”上,但在不同的端口上。 一個應用程序是 kyestonejs 應用程序,第二個應用程序是 nextjs 應用程序

我正在嘗試使用 Nginix 來反向代理這兩個應用程序。 我已經通過了很多教程,但從未找到正確的答案。

我想實現的是使用nginx通過以下方式進行反向代理:

(nextjs)example.com --> localhost:3001

(keystone) example.com/admin --> localhost 3000

nextjs 應用程序運行良好,而 keystonejs 則不行。 它返回一個 404 頁面。 我的理解是,當我添加位置 /admin 時,它會改變路徑並且應用程序無法加載靜態文件,但我可能是錯的。

這是我的 Nginx conf 文件。

server {
    listen 8080;
    listen [::]:8080;
    server_name example.com;
    return 301 https://example.com$request_uri;
}


server {
    listen 443;
    listen [::]:443 ssl;

    ssl on;
    ssl_certificate /mypath/example.com/fullchain.pem;
    ssl_certificate_key /mypath/example.com/privkey.pem;
    include /mypath/options-ssl-nginx.conf;
    ssl_dhparam /mypath/ssl-dhparams.pem;

    server_name  example.com;

   location / {
        proxy_pass   http://localhost:3001;
    }


    location /admin {
        proxy_pass   http://localhost:3000/;
    }

}

兩個應用程序都在一個專用文件夾中運行,因此結構是

└── my-app
    ├── backend
    │   ├── auth.ts
    │   ├── keystone.ts
    │   ├── package.json
    │   ├── package-lock.json
    │   ├── README.md
    │   ├── Schema
    │   │   ├── Blog
    │   │   │   ├── linkSchema.ts
    │   │   │   ├── postSchema.ts
    │   │   │   └── tagSchema.ts
    │   │   └── userSchema.ts
    │   ├── schema.graphql
    │   ├── schema.prisma
    │   ├── schema.ts
    │   └── tsconfig.json
    └── client
        ├── next.config.js
        ├── package.json
        ├── package-lock.json
        ├── pages
        │   ├── api
        │   │   └── hello.js
        │   ├── _app.js
        │   └── index.js
        ├── public
        │   ├── favicon.ico
        │   └── vercel.svg
        ├── README.md
        └── styles
            ├── globals.css
            └── Home.module.css

有沒有可能我應該以這種方式運行兩個 nodejs 應用程序? 在此先感謝您的幫助

好吧,我在評論中提到sub_filter方法是您別無選擇的最后機會。 無法保證,有時根本無法獲得所需的結果。 上述答案給出了替換集的一般示例,主要用於 HTML/CSS 內容。 對於您的配置,它看起來像

location /admin {
    proxy_pass http://localhost:3000/;
    sub_filter_types text/css application/javascript;
    sub_filter_once off;
    sub_filter 'href="/' 'href="/admin/';
    sub_filter "href='/" "href='/admin/";
    sub_filter 'src="/'  'src="/admin/';
    sub_filter "src='/"  "src='/admin/";
    sub_filter 'url("/'  'url("/admin/';
    sub_filter "url('/"  "url('/admin/";
    sub_filter "url(/"   "url(/admin/";
}

您的特定應用程序可能不需要其中一些替換,這取決於其 HTML/CSS 結構。 另一方面,它可能需要一些額外的替換規則,尤其是對於使用 fetch 請求等的 javascript 代碼。考慮以下 JS 代碼:

fetch('/data/dataset.json').then((response) => {
    // do something
});

要正確重寫給定的代碼,您需要一個額外的替換規則:

sub_filter "fetch('/" "fetch('/admin/";

fetch方法將 URL 作為在其他地方組成的變量時,情況可能更糟:

fetch(url).then((response) => { // "url" is some variable assigned elsewhere
    // do something
});

在這里,您可以使用以下替換規則(也適用於前面的示例):

sub_filter "fetch(" "fetch('/admin' +";

然而,它可以通過多種方式發出異步請求(使用XMLHttpRequestjQuery.ajax等)並且每個復雜的 web 應用程序都需要單獨的方法。 我想你已經明白了。

暫無
暫無

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

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