分类 标签 存档 社区 博客 友链 GitHub 订阅 搜索

Nginx 运维寻坑记

498 浏览

ZERO

    持续更新 请关注:https://zorkelvll.cn/blogs/zorkelvll/articles/2018/11/14/1542126572569

背景

   本文主要是介绍在 Nginx 使用运维过程中所遇到的一些坑爹的地方,予自己以做记录,既是为自己后续查找问题提供方便,也是希望能够给各位猿友减少一些踩坑的过程!

前言

    经过前一段时间的思考设计与整合,最终为公司目前的所有项目系统的管理员页面设计成了一个单点登录系统(该系统将在后续专门整理专题讲解设计与实现思路),然后今天在将其中的一个项目系统进行上线整合的过程中,对于配置的 nginx 中踩了个小坑,现在此做一个记录以备后续参考和学习!    

正记

入坑 3

1、描述

  nginx 反向代理多个 springboot-jar 应用,作为统一对外提供的服务网关,而通过 nginx 在 swagger-ui.html 页面 api 文档中发起各个接口请求时,实际请求的地址是 127.0.0.1 问题

2、解决方案:

   在 nginx.conf 中的配置反向代理时,添加 proxy_set_header Host $http_host; 配置项即可,如 nginx1.jpeg

入坑 2

1、描述

  linux-root 用户下配置的 nginx,访问页面时报错 403 Forbidden,nginx-log 显示为 Permission denied

2、说明:

  nginx 配置项中 nginx.conf 中的用户配置默认为 nobody,也即 #user  nobody;,而当前用户是 root

3、解决方案:

   在 nginx.conf 中的配置#user  nobody; 更改为user  root;,,,则可以解决!

入坑 1

1、描述

   由 postman 模拟前端请求的接口中携带的 header,java-tomcat 后端可以成功获取到;但是在线上的服务器中传输过来的 ajax 请求携带的 header 却被服务器的 java 后端获取到为 null,事实上前端 F12 检查查看到的是实际发送的请求确实是携带有 header 的,而且 ajax 的 js 代码与以前可以正常使用被获取到的 js 代码是一样的 

2、说明:
  • 初步考虑是 nginx 代理配置的问题,也就是考虑添加配置项: add_header ‘Access-Control-Allow-Headers’ ‘DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,imf_token_manager,’;  这样的一段配置代码,但是还没有效果

  • 进一步研究发现是因为 nginx 对于 header 中的字符默认是有限制的,且配置项 underscores_in_headers 默认为 off,也即 header-name 中含有下划线_的将被忽略掉,以致于部署的服务器环境中是没有该 header-name 的;在 nginx 源码的 ngx_http_parse_header_line() 函数中有下面一端代码则可以知道:

    if (ch == ‘_’) {
      if (allow_underscores) {
        hash = ngx_hash(hash, ch);
        r->lowcase_header[i++] = ch;
        i &= (NGX_HTTP_LC_HEADER_LEN – 1);
      } else {
        r->invalid_header = 1;
      }
3、解决方案:
  • 推荐使用:将前后端约定的 header-name 中的下划线使用其他字符进行代替,比如减号 “-”,或者使用驼峰命名法定义 header-name

  • 不推荐使用:在 nginx 的 nginx.conf 中配置 http 部分设置underscores_in_headers 为 on,也即添加 “underscores_in_headers:on;**”

  • 习惯:在与 nginx 相关的一些配置或者需要传输或者 log 记录等过程中,尽量避免使用下划线

评论  
留下你的脚步
推荐阅读