目录
案例一:nginx地址重写
步骤一:修改配置文件(访问a.html 跳到b.html)
步骤二:修改配置文件(访问a.网站的a页面,跳转的是a网站的b页面)
步骤三:修改配置文件(访问192.168.4.5的请求重定向至)
步骤四:访问192.168.35.134/下面的页面,重定向到下相同的页面
步骤五:修改配置文件(实现curl和火狐访问相同链接返回的页面不同)
案例二: nginx的反向代理
步骤一:部署实施后端Web服务器
步骤二:配置nginx服务器,添加服务器池,实现反向代理
验证(健康检查):
步骤三:配置upstream 服务器集群池属性
步骤四:配置upstream 服务器集群的调度算法
案例三:Nginx的TCP/UDP调度器
步骤一:部署支持4层tcp/ip代理的Nginx服务器
步骤二:修改nginx配置文件,添加地址池,实现tcp/udp反向代理
步骤三:客户端验证:
案例一:nginx地址重写
什么是地址重写?
就是地址栏被重写,如:www.360buy.com ----> www.jd.com
rewrite 旧地址 新地址 [选项] //rewrite后不要写域名,从/开始写。
需求: 沿用上次的www.a.com的配置,实现以下要求:
1、所有访问a.html的请求,重定向到b.html
2、所有访问192.168.0.100的请求重定向到
3、所有访问192.168.0.100/的请求重定向到下相同的页面
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的请求重定向至)
[root@porxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name 192.168.35.134;
######添加这个信息#########
rewrite ^ # ^/ 值得正则匹配
[root@porxy ~]# /usr/local/nginx/sbin/nginx -s reload
浏览器访问时直接跳转到网站
步骤四:访问192.168.35.134/下面的页面,重定向到下相同的页面
[root@porxy ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
}
listen 80;
listen 80;
server_name 192.168.35.134;
######添加配置#######
rewrite ^/(.*)$
#.*代表任何东西,()括号代表复制,后面的$1就是第一个括号的东西。更好的解决了步骤三的缺点。
[root@porxy ~]# /usr/local/nginx/sbin/nginx -s reload
浏览器验证:
例如:访问的是http://www.baidu.com/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 ^/
#rewrite ^/(.*)
#########添加下列信息#########
#这里的~符号代表正则匹配,*符号代表不区分大小写
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的代理都可以做。