最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx Stream模塊詳細(xì)攻略(四層代理的藝術(shù)與實(shí)踐)

 更新時(shí)間:2025年12月30日 14:35:18   作者:醉風(fēng)塘  
Nginx Stream模塊是1.9.0版本引入的,用于處理TCP/UDP流量,提供四層網(wǎng)絡(luò)代理功能,與HTTP模塊相比,Stream模塊工作在傳輸層,不解析應(yīng)用協(xié)議,本文給大家介紹Nginx Stream模塊完全指南:四層代理的藝術(shù)與實(shí)踐,感興趣的朋友一起看看吧

1. 引言:為什么需要Stream模塊?

在當(dāng)今復(fù)雜的網(wǎng)絡(luò)架構(gòu)中,應(yīng)用協(xié)議的多樣化催生了四層網(wǎng)絡(luò)代理的需求。Nginx最初以HTTP反向代理聞名,但自1.9.0版本起引入的Stream模塊,使其能力擴(kuò)展到了TCP/UDP層。想象這樣一個(gè)場(chǎng)景:你需要為MySQL集群提供統(tǒng)一的訪問(wèn)入口,或在不同服務(wù)器間安全轉(zhuǎn)發(fā)SSH連接,甚至為游戲服務(wù)器做負(fù)載均衡——這些正是Stream模塊大顯身手的領(lǐng)域。

與基于HTTP協(xié)議的七層代理不同,Stream模塊工作在傳輸層(OSI第四層),這意味著它可以處理原始TCP和UDP流量,無(wú)需理解上層應(yīng)用協(xié)議。這種"協(xié)議無(wú)關(guān)性"帶來(lái)了極大的靈活性和性能優(yōu)勢(shì)。

2. Stream與HTTP模塊:核心區(qū)別解析

2.1 架構(gòu)層級(jí)對(duì)比

# HTTP模塊(七層代理)示例
http {
    upstream backend {
        server 10.0.1.2:8080;
        server 10.0.1.3:8080;
    }
    server {
        listen 80;
        location /api/ {
            proxy_pass http://backend;
            # 可以讀取、修改HTTP頭
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
# Stream模塊(四層代理)示例
stream {
    upstream dbservers {
        server 10.0.2.2:3306;
        server 10.0.2.3:3306;
    }
    server {
        listen 3306;
        proxy_pass dbservers;
        # 無(wú)法處理HTTP頭,只能看到原始TCP流
    }
}

2.2 功能特性差異

特性維度HTTP模塊Stream模塊
工作層級(jí)應(yīng)用層(第七層)傳輸層(第四層)
協(xié)議理解解析HTTP/1.x, HTTP/2, WebSocket等不解析應(yīng)用協(xié)議,透?jìng)髟紨?shù)據(jù)
處理內(nèi)容可讀取/修改請(qǐng)求頭、URL、方法等只能看到原始字節(jié)流,無(wú)法修改內(nèi)容
性能開銷較高(需要解析協(xié)議)較低(僅轉(zhuǎn)發(fā)數(shù)據(jù)包)
典型應(yīng)用Web服務(wù)器、API網(wǎng)關(guān)、HTTP負(fù)載均衡數(shù)據(jù)庫(kù)代理、郵件服務(wù)器、游戲服務(wù)器、VPN網(wǎng)關(guān)
SSL終止支持HTTPS解密和重新加密支持SSL透?jìng)骰蚪K止

3. Stream模塊配置詳解

3.1 基礎(chǔ)配置結(jié)構(gòu)

