通过 proxy_pass 在 NGINX 中提供 NodeJS HTTPS 应用程序

Serve a NodeJS HTTPS app, in NGINX via proxy_pass

我目前有一个 NGINX 服务器 运行正在运行一个 ReactJS 应用程序,指向 /build 文件夹,启用 HTPPS 并通过 NGINX 运行正在运行。

除此之外,我曾经有一个 NodeJS 应用程序(网站)运行在端口 8888 上使用反向代理,默认情况下可以通过端口 80 访问它。此应用程序用于 运行 HTTP 协议。

在 HTTPS 中提供这个 NodeJS 网站的需求已经上升,我在让这两个应用程序一起运行时遇到了很多麻烦。它总是 502 错误或 SLL_do_handshake 错误。

这是我的实际配置。 React 应用程序块未受影响,在我开始修补 Node one 之前它运行良好。

server {
    listen 80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

# PLATFORM  - DEFAULT SERVER
server {
    server_name platform.domain.com;
    
    listen 80 default_server;

    ssl_certificate     /etc/ssl/certs/server.crt;
    ssl_certificate_key /etc/ssl/certs/server.key;

    location / {
        proxy_pass https://xx.xx.xx.xx:8888/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

    error_page 404 /404.html;
    location = /404.html {}

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {}
}

# REACT APP
server {
    server_name dashboard.domain.com;
    
    listen 443 ssl;
    root /var/www/react-app/build;
    index index.html;

    include snippets/cert-params.conf;
    include snippets/ssl-params.conf;        

    location / {
      try_files $uri $uri/ /index.html;
    }
}

我的目标是保持其当前功能:2 个独立的应用程序,在同一个 machine/webserver 上,我可以根据用户需要相互重定向。

我错过了什么?大多数答案让我让 NGINX 处理 HTTPS 部分并让 NodeJS 应用 运行ning 在 HTTP 上,但我真的需要让 NodeJS 运行ning 在 HTTPS 上。

提前致谢!

如果您想将两者都作为 https 处理,那么您可以按如下方式组合块。 在 /api 你可以接受所有与节点相关的请求。你可以保留 / 作为你的反应路径。

server {
    listen 80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

# Combine React and Node in same 443 block
server {
    server_name dashboard.domain.com;
    
    listen 443 ssl;
    
    # REACT APP
    root /var/www/react-app/build;
    index index.html;

    include snippets/cert-params.conf;
    include snippets/ssl-params.conf;        

    
    location /api {
        proxy_pass https://xx.xx.xx.xx:8888/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
    
    location / {
      try_files $uri $uri/ /index.html;
    }
    
}

如果您首先使用 nginx 处理所有 https 请求,然后使用简单的 http 协议将代理传递给节点服务器,实际上会更好,因为它减少了节点 js 端的 ssl 处理时间。