首页 > 解决方案 > 无法在 NGINX 的 5050 端口上监听 https

问题描述

我有一个 nodejs 应用程序,用作监听端口 5050 的网络服务器

我已经创建了证书并配置了适用于标准端口(https://xx/)的正常 https 调用的 NGINX

如果我使用普通的http://xx:5050调用来调用端口 5050,它也可以工作,但是使用https://xx:5050/conf调用我得到:此站点无法提供安全连接

NGINX 配置文件下方:(网站名称已更改)

server {

        root /var/www/x.x/html;
        index index.html index.htm index.nginx-debian.html;

        server_name x.x www.x.x;

        location / {
                try_files $uri $uri/ =404;
        }

        location /conf {
               proxy_pass http://localhost:5050;
               try_files $uri $uri/ =404;
        }

        location /wh {
               proxy_pass http://localhost:5050;
               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;
        }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/x.x/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/x.x/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


}

我在这里做错了什么?

标签: node.jsnginxhttpsdigital-ocean

解决方案


您将 nginx 配置为充当反向代理,将传入的请求从 转发https://example.com/whateverhttp://localhost:5050/whatever。你说你做对了,它有效。好的。(得到那个工作是 xxx 脖子上的一个臭名昭著的痛苦。)

您没有将 nginx 配置为侦听端口 5050。您也不应该;这是它用来将请求传递给您的 nodejs 程序的端口。您不能将请求从端口 5050 转发到端口 5050。如果您尝试让 nodejs 和 nginx 都侦听端口 5050,那么当您启动服务器时,其中一个会收到 EADRINUSE 错误。

您的 nodejs 程序在端口 5050 上侦听 http 请求,而不是 https 请求。您不能轻易让它在同一端口上同时侦听 http 和 https。您的 nodejs 程序在 nginx 后面时,不应包含任何 https 服务器,仅包含 http。(您正在让 nginx 进行艰苦的加密工作来处理 https,并让 nodejs 处理您的请求。)

您也不希望您的 nodejs 程序直接侦听来自服务器外部的仅 http 请求。因为网络蠕虫。

如果您可以阻止从 localhost 以外的任何地方访问端口 5050,则可以宣布配置服务器任务的胜利。您可以使用

server.listen({
  host: 'localhost',
  port: 5050, ...
});```

在你的 nodejs 程序中。或者,您可以配置服务器的防火墙以阻止除 https(和 ssh,以便您管理它)以外的任何端口上的传入请求。Digital Ocean在这一点上有一个有用的教程。


推荐阅读