生产服务器中GraphQL连接被拒绝问题求助
问题解决步骤
1. 修复客户端API调用地址错误
你客户端硬编码的http://localhost:9000/graphql是开发环境的本地地址,生产环境下浏览器会把这个localhost解析为用户自己的本地机器,根本不会指向你的DigitalOcean服务器——这是核心问题。
- 将客户端的API地址改为相对路径,比如
/graphql,这样会自动使用当前域名发起请求; - 或者配置Angular的生产环境变量,在
environment.prod.ts里设置apiUrl: '/graphql',打包时自动替换地址。
2. 处理端口占用问题
提示EADDRINUSE说明9000端口确实有进程在运行,先定位进程:
# 查找占用9000端口的进程ID lsof -i :9000 # 或者用netstat命令 netstat -tulpn | grep 9000
拿到进程ID(PID)后强制终止进程:
kill -9 <PID>
之后建议用进程管理工具托管Express服务,避免终端关闭后进程终止:
# 安装pm2 npm install -g pm2 # 启动服务并设置开机自启 pm2 start server/index.js --name graphql-server pm2 startup pm2 save
3. 正确配置Nginx反向代理
之前修改服务器块导致客户端无法访问,大概率是静态文件路径或反向代理规则错误。以下是标准配置示例:
server { listen 80; server_name your-domain.com; # 替换为你的GoDaddy域名 # 指向Angular客户端文件目录 root /var/www/your-client-dist-folder; # 替换为你上传客户端文件的实际路径 index index.html; # 处理Angular单页应用路由 location / { try_files $uri $uri/ /index.html; } # 反向代理GraphQL请求到本地9000端口 location /graphql { proxy_pass http://localhost:9000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
配置完成后验证并重启Nginx:
nginx -t systemctl restart nginx
额外注意事项
- 确保DigitalOcean Droplet防火墙开放80/443端口(若启用HTTPS),9000端口无需对外暴露,Nginx会在内部完成代理;
- 后续可配置Let's Encrypt证书启用HTTPS,避免混合内容错误;
- 检查Express服务是否绑定
0.0.0.0而非仅localhost,确保Nginx能正常访问服务。
内容的提问来源于stack exchange,提问作者Peter Boomsma
相关产品推荐
相关产品推荐

