树莓派Docker环境下Nginx访问Node应用遇ERR_SSL_PROTOCOL_ERROR问题
问题分析与解决方案
核心问题定位
从现象判断,Node应用自身配置了强制HTTPS重定向,但你的Nginx仅监听80端口(HTTP协议),未配置SSL支持。当Nginx将请求转发给Node应用后,Node返回HTTPS重定向指令,导致浏览器尝试在80端口建立SSL连接,从而抛出ERR_SSL_PROTOCOL_ERROR异常。
具体解决步骤
1. 验证Node应用的重定向逻辑
先确认Node应用的强制跳转行为:
- 在树莓派本地执行
curl -v http://127.0.0.1:3000,观察响应头是否包含Location: https://xxx重定向信息。 - 若存在重定向,检查Node应用代码:
- 比如是否使用
express-sslify类中间件,或手动通过请求头判断做HTTPS跳转的逻辑。 - 若暂时不需要HTTPS,可以临时注释重定向代码,测试访问是否恢复正常。
- 比如是否使用
2. 配置Nginx支持HTTPS(推荐方案)
如果Node应用必须保留HTTPS重定向,需给Nginx配置SSL证书(局域网使用自签证书即可):
步骤2.1 生成自签SSL证书
在树莓派终端执行以下命令,生成证书并保存到指定目录:
mkdir -p /my-node-path/ssl openssl req -x509 -newkey rsa:4096 -keyout /my-node-path/ssl/key.pem -out /my-node-path/ssl/cert.pem -days 365 -nodes
按提示填写信息(局域网使用可随意填写)。
步骤2.2 修改Nginx配置文件
替换nginx.conf为以下内容,添加HTTPS监听和代理配置:
worker_processes 1; events { worker_connections 1024; } http { server { listen 80; server_name 192.168.100.82; # 将所有HTTP请求重定向到HTTPS return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name 192.168.100.82; # 指定自签证书路径 ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; location / { proxy_pass http://127.0.0.1:3000; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; # 告诉Node应用当前请求是通过HTTPS转发的 proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; } } }
步骤2.3 更新Docker Compose配置
修改docker-compose.yml,添加443端口映射和SSL目录挂载:
version: '3' services: app: build: context: /my-node-path dockerfile: Dockerfile ports: - "3000:3000" restart: unless-stopped privileged: true network_mode: host nginx: image: nginx:latest ports: - "80:80" - "443:443" volumes: - /my-node-path/nginx.conf:/etc/nginx/nginx.conf - /my-node-path/ssl:/etc/nginx/ssl depends_on: - app restart: unless-stopped privileged: true network_mode: host
3. 重启容器并测试
执行以下命令重启服务:
docker-compose down && docker-compose up -d
- 树莓派本地测试:
curl -k -v https://192.168.100.82(-k参数忽略自签证书的安全提示),确认能正常获取Node应用响应。 - 局域网其他机器访问
https://192.168.100.82,浏览器会提示证书不安全,选择“继续访问”即可正常使用。
4. 额外检查项
- 确认Node应用监听的是
0.0.0.0:3000而非仅localhost:3000,执行netstat -tulpn | grep 3000查看端口监听状态。 - 检查树莓派iptables规则是否拦截80/443端口:
iptables -L -n。
内容的提问来源于stack exchange,提问作者Paweł Jakubowski
相关产品推荐
相关产品推荐

