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

Postgraphile /graphql端点无报错无限挂起问题排查求助

问题根因

  1. 路由冲突:你在同一个Express服务上同时挂载了PostGraphile和Apollo Server两个GraphQL服务,两者默认都占用/graphql端点。本地curl请求刚好匹配到先加载的处理器可以正常返回,公网请求携带的Host头、请求方法和本地测试不同,导致两个处理器的执行逻辑冲突,请求无法被正常响应就会无限挂起。
  2. 反向代理缺少WebSocket支持:GraphiQL加载schema会用到WebSocket协议做订阅和内省查询,当前Apache配置只支持普通HTTP请求转发,长连接请求直接被卡住。
  3. 可选风险点:原vhost配置开启了ProxyRequests on属于正向代理配置,存在被恶意利用的安全风险;生产环境开启watchPg会持续监听PostgreSQL schema变化,额外占用连接资源,也有可能导致查询卡顿。

修复方案

第一步:解决路由冲突

二选一即可:

  • 如果你不需要同时保留两个GraphQL服务,直接删掉Apollo Server相关的初始化代码,PostGraphile本身就会自动生成完整的GraphQL接口和GraphiQL界面
  • 如果你需要同时保留两个服务,修改Apollo Server挂载代码,给它分配独立路径:
// 替换原有的server.applyMiddleware({ app })
server.applyMiddleware({ 
  app,
  path: '/apollo-graphql'
})

第二步:修改Apache反向代理配置,添加WebSocket支持

最终vhost配置参考如下:

<VirtualHost 185.132.41.127:80>
    ServerName api.miniatureawards.com
    Redirect permanent / https://api.miniatureawards.com/
</VirtualHost>
<IfModule mod_ssl.c>
    <VirtualHost 185.132.41.127:443>
        ServerAdmin jamie@hutber.com
        ServerName api.miniatureawards.com

        ProxyRequests off
        LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
        LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so
        LoadModule proxy_wstunnel_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so

        # WebSocket转发规则
        RewriteEngine On
        RewriteCond %{HTTP:Upgrade} =websocket [NC]
        RewriteRule /(.*) ws://localhost:4006/$1 [P,L]

        ProxyPass / http://localhost:4006/
        ProxyPassReverse / http://localhost:4006/
        ProxyPreserveHost On
        ProxyTimeout 600

        # SSL证书配置
        SSLEngine on

        ErrorLog ${APACHE_LOG_DIR}/error_api.miniatureawards.com.log
        CustomLog ${APACHE_LOG_DIR}/access_api.miniatureawards.com.log combined

    </VirtualHost>
</IfModule>

改完后执行命令重启Apache生效:

# 启用必要的模块
a2enmod proxy_wstunnel rewrite
# 重启Apache
systemctl restart apache2

第三步:生产环境优化(可选)

如果是生产环境部署,把postgraphile初始化配置里的watchPg: true改成watchPg: false,减少不必要的数据库连接占用。

内容的提问来源于stack exchange,提问作者Jamie Hutber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:06:03