612错误 nginx转发200_nginx通过自定义header属性来转发不同的服务

一、背景

因为需要上线灰度发布,只要nginx接收到头部为:

wx_unionid:123456

就会跳转到另外一个url,比如:

127.0.0.1:8080

通过配置nginx 匹配请求头wx_unionid 来转发到灰度环境。

核心:客户端自定义的http header,在nginx的配置文件里能直接读取到。

条件:header必须用减号“-”分隔单词,nginx里面会转换为对应的下划线“_”连接的小写单词。

二、修改Nginx配置

安装nginx

apt-get install -y nginx

编辑主页

cd /etc/nginx/sites-enabled

vim home.conf

内容如下:

upstream wx {

server127.0.0.1:8080;

}

server {

listen8008;

server_name localhost;

root html;

index index.html;

charset utf-8;

underscores_in_headers on;

location/{

#测试header转发if ($http_wx_unionid = "123456") {

proxy_pass http://wx;

}

}

}

参数配置说明

underscores_in_headers on:nginx是支持读取非nginx标准的用户自定义header的,但是需要在http或者server下开启header的下划线支持:

比如我们自定义header为wx_unionid,获取该header时需要这样:$http_wx_unionid(一律采用小写,而且前面多了个http_)

如果需要把自定义header传递到下一个nginx:

1.如果是在nginx中自定义采用proxy_set_header X_CUSTOM_HEADER $http_host;

2.如果是在用户请求时自定义的header,例如curl –head -H “X_CUSTOM_HEADER: foo” http://domain.com/api/test,则需要通过proxy_pass_header X_CUSTOM_HEADER来传递

编辑调整页

vim wx.conf

内容如下:

server {

listen8080;

server_name localhost;

root/var/www/html;

index wx.html;

location/{

try_files $uri $uri/ =404;

}

}

增加测试页面

vim /var/www/html/wx.html

内容如下:

微信小程序测试平台

三、测试结果

加自定义头部

root@ubuntu:~# curl -v -H 'wx_unionid:123456' 127.0.0.1:8008

* Rebuilt URL to: 127.0.0.1:8008/

* Trying 127.0.0.1...* Connected to 127.0.0.1 (127.0.0.1) port 8008 (#0)> GET / HTTP/1.1

> Host: 127.0.0.1:8008

> User-Agent: curl/7.47.0

> Accept: */*> wx_unionid:123456

>

< HTTP/1.1 200 OK

< Server: nginx/1.10.3 (Ubuntu)

< Date: Mon, 29 Jul 2019 07:49:46 GMT

< Content-Type: text/html; charset=utf-8

< Content-Length: 37

< Connection: keep-alive

< Last-Modified: Mon, 29 Jul 2019 06:23:49 GMT

< ETag: "5d3e90f5-25"

< Accept-Ranges: bytes

<

微信小程序测试平台

* Connection #0 to host 127.0.0.1 left intact

不加头部

root@ubuntu:~# curl -v 127.0.0.1:8008

* Rebuilt URL to: 127.0.0.1:8008/

* Trying 127.0.0.1...* Connected to 127.0.0.1 (127.0.0.1) port 8008 (#0)> GET / HTTP/1.1

> Host: 127.0.0.1:8008

> User-Agent: curl/7.47.0

> Accept: */*>

< HTTP/1.1 200 OK

< Server: nginx/1.10.3 (Ubuntu)

< Date: Mon, 29 Jul 2019 07:50:13 GMT

< Content-Type: text/html; charset=utf-8

< Content-Length: 612

< Last-Modified: Tue, 31 Jan 2017 15:01:11 GMT

< Connection: keep-alive

< ETag: "5890a6b7-264"

< Accept-Ranges: bytes

<

Welcome to nginx!

body {

width: 35em;

margin: 0 auto;

font-family: Tahoma, Verdana, Arial, sans-serif;

}

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.

For online documentation and support please refer to

nginx.org.

Commercial support is available at

nginx.com.

Thank you for using nginx.

* Connection #0 to host 127.0.0.1 left intact

四、匹配多条件

现在又多了一个需求,需要对客户端ip为:192.168.0.45,同时也增加自定义头部wx_unionid:123456,才会转发,否则不做转发。

nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法,否则会报下面的错误:nginx: [emerg] invalid condition。

我们可以用变量的方式来间接实现。

要实现的语句:

if ($remote_addr ~* "192.168.0.45" && $http_wx_unionid = "123456"){

proxy_pass http://wx;

}

如果按照这样来配置,就会报nginx: [emerg] invalid condition错误。

如下:

nginx: [emerg] invalid condition "$http_wx_unionid" in /etc/nginx/sites-enabled/home.conf:16nginx: configurationfile /etc/nginx/nginx.conf test failed

可以这么来实现,如下所示:

upstream wx {

server127.0.0.1:8080;

}

server {

listen8008;

server_name localhost;

root html;

index index.html;

charset utf-8;

underscores_in_headers on;

location/{

#测试header转发

# 标志位

set $flag0;if ($remote_addr ~* "192.168.0.45"){

# 末尾追加1,此时$flag=01set $flag"${flag}1";

}if ($http_wx_unionid = "123456"){

# 末尾追加1,此时$flag=011set $flag"${flag}1";

}

# 当为011时,表示条件都匹配if ($flag = "011") {

proxy_pass http://wx;

}

}

}

重新加载配置

nginx -s reload

再次使用本机测试,增加头部

root@ubuntu:~# curl -v -H 'wx_unionid:123456' 127.0.0.1:8008

* Rebuilt URL to: 127.0.0.1:8008/

* Trying 127.0.0.1...* Connected to 127.0.0.1 (127.0.0.1) port 8008 (#0)> GET / HTTP/1.1

> Host: 127.0.0.1:8008

> User-Agent: curl/7.47.0

> Accept: */*> wx_unionid:123456

>

< HTTP/1.1 200 OK

< Server: nginx/1.10.3 (Ubuntu)

< Date: Mon, 29 Jul 2019 08:01:30 GMT

< Content-Type: text/html; charset=utf-8

< Content-Length: 612

< Last-Modified: Tue, 31 Jan 2017 15:01:11 GMT

< Connection: keep-alive

< ETag: "5890a6b7-264"

< Accept-Ranges: bytes

<

Welcome to nginx!

body {

width: 35em;

margin: 0 auto;

font-family: Tahoma, Verdana, Arial, sans-serif;

}

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.

For online documentation and support please refer to

nginx.org.

Commercial support is available at

nginx.com.

Thank you for using nginx.

* Connection #0 to host 127.0.0.1 left intact

登录到192.168.0.45,增加头部测试

root@docker-reg:~# curl -v -H 'wx_unionid:123456' 192.168.0.162:8008

* Rebuilt URL to: 192.168.0.162:8008/

* Trying 192.168.0.162...* Connected to 192.168.0.162 (192.168.0.162) port 8008 (#0)> GET / HTTP/1.1

> Host: 192.168.0.162:8008

> User-Agent: curl/7.47.0

> Accept: */*> wx_unionid:123456

>

< HTTP/1.1 200 OK

< Server: nginx/1.10.3 (Ubuntu)

< Date: Mon, 29 Jul 2019 08:02:01 GMT

< Content-Type: text/html; charset=utf-8

< Content-Length: 37

< Connection: keep-alive

< Last-Modified: Mon, 29 Jul 2019 06:23:49 GMT

< ETag: "5d3e90f5-25"

< Accept-Ranges: bytes

<

微信小程序测试平台

* Connection #0 to host 192.168.0.162 left intact

本文参考链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值