You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 23:35:02