【问题标题】:How to resolve port 3000 for HTTPS using Nginx and NodeJs/NestJs?如何使用 Nginx 和 NodeJs/NestJs 为 HTTPS 解析端口 3000?
【发布时间】:2019-07-15 02:56:20
【问题描述】:

我正在学习 NodeJs 的 NestJs 框架,以使用 Vue 和后端部分创建带有前端的网站。 所有组件都在这台服务器上:Nginx,前端和后端(本文帮助我https://scotch.io/tutorials/building-a-modern-app-using-nestjs-mongodb-and-vuejs) 如果我通过 IP 地址连接到网站,一切正常。 然后我需要将它迁移到带有 SSL 的真实站点以进行 HTTPS 访问。 这是一个问题。

在前端 - 我将文件 /nestjs-frontend/src/helper.js 更改为:

// ./src/helper.js
export const server = {
    baseURL: 'https://my_site.ru:3000'
}

注意!端口 3000

问题在于从主域https://my_site.com 访问内部API 路径https://my_site.com:3000

请帮我解决这个问题。

我的 Nginx 配置是:

server {

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name my_site.com www.my_site.com;

        location / {
                #proxy_set_header Host $host;

                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header        X-Forwarded-Proto https;
                proxy_set_header        SSL_PROTOCOL $ssl_protocol;

                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                #proxy_set_header Host $http_host;
                proxy_set_header X-NginX-Proxy true;

                #proxy_set_header    X-Client-Verify  SUCCESS;
                #proxy_set_header    X-Client-DN      $ssl_client_s_dn;
                #proxy_set_header    X-SSL-Subject    $ssl_client_s_dn;
                #proxy_set_header    X-SSL-Issuer     $ssl_client_i_dn;

                proxy_redirect off;

                proxy_pass http://127.0.0.1:8080;
        }

    #listen 8080;
    listen 443 ssl; # managed by Certbot
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/my_site.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/my_site.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload;";

}

server {
    if ($host = www.my_site.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = my_site.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80 default_server;
        listen [::]:80 default_server;

        server_name my_site.com www.my_site.com;
    return 404; # managed by Certbot

}

upstream app_nodejs {
    server 127.0.0.1:3000;
  }

upstream web_nodejs {
    server 127.0.0.1:8080;
  }

【问题讨论】:

    标签: node.js nginx


    【解决方案1】:

    问题是你的 nginx 服务器没有监听 3000 端口。它只监听 443 端口(https 标准端口)。它也在监听 80 端口(http 标准端口),但只重定向到 443。

    你需要做的是对从443端口到3000端口的api请求和8080端口的web资源请求使用反向代理。

    为此,您需要一种方法来区分 API 请求和 Web 请求,并为每个请求创建一个不同的 location 块。执行此操作的典型方法是比较部分 url 路径。例如,您可以更改您的应用,使所有 API 请求路径如下所示:

    /api/v1/customers
    

    您可以像这样专门为 API 请求创建一个位置块:

    location /api/v1 {
      ...
      proxy_pass http://127.0.0.1:3000;
    }
    

    并且你保持你的其他位置块机智。除了proxy_pass之外,新位置块的内容应该与原来的大致相同。

    如果您不想更改应用程序,则可以在单个位置块中使用正则表达式枚举所有请求路径,但这确实不可扩展。它看起来像这样:

    location ~ ^/{customer|item|group}.*$ {
      ...
      proxy_pass http://127.0.0.1:3000;
    }
    

    【讨论】:

    • 非常感谢您的回答!它对我有帮助!
    • 在您的帮助下,我做了这些事情:我在 nginx 配置文件中将文件 ./src/helper.js 更改为:export const server = { baseURL: 'https://my_site.ru' // remove port 3000 } 我添加了以下代码:location ~ customer { proxy_pass http://127.0.0.1:3000; } 它工作正常!谢谢!
    猜你喜欢
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    相关资源
    最近更新 更多