轉自:http://blog.itpub.net/27043155/viewspace-734234/html
經過這個模塊容許咱們改變客戶端請求頭中客戶端IP地址值(例如,X-Real-IP 或 X-Forwarded-For)。前端
若是Nginx工做在某些7層負載均衡代理後面,這個功能對於Nginx服務器很是有用,因爲客戶端請求的本地IP(就是客戶端的請求地址)在經過7層代理時被添加了客戶端IP地址頭,所以才使得後端的Nginx可以取得震懾客戶端的IP地址值。該模塊在默認安裝是並無安裝,所以若是要使用該模塊,那麼在編譯安裝是須要添加--with-http_realip_module選項。後端
爲何使用該模塊,它的意義在於可以使得後臺服務器記錄原始客戶端的IP地址。服務器
set_real_ip_from 192.168.1.0/24;負載均衡 set_real_ip_from 192.168.2.1;測試 real_ip_header X-Real-IP;ui |
該模塊僅提供了兩條指令。spa
指令名稱:set_real_ip_from.net
功 能:經過該指令指定信任的地址,將會被替代爲精確的IP地址。從0.8.22版本後也可使用信任的Unix套接字。這裏設置的IP就是指前端Nginx 、Varnish或者 Squid 的 IP地址。代理
語 法: set_real_ip_from [the address|CIDR|"unix:"]
默 認 值: none
使用環境: http, server, location
指令名稱:real_ip_header
功 能:這個指令用於設置使用哪一個頭來替換IP地址。若是使用了X-Forwarded-For,那麼該模塊將會使用X-Forwarded-For頭中的最後一個IP地址來替換前端代理的IP地址。
語 法: real_ip_header [X-Real-IP|X-Forwarded-For]
默 認 值: real_ip_header X-Real-IP
使用環境: http, server, location
在下面的實例中,咱們環境是這樣的有兩臺Nginx服務器,一臺是前端,另外一臺是後端,前端的Nginx被用做代理,然後臺的Nginx用於提供頁面訪問,還有一臺客戶端,IP地址以下:
前端Nginx:192.168.7.10
後端Nginx:192.168.1.15
客戶端主機:218.239.201.36
前端的Nginx配置是這樣的:
server { listen 80; server_name www.xx.com;
location / { root html; index index.html index.htm; charset utf-8; }
location /865 { proxy_pass http://192.168.3.139:80/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; }
…… }
|
後端的Nginx配置以下:
server { listen 80; server_name localhost;
location / { root /var/www/html; index index.html index.htm; } |
訪問測試
若是咱們訪問http://www.xx.com/865,沒問題,能夠是正常訪問,訪問日誌以下:
前端Nginx的日誌:
218.239.201.36 - - [30/Aug/2011:16:09:56 +0800] "GET /865/ HTTP/1.1" 200 151 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB7.1" |
後端Nginx的日誌:
192.168.7.10 - - [30/Aug/2011:16:09:56 +0800] "GET // HTTP/1.0" 200 151 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB7.1" |
咱們看到在後端Nginx的日誌中並無記錄原始客戶端的IP地址,而是記錄了前端Nginx的IP地址。
若是將後臺Nginx服務器的配置修改成:
server { listen 80; server_name localhost; set_real_ip_from 192.168.3.0/24; set_real_ip_from 100.100.0.0/16; real_ip_header X-Real-IP;
location / { root html; index index.html index.htm; }
…… }
|
而後咱們再次進行訪問測試:
前端Nginx的日誌:
218.239.201.36 - - [30/Aug/2011:16:10:28 +0800 "GET /865/ HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB7.1" |
後端Nginx的日誌:
218.239.201.36 - - [30/Aug/2011:16:10:28 +0800] "GET // HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB7.1" |
可見,此次後臺記錄的是客戶端的IP地址。