在含Portainer、NPM的VPS上用Docker部署XMPP服务器遇子域名访问问题
XMPP容器 + Nginx Proxy Manager 配置方案
XMPP和Jellyfin这类纯HTTP服务不一样,它依赖多端口混合协议,这是你部署失败的核心原因——大部分教程只提HTTP反向代理,但XMPP的核心TCP端口需要额外配置。下面是适配你现有NPM+Portainer环境的完整步骤:
1. 先搞定XMPP容器的端口映射
以主流的Prosody容器为例(其他XMPP服务器如Ejabberd步骤一致),在Portainer启动容器时,必须映射以下端口:
5222:5222TCP(XMPP客户端连接端口)5269:5269TCP(XMPP服务器间通信端口)5280:5280HTTP(BOSH/WebSocket,用于网页端XMPP客户端)5281:5281HTTPS(加密版BOSH/WebSocket)
注意:不要用随机端口,必须固定宿主机端口和容器端口一致,否则后续NPM配置会混乱。
2. NPM的反向代理配置
① HTTP/WebSocket管理界面(子域名访问)
如果你的XMPP服务器带网页管理端,用子域名xmpp.yourdomain.com访问:
- 在NPM新建Proxy Host,填写子域名,目标填宿主机IP(或Docker内网的XMPP容器IP),端口选
5280(如果用HTTPS就填5281) - 开启SSL,用Let's Encrypt申请对应子域名的证书
- 切换到
Advanced标签,添加WebSocket支持的Nginx配置:
location / { proxy_pass http://[XMPP容器IP]:5280; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
② 核心TCP端口的Stream代理(关键)
NPM默认只处理HTTP/HTTPS,XMPP的核心TCP连接需要用NPM的Streams功能:
- 打开NPM左侧菜单的
Streams,新建Stream,类型选TCP - 监听端口填
5222,目标地址填[XMPP容器IP]:5222,保存 - 重复上述步骤,新建另一个TCP Stream,监听
5269端口,目标指向[XMPP容器IP]:5269 - 如果需要加密的客户端连接(端口5223),新建
SSL TCP类型的Stream,监听5223,目标容器5223,同时上传之前申请的SSL证书
3. DNS记录配置
除了常规的A记录(xmpp.yourdomain.com指向VPS IP),必须添加SRV记录让XMPP客户端自动发现服务器:
_xmpp-client._tcp.yourdomain.com:优先级0,权重5,端口5222,目标xmpp.yourdomain.com_xmpp-server._tcp.yourdomain.com:优先级0,权重5,端口5269,目标xmpp.yourdomain.com
4. XMPP容器内部配置
进入Portainer的XMPP容器控制台,修改配置文件(比如Prosody的prosody.cfg.lua):
- 设置
VirtualHost为你的子域名xmpp.yourdomain.com - 开启SSL,将NPM申请的证书文件(通常在NPM的
data/letsencrypt/live/xmpp.yourdomain.com目录)挂载到容器内的证书路径 - 确保配置中允许外部连接,关闭
localhost_only之类的限制
内容的提问来源于stack exchange,提问作者FinallyCanuck
相关产品推荐
相关产品推荐

