一身转战三千里,一剑曾当百万师。这篇文章主要讲述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刷新
可看数据包很多信息
-->
再点击“网络”看报头
?
推荐阅读
- C# 将Excel转为PDF时设置内容适应页面宽度
- CentOS 文件的属性及类型
- Pod概念详解
- 准时下班系列!Access合集之第5集—闭环的Access系统开发流程演示
- # yyds干货盘点 # 实战篇(盘点Pandas中的factorize()函数妙用)
- RouterOS 重置密码
- 二叉树面试题(前中序求后序中后序求前序)
- 一文了解 Python 中的生成器#私藏项目实操分享#
- 五分钟后,你将真正理解MySQL事务隔离级别!