• Nginx 配置根据路径转发


    Nginx 配置根据路径转发

    总结:

    先谈理解:

    • 1.反向代理:是nginx代理所有的服务器。而正向代理是vpn代理客户端!!

    反向代理是配置 proxy_pass 可以只配置一个地址如 :

    proxy_pass http://127.0.0.1:8081;

    也可以配置多个

    • 2.那就是负载均衡

    定义负载均衡服务器:

    upstream myserver {
        server        192.168.12.127:8080;
        server        192.168.12.127:8081;
    }
    
    • 1
    • 2
    • 3
    • 4

    修改proxy_pass

    proxy_pass http://myserver;

    这样就实现了 反向代理 (proxy_pass)+ 负载均衡(upstream)

    1.nginx基本概念

    Nginx的概念

    • 正向代理和反向代理:
      • 正向代理:正向代理就是在客户端配置代理服务器,通过代理服务器去进行互联网操作。(VPN代理客户端)
      • 反向代理:客户端发送请求到反向代理服务器,由反向代理服务器去选择目标服务器获取它的数据,在返回给客户端。此时反向代理服务器和目标服务器对外就是一台服务器,暴露的是代理服务器地址,隐藏了真实的服务器地址。(代理服务端)
    • 负载均衡
      • 在多个服务器的情况下,我们将请求发放到各个服务器上,将原先请求集中到单个服务器的情况改为将请求发送到多个服务器上,将负载分发到不同的服务器,也就是负载均衡
    • 动静分离
      • 简单理解就是把静态资源和动态资源分开部署。为了加快网站解析的速度,可以把静态资源和动态资源部署到不同的服务器来解析,加快解析速度。降低单个服务器的压力!

    2.常用命令以及配置文件

    Win下nginx的常用命令

    • 前提:需要进入到nginx目录下在进行操作
    • nginx -v:查看nginx版本号
    • nginx -s stop:关闭nginx
    • start nginx:启动nginx
    • nginx -s reload:重新加载nginx
    • nginx -t 检查默认配置conf
    • taskkill /f /im nginx.exe win杀掉nginx

    3.nginx配置文件

    • 全局块
      • 主要设置一些影响nginx服务器运行的配置指令。主要包括配置运行nginx服务器的用户,允许生成的worker process数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等
      • 比如:worker_process 1; 这个就代表nginx服务器并发处理服务的关键配置,它的值越大,表示支持的并发处理量越多,但是会受到硬件,软件等设备的约束。
    • events块
      • events块主要影响nginx服务器与用户的网络连接,是否开启同时多个网络连接
      • 比如:worker_connections:1024;表示最大连接数为1024个
    • http块(http块包含了http全局块和server块)
      • 这时nginx配置最频繁的部分,代理,缓存,日志等都是在这里配置。
      • http全局块:主要是配置日志等等的配置
      • server块:
        • server全局快:listen:参数对应的是端口号;server_name:地址参数
        • location块:用来配置响应反向代理的。增加参数proxy_pass 服务器(反向代理去到的服务器)地址(比如:127.0.0.1:8080)

    3.nginx配置实例之反向代理

    1. 实现效果:监听9000端口。根据不同的路径跳转到不同的端口服务中

    2. 准备工作

    • 准备好两个服务器:8080和8081
    • 在8080tomcat的webapps里面添加一个shisan01文件夹,编写一个shisan.html。内容自己定就好,同理8081也是一样,添加一个shisan02文件夹,编写一个shisan.html。跑完之后访问不同的服务测试

    3. 前往nginx配置文件配置

    • 进入配置文件,如下配置

      server {
        listen        9000;
        server_name        192.168.12.127;
        location ~/shisan01/ {
            proxy_pass http://127.0.0.1:8080;
        }
        location ~/shisan02/ {
            proxy_pass http://127.0.0.1:8081;
        }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      PS:注意要记得开发端口号:8080 8081 9000
      PS:location的指令可以百度了解一下

    4.nginx配置实例之负载均衡

    1. 准备工作

    • 同样是两个tomcat(8080和8081)服务器,当然要是你真有两台服务器最好!哈哈哈。条件问题还是模拟。
    • 在两个服务器里面的webapps里面创建一个shisan文件夹,在shisan文件夹里创建一个shisan.html,添加内容自己定就好

    2. 在nginx配置文件中修改配置

    • 在http块中配置

      upstream myserver {
      server 192.168.12.127:8080;
      server 192.168.12.127:8081;
      }
      server {
      listen 80;
      server_name 192.168.12.127;
      location / {
      proxy_pass http://myserver;
      root html;
      index index.html index.htm;
      }
      }

    3. nginx分配服务器的策略

    • 轮询:默认策略;每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

    • 权重:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

      upstream myserver {
      server 192.168.12.127:8080 weight=10;
      server 192.168.12.127:8081 weight=5;
      }

    • IP绑定 ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题

      upstream myserver { 
        ip_hash; 
        server        192.168.12.127:8080;
        server        192.168.12.127:8081;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。

      upstream backserver {
      server 192.168.12.127:8080;
      server 192.168.12.127:8081;
      fair;
      }

    • url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

    5.nginx配置实例之动静分离

    1. 准备工作

    • 弄好一个动态资源一个静态资源:比如
      • /shisan/image/01.jpg
      • /shisan/html/01.html

    2. 配置nginx文件

    server {
        listen        80;
        server_name        192.168.12.127;
        location /html/ {
            root        /shisan/;
            index        index.html index.htm;
        }
        location /image/ {
            root        /shisan/;
            autoindex        on;            // 列出文件的目录,可以自行观看对比就知道
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    6.nginx配置高可用集群

    1. 因为我这里环境不允许,可以参考这个文章

    Location规则

    语法规则: location [=||*|^~] /uri/ {… }

    首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

    符号

    含义

    =

    = 开头表示精确匹配

    ^~

    ^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)

    ~
    开头表示区分大小写的正则匹配

    ~*

    ~ 开头表示不区分大小写的正则匹配*

    !和!*

    !和!*分别为区分大小写不匹配及不区分大小写不匹配的正则

    /

    用户所使用的代理(一般为浏览器)

    $http_x_forwarded_for

    可以记录客户端IP,通过代理服务器来记录客户端的ip地址

    $http_referer

    可以记录用户是从哪个链接访问过来的

    比这些 location 规则来选择一个 location,对比的顺序可以总结为:

    1. 首先匹配前缀匹配(没有 RE 表达式),针对当前这个请求,每个前缀匹配都匹配一遍.
    2. 搜索=匹配,如果当前请求匹配上了,搜索将会停止,直接使用这个这个 location.
    3. 如果第二步没有匹配上,nginx 会按照如下步骤继续搜索最长前缀匹配:
      3.1 如果最长前缀匹配有^~这个modifier,nginx 会停止搜索并直接使用这个 location.
      3.2 如果没有使用 ^~,暂存这个 location并且继续搜索.
    4. 只要最长前缀匹配被暂存和选中,nginx 就会看当前的 location 是否有大小写敏感的 RE(~~*),第一个匹配上这种会被当做有效的 location来处理这个请求.
    5. 如果没有 RE 的 location 匹配上,前面暂存的 location 就会被选中来处理这个请求.

    举例

    如下是一些 location 配置的例子,用来详细描述上面所说的处理顺序,你也可以按照具体实际情况来修改这些例子.

    location  = / {
      #  只处理请求 /.
    }
    
    
    location /data/ {
      # 所有以 /data/ 匹配,但是还会继续搜索.
      # 如果没有其他 location 匹配上,就用这个处理请求.
    }
    
    
    
    location ^~ /img/ {
      # 所有以 /img/ 开头的请求并且会停止搜索.
    }
    
    
    
    location ~* .(png|gif|ico|jpg|jpeg)$ {
      # 以png, gif, ico, jpg ,jpeg结尾的请求. 
      # 如果请求是到 /img/ 路径的话 还是会被上面??的 location 处理
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    3D检测PointNet++(通俗易懂的解析)
    Rust 中的 Pin UnPin Async Await 实现机制
    Java毕业设计-火车订票管理系统
    STM32keil设置中的宏定义STM32F10X_MD,USE_STDPERIPH_DRIVER作用以及用VS Code编写stm32代码配置问题
    k8s pod 处于Terminating的原因分析和解决处理——筑梦之路
    连接器切断机维修
    在字节跳动干软件测试5年,4月无情被辞,想给划水的兄弟提个醒
    NLP大模型
    基于stm32的shell实现
    Linux学习(二)
  • 原文地址:https://blog.csdn.net/m0_67393295/article/details/126062706