應(yīng)用場(chǎng)景,我們由于網(wǎng)絡(luò)限制,只有前置機(jī)或者固定服務(wù)器可以與外部鏈接, 要使用 Nginx 代理 TCP 端口(如數(shù)據(jù)庫(kù)、SSH、游戲服務(wù)器等非 HTTP 服務(wù)),需使用 Nginx Stream 模塊。該模塊專(zhuān)門(mén)處理 TCP/UDP 流量,配置與 HTTP 代理有所不同。以下是詳細(xì)配置步驟:
一、確認(rèn) Nginx 是否支持 Stream 模塊
- 檢查編譯參數(shù):
nginx -V 2>&1 | grep stream
- 若輸出包含
--with-stream
,說(shuō)明已啟用 Stream 模塊。 - 若未啟用,需重新編譯 Nginx 并添加
--with-stream
參數(shù)(或使用包含該模塊的發(fā)行版,如 Ubuntu 的 nginx-extras
)。
二、配置 TCP 代理(示例:代理 MySQL 端口 3306)
1. 創(chuàng)建 Stream 配置文件
在 Nginx 配置目錄(通常為 /etc/nginx
)下創(chuàng)建 stream.conf
:
# /etc/nginx/stream.conf
stream {
# 定義日志格式(可選)
log_format tcp '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received"';
access_log /var/log/nginx/tcp_access.log tcp;
error_log /var/log/nginx/tcp_error.log;
# TCP 代理配置(監(jiān)聽(tīng) 63306 端口,轉(zhuǎn)發(fā)到后端 MySQL 3306)
server {
listen 63306; # 代理服務(wù)器監(jiān)聽(tīng)端口
proxy_pass 192.168.1.100:3306; # 后端真實(shí)服務(wù)器地址:端口
# 可選參數(shù)
proxy_connect_timeout 10s; # 連接超時(shí)時(shí)間
proxy_timeout 300s; # 會(huì)話超時(shí)時(shí)間
proxy_buffer_size 16k; # 緩沖區(qū)大小
}
}
2. 在主配置文件中引入 Stream 配置
編輯 /etc/nginx/nginx.conf
,在文件末尾添加:
# /etc/nginx/nginx.conf
include /etc/nginx/stream.conf;
三、多端口代理配置示例
若需同時(shí)代理多個(gè) TCP 服務(wù)(如 MySQL 和 Redis),可在 stream.conf
中添加多個(gè) server
塊:
stream {
# MySQL 代理
server {
listen 63306;
proxy_pass 192.168.1.100:3306;
}
# Redis 代理
server {
listen 6379;
proxy_pass 192.168.1.101:6379;
}
# SSH 代理
server {
listen 2222;
proxy_pass 192.168.1.102:22;
}
}
四、常用 Stream 模塊參數(shù)說(shuō)明
| | |
---|
listen | 代理服務(wù)器監(jiān)聽(tīng)的端口 | 63306 |
proxy_pass | | 192.168.1.100:3306 |
proxy_connect_timeout | 連接后端服務(wù)器的超時(shí)時(shí)間 | 10s |
proxy_timeout | 會(huì)話超時(shí)時(shí)間(無(wú)數(shù)據(jù)傳輸時(shí)關(guān)閉) | 300s |
proxy_buffer_size | | 8k |
ssl_preread | 啟用 SSL/TLS 預(yù)讀?。ㄓ糜?SNI 路由) | on |
五、驗(yàn)證配置并重啟 Nginx
重啟 Nginx:
systemctl restart nginx
驗(yàn)證代理是否生效:
# 檢查端口監(jiān)聽(tīng)
netstat -tulpn | grep nginx
# 使用 telnet 測(cè)試連接(以 MySQL 為例)
telnet localhost 63306
六、注意事項(xiàng)
- 確保服務(wù)器防火墻開(kāi)放代理端口(如
63306
)。 - 示例(以
firewalld
為例):firewall-cmd --add-port=63306/tcp --permanent
firewall-cmd --reload
- 高并發(fā)場(chǎng)景下,建議調(diào)整
worker_processes
和 worker_connections
參數(shù)。 - 開(kāi)啟
sendfile
提升傳輸效率:stream {
sendfile on;
# 其他配置...
}
- 通過(guò)
tcp_access.log
和 tcp_error.log
監(jiān)控代理流量。 - 使用
nginx -s reload
熱加載配置,避免中斷服務(wù)。
通過(guò)以上配置,Nginx 可高效代理各類(lèi) TCP 服務(wù),實(shí)現(xiàn)負(fù)載均衡、端口映射、安全隔離等功能。
閱讀原文:原文鏈接
該文章在 2025/7/1 10:58:40 編輯過(guò)