# 主配置文件nginx.conf中
# 注意:stream塊與http塊是平級(jí)的,不是嵌套關(guān)系
# HTTP模塊配置
http {
    # ... HTTP相關(guān)配置
}
# Stream模塊配置
stream {
    # 共享內(nèi)存區(qū)域,用于工作進(jìn)程間共享狀態(tài)
    # 對(duì)于連接數(shù)統(tǒng)計(jì)、限流等功能是必須的
    shared_stream_zone 10m;
    # 上游服務(wù)器組定義
    upstream backend_tcp {
        # 默認(rèn)輪詢負(fù)載均衡
        server backend1.example.com:12345 weight=3;  # 權(quán)重3
        server backend2.example.com:12345 weight=2;  # 權(quán)重2
        server backup.example.com:12345 backup;      # 備份服務(wù)器
    }
    upstream backend_udp {
        server udp1.example.com:53;
        server udp2.example.com:53;
    }
    # TCP服務(wù)器配置
    server {
        listen 12345;                    # 監(jiān)聽TCP端口
        # listen 12345 ssl;             # 監(jiān)聽SSL/TLS
        # listen [::1]:12345;           # 監(jiān)聽I(yíng)Pv6
        proxy_pass backend_tcp;          # 轉(zhuǎn)發(fā)到上游組
        proxy_timeout 30s;               # 代理超時(shí)時(shí)間
        proxy_connect_timeout 3s;        # 連接上游超時(shí)時(shí)間
        # TCP特定配置
        tcp_nodelay on;                  # 禁用Nagle算法
        so_keepalive on;                 # 啟用TCP Keepalive
    }
    # UDP服務(wù)器配置
    server {
        listen 53 udp;                   # 監(jiān)聽UDP端口
        proxy_pass backend_udp;
        proxy_timeout 10s;
    }
}

3.2 核心指令解析

3.2.1 負(fù)載均衡策略

stream {
    upstream app_servers {
        # 1. 輪詢(默認(rèn))
        server 10.0.1.1:9000;
        # 2. 加權(quán)輪詢
        server 10.0.1.2:9000 weight=5;
        # 3. 最少連接數(shù)
        least_conn;
        server 10.0.1.3:9000;
        server 10.0.1.4:9000;
        # 4. 哈希(會(huì)話保持)
        hash $remote_addr consistent;
        server 10.0.1.5:9000;
        server 10.0.1.6:9000;
        # 5. 隨機(jī)算法
        random two;
        server 10.0.1.7:9000;
        server 10.0.1.8:9000;
        # 健康檢查(需要nginx-plus或第三方模塊)
        # health_check interval=10 passes=2 fails=3;
    }
    server {
        listen 9000;
        proxy_pass app_servers;
    }
}

3.2.2 SSL/TLS配置

stream {
    # SSL上游服務(wù)器
    upstream ssl_backend {
        server 10.0.3.1:443;
    }
    server {
        listen 8443 ssl;
        # SSL證書配置
        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;
        # 兩種SSL代理模式:
        # 模式1:SSL終止(解密流量,看到明文)
        proxy_pass ssl_backend;
        # 此時(shí)與后端的通信可以是明文的
        # 模式2:SSL透?jìng)鳎用苤蓖ǎ?
        # proxy_ssl on;                  # 啟用SSL連接到上游
        # proxy_ssl_certificate /path/to/client.crt;
        # proxy_ssl_certificate_key /path/to/client.key;
        # proxy_ssl_trusted_certificate /path/to/ca.crt;
        # proxy_ssl_verify on;          # 驗(yàn)證上游證書
        # proxy_ssl_verify_depth 2;
        # proxy_ssl_session_reuse on;   # SSL會(huì)話復(fù)用
    }
}

4. 實(shí)戰(zhàn)應(yīng)用場(chǎng)景

4.1 場(chǎng)景一:數(shù)據(jù)庫(kù)負(fù)載均衡與高可用

