仅 Https Post 请求在运行 nginx 反向代理的 cloudfront 和 ec2 实例上失败

仅 Https Post 请求在运行 nginx 反向代理的 cloudfront 和 ec2 实例上失败

我在 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

然而,

这是我的 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 设置

  1. 设置
  2. 价格等级:使用所有边缘位置(最佳性能)
  3. 备用域名 (CNAME):api.mydomain.com
  4. 自定义 SSL 证书:domain.com(acm 生成的 id)
  5. 旧版客户端支持:未启用
  6. 安全策略:TLSv1
  7. 支持的 HTTP 版本:HTTP1、HTTP2、HTTP3
  8. 标准记录:关闭
  9. IPv6:开启

起源:

  1. 域名:ec2-xxx.compute.amazonaws.com
  2. 协议:匹配查看器
  3. http: 80
  4. https:443
  5. 最低 Origin SSL 协议:TLSv1.2
  6. 原始路径:[空]
  7. 启用屏蔽:否

行为

  1. 路径模式:默认(*)
  2. 来源:ec2-xxx.compute.amazonaws.com
  3. 自动压缩对象:是
  4. 查看器协议策略:Http 和 Https
  5. 允许的 http 方法:GET、HEAD、OPTIONS、PUT、POST、PATCH、DELETE
  6. 限制查看者访问:否
  7. 缓存键和来源请求:缓存策略和来源请求策略(推荐)
  8. 缓存策略:CachingOptimized
  9. 来源请求政策:无
  10. 响应标头策略:CorsAndSecurityHeadersPolicy
  11. SmoothStream:否
  12. 字段加密:否
  13. 功能关联:无关联(对于所有请求和响应)

答案1

您已在 CloudFront 配置中配置了“protocol: match-viewer”。此设置意味着当客户端使用 HTTPS 连接api.mydomain.com但您nginx未配置 HTTPS 时,CloudFront 使用 HTTPS 连接到您的源服务器 (EC2)。将协议切换为仅 HTTP 或在 中配置 HTTPS nginx。参考:CloudFront 文档

相关内容