部署GCP负载均衡后Apollo Studio无法连接Apollo Server
解决Apollo Studio/Client无法连接GraphQL服务器但Postman等工具可正常访问的问题
以下是针对该场景的核心排查方向和解决方法:
CORS配置缺失或不完整
浏览器环境(包括Apollo Studio网页版、前端Apollo Client)会触发CORS预检请求(OPTIONS方法),而Postman、CURL等工具不会。需确保Nginx和Apollo服务器的CORS配置覆盖必要规则:- Nginx层面添加预检请求处理和跨域头:
location /graphql { # 处理OPTIONS预检请求 if ($request_method = OPTIONS) { add_header Access-Control-Allow-Origin "*"; add_header Access-Control-Allow-Methods "POST, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, Authorization, Apollo-Require-Preflight"; add_header Access-Control-Max-Age 3600; add_header Content-Length 0; add_header Content-Type text/plain; return 200; } # 转发请求到后端服务 proxy_pass http://localhost:4000; # 给实际请求添加跨域头 add_header Access-Control-Allow-Origin "*"; add_header Access-Control-Allow-Methods "POST, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, Authorization, Apollo-Require-Preflight"; } - Apollo服务器层面:若使用
apollo-server,确保启用CORS插件并配置正确的允许源和头,例如:const server = new ApolloServer({ typeDefs, resolvers, cors: { origin: "*", // 生产环境建议指定具体域名 allowedHeaders: ["Content-Type", "Authorization", "Apollo-Require-Preflight"], methods: ["POST", "OPTIONS"] } });
- Nginx层面添加预检请求处理和跨域头:
自定义请求头被拦截
Apollo Studio会发送apollo-client-name、apollo-client-version等自定义头,需确认Nginx和GCP负载均衡器未拦截这些头,确保所有请求头能正常转发到后端实例。SSL证书校验问题
浏览器对SSL证书的校验比Postman严格,检查GCP负载均衡器的SSL证书是否完整(包含证书链)、是否在有效期内、域名匹配是否正确。若证书不被浏览器信任,会导致连接失败。预检请求未正确响应
检查Nginx是否正确处理OPTIONS请求,返回200状态码和必要的CORS头。可以用浏览器开发者工具的Network面板查看预检请求的响应状态和头信息,确认是否符合要求。
内容的提问来源于stack exchange,提问作者NTF
相关产品推荐
相关产品推荐