# MySQL讀寫分離代理
stream {
    upstream mysql_read {
        zone mysql_zone 64k;           # 共享內(nèi)存區(qū)
        least_conn;                    # 最少連接負(fù)載均衡
        server db-slave1:3306 weight=3 max_conns=100;
        server db-slave2:3306 weight=2 max_conns=100;
        server db-slave3:3306 weight=2 max_conns=100;
        server db-slave-backup:3306 backup;  # 備份節(jié)點(diǎn)
    }
    upstream mysql_write {
        server db-master:3306;
    }
    # 讀負(fù)載均衡器
    server {
        listen 3307;  # 讀端口
        # 連接限制
        proxy_connect_timeout 1s;
        proxy_timeout 3h;              # MySQL長(zhǎng)連接
        # 連接數(shù)限制(需要limit_conn模塊)
        limit_conn mysql_conn_zone 200;
        limit_conn_log_level error;
        proxy_pass mysql_read;
        # 錯(cuò)誤處理
        proxy_next_upstream on;
        proxy_next_upstream_timeout 2s;
        proxy_next_upstream_tries 2;
    }
    # 寫代理
    server {
        listen 3308;  # 寫端口
        proxy_pass mysql_write;
    }
}

4.2 場(chǎng)景二:SSH/SFTP跳板機(jī)

# SSH安全網(wǎng)關(guān):集中管理服務(wù)器訪問(wèn)入口
stream {
    # 內(nèi)部服務(wù)器組
    upstream ssh_servers {
        server 192.168.1.10:22;    # Web服務(wù)器
        server 192.168.1.20:22;    # 數(shù)據(jù)庫(kù)服務(wù)器
        server 192.168.1.30:22;    # 應(yīng)用服務(wù)器
    }
    server {
        listen 2222;
        # 訪問(wèn)控制
        allow 203.0.113.0/24;      # 辦公室IP段
        allow 192.168.1.100;       # 管理員IP
        deny all;                   # 其他全部拒絕
        # 連接限制
        proxy_connect_timeout 10s;
        proxy_timeout 1h;
        # 使用客戶端真實(shí)IP(需要后端SSH配置支持)
        proxy_protocol on;          # 發(fā)送Proxy Protocol v2
        # 日志記錄
        access_log /var/log/nginx/ssh-access.log;
        error_log /var/log/nginx/ssh-error.log;
        proxy_pass ssh_servers;
    }
}

4.3 場(chǎng)景三:游戲服務(wù)器代理

# 多區(qū)游戲服務(wù)器負(fù)載均衡
stream {
    # 基于地理位置的服務(wù)器分配
    geo $player_region {
        default        us_servers;
        1.0.0.0/8      cn_servers;
        8.0.0.0/8      us_servers;
        14.0.0.0/8     au_servers;
        46.0.0.0/8     eu_servers;
    }
    upstream us_servers {
        server game-us-east:27015 weight=5;
        server game-us-west:27015 weight=5;
    }
    upstream eu_servers {
        server game-eu-frankfurt:27015;
        server game-eu-london:27015;
    }
    upstream cn_servers {
        server game-cn-beijing:27015;
        server game-cn-shanghai:27015;
    }
    server {
        listen 27015 udp;    # 游戲通常使用UDP
        # UDP特定優(yōu)化
        proxy_responses 0;    # 不等待響應(yīng)(適用于單向通信)
        proxy_timeout 5s;
        # 根據(jù)玩家IP選擇服務(wù)器組
        proxy_pass $player_region;
        # 緩沖區(qū)優(yōu)化
        proxy_buffer_size 16k;
    }
}

4.4 場(chǎng)景四:DNS負(fù)載均衡

# DNS查詢負(fù)載均衡
stream {
    upstream dns_resolvers {
        # 多個(gè)上游DNS服務(wù)器
        server 8.8.8.8:53;      # Google DNS
        server 1.1.1.1:53;      # Cloudflare DNS
        server 208.67.222.222:53;  # OpenDNS
    }
    server {
        listen 53 udp reuseport;  # reuseport提高UDP性能
        # UDP DNS配置
        proxy_responses 1;        # 等待一個(gè)響應(yīng)
        proxy_timeout 2s;
        # 響應(yīng)數(shù)據(jù)包大小限制
        proxy_buffer_size 512;
        proxy_pass dns_resolvers;
    }
    # TCP DNS回退(當(dāng)響應(yīng)超過(guò)512字節(jié)時(shí))
    server {
        listen 53;
        proxy_pass dns_resolvers;
    }
}

