proxy protocol在nginx中應用
#我們知道nginx是web伺服器和代理伺服器,它一般工作在proxy server或負載平衡軟體(Haproxy ,Amazon Elastic Load Balancer (ELB)的後面。
首先,客戶端向代理伺服器或負載平衡軟體發起請求,然後請求會被轉發到nginx進行實際的web存取。
因為經過了多層軟體,所以客戶端的一些資訊例如ip位址,連接埠號碼等可能就會被隱藏,這對於我們問題分析,資料統計都是不利的。我們希望獲得客戶端真實的IP位址,以便獲取準確的請求環境。
這種情況下就需要用到PROXY protocol了。
#如果前面所說的proxy或LSB都實現了PROXY protocol協定的話,不管是HTTP, SSL , HTTP/2, SPDY, WebSocket 還是TCP協議,nginx都可以拿到客戶端的原始IP位址,從而根據原始IP位址進行一些特殊的操作,例如屏蔽惡意IP的訪問,根據IP不同展示不同的語言或頁面,或者更簡單的日誌記錄和統計等,都非常有效。
當然,如果想要支援PROXY protocol,對nginx的版本也是有要求的,具體版本需求如下:
想要支援PROXY protocol v2,需要NGINX Plus R16或NGINX Open Source 1.13.11。
想要支援ROXY protocol for HTTP,需要NGINX Plus R3或NGINX Open Source 1.5.12。
想要支援TCP client‑side PROXY protocol,需要NGINX Plus R7或NGINX Open Source 1.9.3。
- ##想要支援PROXY protocol for TCP,需要NGINX Plus R11 或NGINX Open Source 1.11.4。
在nginx中可以透過下面的變數來取得對應的客戶端資訊,具體而言如下所示:
$proxy_protocol_addr和$proxy_protocol_port 分別表示的是原始客戶端的IP位址和連接埠號碼。
$remote_addr 和 $remote_port表示的是load balancer的的IP位址和連接埠。
如果你使用了RealIP擴充模組,那麼這個模組會重寫$remote_addr 和 $remote_port這兩個值,將其替換成原始客戶端的IP位址和連接埠號碼。
然後使用$realip_remote_addr 和 $realip_remote_port來表示load balancer的的IP位址和連接埠。
在RealIP擴充模組中,$proxy_protocol_addr和$proxy_protocol_port 表示的意義不變,還是原始客戶端的IP位址和連接埠號碼。
在nginx中設定使用proxy protocol
上面我們提到了nginx中proxy protocol的基本應用,下面來講一下如何在nginx中進行具體的設定。
在nginx中啟用proxy protocol
如果你的nginx已經是支援proxy protocol的版本,那麼啟用proxy protocol非常簡單,只需要在server中的listen中加入proxy_protocol即可,如下:
http { #... server { listen 80 proxy_protocol; listen 443 ssl proxy_protocol; #... } } stream { #... server { listen 112233 proxy_protocol; #... } }
大家比較熟悉的是http block,在nginx中,它表示對http/https的支持。 Nginx提供了對TCP/UDP協定的支持,這項功能透過stream模組實現,對許多人來說比較陌生。
透過上面的配置,nginx可以實現在tcp/udp協定和http/https協定同時支援proxy protocol。
使用Real‑IP modules
Real‑IP modules是nginx自帶的一個模組,可以透過下面的指令來查看nginx是否有安裝real-ip模組:
nginx -V 2>&1 | grep -- 'http_realip_module' nginx -V 2>&1 | grep -- 'stream_realip_module'
如果你目前使用的版本沒有real ip,也不要急,這時候你可能需要從原始碼編譯。
在編譯的過程中,我們需要執行一個configure指令,在這個configure指令中可以指定要開啟的功能,例如stream或http_ssl_module:
$ ./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-pcre=../pcre-8.44 --with-zlib=../zlib-1.2.11 --with-http_ssl_module --with-stream --with-mail
如果要開啟real-ip功能,則可以新增:
--with-http_realip_module
如果nginx是運行在SLB或proxy之後的,那麼可以透過set_real_ip_from指令來指定代理程式或負載平衡伺服器的IP範圍,如下所示:
server { #... set_real_ip_from 192.168.1.0/24; #... }
然後我們需要將proxy或SLB的IP位址替換為真實客戶端的位址,那麼可以這樣使用:
http { server { #... real_ip_header proxy_protocol; } }
請求轉送
不管是http還是stream block,都可能會遇到請求向後續的upstream進行轉送的情況,對於upstream來說,他們希望收到的是真實客戶端IP位址,而不是proxy或slb的位址,那麼可以透過下面的設定來解決:
http { proxy_set_header X-Real-IP $proxy_protocol_addr; proxy_set_header X-Forwarded-For $proxy_protocol_addr; }
stream { server { listen 12345; proxy_pass example.com:12345; proxy_protocol on; } }
http和stream的設定方式是不同的。
日誌記錄
日誌是一個非常重要的功能,對於定位問題,執行資料統計分析都非常有用,當然我們需要的是真實的客戶端IP位址。
###我們可以透過使用變數$proxy_protocol_addr在http和stream block中記錄對應的日誌,如下所示:###http { #... log_format combined '$proxy_protocol_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; }
stream { #... log_format basic '$proxy_protocol_addr - $remote_user [$time_local] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time'; }
以上是nginx中怎麼設定使用proxy protocol協定的詳細內容。更多資訊請關注PHP中文網其他相關文章!

NGINX和Apache都是強大的Web服務器,各自在性能、可擴展性和效率上有獨特的優勢和不足。 1)NGINX在處理靜態內容和反向代理時表現出色,適合高並發場景。 2)Apache在處理動態內容時表現更好,適合需要豐富模塊支持的項目。選擇服務器應根據項目需求和場景來決定。

NGINX適合處理高並發請求,Apache適合需要復雜配置和功能擴展的場景。 1.NGINX採用事件驅動、非阻塞架構,適用於高並發環境。 2.Apache採用進程或線程模型,提供豐富的模塊生態系統,適合複雜配置需求。

NGINX可用於提升網站性能、安全性和可擴展性。 1)作為反向代理和負載均衡器,NGINX可優化後端服務和分擔流量。 2)通過事件驅動和異步架構,NGINX高效處理高並發連接。 3)配置文件允許靈活定義規則,如靜態文件服務和負載均衡。 4)優化建議包括啟用Gzip壓縮、使用緩存和調整worker進程。

NGINXUnit支持多種編程語言,通過模塊化設計實現。 1.加載語言模塊:根據配置文件加載相應模塊。 2.應用啟動:調用語言運行時執行應用代碼。 3.請求處理:將請求轉發給應用實例。 4.響應返回:將處理後的響應返回給客戶端。

NGINX和Apache各有優劣,適合不同場景。 1.NGINX適合高並發和低資源消耗場景。 2.Apache適合需要復雜配置和豐富模塊的場景。通過比較它們的核心特性、性能差異和最佳實踐,可以幫助你選擇最適合需求的服務器軟件。

確認 Nginx 是否啟動的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 檢查端口 80 是否開放;3. 查看系統日誌中 Nginx 啟動消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

要關閉 Nginx 服務,請按以下步驟操作:確定安裝類型:Red Hat/CentOS(systemctl status nginx)或 Debian/Ubuntu(service nginx status)停止服務:Red Hat/CentOS(systemctl stop nginx)或 Debian/Ubuntu(service nginx stop)禁用自動啟動(可選):Red Hat/CentOS(systemctl disable nginx)或 Debian/Ubuntu(syst


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中