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

在含Portainer、NPM的VPS上用Docker部署XMPP服务器遇子域名访问问题

XMPP容器 + Nginx Proxy Manager 配置方案

XMPP和Jellyfin这类纯HTTP服务不一样,它依赖多端口混合协议,这是你部署失败的核心原因——大部分教程只提HTTP反向代理,但XMPP的核心TCP端口需要额外配置。下面是适配你现有NPM+Portainer环境的完整步骤:

1. 先搞定XMPP容器的端口映射

以主流的Prosody容器为例(其他XMPP服务器如Ejabberd步骤一致),在Portainer启动容器时,必须映射以下端口:

  • 5222:5222 TCP(XMPP客户端连接端口)
  • 5269:5269 TCP(XMPP服务器间通信端口)
  • 5280:5280 HTTP(BOSH/WebSocket,用于网页端XMPP客户端)
  • 5281:5281 HTTPS(加密版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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:01:00