5. 高級(jí)特性與優(yōu)化

5.1 連接限流與防護(hù)

stream {
    # 連接限制區(qū)域定義
    limit_conn_zone $binary_remote_addr zone=per_ip:10m;
    limit_conn_zone $server_name zone=per_server:10m;
    # 限速區(qū)域
    limit_req_zone $binary_remote_addr zone=stream_req:10m rate=10r/s;
    server {
        listen 5432;  # PostgreSQL代理
        # 連接數(shù)限制
        limit_conn per_ip 20;      # 每個(gè)IP最多20個(gè)連接
        limit_conn per_server 200; # 本服務(wù)最多200個(gè)連接
        # 連接速率限制
        limit_req zone=stream_req burst=20;
        # 慢連接防護(hù)
        proxy_upload_rate 100k;    # 上傳限速
        proxy_download_rate 500k;  # 下載限速
        proxy_pass postgres_backend;
        # 錯(cuò)誤頁(yè)面(簡(jiǎn)化版)
        error_log /var/log/nginx/stream_error.log;
    }
}

5.2 日志與監(jiān)控

stream {
    log_format stream_basic '$remote_addr [$time_local] '
                           '$protocol $status $bytes_sent $bytes_received '
                           '$session_time "$upstream_addr"';
    log_format stream_detailed '$remote_addr - $remote_user [$time_local] '
                              '"$server_name" $server_port '
                              '$protocol $status $bytes_sent $bytes_received '
                              '$session_time "$upstream_addr" '
                              '"$upstream_bytes_sent" "$upstream_bytes_received" '
                              '"$upstream_connect_time"';
    # 訪問(wèn)日志
    access_log /var/log/nginx/stream-access.log stream_basic;
    # 如果需要更詳細(xì)的信息
    # access_log /var/log/nginx/stream-access-detailed.log stream_detailed buffer=32k flush=5s;
    server {
        listen 6379;  # Redis代理
        # 特定服務(wù)的日志
        access_log /var/log/nginx/redis-access.log stream_basic;
        # 實(shí)時(shí)監(jiān)控支持
        # status_zone redis_service;
        proxy_pass redis_backend;
    }
}

5.3 動(dòng)態(tài)配置與維護(hù)

# 使用變量實(shí)現(xiàn)動(dòng)態(tài)路由
stream {
    # 從外部文件或API獲取服務(wù)器列表
    map $ssl_preread_server_name $backend_name {
        mysql.example.com    mysql_backend;
        pg.example.com       postgres_backend;
        redis.example.com    redis_backend;
        default              default_backend;
    }
    upstream mysql_backend {
        server 10.0.5.1:3306;
    }
    upstream postgres_backend {
        server 10.0.5.2:5432;
    }
    server {
        listen 443 ssl;
        # SSL預(yù)讀:在握手階段讀取服務(wù)器名稱
        ssl_preread on;
        # 根據(jù)SNI動(dòng)態(tài)選擇后端
        proxy_pass $backend_name;
        # 使用變量控制超時(shí)
        proxy_timeout $timeout_by_backend;
    }
}

6. 故障排查與性能調(diào)優(yōu)

6.1 常見問(wèn)題排查

# 調(diào)試配置示例
stream {
    server {
        listen 3389;  # RDP代理
        # 詳細(xì)錯(cuò)誤日志
        error_log /var/log/nginx/rdp-debug.log debug;
        # 調(diào)試連接問(wèn)題
        proxy_connect_timeout 5s;
        proxy_timeout 30s;
        # 緩沖區(qū)調(diào)試
        proxy_buffer_size 4k;
        # 臨時(shí)禁用,用于測(cè)試
        # deny all;
        # return "Service in maintenance";
        proxy_pass rdp_backend;
        # 狀態(tài)檢查端點(diǎn)(需要nginx-plus)
        # listen 127.0.0.1:8081;
        # status_zone rdp_status;
    }
}

