前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一次nginx返回422状态码的经历

一次nginx返回422状态码的经历

作者头像
编程随笔
发布2022-09-23 10:18:20
9190
发布2022-09-23 10:18:20
举报
文章被收录于专栏:后端开发随笔后端开发随笔

故事背景

后端使用Docker Compose部署一个代码片段管理应用:snibox,某天因为云服务卡死重启之后再次访问时,登录或退出都返回422状态码。 界面提示如下:

snibox_log_422
snibox_log_422
snibox_code_422
snibox_code_422

不过奇怪的是;直接通过IP+PORT访问是没问题的,但是使用域名方式访问就会报错。

前端使用nginx作为反向代理,并配置了SSL。 配置信息如下:

代码语言:javascript
复制
server {
   listen       80;
   server_name  snibox.zhangsan.org.cn;
   
   rewrite ^(.*)$  https://$host$1 permanent;
}

server {
   listen 443 ssl;
   server_name  snibox.zhangsan.org.cn;

   ssl_certificate  /data/ssl/zhangsan.org.cn_cert_chain.pem;
   ssl_certificate_key  /data/ssl/zhangsan.org.cn_key.key;
   ssl_session_timeout 5m;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers on;

   client_max_body_size 10M;

   location / {
       proxy_pass_header Server;
       proxy_set_header Host $http_host;
       proxy_redirect off;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Scheme $scheme;
       proxy_pass http://snibox;
   }
}

既然直接使用IP+PORT方式是可以正常访问的,但是使用域名方式确异常,问题应该出在nginx配置上。

解决办法

在nginx配置中设置X-Forwarded-Proto(明确指定客户端与nginx的通信协议为https),即:

代码语言:javascript
复制
proxy_set_header X-Forwarded-Proto https;

最终的nginx完整配置为:

代码语言:javascript
复制
server {
   listen       80;
   server_name  snibox.zhangsan.org.cn;
   
   rewrite ^(.*)$  https://$host$1 permanent;
}

server {
   listen 443 ssl;
   server_name  snibox.zhangsan.org.cn;

   ssl_certificate  /data/ssl/zhangsan.org.cn_cert_chain.pem;
   ssl_certificate_key  /data/ssl/zhangsan.org.cn_key.key;
   ssl_session_timeout 5m;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers on;

   client_max_body_size 10M;

   location / {
       proxy_pass_header Server;
       proxy_set_header Host $http_host;
       proxy_redirect off;
       proxy_set_header X-Forwarded-Proto https;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Scheme $scheme;
       proxy_pass http://snibox;
   }
}

关于X-Forwarded-Proto

参考MDN解释

代码语言:javascript
复制
X-Forwarded-Proto (XFP) 是一个事实上的标准首部,用来确定客户端与代理服务器或者负载均衡服务器之间的连接所采用的传输协议(HTTP 或 HTTPS)。在服务器的访问日志中记录的是负载均衡服务器与服务器之间的连接所使用的传输协议,而非客户端与负载均衡服务器之间所使用的协议。为了确定客户端与负载均衡服务器之间所使用的协议, X-Forwarded-Proto 就派上了用场。

简而言之,X-Forwarded-Proto在nginx中配置时用于明确指定客户端与nginx之间的通信协议。

【参考】 https://feilong.home.blog/2018/12/22/nginx反向代理huginn部分请求422/ Nginx反向代理Huginn部分请求422 https://github.com/snibox/snibox/issues/26 enable cors with specified host https://techoverflow.net/2022/05/03/how-to-set-x-forwarded-proto-header-in-nginx/ How to set X-Forwarded-Proto header in nginx

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 故事背景
  • 解决办法
  • 关于X-Forwarded-Proto
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档