nginx地址重写、反向代理方式

 更新时间:2023年12月25日 10:02:12   作者:小小妍的棉花糖  
这篇文章主要介绍了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.起到高可用的功能。当不做这个环境时,坏了一台机子将全部坏掉,有这个环境就可以起到高可用的功能。

实验环境:四台虚拟机

client192.168.35.137ens33
proxy192.168.35.5ens33
proxy192.168.0.5ens37
web1192.168.0.100ens33
web2192.168.0.200ens33

不相同网段之间不通。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。

实验环境:四台虚拟机 

client192.168.35.137ens33
proxy192.168.35.5ens33
proxy192.168.0.5ens37
web1192.168.0.100ens33
web2192.168.0.200ens33

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的代理都可以做。

最后

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • nginx负载均衡配置,宕机自动切换方式

    nginx负载均衡配置,宕机自动切换方式

    这篇文章主要介绍了nginx负载均衡配置,宕机自动切换方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • nginx实现根据URL转发请求的实战经历

    nginx实现根据URL转发请求的实战经历

    这篇文章主要给大家介绍了一次关于nginx实现根据URL转发请求的实战经历,文中通过示例代码介绍的非常详细,对大家学习或者使用nginx具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 详解nginx过滤url实现前台js的配置问题

    详解nginx过滤url实现前台js的配置问题

    本篇文章主要介绍了nginx过滤url实现前台js的配置问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • nginx简单配置多个server的方法

    nginx简单配置多个server的方法

    这篇文章主要介绍了nginx简单配置多个server的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • nginx 添加http_stub_status_module模块

    nginx 添加http_stub_status_module模块

    本文主要介绍了nginx 添加http_stub_status_module模块,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 图文详解nginx日志切割的实现

    图文详解nginx日志切割的实现

    这篇文章主要给大家介绍了关于nginx日志切割实现的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • nginx配置location方法总结

    nginx配置location方法总结

    这篇文章主要介绍了nginx配置location方法总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • zabbix自定义监控nginx状态实现过程

    zabbix自定义监控nginx状态实现过程

    这篇文章主要为大家介绍了zabbix如何自定义监控nginx状态的实现过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • nginx could not build the server_names_hash 解决方法

    nginx could not build the server_names_hash 解决方法

    服务器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。
    2011-03-03
  • CentOS7下非编译安装Nginx的图文教程

    CentOS7下非编译安装Nginx的图文教程

    这篇文章主要为大家详细介绍了CentOS7下非编译安装Nginx的图文教程,文中通过示例图片进行了详细讲解,有需要的小伙伴可以跟随小编一起学习一下
    2023-10-10

最新评论