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

Posted njsummer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. 架构和主机

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

# 四台主机
1 2台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

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

3 1台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;systemctl enable --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;systemctl enable --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
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:80 0.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

user nginx;
worker_processes auto;

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

events
worker_connections 1024;


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_type application/octet-stream;

log_format main $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.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

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 ]#

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

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


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地址透传_rewrite规则实现域名重定向_04

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刷新   可看数据包很多信息    -->  再点击“网络”看报头


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

以上是关于Nginx实践:用rewrite规则实现域名重定向及客户端IP地址透传的主要内容,如果未能解决你的问题,请参考以下文章

使用rewrite规则实现将所有到a域名的访问rewrite到b域名

Nginx中的Rewrite的重定向配置与实践

灵活使用rewrite

第十八章 Nginx Rewrite重写

Nginx中rewrite实现二级域名三级域名泛域名路径的重写

nginx