nginx之TCP反向代理

nginx的tcp proxy負載調度有兩種方式:

    官方的ngx_stream_core_module

    阿里開源的nginx_tcp_proxy_module


此處介紹nginx官方TCP proxy。

nginx從1.9.0版本以後支持面向TCP的反向代理。莫約是2015年初發布的。

注:如今最新版nginx爲1.11.12

  nginx從1.9.0後引入模塊ngx_stream_core_module,模塊是沒有編譯的,需要用到編譯需添加--with-stream配置參數,stream負載均衡官方配置樣例


配置編譯的時候需要加上

先切換到nginx解壓後目錄內

# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-stream

# make

# cp ./objs/nginx /usr/local/nginx/sbin/

# make upgrade


以下配置文件示例爲反向代理MySQL。

user  nginx;
#user root;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

stream{
	upstream mysql{
		server 192.168.1.106:3306 weight=1;
		server 192.168.1.108:3306 weight=1;
	}
        
	server{
		listen 3307;
		proxy_pass mysql;
	}

}

stream 與 http 是一個層級的,在main內定義,放在配置文件最後。其中可包含server字段。


配置項說明:

listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];  

 It is possible to specify just only the port.   #我這撇腳的英語。。

 地址也可以是一個主機名,若IPv6要用方括號指定 [::1] 。

 ssl參數允許指定所有連接在該端口上接受SSL模式下工作。

 udp參數配置一個監聽套接字用於處理數據報(1.9.13引入)。

 proxy_protocol參數(1.11.4)允許指定在該端口上所有連接都要使用PROXY protocol.。

 backlog參數 它限制了等待連接的隊列的最大長度(1.9.2)。

 bind 指定一個單獨的bind()相應一個給定地址:端口。

 更多參照官網關於模塊ngx_stream_core_module的敘述


ngx_stream_core_module自1.11.2模塊支持變量。

$binary_remote_addr

 二進制格式的客戶端地址

$bytes_received

 從客戶端接收的字節數(1.11.4)

$bytes_sent

 發送到客戶端的字節數

$connection

 連接序列號

$hostname

 主機名

$msec

 當前時間在秒和毫秒分辨率

$nginx_version

 nginx版本

$pid

 工作進程的PID

$protocol

 協議用於與客戶溝通: TCP或 UDP(1.11.4)

$proxy_protocol_addr

 客戶端地址從代理協議頭,否則或空字符串(1.11.4)

 代理協議之前必須通過設置啓用 proxy_protocol參數聽指令。

$proxy_protocol_port

 客戶端端口從代理協議頭,否則或空字符串(1.11.4)

 代理協議之前必須通過設置啓用 proxy_protocol參數聽指令。

$remote_addr

 客戶端地址

$remote_port

 客戶端端口

$server_addr

 接受連接過來的服務器的地址

 計算這個變量的值通常需要一個系統調用。爲了避免一個系統調用,聽指令必須指定地址和使用 bind參數。

$server_port

 接受了一個連接端口的服務器

$session_time

 會話持續時間在秒和毫秒分辨率(1.11.4);

$status

 會話狀態(1.11.4),可以是下列之一:

 200

 會議成功完成

 400

 客戶端數據不能被解析,例如,代理協議頭

 403

 訪問被禁止的,例如,當訪問是有限的某些客戶端地址

 500

 內部服務器錯誤

 502

 糟糕的網關,例如,如果一個上游服務器無法選中或者聯繫到。

 503

 服務不可用,例如,當訪問是有限的連接數

 $time_iso8601

 當地時間的ISO 8601標準格式


編寫完成後測試語法格式,OK後重載服務

# ./sbin/nginx -t

# ./sbin/nginx -s reload


———————————————官方Example Configuration—————————————————worker_processes auto;


error_log /var/log/nginx/error.log info;

events {
   worker_connections  1024;
}

stream {
   upstream backend {
       hash $remote_addr consistent;

       server backend1.example.com:12345 weight=5;
       server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;
       server unix:/tmp/backend3;
   }

   upstream dns {
      server 192.168.0.1:53535;
      server dns.example.com:53;
   }

   server {
       listen 12345;
       proxy_connect_timeout 1s;
       proxy_timeout 3s;
       proxy_pass backend;
   }

   server {
       listen 127.0.0.1:53 udp;
       proxy_responses 1;
       proxy_timeout 20s;
       proxy_pass dns;
   }

   server {
       listen [::1]:12345;
       proxy_pass unix:/tmp/stream.socket;
   }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章