根據(jù)url 調(diào)度不同的集群 url.oldxu.com
10.0.0.5
10.0.0.7 /pass
10.0.0.8 /user
#1绊谭、web01和web02配置 (只不過代碼不一樣)
[root@web01 ~]# cd /etc/nginx/conf
[root@web01 conf.d]# cat url.oldxu.com.conf
server {
listen 80;
server_name url.oldxu.com;
root /code;
location / {
index index.html;
}
}
#2待笑、lb配置
[root@lb01 conf.d]# cat proxy_url.oldxu.com.conf
upstream user {
server 172.16.1.8;
}
upstream pass {
server 172.16.1.7;
}
server {
listen 80;
server_name url.oldxu.com;
location / {
proxy_pass http://user;
include proxy_params;
}
location /user {
proxy_pass http://user;
include proxy_params;
}
location /pass {
proxy_pass http://pass;
include proxy_params;
}
}
#3、重啟nginx服務
[root@lb01 conf.d]# systemctl restart nginx
根據(jù)設備調(diào)度不同的集群 ( 瀏覽器 ) ( 手機 )
10.0.0.5
10.0.0.7 pc
10.0.0.8 phone
#1囤攀、所有的web都需要配置
[root@web01 ~]# cd /etc/nginx/conf.d
[root@web01 conf.d]# cat /etc/nginx/conf.d/agent.oldxu.com.conf
server {
listen 80;
server_name agent.oldxu.com;
root /code;
location / {
index index.html;
}
}
#2、代理配置
[root@lb01 ~]# cd /etc/nginx/conf.d
[root@lb01 conf.d]# cat proxy_agent.oldxu.com.conf
upstream pc {
server 172.16.1.7:80;
}
upstream phone {
server 172.16.1.8:80;
}
server {
listen 80;
server_name agent.oldxu.com;
location / {
#默認都走pc
proxy_pass http://pc;
include proxy_params;
default_type text/html;
charset utf-8;
#如果是安卓或iphone,則走phone
if ( $http_user_agent ~* "android|iphone|iPad" ) {
proxy_pass http://phone;
}
#如果是IE瀏覽器,要么拒絕,要么返回一個好的瀏覽器下載頁面
if ( $http_user_agent ~* "MSIE" ) {
return 200 '<a target="_blank">點擊下載正版瀏覽器google.exe</a>';
}
}
}
多級負載下透傳真實ip
#1汁咏、一級代理proxy_node1 Nginx配置
[root@lb01 ~]# cd /etc/nginx/conf.d
[root@lb01 conf.d]# cat proxy_ip.xuliangwei.com.conf
server {
listen 80;
server_name ip.xuliangwei.com;
location / {
proxy_pass http://10.0.0.6;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#2很魂、二級代理proxy_node2 nginx 配置
[root@lb01 conf.d]# cat proxy_ip.xuliangwei.com.conf
server {
listen 80;
server_name ip.xuliangwei.com;
location / {
proxy_pass http://10.0.0.7;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#3毅待、三級代理proxy_node3 Nginx配置
[root@lb01 conf.d]# cat proxy_ip.xuliangwei.com.conf
server {
listen 80;
server_name ip.xuliangwei.com;
location / {
proxy_pass http://10.0.0.8;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#4、webserver nginx配置
[root@web02 conf.d]# cat ip.xuliangwei.com.conf
server {
listen 80;
server_name ip.xuliangwei.com;
root /code;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
測試方式一酪捡,通過如下頁面獲取真實IP叁征,或查看 phpinfo() 函數(shù)中的 HTTP_X_FORWARDED_FOR
[root@web02 conf.d]# cat /code/index.php
<?php
$ip = getenv("HTTP_X_FORWARDED_FOR");
echo "X_FORWARDED_FOR: $ip";
?>
測試方式二,通過查看日志測試
#1.proxy_node1代理的日志
10.0.0.1 - - "GET /index.php HTTP/1.1" 200
#2.proxy_node2代理的日志
10.0.0.5 - - "GET /index.php HTTP/1.1" 200 "10.0.0.1"
#3.proxy_node3代理的日志
10.0.0.6 - - "GET /index.php HTTP/1.1" 200 "10.0.0.1, 10.0.0.5"
#4.真實web節(jié)點的日志
10.0.0.7 - - "GET /index.php HTTP/1.1" 200 "10.0.0.1, 10.0.0.5, 10.0.0.6"
Nginx RealIP獲取真實IP
使用nginx Realip_module獲取多級代理下的客戶端真實IP地址,在真實Web節(jié)點上配置沛善,配置信息如下:
[root@web02 conf.d]# cat ip.xuliangwei.com.conf
server {
listen 80;
server_name ip.xuliangwei.com;
root /code;
set_real_ip_from 10.0.0.5;
set_real_ip_from 10.0.0.6;
set_real_ip_from 10.0.0.7;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
#set_real_ip_from:真實服務器上一級代理的IP地址或者IP段,可以寫多行
#real_ip_header:從哪個header頭檢索出需要的IP地址
#real_ip_recursive:遞歸排除set_real_ip_from里面出現(xiàn)的IP,其余沒有出現(xiàn)的認為是用戶真實IP
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
最終結果是"10.0.0.1 - - "GET /index.php HTTP/1.1" 200 "10.0.0.5, 10.0.0.6"
10.0.0.5航揉,10.0.0.6都出現(xiàn)在set_real_ip_from中,僅僅10.0.0.1沒出現(xiàn)金刁,那么他就被認為是用戶的ip地址帅涂,同時會被賦值到 $remote_addr變量中。
獲取真實IP總結:
forwarded-for:可以獲取到用戶的真實IP地址尤蛮。
nginx realip:程序無需改動媳友,直接使用remote_addr變量即可獲取真實IP地址,但需要知道所有沿途經(jīng)過的IP地址或IP段