Nginx实践(用rewrite规则实现域名重定向及客户端IP地址透传)

一身转战三千里,一剑曾当百万师。这篇文章主要讲述Nginx实践:用rewrite规则实现域名重定向及客户端IP地址透传相关的知识,希望能为你提供帮助。
?简要说明:按照下图的规划,实现访问 www.shone.cn ,被nginx 反向代理到后端的两台http(IP:192.168.250.18 和IP:192.168.250.28 ),Nginx代理到后端两台RS服务器采用轮询方式,并可以自动进行对端的web进行健康检测,出现后端的RS故障自动停止调度。实现上面目标后,在NgInx 服务器上完成地址透传,让后端RS服务器记录到真实的访问IP地址,便于做访问日志分析等。最后,再配置 NgInx 服务器,测试 rewrite 模块的域名重定向。?
1.架构和主机

# 四台主机
12台web服务器 :
主机名:PC-WebServer-IP18
CentOS 8.4
IP:192.168.250.18
httpd web服务页面内容 PC-WebServer-IP18 192.168.250.18

主机名:PC-WebServer-IP28
CentOS 8.4
IP:192.168.250.28
httpd web服务页面内容 PC-WebServer-IP28 192.168.250.28

21台 Nginx 服务器 :
主机名: Nginx-IP08
CentOS 8.4
IP:192.168.250.8/24
nginx version: nginx/1.21.6

31台client主机 :
主机名:Client-IP172-18
CentOS 8.4

2.后端web主机的准备?简要说明:在2台服务器上分别安装好Apache,并定义好首页页面,确保后面测试直观显示效果。?
# 一条命令完成 PC-WebServer-IP18 主机部署 httpd
[root@PC-WebServer-IP28 ]#yum -y install httpd; hostname > /var/www/html/indexTmp.html; hostname -I > > /var/www/html/indexTmp.html; cat /var/www/html/indexTmp.html | xargs > /var/www/html/index.html; systemctlenable --now httpd


# 一条命令完成 PC-WebServer-IP28 主机部署 httpd
[root@PC-WebServer-IP28 ]#yum -y install httpd; hostname > /var/www/html/indexTmp.html; hostname -I > > /var/www/html/indexTmp.html; cat /var/www/html/indexTmp.html | xargs > /var/www/html/index.html; systemctlenable --now httpd

3.配置Nginx 服务器
[root@Nginx-IP08 ]#vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

# yum安装最新的 nginx
[root@Nginx-IP08 ]#yum -y install nginx
# 启动并设定开机启动
[root@Nginx-IP08 ]#systemctl enable --now nginx
[root@Nginx-IP08 ]#ss -ltn
StateRecv-QSend-QLocal Address:PortPeer Address:PortProcess
LISTEN05110.0.0.0:800.0.0.0:*
[root@Nginx-IP08 ]#nginx -v
nginx version: nginx/1.21.6
[root@Nginx-IP08 ]#

4.实现反向代理web负载均衡?简要说明:配置 Nginx的反向代理,并在两台WEB服务器之间实现负载均衡和自动的故障停止调度等?
# 首先要修改主配置文件
[root@Nginx-IP08 ]#vim /etc/nginx/nginx.conf
######################下面这部分就是新增加的内容 ######################
# PC-Servers组的配置,注释掉一些高级用法,用基础的可以测试下
upstream PC-Servers
#hash $request_uri consistent;
#hash $cookie_sessionid
#ip_hash;
#least_conn;
server 192.168.250.18:80;
server 192.168.250.28:80;



[root@Nginx-IP08 ]#cat /etc/nginx/nginx.conf

usernginx;
worker_processesauto;

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

events
worker_connections1024;


http

upstream PC-Servers
#hash $request_uri consistent;
#hash $cookie_sessionid
#ip_hash;
#least_conn;
server 192.168.250.18:80;
server 192.168.250.28:80;

include/etc/nginx/mime.types;
default_typeapplication/octet-stream;

log_formatmain$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.logmain;

sendfileon;
#tcp_nopushon;

keepalive_timeout65;

#gzipon;

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

[root@Nginx-IP08 ]#

########和上面主配置文件对应的是server子配置文件PC-Servers 要和上面的主配置文件中定义的对应########
# PC-Servers组的server子配置文件
[root@Nginx-IP08 ]#cat /etc/nginx/conf.d/pc.conf
server
listen 80;
server_name www.shone.cn;
location /
proxy_pass http://PC-Servers;



[root@Nginx-IP08 ]#


# 语法检测没错误
[root@Nginx-IP08 ]#nginx -t
# 重新引导Nginx,让新配置文件生效
[root@Nginx-IP08 ]#nginx -s reload

