我有以下 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/login
为http://localhost:4000/auth/login
。刚才,由于缺少斜杠,您传递的请求 URI 未发生改变:
proxy_pass http://localhost:4000/;