Nginx HTTP/TCP代理配置

Nginx HTTP/TCP代理配置

众所周知,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
这种情况下,我们想要连接到数据库就只有做一个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配置:

1
nginx -s reload

此时连接代理服务器响应的端口,就可以将TCP请求转发到实际服务器。

官方文档
nginx下载地址

#
You forgot to set the qrcode for Alipay. Please set it in _config.yml.
You forgot to set the qrcode for Wechat. Please set it in _config.yml.
You forgot to set the business and currency_code for Paypal. Please set it in _config.yml.
You forgot to set the url Patreon. Please set it in _config.yml.
Your browser is out-of-date!

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

×