❶ nginx的tcp透明代理設置
目前,接入層access使用nginx作為反向代理。客戶端連接nginx打開的5000埠後,nginx通過客戶端ip哈希的方式,將客戶端的接入請求負載均衡到後台的4個access服務。
使用nginx作為反向代理時,客戶端與nginx直連,同時nginx為每一個客戶端連接建立了單獨的tcp連接到access服務。此時,nginx代理帶來的問題是,access無法獲取到客戶端的真實ip,而只能拿到nginx代理服務所在機器的ip。(所有的代理都有類似的問題,因為與上游服務(例如這里的access服務)連接的實際上是代理伺服器,ip包里的ip地址是代理伺服器的地址)。
但是,很時候我們需要拿到客戶端的真實ip做一些業務上的判斷。這個時候,就需要通過某些方式獲取客戶端的真實ip。如果代理伺服器和上游服務之前是通過http通訊,則可以通過http的首部 X-Forwarded-For 將客戶端的ip信息傳給上游服務(nginx可以很方便的設置該首部設置)。
對於純tcp代理,則獲取客戶端ip會麻煩一些。主要有兩種方式:
nginx作為上游服務的反向代理時,每個客戶端的連接方式如下:
實現透明代理的原理是,nginx使用獲取到的客戶端ip來建立nginx與上游服務直接的tcp連接。也即:
總共有兩台伺服器,內網ip地址分別為 172.19.228.32 和 172.19.228.33 。兩台機器部署的服務如下:
nginx設置完成並reload配置後,所有從nginx發送到上游伺服器的ip數據包將使用客戶端的ip地址作為源地址。後續的設置,需要將上游伺服器返回的ip數據包(其中的目的地址是客戶端的ip)返回到nginx所在的機器,並投遞給nginx進程。
32機器上的上游服務返回ip數據包給nginx時,指定的目的ip地址是客戶端的ip地址。32機器需要將這些數據返回給nginx進程。
設置完成後,32上的上游服務(埠為15010以及15011)發出的ip數據包,因為被設置了標記而匹配新增的策略路由,所有ip數據被路由到lo網路介面。同時,因為這些數據包中包含的埠是nginx連接上游服務時打開的埠,所以這些數據最終被分用到nginx進程。
這樣,nginx和同在一個機器上的上游服務之間的透明代理設置完整。上游服務將可以得到客戶端的ip地址,同時可以將數據返回給nginx,nginx再將返回的數據返回給對應的客戶端。
此時,如果使用 lsof(1) 命令查看上游服務打開的tcp鏈接,顯示的源ip地址也將是客戶端的ip地址。
33上的上游服務與nginx在不同的主機上。主要設置如下:
設置完成後,33可以接收nginx發出的ip數據包,並可以將上游服務回復的ip數據路由給32機上的nginx進程。
同時,使用 lsof(1) 命令查看33的上游服務打開的tcp鏈接,源ip將是客戶端的ip。其他所有的與nginx不在同一個主機上的上游服務都可以參考這個配置設置。
參考:
nginx的透明代理實現
IP Transparency and Direct Server Return with NGINX and NGINX Plus as Transparent Proxy
Linux kernel rp_filter settings
❷ 如何運用Nginx搭建代理伺服器
如何實現Nginx的反向代理?
這句話什麼意思?
意思是說當客戶機來訪問伺服器的時候,伺服器本身並不出面接待,而是將客戶的請求轉高給手下的子伺服器(小弟)負責接待。
比如:你訪問www..com,其實並不時網路總伺服器接待的你,而是網路的代理伺服器接待的你,不過他們的服務是一樣的,提供同樣的頁面;
如是搭建Nginx服務才能實現這樣的效果呢?
搭建一個最簡單,最基礎nginx代理伺服器,需要一台代理服務,兩檯子伺服器,XX台客戶機來作驗證;
操作流程如下:
第一步、伺服器和客戶機配好IP地址,其中Nginx代理伺服器需要配置兩張網卡,兩個IP地址,一個和客戶機通信,一個和子伺服器通信;
代理伺服器與客戶機和子伺服器都分別配置同網段IP地址;
例如:
代理伺服器:192.168.4.5 192.168.2.5
子伺服器 :192.168.2.100 192.168.2.200
客戶機 :192.168.4.10
這樣配置的好處是: 可以負載均衡,保障用戶的訪問體驗,保障上網速度,同時也保障了,即便有一台伺服器壞掉了,另一台服務可以接待用戶訪問;
第二步、代理伺服器上安裝Nginx服務軟體,兩檯子伺服器上安裝HTTPD服務並寫入相應的網頁,然後啟動服務;
yum -y install httpd ##安裝httpd服務;
echo "羅貴" > /var/www/html/index.html ##寫一個簡單的網頁
./configure --user=nginx --group=nginx --with-http_ssl_mole
make && make install ##編譯安裝Nginx
第三步、修改Nginx的配置文件;
vim /usr /local /nginx /conf /nginx.conf
http { ............... ##在文件中找到http開頭的行,並在http下面隨意找兩行添加下面兩行的內容;
upstream luogui { ##luogui是集答納歷群名字,可以自由定義,upstream 上游的意思;翻譯過來就是在上游建立一個名字為luogui的集群,集群中包含下述IP地址茄升;
server 192.168.2.100:80;
server 192.168.2.200:80;
}
server {
listen 80;
server_name www.luogui.com; ##域名,可以自由定義;
location ^/.php$ { ##匹配清搜網頁地址的意思,匹配以 / 開頭.php結尾的網頁文件;
proxy_pass http://luogui; ##通過proxy代理伺服器將用戶的請求轉發給luogui集群伺服器;(註:優先順序最高,系統會優先處理這條命令)
}
}
第四步、測試效果;
firefox http://192.168.4.5 或者 本地測試 curl http://192.168.4.5
結果應該是暫停任何一檯子伺服器,客戶機訪問網頁都沒有問題;
以上.......
(EDN)
祝:開心!
羅貴
2019-04-05於深圳
❸ Nginx 最全操作——nginx反向代理(5)
將 NGINX 配置為 HTTP 和其他協議的反向代理,支持修改請求標頭和微調的響應緩沖。
本文介紹代理伺服器的基本配置。您將學習如何通過不同的協議將請求從 NGINX 傳遞到代理伺服器,修改發送到代理伺服器的客戶端請求標頭,以及配置來自代理伺服器的響應的緩沖。
代理通常用於在多個伺服器之間分配負載,無縫顯示來自不同網站的內容,或通過 HTTP 以外的協議將處理請求傳遞給應用程序伺服器。
當 NGINX 代理請求時,它會將請求發送到指定的代理伺服器,獲取響應,然後將請求發送回客戶端。可以使用指定的協議將請求代理到 HTTP 伺服器(另一個 NGINX 伺服器或任何其他伺服器)或非 HTTP 伺服器(可以運行使用特定框架開發的應用程序,例如 PHP 或 Python)。支持的協議包括FastCGI、uwsgi、SCGI和memcached。
要將請求傳遞給 HTTP 代理伺服器,需要在location中指定proxy_pass指令。例如:
此示例配置導致將在此位置處理的所有請求傳遞到指定地址的代理伺服器。此地址可以指定為域名或者 IP 地址。該地址還可能包括一個埠:
注意,在上面的第一個例子中,代理的伺服器的地址後面是一個URI, /link/ 。如果 URI 與地址一起指定,它將替換請求 URI 中與 location 參數匹配的部分。例如,這里帶有 /some/path/page.html URI的請求將被代理到 http://www.example.com/link/page.html . 如果指定的地址沒有問題 URI,或者無法確定要替換的 URI 部分,則傳遞完整的請求 URI(可能已修改)。
要將請求傳遞給非 HTTP 代理伺服器, **_pass 應使用適當的指令:
請注意,在這些情況下,指定地址的規則可能不同。您可能還需要將其他參數傳遞給伺服器(有關詳細信息,請參閱參考文檔)。
proxy_pass指令也可以指向一組命名的伺服器。在這種情況下,請求根據指定的方法在組中的伺服器之間分發。
默認情況下,NGINX 重新定義代理請求中的兩個 header 欄位,「Host」和「Connection」,並消除值為空字元串的 header 欄位。「Host」設置為 $proxy_host 變數,「Connection」設置為 close 。
要更改這些設置以及修改其他標頭欄位,請使用proxy_set_header指令。該指令可以在某個位置或更高位置指定。它也可以在特定的伺服器上下文或http塊中指定。例如:
在此配置中,「主機」欄位設置為$host變數。
要防止標頭欄位被傳遞到代理伺服器,請將其設置為空字元串,如下所示:
默認情況下,NGINX 緩沖來自代理伺服器的響應。響應存儲在內部緩沖區中,並且在收到整個響應之前不會發送到客戶端。緩沖有助於優化慢速客戶端的性能,如果響應從 NGINX 同步傳遞到客戶端,這可能會浪費代理伺服器的時間。但是,當啟用緩沖時,NGINX 允許代理伺服器快速處理響應,而 NGINX 存儲響應的時間與客戶端下載它們所需的時間一樣長。
負責啟用和禁用緩沖的指令是proxy_buffering。默認情況下,它設置為 on 並啟用緩沖器。
該proxy_buffers指令控制規模和分配的請求緩沖區的數目。來自代理伺服器的響應的第一部分存儲在單獨的緩沖區中,其大小由proxy_buffer_size指令設置。這部分通常包含一個相對較小的響應頭,並且可以做得比其餘響應的緩沖區小。
在以下示例中,緩沖區的默認數量增加了,並且響應的第一部分的緩沖區大小小於默認值。
如果禁用緩沖,則在從代理伺服器接收響應的同時將響應同步發送到客戶端。對於需要盡快開始接收響應的快速交互客戶端,此行為可能是可取的。
要在特定位置禁用緩沖,請將proxy_buffering指令放在帶有參數的位置 off ,如下所示:
在這種情況下,NGINX 僅使用proxy_buffer_size配置的緩沖區來存儲響應的當前部分。
反向代理的一個常見用途是提供負載平衡。閱讀免費的選擇軟體負載均衡器的五個理由電子書,了解如何通過快速部署來提高功能、性能和專注於您的應用程序。
如果您的代理伺服器有多個網路介面,有時您可能需要選擇特定的源 IP 地址連接到代理伺服器或上游。如果 NGINX 後面的代理伺服器配置為接受來自特定 IP 網路或 IP 地址范圍的連接,這可能很有用。
指定proxy_bind指令和必要網路介面的 IP 地址:
IP 地址也可以用變數指定。例如, $server_addr 變數傳遞接受請求的網路介面的 IP 地址:
簡單來說,把網路首頁代理到/test路徑,同時把java代理到/testapi,配置如下:
參考鏈接:https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
歡迎大家提出不一樣的觀點,我們一起討論,
我是辣個男人,一個運維人。