Skip to content

为 Nginx 配置 TCP 反向代理

标签
网络/网关/Nginx
网络/网关
网络/网关/OpenResty
命令行/systemd
Linux
Linux/命令行
操作系统/Linux
操作系统/Debian
密码学/证书/TLS
密码学/证书/TLS/mTLS
命令行/kubectl
软件/云原生/kubectl
网络/协议/TCP
字数
801 字
阅读时间
4 分钟

在 Nginx 主配置中添加可复用配置

nginx
stream {
	log_format tcp_json '{'
		'"@timestamp": "$time_iso8601",'
        '"remote_addr": "$remote_addr",'
		'"protocol": "$protocol",'
		'"status": "$status",'
		'"bytes_sent": "$bytes_sent",'
		'"bytes_received": "$bytes_received",'
		'"session_time": "$session_time",'
		'"upstream_addr": "$upstream_addr",'
        '"upstream_bytes_sent": "$upstream_bytes_sent",'
		'"upstream_bytes_received": "$upstream_bytes_received",'
		'"upstream_connect_time": "$upstream_connect_time"'
	'}';

	access_log /var/log/nginx/tcp-access.log tcp_json buffer=512k flush=1m;
	include /etc/nginx/tcp.d/*.conf;
}
nginx
stream {
	log_format tcp_plain '$remote_addr [$time_local] '
	        '$protocol $status $bytes_sent $bytes_received '
            '$session_time "$upstream_addr" '
            '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

	access_log /var/log/nginx/tcp-access.log tcp_plain buffer=512k flush=1m;
	include /etc/nginx/tcp.d/*.conf;
}

说明:

  • log_format:这里我使用的 JSON 为格式的日志输出,方便采集和处理,如果你不需要 JSON 格式,也可以在上方切换换成非 JSON 格式的配置文件然后参考配置。
  • access_log:输出到 /var/log/nginx/tcp-access.log,与 HTTP 请求的日志不同,HTTP 的放在 /var/log/nginx/access.log 里面,当然你也可以混合存放。
  • include:与普通的 HTTP 虚拟主机配置通常存放在 /etc/nginx/conf.d 或者在 Debian 系列的发行版中的 /etc/nginx/sites-enabled/etc/nginx/sites-available 类似,我们也创建一个 /etc/nginx/tcp.d 来存放我们的 TCP 代理。

你可以通过下面的命令来检查配置文件是否配置正确:

shell
sudo nginx -t

配置保存后我们可以通过下面的命令更新配置:

shell
sudo nginx -s reload
shell
sudo systemctl restart nginx

然后这个时候可以添加我们的 TCP 反向代理目标了。

添加 TCP 反向代理配置模块

nginx
upstream <上游名称> {
	server <IP>:<端口>;
}

server {
    listen <网关层希望暴露的端口>;
    proxy_connect_timeout 30s;
    proxy_pass <上游名称>;
}
nginx
upstream <上游名称> {
	server <IP>:<端口>;
}

server {
    listen <网关层希望暴露的端口> ssl;

	ssl_certificate      <证书路径>;
    ssl_certificate_key  <证书私钥路径>;

    proxy_connect_timeout 30s;
    proxy_pass <上游名称>;
}
nginx
upstream <上游名称> {
	server <IP>:<端口>;
}

server {
    listen <网关层希望暴露的端口> ssl;

	ssl_certificate      <证书路径>;
    ssl_certificate_key  <证书私钥路径>;

	ssl_client_certificate  <用于验证客户端证书的证书 CA 链或者单 CA 证书路径>;
    ssl_verify_client on;
    ssl_verify_depth 2;

    proxy_connect_timeout 30s;
    proxy_pass <上游名称>;
}

以暴露 Kubernetes 集群为例:

nginx
upstream kubernetes_api_server_tcp {
	server <控制平面(Control Plane)节点 IP>:6443;
	# 如果部署了多个控制平面的话
	server <控制平面(Control Plane)节点 IP 2>:6443;
	server <控制平面(Control Plane)节点 IP 3>:6443;
}

server {
    listen 6443;
    proxy_connect_timeout 30s;
    proxy_pass kubernetes_api_server_tcp;
}

观察日志输出

比如对 Kubernetes 的 API Server 配置了 TCP 反向代理进行暴露之后可以运行 kubectl 来获取集群资源看看效果:

shell
kubectl get nodes

这个时候就可以通过下面的命令同步输出 Nginx 的 TCP 反向代理日志:

shell
sudo tail -f /var/log/nginx/tcp-access.log
shell
$ sudo tail -f /var/log/nginx/tcp-access.log

{"@timestamp": "2023-10-14T16:09:35+08:00","remote_addr": "10.0.2.145","protocol": "TCP","status": "200","bytes_sent": "44205","bytes_received": "3690","session_time": "0.351","upstream_addr": "10.24.0.2:6443","upstream_bytes_sent": "3690","upstream_bytes_received": "44205","upstream_connect_time": "0.000"}
{"@timestamp": "2023-10-14T16:09:37+08:00","remote_addr": "10.0.2.145","protocol": "TCP","status": "200","bytes_sent": "13264","bytes_received": "1909","session_time": "0.029","upstream_addr": "10.24.0.2:6443","upstream_bytes_sent": "1909","upstream_bytes_received": "13264","upstream_connect_time": "0.000"}

贡献者

页面历史

撰写

布局切换

调整 VitePress 的布局样式,以适配不同的阅读习惯和屏幕环境。

全部展开
使侧边栏和内容区域占据整个屏幕的全部宽度。
全部展开,但侧边栏宽度可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
全部展开,且侧边栏和内容区域宽度均可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
原始宽度
原始的 VitePress 默认布局宽度

页面最大宽度

调整 VitePress 布局中页面的宽度,以适配不同的阅读习惯和屏幕环境。

调整页面最大宽度
一个可调整的滑块,用于选择和自定义页面最大宽度。

内容最大宽度

调整 VitePress 布局中内容区域的宽度,以适配不同的阅读习惯和屏幕环境。

调整内容最大宽度
一个可调整的滑块,用于选择和自定义内容最大宽度。

聚光灯

支持在正文中高亮当前鼠标悬停的行和元素,以优化阅读和专注困难的用户的阅读体验。

ON开启
开启聚光灯。
OFF关闭
关闭聚光灯。

聚光灯样式

调整聚光灯的样式。

置于底部
在当前鼠标悬停的元素下方添加一个纯色背景以突出显示当前鼠标悬停的位置。
置于侧边
在当前鼠标悬停的元素旁边添加一条固定的纯色线以突出显示当前鼠标悬停的位置。