SSL_ERROR_RX_RECORD_TOO_LONG 使用 Nginx 反向代理和 certbot

SSL_ERROR_RX_RECORD_TOO_LONG 使用 Nginx 反向代理和 certbot

我有以下 Nginx 配置:

erver {
    server_name api.wijdenbos.ch www.api.wijdenbos.ch;

    location /akira/ {
        proxy_pass http://localhost:4000/;
        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;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
    }



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

在我的应用程序中,我有一条指向https://api.wijdenbos.ch/akira/auth/login但当我访问该页面时,我得到SSL_ERROR_RX_RECORD_TOO_LONG,SSL正在工作,因为如果我访问常规域名https://api.wijdenbos.ch/我看到 Nginx 起始页已经启用了 HTTPS,为什么访问路由时会出现这个错误?

答案1

您的问题来自 Node.js Express 应用返回的疯狂重定向。当您首次发布时,它将所有内容重定向到https://api.wijdenbos.ch:4000,这给出了错误:该端口使用 HTTP,而不是 SSL。

当在正向代理后面运行应用程序时(无论哪个框架/技术使用该应用程序)您需要进行一些配置。参见代理后面的 Express针对您的具体情况。nginx您必须设置 Express 所需的标题:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;

此外,您可能还想摆脱:

if (NODE_ENV === "production") {
    app.use(forceSSL);
}

在您的应用程序中,这会导致疯狂的重定向:它重定向到https,但它没有配置,因此它重定向到同一个端口。

评论:将您的应用绑定到localhost,以便它仅可通过nginx

app.listen(4000, 'localhost', () => {
    logger.info("Express server is listening on port 4000");
});

编辑: 看了一会儿你的代码,您似乎想要重写https://api.wijdenbos.ch/akira/auth/loginhttp://localhost:4000/auth/login。刚才,由于缺少斜杠,您传递的请求 URI 未发生改变:

proxy_pass http://localhost:4000/;

相关内容