众所周知,nginx是一款高性能的反向代理工具,在之前nginx只能代理应用层的应用,如果是要做TCP即网络第4层的代理就只有借助HaProxy等工具,在nginx1.9版本之后即可支持TCP的代理。下面,我们来展现一下nginx强大的代理能力。
我们的网络有内网和办公网还有互联网,首先所有项目部署在内网,使用只能在生产网(需要开通特殊策略),特殊情况下,可以申请互联网的网络,但是比较麻烦,而且,我们进入生产服务器必须在内网的环境下通过堡垒机才能登陆,现在多个生产部署多个系统,但是映射到办公网只有个IP且只有一个端口。此时,我们就需要用到反向代理实现系统的访问。
Nginx基本配置说明
nginx有强大的url匹配功能,下面,我们一起来了解一下nginx的优先级匹配。以下是匹配语法模版
1 2 3 4
| location [=|~|~*|^~] /uri/ { root html; index index.html index.htm; }
|
说明:
1 2 3 4 5 6 7
| = 表示精确匹配 ^~ 表示uri以某个常规字符串开头 ~ 表示区分大小写的正则匹配 ~* 表示不区分大小写的正则匹配 !~ 表示区分大小写不匹配的正则 !~* 表示不区分大小写不匹配的正则 / 通用匹配,相当于根目录可以匹配到任何请求
|
优先级: 精确匹配>普通匹配>正则匹配
nginx对http进行反向代理:
1 2 3
| location / { proxy_pass http://127.0.0.1; }
|
Nginx Http反向代理实践配置
下面是我们为解决上面的问题所做的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| //HTTP代理 location / { proxy_pass http://xx.xx.xxx.xxx:8081/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_connect_timeout 1690; proxy_read_timeout 1690; proxy_send_timeout 1690; } location ^~ /Insight { proxy_pass http://xx.xxx.x.xxx:8083/BingoInsight; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_connect_timeout 1690; proxy_read_timeout 1690; proxy_send_timeout 1690; } location ^~ /etl{ proxy_pass http://xx.xxx.x.xxx:8080/etl; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header Host $host:$server_port; #这里是重点,这样配置才不会丢失端口 }
//websocket 代理 location /gateone/{ proxy_pass http://xx.xx.xx.xx:58080/gateone/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_connect_timeout 1690; proxy_read_timeout 1690; proxy_send_timeout 1690; client_max_body_size 300m; proxy_http_version 1.1; proxy_redirect off; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } ......
|
Nginx 代理转发TCP配置
我又有另外一个场景,也是内网和办公网的交互,但是这个场景不需要那么严格,可以直连服务器,但是我们是想在办公网直连数据库。这显然形成了一个屏障
这种情况下,我们想要连接到数据库就只有做一个TCP四层代理。我们就可以借助nginx upstream的功能实现TCP转发。配置如下
1 2 3 4 5 6 7 8 9
| upstream proxy_redis { server xx.xxx.xx.xxx:6379; } server { listen 6379; #监听端口 proxy_pass proxy_redis; #转发请求 }
|
然后刷新一下nginx配置:
此时连接代理服务器响应的端口,就可以将TCP请求转发到实际服务器。
官方文档
nginx下载地址