我在 ec2 的 3000 端口上运行一个 nodejs 服务器。为了将其连接到互联网,我运行了一个 nginx 服务器来代理从端口 80 到 3000 的请求。
我有一个 ec2 域“http://ec2-xxx.compute.amazonaws.com”,并且我可以在这里成功地发出发布和获取请求。
现在我有一个域,并希望“api.mydomain.com”指向此服务器。为此,我使用了 ACM 和 Cloudfront,在配置它们之后,我能够成功通过 https 发出 GET 请求,但是 post 请求一直收到来自 cloudfront 的 502 错误响应。
请求的形式如下:
(https)-> route53 -> cloudfront -> (http)-> nginx -> nodejs
GET 请求http://ec2-xxx.compute.amazonaws.com: 在职的
POST 请求http://ec2-xxx.compute.amazonaws.com: 在职的
GET 请求http://dyyyyy.cloudfront.net: 在职的
POST 请求http://dyyyyy.cloudfront.net: 在职的
然而,
GET 请求https://dyyyyy.cloudfront.net: 在职的
POST 请求https://dyyyyy.cloudfront.net:不工作[<- 我该如何调试它]
GET 请求https://api.mydomain.com: 在职的
POST 请求https://api.mydomain.com:不工作
这是我的 nginx 配置文件:
server {
listen 80;
server_name ec2-3-109-166-206.ap-south-1.compute.amazonaws.com;
location / {
proxy_pass http://127.0.0.1:3000/;
proxy_redirect http://127.0.0.1:3000/ /;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Connection $http_connection;
proxy_ssl_server_name on;
proxy_ssl_session_reuse off;
}
}
我似乎无法弄清楚为什么通过 https 的 GET 请求成功,但 POST 请求却出现此错误
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>502 ERROR</H1>
<H2>The request could not be satisfied.</H2>
更新:添加 Cloudfront 设置
- 设置
- 价格等级:使用所有边缘位置(最佳性能)
- 备用域名 (CNAME):api.mydomain.com
- 自定义 SSL 证书:domain.com(acm 生成的 id)
- 旧版客户端支持:未启用
- 安全策略:TLSv1
- 支持的 HTTP 版本:HTTP1、HTTP2、HTTP3
- 标准记录:关闭
- IPv6:开启
起源:
- 域名:ec2-xxx.compute.amazonaws.com
- 协议:匹配查看器
- http: 80
- https:443
- 最低 Origin SSL 协议:TLSv1.2
- 原始路径:[空]
- 启用屏蔽:否
行为
- 路径模式:默认(*)
- 来源:ec2-xxx.compute.amazonaws.com
- 自动压缩对象:是
- 查看器协议策略:Http 和 Https
- 允许的 http 方法:GET、HEAD、OPTIONS、PUT、POST、PATCH、DELETE
- 限制查看者访问:否
- 缓存键和来源请求:缓存策略和来源请求策略(推荐)
- 缓存策略:CachingOptimized
- 来源请求政策:无
- 响应标头策略:CorsAndSecurityHeadersPolicy
- SmoothStream:否
- 字段加密:否
- 功能关联:无关联(对于所有请求和响应)
答案1
您已在 CloudFront 配置中配置了“protocol: match-viewer”。此设置意味着当客户端使用 HTTPS 连接api.mydomain.com
但您nginx
未配置 HTTPS 时,CloudFront 使用 HTTPS 连接到您的源服务器 (EC2)。将协议切换为仅 HTTP 或在 中配置 HTTPS nginx
。参考:CloudFront 文档