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

Ubuntu系统Apache环境下如何实现多个服务共用443端口

解决方案

核心结论

  • 两个独立进程无法直接绑定同一个443端口,你遇到的EADDRINUSE报错是因为Apache已经占用了443端口,Node.js进程再次绑定就会冲突
  • 你可以用已经监听443端口的Apache作为反向代理,实现两个域名共用443端口的需求

具体操作步骤

第一步:修改Node.js服务监听配置

将Node.js后端服务的监听地址改为本地回环地址的非443端口,比如127.0.0.1:3000,不需要暴露到公网,也不需要单独配置SSL证书。

第二步:启用Apache代理模块

执行以下命令启用所需的代理模块:

a2enmod proxy proxy_http proxy_html
systemctl restart apache2

第三步:调整Apache虚拟主机配置

首先修正你现有配置的错误:example1-le.ssl.conf中SSLCertificateKeyFile错误配置成了example2的私钥,需要改为对应域名自己的私钥路径:

SSLCertificateKeyFile /etc/letsencrypt/live/example1.com/privkey.pem

然后修改后端域名(假设为example2.com)的SSL虚拟主机配置,删除原有DocumentRoot相关配置,添加反向代理规则:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName example2.com
    ServerAlias www.example2.com
    ServerAdmin info@example.com
    ErrorLog ${APACHE_LOG_DIR}/example2_error.log
    CustomLog ${APACHE_LOG_DIR}/example2_access.log combined

    # 反向代理规则,转发到本地Node.js服务
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/
    # 保留请求原始信息,方便Node.js获取客户端IP等数据
    ProxyPreserveHost On

    SSLCertificateFile /etc/letsencrypt/live/example2.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example2.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

React前端对应的example1.com配置不需要调整,保持原有的静态文件服务配置即可。

第四步:重启Apache生效

执行以下命令重启Apache加载新配置:

systemctl restart apache2

实现原理

Apache监听443端口后,会根据TLS的SNI扩展判断请求对应的域名,自动匹配对应的虚拟主机规则:

  • 请求example1.com时,直接返回React打包后的静态文件
  • 请求example2.com时,将请求转发到本地运行的Node.js服务,再将服务返回的结果回传给客户端

整个过程SSL证书校验、HTTPS握手都由Apache处理,Node.js只需要处理业务逻辑即可,两个域名对外都使用443端口,不会出现端口冲突。

内容的提问来源于stack exchange,提问作者Julian Bermolen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 21:18:02