我在 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
http://ec2-xxx.compute.amazonaws.com上的 GET 请求:工作
http://ec2-xxx.compute.amazonaws.com上的 POST 请求:工作
http://dyyyyy.cloudfront.net上的 GET 请求:工作
http://dyyyyy.cloudfront.net上的 POST 请求:工作
然而,
https://dyyyyy.cloudfront.net上的 GET 请求:工作
https://dyyyyy.cloudfront.net上的 POST 请求:不工作 [<- 我该如何调试这个]
https://api.mydomain.com上的 GET 请求:工作
https://api.mydomain.com上的 POST 请求:不起作用
这是我的 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
- 最低来源 SSL 协议:TLSv1.2
- 原始路径:[空]
- 启用屏蔽: 否
行为
- 路径模式:默认(*)
- 来源:ec2-xxx.compute.amazonaws.com
- 自动压缩对象:是
- 查看器协议策略:Http 和 Https
- 允许的 http 方法:GET、HEAD、OPTIONS、PUT、POST、PATCH、DELETE
- 限制查看者访问:否
- 缓存键和源请求:缓存策略和源请求策略(推荐)
- 缓存策略:CachingOptimized
- 原产地请求政策:无
- 响应标头策略:CorsAndSecurityHeadersPolicy
- 平滑流: 否
- 现场加密:否
- 功能关联:无关联(对于所有请求和响应)
您已在 CloudFront 配置中配置了“协议:match-viewer”。
api.mydomain.com
此设置意味着当客户端使用 HTTPS 连接但您nginx
未配置 HTTPS时,CloudFront 使用 HTTPS 连接到您的源服务器 (EC2) 。切换到仅 HTTP 协议或在nginx
. 参考:CloudFront 文档