6.2 性能優(yōu)化建議

  1. 內(nèi)核參數(shù)調(diào)優(yōu)
# 增加最大文件描述符數(shù)
sysctl -w fs.file-max=1000000
sysctl -w net.core.somaxconn=65535
# 增加端口范圍
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
  1. Nginx配置優(yōu)化
# 主配置文件優(yōu)化
worker_processes auto;  # 自動(dòng)設(shè)置工作進(jìn)程數(shù)
worker_rlimit_nofile 100000;  # 每個(gè)worker的文件描述符限制
events {
    worker_connections 65536;  # 每個(gè)worker的連接數(shù)
    use epoll;  # Linux高性能事件模型
    multi_accept on;
}
stream {
    # 啟用端口復(fù)用(特別針對(duì)UDP)
    server {
        listen 53 udp reuseport;
        # ...
    }
}

7. 總結(jié)與最佳實(shí)踐

7.1 何時(shí)使用Stream模塊

  • 適用場(chǎng)景
    • 非HTTP協(xié)議的TCP/UDP服務(wù)代理
    • 需要高性能、低延遲的四層負(fù)載均衡
    • 協(xié)議透明轉(zhuǎn)發(fā)(不解密、不修改)
    • 數(shù)據(jù)庫(kù)、游戲、郵件等服務(wù)的負(fù)載均衡
  • 不適用場(chǎng)景
    • 需要修改應(yīng)用層協(xié)議內(nèi)容
    • 基于HTTP頭的路由決策
    • 需要URL重寫或重定向
    • Web應(yīng)用防火墻功能

7.2 部署建議

  • 安全性
    • 結(jié)合iptables/firewalld做網(wǎng)絡(luò)層防護(hù)
    • 為每個(gè)服務(wù)使用獨(dú)立的監(jiān)聽I(yíng)P或端口
    • 實(shí)施嚴(yán)格的訪問(wèn)控制列表
    • 定期更新SSL證書和密碼套件
  • 高可用
    • 部署多個(gè)Nginx實(shí)例,使用Keepalived實(shí)現(xiàn)VIP
    • 配置健康檢查,自動(dòng)剔除故障后端
    • 實(shí)現(xiàn)優(yōu)雅的連接排空和重新加載配置
  • 監(jiān)控
    • 監(jiān)控連接數(shù)、吞吐量、響應(yīng)時(shí)間
    • 設(shè)置警報(bào)閾值
    • 保留足夠的日志用于審計(jì)和故障排查

Stream模塊的強(qiáng)大之處在于它的簡(jiǎn)潔性和專注性。它不試圖理解它轉(zhuǎn)發(fā)的數(shù)據(jù),只是高效地移動(dòng)字節(jié)。這種設(shè)計(jì)哲學(xué)使其成為許多場(chǎng)景下的理想解決方案,特別是在微服務(wù)架構(gòu)和混合云環(huán)境中。通過(guò)合理配置,Stream模塊可以成為你基礎(chǔ)設(shè)施中可靠、高效的網(wǎng)絡(luò)流量調(diào)度員。

