通过proxy_pass

时间:2020-10-21 09:52:05

标签: node.js nginx nginx-reverse-proxy nginx-config

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

此外,我曾经在8888端口上运行一个带有反向代理的NodeJS应用程序(网站),默认情况下可以通过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;
    }
}

我的目标是维持其当前功能:在同一台计算机/ Web服务器上,我可以根据用户的需要相互重定向两个独立的应用程序。

我想念什么?大多数答案使我让NGINX处理HTTPS部分,并使NodeJS应用程序在HTTP上运行,但是我确实需要让NodeJS在HTTPS上运行。

谢谢!

1 个答案:

答案 0 :(得分:1)

由于您想将两者都当作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处理时间。