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

AWS Ubuntu服务器Jupyter Docker内核断开与Apache代理400错误排查

问题描述

在AWS的Ubuntu服务器上运行Jupyter Notebook,执行命令:

docker run -d -p 8880:8888 jupyter/all-spark-notebook

Web界面可正常访问,进入容器获取token后能登录,但界面底部持续显示:

Python 3 (ipykernel)|Disconnected

执行命令查看容器日志:

docker logs --tail -50 [container ID]

发现大量400状态码的GET请求,集中在/api/kernels/channels和/api/events/subscribe路径。

已参考Apache文档配置反向代理(已启用Rewrite模块并重启Apache),配置内容如下:

<VirtualHost *:8888>

        ServerName host.domain.com

        <IfModule mod_ssl.c>
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/host.domain.com/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/host.domain.com/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/host.domain.com/fullchain.pem
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        ProxyPreserveHost On
        ProxyRequests Off
        ProxyVia On

        ProxyPass / http://localhost:8880/
        ProxyPassReverse / http://localhost:8880/

        RewriteEngine on
        RewriteCond ${HTTP:Upgrade} websocket [NC]
        RewriteCond ${HTTP:Connection} upgrade [NC]
        RewriteRule ^/?(.*) "ws://localhost:8880/$1" [P,L]

#        RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
#        RequestHeader set "X-Forwarded-SSL" expr=%{HTTPS}
        </IfModule>

</VirtualHost>

更换base-notebook镜像后问题仍未解决,询问遗漏了哪些关键配置。

排查与解决建议
  • 启用WebSocket代理模块:除mod_rewrite外,必须启用mod_proxy_wstunnel模块,这是Apache处理WebSocket转发的核心依赖。执行命令启用:
    sudo a2enmod proxy_wstunnel
    sudo systemctl restart apache2
    
  • 调整规则匹配顺序:将Rewrite规则移至ProxyPass/ProxyPassReverse之前,因为Apache会优先匹配ProxyPass规则,导致WebSocket请求被错误转发为HTTP请求。修改后配置顺序如下:
    RewriteEngine on
    RewriteCond ${HTTP:Upgrade} websocket [NC]
    RewriteCond ${HTTP:Connection} upgrade [NC]
    RewriteRule ^/?(.*) "ws://localhost:8880/$1" [P,L]
    
    ProxyPass / http://localhost:8880/
    ProxyPassReverse / http://localhost:8880/
    
  • 启用转发协议头部:取消注释配置中的X-Forwarded-Proto和X-Forwarded-SSL设置,Jupyter需要这些头部识别请求的HTTPS协议,避免WebSocket连接时出现协议不匹配:
    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
    RequestHeader set "X-Forwarded-SSL" expr=%{HTTPS}
    
  • 配置Jupyter代理信任规则:启动容器时添加参数,指定允许的外部域名并开启头部信任,确保Jupyter认可反向代理的请求:
    docker run -d -p 8880:8888 jupyter/all-spark-notebook \
      jupyter notebook --NotebookApp.allow_origin='https://host.domain.com' \
      --NotebookApp.trust_xheaders=True
    
  • 检查端口配置冲突:当前VirtualHost监听8888端口,但容器映射的是宿主机8880→容器8888。如果通过域名访问的是标准HTTPS端口(443),需将VirtualHost改为*:443,避免端口占用冲突;若确实使用8888端口,需确保宿主机防火墙已开放该端口。

内容的提问来源于stack exchange,提问作者Adam Winter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:28:39