到此這篇關(guān)于Nginx Stream模塊完全指南:四層代理的藝術(shù)與實(shí)踐的文章就介紹到這了,更多相關(guān)Nginx Stream模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nginx解決Http慢攻擊(Slow HTTP Attack)的方法

    Nginx解決Http慢攻擊(Slow HTTP Attack)的方法

    緩慢的HTTP拒絕服務(wù)攻擊是一種專門針對(duì)于Web的應(yīng)用層拒絕服務(wù)攻擊,本文給大家介紹了Nginx解決Http慢攻擊(Slow HTTP Attack)的方法,需要的朋友可以參考下
    2024-02-02
  • Nginx Rewrite使用場(chǎng)景及配置方法解析

    Nginx Rewrite使用場(chǎng)景及配置方法解析

    這篇文章主要介紹了Nginx Rewrite使用場(chǎng)景及配置方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 通過(guò)nginx反向代理來(lái)調(diào)試代碼的實(shí)現(xiàn)

    通過(guò)nginx反向代理來(lái)調(diào)試代碼的實(shí)現(xiàn)

    這篇文章主要介紹了通過(guò)nginx反向代理來(lái)調(diào)試代碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 使用Nginx實(shí)現(xiàn)根據(jù) IP 匹配指定 URL

    使用Nginx實(shí)現(xiàn)根據(jù) IP 匹配指定 URL

    最近的一個(gè)項(xiàng)目,需要特定的IP訪問(wèn)某專題頁(yè)面的時(shí)候跳轉(zhuǎn)到網(wǎng)站首頁(yè),思考了下,直接使用NGINX實(shí)現(xiàn),分享給大家。
    2014-09-09
  • nginx開啟gzip壓縮的完整步驟記錄

    nginx開啟gzip壓縮的完整步驟記錄

    Nginx開啟Gzip壓縮功能,可以使網(wǎng)站的css、js 、xml、html文件在傳輸時(shí)進(jìn)行壓縮,提高訪問(wèn)速度,進(jìn)而優(yōu)化Nginx性能,下面這篇文章主要給大家介紹了關(guān)于nginx開啟gzip壓縮的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Nginx生成縮略圖并存儲(chǔ)到硬盤上

    Nginx生成縮略圖并存儲(chǔ)到硬盤上

    這篇文章主要介紹了Nginx生成縮略圖并存儲(chǔ)到硬盤上的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 詳解Nginx http資源請(qǐng)求限制(三種方法)

    詳解Nginx http資源請(qǐng)求限制(三種方法)

    這篇文章主要介紹了Nginx http資源請(qǐng)求限制,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • Nginx啟用gzip壓縮的方法示例

    Nginx啟用gzip壓縮的方法示例

    這篇文章主要介紹了Nginx啟用gzip壓縮的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Nginx HTTPS代理大文件加載失敗的排查與解決方案

    Nginx HTTPS代理大文件加載失敗的排查與解決方案

    本文基于一次生產(chǎn)環(huán)境中的實(shí)際案例,詳細(xì)解析了Nginx代理配置不當(dāng)導(dǎo)致HTTPS訪問(wèn)下前端資源加載失敗的問(wèn)題,通過(guò)日志分析、參數(shù)調(diào)優(yōu)和原理說(shuō)明,為開發(fā)者提供完整的排查思路與解決方案,需要的朋友可以參考下
    2025-12-12
  • Nginx 配置 HTTPS 與 WSS 完整指南(最新推薦)

    Nginx 配置 HTTPS 與 WSS 完整指南(最新推薦)

    本教程將手把手教你如何為網(wǎng)站配置 HTTPS 加密訪問(wèn),并通過(guò)反向代理實(shí)現(xiàn)安全的 WebSocket(WSS)通信,感興趣的朋友跟隨小編一起看看吧
    2025-05-05

最新評(píng)論

柘荣县| 应用必备| 财经| 磐安县| 建湖县| 波密县| 泽州县| 建水县| 宁德市| 岳阳市| 洛浦县| 江阴市| 德清县| 邵东县| 竹山县| 夹江县| 甘谷县| 万山特区| 屏东市| 呼玛县| 旅游| 昭苏县| 化隆| 乐安县| 游戏| 黄浦区| 盈江县| 苍梧县| 赤壁市| 定南县| 清河县| 资中县| 东海县| 酒泉市| 南阳市| 清苑县| 营口市| 灵台县| 阿城市| 兴仁县| 景泰县|