nginx地址重写、反向代理方式
作者:小小妍的棉花糖
案例一:nginx地址重写
什么是地址重写?
就是地址栏被重写,如:www.360buy.com ----> www.jd.com
rewrite 旧地址 新地址 [选项] //rewrite后不要写域名,从/开始写。
需求:
沿用上次的www.a.com的配置,实现以下要求:
- 1、所有访问a.html的请求,重定向到b.html
- 2、所有访问192.168.0.100的请求重定向到www.tmooc.cn
- 3、所有访问192.168.0.100/的请求重定向到www.tmooc.cn/下相同的页面
- 4、实现浏览器与curl访问相同的页面文件,返回不同的内容
实现方案:
- 主要用到参数 rewrite
- rewrite regex replacement flag
- rewrite 旧地址 新地址 【选项】
步骤一:修改配置文件(访问a.html 跳到b.html)
[root@porxy ~]# vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name 192.168.35.134; ###添加下列信息#### rewrite /a.html /b.html; [root@porxy ~]# echo "BBB" > /usr/local/nginx/html/b.html [root@porxy ~]# /usr/local/nginx/sbin/nginx -s reload 客户端进行验证: [root@client ~]# curl http://192.168.35.134/a.html //访问的是a.html,实际出来的是b.html BBB
浏览器验证:
步骤二:修改配置文件(访问a.网站的a页面,跳转的是a网站的b页面)
[root@porxy ~]# vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name 192.168.35.134; ###多添加redirect#### rewrite /a.html /b.html redirect; [root@porxy ~]# echo "BBB" > /usr/local/nginx/html/b.html [root@porxy ~]# /usr/local/nginx/sbin/nginx -s reload 客户端进行验证: [root@client ~]# curl http://192.168.35.134/a.html //访问的是a.html,实际出来的是b.html BBB
浏览器地址栏会出现变化:
步骤三:修改配置文件(访问192.168.4.5的请求重定向至www.tmooc.cn)
[root@porxy ~]# vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name 192.168.35.134; ######添加这个信息######### rewrite ^/ http://www.tmooc.cn/ ; # ^/ 值得正则匹配 [root@porxy ~]# /usr/local/nginx/sbin/nginx -s reload
浏览器访问时直接跳转到www.tmooc.cn 网站
步骤四:访问192.168.35.134/下面的页面,重定向到www.tmooc.cn/下相同的页面
[root@porxy ~]# vim /usr/local/nginx/conf/nginx.conf location / { } listen 80; listen 80; server_name 192.168.35.134; ######添加配置####### rewrite ^/(.*)$ http://www.tmooc.cn/$1; #.*代表任何东西,()括号代表复制,后面的$1就是第一个括号的东西。更好的解决了步骤三的缺点。 [root@porxy ~]# /usr/local/nginx/sbin/nginx -s reload 浏览器验证: 例如:访问的是http://www.baidu.com/free 则会跳转到http://www.tmooc.cn/free页面下。
浏览器测试:
步骤五:修改配置文件(实现curl和火狐访问相同链接返回的页面不同)
连接相同则代表
访问:/usr/local/nginx/html/test.html 实际访问:/usr/local/nginx/html/firefox/test.html
脚本更改为:如何区分?
if (如果你是手机){
rewrite ^/(.*) /firefox/$1;
}
http { include mime.types; default_type application/octet-stream; #######下面注释的很重要######## #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' //日志的第一列时客户端的ip地址,第二列时横线,第三列是用户名,第四列是方括号括起来的时间,第五列是访问的页面 # '$status $body_bytes_sent "$http_referer" ' //然后是状态,再一列是字节,再是看请求的是什么 # '"$http_user_agent" "$http_x_forwarded_for"'; //$http_user_agent 是可以看到客户端用的是什么操作系统,什么浏览器,什么版本号, #access_log logs/access.log main;
步骤一:
1)创建网页目录及对应的网页文件
[root@porxy ~]# echo " I am beautiful girl" > /usr/local/nginx/html/test.html [root@porxy ~]# mkdir -p /usr/local/nginx/html/firefox/ [root@porxy ~]# echo "firefox page" > /usr/local/nginx/html/firefox/test.html
2)修改nginx配置文件
[root@porxy ~]# vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name 192.168.35.134; #rewrite ^/ http://www.tmooc.cn/ ; #rewrite ^/(.*)$ http://www.tmooc.cn/$1; #########添加下列信息######### #这里的~符号代表正则匹配,*符号代表不区分大小写 if ($http_user_agent ~* firefox){ #识别客户端firefox浏览器 rewrite ^(.*)$ /firefox/$1; } [root@porxy ~]# /usr/local/nginx/sbin/nginx -s reload
nginx地址重写【总结】
rewrite 旧地址 新地址 [选项] //rewrite后不要写域名,从/开始写。
rewrite /a.html /b.html ; //访问a跳转到b
rewrite /a.html /b.html redirect; // redirect 临时重定向
rewrite /a.html /b.html last; // last意思是不再读其他rewrite
rewrite /a.html /b.html permament; //permament意思是永久重定向。
rewrite /a.html /b.html break; // break意思是不再读其他语句,请求结束。
案例二: nginx的反向代理
Nginx功能:
- 调度器(轮询算法)
- 健康检查
什么是调度?
就是当用户发送访问请求时,nginx代理器将第一次请求发送到web1,第二次请求发送到web2服务器上。
什么是健康检查?
就是智能的判断哪台服务器坏了,智能做健康检查。
结构上的作用:
这个环境的结构上作用就是:
1.当访问压力增大时,可以把负载均衡到每个服务器上。在生产环境中起到高并发的功能。
2.起到高可用的功能。当不做这个环境时,坏了一台机子将全部坏掉,有这个环境就可以起到高可用的功能。
实验环境:四台虚拟机
client | 192.168.35.137 | ens33 |
proxy | 192.168.35.5 | ens33 |
proxy | 192.168.0.5 | ens37 |
web1 | 192.168.0.100 | ens33 |
web2 | 192.168.0.200 | ens33 |
不相同网段之间不通。Nginx即叫代理服务器、也叫调度器。
步骤一:部署实施后端Web服务器
1)部署后端服务器
[root@web1 ~]# echo "AAA" >/var/www/html/index.html [root@web2 ~]# echo "BBB" >/var/www/html/index.html [root@porxy ~]# systemctl start httpd
步骤二:配置nginx服务器,添加服务器池,实现反向代理
[root@porxy ~]# vim /usr/local/nginx/conf/nginx.conf ######添加如下信息###### #upstream 定义后端的服务器集群,集群名字任意(如webserver) #使用server定义集群中的具体服务器和端口 upstream webserver { server 192.168.0.100:80; server 192.168.0.200:80; } server { listen 8000; server_name localhost; # server_name 192.168.35.5; # rewrite /a.html /b.html; #访问a.html跳转到b.html # rewrite /a.html /b.html redirect; #访问a.网站 的a页面,跳转的是a网站的b页面 # rewrite ^/ http://www.tmooc.cn/ ; # ^/ 值得正>则匹配 # rewrite ^/(.*)$ http://www.tmooc.cn/$1; # .*代表任何东西,()括号代表复制,后面的$1就是第一个>括号的东西 #charset koi8-r; #access_log logs/host.access.log main; location / { #处理静态信息 ######添加如下信息###### proxy_pass http://webserver; #当用户访问8000>端口时,直接定义到webserver root html; index index.html index.htm; } [root@porxy ~]/usr/local/nginx/sbin/nginx -s reload 此时在客户端上:9验证负载均衡)
验证(健康检查):
当停掉某一台web服务器时,再次客户端访问,看是否轮询,是否报错,
步骤三:配置upstream 服务器集群池属性
1)设置失败次数,超时时间,权重
- weight:设置服务器权重值,权重默认为1
- max_fails设置最大失败次数
- fail_timeout:设置失败超时时间,单位为秒,(坏了,超时时间内不再连接)
- down: 标记服务器已关机,不参与集群调度
长时间不能恢复使用down,短时间可以使用fail——timeout,权重越高,服务器越繁忙
[root@porxy ~]vim /usr/local/nginx/conf/nginx.conf upstream webserver { server 192.168.0.100:80 weight=1 max_fails=1 fail_timeout=30 ; #意思为权重时2:1的概率 server 192.168.0.200 weight=2 max_fails=2 fail_timeout=30; } [root@porxy ~]/usr/local/nginx/sbin/nginx -s reload
步骤四:配置upstream 服务器集群的调度算法
1)相同客户端访问相同的服务器
假设:web1、web2是一个需要登录的动态网站。porxy使用轮询算法时,登录web1,则访问到了web2。
需求:相同客户端访问相同的服务器
解决办法:porxy采用ip_hash算法
vim /usr/local/nginx/conf/nginx.conf .... upstream webserver{ ip_hash; #通过ip_hash设置调度规则为:相同客户端访问相同的服务器 server 192.168.0.100:80; #使用server定义集群中的具体服务器和端口 server 192.168.0.200:80; } server { listen 80; server_name www.a.com; location / { proxy_pass http://webserver; root html; index index.html index.htm; } } ... 重启服务 /usr/local/nginx/sbin/nginx -s reload
总结:案例一配置都是在http中修改,所以做的是网站代理。
案例三:Nginx的TCP/UDP调度器
需求
使用Nginx实现tcp/udp调度器功能,实现如下功能:
- 后端ssh服务器两台
- nginx编译安装时需要使用–with-stream,开启ngx_stream_core_module模块
- nginx采用轮询的方式调用后端ssh服务器
方案:
使用4台虚拟机,其中一台作为nginx代理服务器,该服务器需要配置两块网卡,IP地址分别为192.168.0.100和192.168.0.200。
实验环境:四台虚拟机
client | 192.168.35.137 | ens33 |
proxy | 192.168.35.5 | ens33 |
proxy | 192.168.0.5 | ens37 |
web1 | 192.168.0.100 | ens33 |
web2 | 192.168.0.200 | ens33 |
nginx可以做其他服务的代理
要实现Nginx对TCP/UDP的调度,需要安装以下模块
模块
- ngx_stream_core_module模块
- 使用--with-stream开启该模块 (开启这一功能,则可以代理一切的服务)
- 注意:nginx从1.9版本才开始支持该功能
步骤一:部署支持4层tcp/ip代理的Nginx服务器
特别注意:做过之前实验的,现在需要将之前的删除后,重新安装。
[root@proxy ~]# yum -y install gcc pcre-devel openssl-devel [root@proxy ~]# tar -xf nginx-1.20.1.tar.gz [root@proxyt ~]# cd nginx-1.20.1/ [root@localhost nginx-1.20.1]# ./configure \ > --with-http_ssl_module \ //开启ssl加密功能 > --with-stream //开启四层反向代理,也就是tcp/udp的服务器 [root@proxy nginx-1.20.1]# make && make install
步骤二:修改nginx配置文件,添加地址池,实现tcp/udp反向代理
[root@porxy ~]vim /usr/local/nginx/conf/nginx.conf events { worker_connections 1024; } stream { upstream backend{ server 192.168.0.100:22; #后端两台ssh服务器 server 192.168.0.200:22; } server { listen 12345; #nginx监听的端口号确保唯一性 proxy_pass backend; proxy_connect_timeout 1s; #连接的超时时间 proxy_timeout 3s; } } [root@proxy conf]# /usr/local/nginx/sbin/nginx
步骤三:客户端验证
[root@client ~]# ssh 192.168.4.5 -p 12345
总结:案例二只要是tcp/udp的代理都可以做。
最后
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。