Docker Compose部署Node.js-Nginx-Vite项目遇PR_END_OF_FILE_ERROR求助
解决Docker Compose部署Node.js-Nginx-Vite HTTPS项目的连接错误问题
以下是针对你遇到的PR_END_OF_FILE_ERROR(Firefox)和ERR_CONNECTION_CLOSED(Chrome)错误的排查与解决步骤:
1. 修正容器间网络通信配置
- Docker Compose默认创建专属桥接网络,容器间需通过服务名而非
localhost通信。确认Nginx配置中的反向代理目标是否使用Node.js服务的Compose服务名(比如http://node-server:3000,而非localhost:3000)——单独运行时用localhost是因为容器共享主机网络,Compose中容器处于独立网络空间。 - 确保Node.js服务的监听地址设置为
0.0.0.0,而非127.0.0.1/localhost,容器内服务需监听所有网卡才能被其他容器访问。示例代码:https.createServer(options, app).listen(3000, '0.0.0.0');
2. 验证自签名证书的挂载与路径
- 确认证书文件(
.key和.pem)已通过Compose的volumes正确挂载到Node.js和Nginx容器内,且容器内的路径与代码/配置中指定的路径完全一致。比如Compose中Node服务的挂载配置:
则Node.js代码中读取证书的路径应为services: node-server: volumes: - ./certs:/app/certs # 本地certs目录挂载到容器内/app/certs/app/certs/private.key和/app/certs/certificate.pem。 - 在Node.js容器内执行证书有效性验证:
若输出中出现证书加载失败、格式错误等信息,需检查证书文件本身或挂载路径。openssl s_client -connect localhost:3000 # 替换为Node.js的HTTPS端口
3. 检查Node.js HTTPS服务配置
- 确保Node.js代码中正确加载证书并创建HTTPS服务器,示例代码:
const https = require('https'); const fs = require('fs'); const express = require('express'); const app = express(); const sslOptions = { key: fs.readFileSync('/app/certs/private.key'), cert: fs.readFileSync('/app/certs/certificate.pem') }; app.get('/api', (req, res) => { res.send('HTTPS API response'); }); https.createServer(sslOptions, app).listen(3000, '0.0.0.0', () => { console.log('Node.js HTTPS server running on port 3000'); }); - 确认Compose文件中Node服务的内部端口与代码监听端口一致,若通过Nginx反向代理,无需对外暴露Node服务端口(仅需容器间内部通信即可)。
4. 排查Nginx反向代理配置
- 若Nginx反向代理到Node.js的HTTPS端口,需确保Nginx能处理HTTPS上游连接。测试环境可临时添加
proxy_ssl_verify off;跳过证书验证(生产环境需配置证书信任):server { listen 443 ssl; server_name localhost; ssl_certificate /etc/nginx/certs/certificate.pem; ssl_certificate_key /etc/nginx/certs/private.key; location /api/ { proxy_pass https://node-server:3000; proxy_ssl_verify off; # 测试环境临时关闭验证 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { proxy_pass http://vite-server:5173; } } - 确认Nginx容器已正确挂载证书文件到配置指定的路径(如
/etc/nginx/certs/)。
5. 检查端口与防火墙
- 执行
netstat -tulpn | grep 443(Linux/macOS)或netstat -ano | findstr :443(Windows),确认443端口未被其他服务占用。 - 检查Docker是否有权限使用HTTPS端口,部分系统需root权限或配置端口范围。
内容的提问来源于stack exchange,提问作者Kartic Joshi
相关产品推荐
相关产品推荐