##############################################################################################################
# 测试访问
[root@Client-IP172-18 ]#while :; do curl http://www.shone.cn; sleep 1; done
PC-WebServer-IP28 192.168.250.28
PC-WebServer-IP18 192.168.250.18
PC-WebServer-IP28 192.168.250.28
PC-WebServer-IP18 192.168.250.18
PC-WebServer-IP28 192.168.250.28
PC-WebServer-IP18 192.168.250.18
PC-WebServer-IP28 192.168.250.28
PC-WebServer-IP18 192.168.250.18
PC-WebServer-IP28 192.168.250.28
PC-WebServer-IP18 192.168.250.18
PC-WebServer-IP28 192.168.250.28
[root@Client-IP172-18 ]#





5.实现反向代理客户端IP透传?简要说明:在Nginx 和 httpd 上进行配置,实现后端的httpd服务器的日志可以正确记录客户端的实际访问地址,而不仅仅只认为都来自Nginx的IP地址访问,便于进行日志分析。?
###################修改Nginx的子配置文件 ###################
[root@Nginx-IP08 ]#cat /etc/nginx/conf.d/pc.conf
server
listen 80;
server_name www.shone.cn;
location /
proxy_pass http://PC-Servers;
#proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #加入此行,这行可以实现多级代理的IP地址透传,上面行只能实现一级透传。这两行中的 X-Real-IP 和X-Forwarded-For 两个字段必须和后端的httpd的日志配置文件内的字段相同


[root@Nginx-IP08 ]#

# 重启nginx服务
[root@Nginx-IP08 ]#systemctl restart nginx

###################修改后端RS上的httpd的配置文件 ###################
[root@PC-WebServer-IP18 ]#vim /etc/httpd/conf/httpd.conf

.........................
< IfModule log_config_module>
LogFormat "%X-Forwarded-Fori %h %l %u %t \\"%r\\" %> s %b \\"%Refereri\\" \\"%User-Agenti\\"" combined
...........................

# 上面的LogFormat "%X-Forwarded-Fori %h %l %u %t \\"%r\\" %> s %b \\"%Refereri\\" \\"%User-Agenti\\"" combined这行修改,在前面加了字头 %X-Forwarded-Fori

# 配置修改好好并保存,重启httpd服务
[root@PC-WebServer-IP18 ]#systemctl restart httpd

###################抓取后端RS的日志文件,可以看到实现IP地址透传 ###################

[root@PC-WebServer-IP18 ]#cat /var/log/httpd/access_log
192.168.250.8 - - [28/Mar/2022:06:07:47 +0800] "GET / HTTP/1.0" 200 33 "-" "curl/7.61.1"
192.168.250.8 - - [28/Mar/2022:06:07:50 +0800] "GET / HTTP/1.0" 200 33 "-" "curl/7.61.1"
192.168.250.254 192.168.250.8 - - [29/Mar/2022:20:41:57 +0800] "GET / HTTP/1.0" 200 33 "-" "curl/7.61.1"
192.168.250.254 192.168.250.8 - - [29/Mar/2022:20:41:58 +0800] "GET / HTTP/1.0" 200 33 "-" "curl/7.61.1"
192.168.250.7 192.168.250.8 - - [29/Mar/2022:20:42:05 +0800] "GET / HTTP/1.0" 200 33 "-" "curl/7.29.0"
192.168.250.7 192.168.250.8 - - [29/Mar/2022:20:42:06 +0800] "GET / HTTP/1.0" 200 33 "-" "curl/7.29.0"
[root@PC-WebServer-IP18 ]#cat /var/log/httpd/access_log

6.使用rewrite实现域名的重定向?简要说明: 使用rewrite实现访问地址的重定向?
6.1临时重定向redirect
?临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求。状态码:302 。示例:临时将访问源域名www.shone.cn 重定向到 www.feng.com 域名?
# 修改 Nginx 配置文件,将对 www.shone.cn域名的访问全部重定向到 www.ifeng.com 域名
[root@Nginx-IP08 ]#cat /etc/nginx/conf.d/pc.conf
server
listen 80;
server_name www.shone.cn;
location /
proxy_pass http://PC-Servers;
#proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite / http://www.ifeng.com redirect;


[root@Nginx-IP08 ]#

?在客户端通过浏览器访问,看到数据包的重定向过程如下图
【Nginx实践(用rewrite规则实现域名重定向及客户端IP地址透传)】
6.2永久重定向permanent
?重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求。状态码:301。示例:永久将访问源域名www.shone.cn 重定向到 www.feng.com 域名?
# 采用另外一种方式进行重新定向
[root@Nginx-IP08 ]#cat /etc/nginx/conf.d/pc.conf
server
listen 80;
server_name www.shone.cn;
location /
proxy_pass http://PC-Servers;
#proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#rewrite / http://www.ifeng.com redirect;
rewrite / http://www.ifeng.com permanent;


[root@Nginx-IP08 ]#systemctl restart nginx

打开浏览器后,摁?F12  -->     CTRL+R刷新    可看数据包很多信息    -->   再点击“网络”看报头
?


    推荐阅读