如何使用Nginx和NodeJ / NestJs为HTTPS解析端口3000?

时间:2019-07-14 16:52:47

标签: node.js nginx

我正在学习NodeJ的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'
}

NB!端口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;
  }

enter image description here

1 个答案:

答案 0 :(得分: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;
}