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
相关产品推荐
相关产品推荐

