如何在同一台服务器同时运行Node与Apache,实现HTTPS访问API?
同服务器运行Node+Apache并支持HTTPS访问的解决步骤
1. 清理冲突的Apache配置
你当前存在两个绑定aws.website.com的80端口虚拟主机配置,存在冲突,先删除000-default.conf中对应ServerName aws.website.com的<VirtualHost *:80>块,保留website.com.conf中的80端口配置即可,该配置已经配置了80端口自动跳转HTTPS,符合需求。
2. 给SSL虚拟主机添加反向代理规则
你之前的反向代理规则只写在了80端口配置中,但所有请求都会跳转到443端口,而443端口的SSL配置中没有任何代理规则,导致请求直接访问静态文件目录返回404,修改website.com.le-ssl.conf的<VirtualHost *:443>块,添加如下配置:
ProxyPreserveHost On # 仅转发/endpoint前缀的请求到Node服务,保留静态文件访问能力 ProxyPass /endpoint http://127.0.0.1:3001/endpoint ProxyPassReverse /endpoint http://127.0.0.1:3001/endpoint # 如果需要所有请求都走Node服务,把上面两行的/endpoint替换为/即可
配置修改完成后执行以下命令启用必要的Apache模块并重启服务:
a2enmod proxy proxy_http systemctl restart apache2
3. 修复Node服务代码错误
你的App.js存在多处语法和逻辑问题,会直接导致请求异常:
- 顶部缺少path模块引入,调用
path.resolve会报错,添加const path = require('path')到文件头部 - 重复引入express模块,且路由定义不应该写在App.js末尾,需要移动到单独的
routes/routes.js文件中 - 路由定义顺序错误:
app.get('*', ...)全局匹配规则写在了接口路由前面,会拦截所有接口请求,需要将这行代码移动到所有接口路由定义的后面 - 路由路径书写错误:
router.post('back/get-email'缺少路径开头的斜杠,修改为router.post('/back/get-email'
4. 验证服务可用性
- 确认Node服务正常运行:执行
netstat -tulpn | grep 3001,确认3001端口处于监听状态 - 本地测试Node接口:执行
curl http://127.0.0.1:3001/endpoint,确认能正常返回结果 - 测试HTTPS访问:执行
curl https://aws.website.com/endpoint,确认无超时、404错误即可
内容的提问来源于stack exchange,提问作者Julie
相关产品推荐
相关产品推荐

