首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Nginx 作為 TCP 代理(四層負載均衡)安裝與配置實戰指南

     編輯:Java 綜合教學

為什麼選擇 Nginx 做 TCP 代理?

傳統上 TCP 代理常用 HAProxy,但自 Nginx 1.9 版本引入 stream 模塊後,Nginx 也能勝任四層(傳輸層)代理。優勢在於:

  • 統一運維:無需學習 HAProxy 新語法,複用現有 Nginx 知識體系。
  • HTTPS 透傳簡單:TCP 層不關心應用層協議,無需在 Nginx 配置 SSL 證書,直接轉發 443 端口流量到後端,極大簡化了 HTTPS 部署。
  • 性能優異:事件驅動模型,連接處理效率高,配置極其精簡。

一、Nginx 安裝(CentOS/RHEL 環境)

方式一:官網下載編譯

地址:https://nginx.org/en/download.html

方式二:YUM 源安裝(推荐,便於升級維護)

# 1. 創建 yum 源文件
vim /etc/yum.repos.d/nginx.repo

# 寫入以下內容
[nginx]
name=nginx repo
baseurl=https://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
# 2. 安裝
yum clean all
yum install nginx

# 3. 驗證安裝
whereis nginx
/usr/sbin/nginx -v
# 輸出: nginx version: nginx/1.10.1

# 4. 查看默認配置路徑
/usr/sbin/nginx -h
# -c filename : set configuration file (default: /etc/nginx/nginx.conf)

二、目錄規劃與核心配置

建議將配置、日誌、腳本與安裝程序分離,便於遷移與備份。

# 創建目錄結構
mkdir -p /opt/service/nginx/conf
mkdir -p /opt/logs/nginx
cd /opt/service/nginx
ln -s /usr/sbin/nginx
ln -s /opt/logs/nginx log

最終結構:

/opt/service/nginx/
├── conf
├── log -> /opt/logs/nginx
└── nginx -> /usr/sbin/nginx

1. 主配置文件:/opt/service/nginx/conf/nginx.conf

user nginx;
worker_processes 16;              # 通常設置為 CPU 核心數
worker_rlimit_nofile 100000;      # 打開文件描述符限制

error_log /opt/service/nginx/log/error.log error;
pid /opt/service/nginx/nginx.pid;

events {
    use epoll;                    # Linux 內核高效事件模型
    worker_connections 10240;     # 單進程最大連接數
}

# 核心:包含 conf 目錄下所有 .conf 文件,實現模塊化配置
include /opt/service/nginx/conf/*.conf;

2. TCP 代理配置:/opt/service/nginx/conf/nginx_tcp_proxy.conf

使用 stream 塊(與 http 塊同級)定義四層代理。

stream {
    # 定義上游服務器組
    upstream weixin_proxy {
        # 一致性哈希,保證同一客戶端固定訪問同一後端(有狀態協議需求時)
        hash $remote_addr consistent;
        server wx.qq.com:443 weight=1 max_fails=3 fail_timeout=60s;
    }

    server {
        listen 443;                       # 監聽本地 443 端口
        proxy_connect_timeout 10s;        # 連接後端超時
        proxy_pass weixin_proxy;          # 轉發到上游組
        proxy_buffer_size 64k;            # 代理緩衝區大小
    }
}

三、啟動維護腳本:nginx.sh

提供 start|stop|restart|reload|check 命令,生產環境建議配置為 Systemd 服務,但 Shell 腳本便於快速部署與調試。

#!/bin/sh
nginx="/usr/sbin/nginx"
prog="nginx"
conf_file="/etc/nginx/nginx.conf"  # 注意:腳本中指定的配置文件路徑需與實際一致

start() {
    if [ `pgrep $prog | wc -l` -eq 0 ]; then
        if [ -x $nginx ] && [ -f $conf_file ]; then
            $nginx -c $conf_file
            # ... 成功失敗判斷邏輯 ...
        fi
    else
        echo "$prog is already started"
    fi
}

stop() {
    # ... killall -9 $prog 邏輯 ...
}

reload() {
    # ... kill -HUP master_pid 熱加載邏輯 ...
}

check() {
    $nginx -t -c $conf_file  # 配置檢查
}

case $1 in
    start) start ;;
    stop) stop ;;
    restart) stop; sleep 2; start ;;
    reload) reload ;;
    check) check ;;
    *) echo "Usage: $0 {start|stop|restart|reload|check}" ;;
esac

賦權並啟動:

chmod a+rwx nginx.sh
./nginx.sh restart

四、常見坑點:域名後端 DNS 解析更新

問題:upstream 中使用域名(如 wx.qq.com),Nginx 啟動時解析 IP 並緩存。若域名 IP 變更(如雲服務商切換 IP),Nginx 不會自動感知,導致代理失效。

解決方案:在 stream 或 http 上下文中配置 resolver 指令,並配合變量強制動態解析(需 Nginx Plus 或 OpenResty 完美支持,社區版有限制)。

# 在 nginx.conf 主上下文添加
resolver 100.100.2.136 valid=1s;  # 使用內網 DNS,TTL 1 秒
# include /etc/nginx/nginx_vhost/*.conf;

注意:社區版 Nginx 在 stream 模塊中對動態解析支持有限,生產環境強依賴域名解析更新的場景,建議使用 OpenResty 或 HAProxy,或配合腳本定期 reload。

總結

Nginx 的 stream 模塊為四層代理提供了輕量、高性能的原生支持。通過模塊化配置、標準化部署目錄與健壯的啟動腳本,可快速構建穩定的 TCP 代理集群。但需注意域名解析緩存機制,根據業務關鍵性選擇合適的解決方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved