Nginx配置经验

Nginx配置经验

1. Nginx 会导致 带下划线命名的Header参数丢失

nginx对下划线的头信息做了限制

  1. 不用下划线

  2. 配置nginx 参数

    underscores_in_headers on; (默认 underscores_in_headers 为off)

2. nginx proxy_pass后的url加不加/的区别

第一种:proxy_pass后缀不加斜杠

1
2
3
location /abc/ {
proxy_pass http://172.16.1.38:8080;
}

第二种:proxy_pass后缀加斜杠

1
2
3
location /abc/ {
proxy_pass http://172.16.1.38:8081/;
}

上面两种配置,区别只在于proxy_pass转发的路径后是否带/

针对情况1,如果访问url = http://server/abc/test.jsp,则被nginx代理后,请求路径会便问http://proxy_pass/abc/test.jsp,将test/ 作为根路径,请求test/路径下的资源

针对情况2,如果访问url = http://server/abc/test.jsp,则被nginx代理后,请求路径会变为 http://proxy_pass/test.jsp,直接访问server的根资源

3. Nginx反向代理中proxy_set_header参数说明

Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义:

1
2
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

如果启用缓存,来自之前请求的头字段“If-Modified-Since”, “If-Unmodified-Since”, “If-None-Match”, “If-Match”, “Range”, 和 “If-Range” 将不会被代理服务器传递。
一个不会变化的“Host”头请求字段可通过如下方式被传递:

1
proxy_set_header Host    $http_host;

然后,当字段不在请求头中就无法传递了,在这种情况下,可通过设置Host变量,将需传递值赋给Host变量

1
proxy_set_header Host    $host;

此外,服务器名称和端口一起通过代理服务器传递

1
proxy_set_header Host    $host:$proxy_port;

如果请求头的存在空的字段将不会通过代理服务器传递出去

1
proxy_set_header Accept-Encoding "";

简而言之,proxy_set_header 就是可设置请求头-并将头信息传递到服务器端,不属于请求头的参数中也需要传递时,重定义下即可!

###4. 非标产品Nginx路由配置方案

场景:标准产品中的Nginx 配置都是跟随产品打包部署的,而定制化项目的配置中却需要根据客户业务场景需要的变化添加。

如果让运维通过手动方式添加,在以后的升级过程中可能就会覆盖,尤其是当nginx 交给Ambari等系统集成运维,重启都会被覆盖。

如果将定制化产品的配置放到标准产品就会产生冗余配置,而且随着定制化项目越多,冗余越多,容易出现冲突。

如果为了定制化项目,就轻易做分支维护,会导致后续版本的管理超级复杂。

这时候通过incloud方式就很方便应对:

在 标准产品的nginx 配置中预留 include 配置入口,如果有定制化项目需要配置路由,只需要往该入口增加一个额外的conf 文件。

1
include /usr/opt/soft/netty/nginx/conf/extra/*.conf;
1
2
3
4
5
6
7
8
9
[root@ark2 ~]# cat /usr/opt/soft/netty/nginx/conf/extra/*.conf
location /arkns/cmb {
proxy_pass http://127.0.0.1:9190/;
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_send_timeout 600;
proxy_read_timeout 600;
}

这样定制化项目的配置可以跟随定制化包部署,而且不会影响到标准产品的升级部署


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×