【发布时间】:2017-05-10 18:46:46
【问题描述】:
我已经制作了我的 nodejs 应用程序,将其托管在数字海洋服务器上,将其连接到域名,一切正常,但是当我尝试放置 ssl 证书(使用 https 模块而不是 http)时,它没有作品。这是一个代码:
var sslopt = {
key : fs.readFileSync('./ssl/server.key'),
cert : fs.readFileSync('./ssl/server.crt'),
ca : [fs.readFileSync('./ssl/ca1.crt'), fs.readFileSync('./ssl/ca2.crt')]
};
var server = https.createServer(sslopt,function(req,res){
...
});
server.listen(8001,function(err){
...
});
我的 nodejs 应用程序运行良好,但如果我尝试访问它,我只会看到 502 Bad Gateway 错误,并且没有向我的 nodejs 应用程序发送任何请求。当我打开我的 nginx 错误日志时,我看到了错误
-date--time- [error] 18116#18116: *1 recv() 失败(104: Connection reset by peer)同时从上游读取响应头,客户端:-ip-,服务器:-server-,请求:“GET / HTTP/1.1”,上游:“http://127.0.0.1:8001/”,主机:-host-
但最奇怪的是,如果我尝试使用 https 协议和端口 8001 (https://{domainname}.com:8001) 进行访问,我可以看到我的应用程序运行良好,但连接不安全。
我只是无法理解我做错了什么......
附言
我的 nginx 配置文件
server {
listen *:443;
listen *:80;
server_name {myhostname};
access_log /var/log/nginx/qt.access.log;
error_log /var/log/nginx/qt.error.log;
root /srv/qt;
index index.html index.htm index.php;
# Headers to pass to proxy server.
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_cache_bypass $http_upgrade;
proxy_http_version 1.1;
proxy_redirect off;
# Go to next upstream after if server down.
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_connect_timeout 5s;
# Gateway timeout.
proxy_read_timeout 20s;
proxy_send_timeout 20s;
# Buffer settings.
proxy_buffers 8 32k;
proxy_buffer_size 64k;
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
【问题讨论】:
-
proxy_pass设置为http://,而不是https://。但是,我建议不要让 Node 处理 HTTPS,而是让 NGINX 来处理(所以 "client-to-NGINX" 是 HTTPS 并且 "NGINX-to-Node" 是纯 HTTP)。 -
感谢您的回复。如果我将证书附加到 nginx,然后使用 http 而不是 https 一切正常,但我现在无法连接到 websocket 服务器。在控制台中,我看到了错误。 WebSocket 连接到 'wss://{hostname}:8001/' 失败:连接建立错误:net::ERR_CONNECTION_CLOSED 并且没有请求发送到我的 websocket 服务器日志
-
你应该让 NGINX 为你代理你的 websockets:
wss://{hostname}(不需要端口号) -
现在它响应我与 'wss://{hostname}/' 的连接失败:WebSocket 握手期间出错:意外响应代码:200 在我的控制台中,我看到它就像简单的 http 请求一样。 ..
-
这可能是个问题,尽管我认为常规 HTTPS 请求也会在这种情况下导致问题。也许(目前)将 HTTPS 部分移回 Node 更容易:(