Postgraphile /graphql端点无报错无限挂起问题排查求助
问题根因
- 路由冲突:你在同一个Express服务上同时挂载了PostGraphile和Apollo Server两个GraphQL服务,两者默认都占用
/graphql端点。本地curl请求刚好匹配到先加载的处理器可以正常返回,公网请求携带的Host头、请求方法和本地测试不同,导致两个处理器的执行逻辑冲突,请求无法被正常响应就会无限挂起。 - 反向代理缺少WebSocket支持:GraphiQL加载schema会用到WebSocket协议做订阅和内省查询,当前Apache配置只支持普通HTTP请求转发,长连接请求直接被卡住。
- 可选风险点:原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
相关产品推荐
相关产品推荐

