美文网首页
nginx学习笔记二 location配置

nginx学习笔记二 location配置

作者: 讲道理很没道理 | 来源:发表于2019-09-29 16:22 被阅读0次
    kill命令格式:

    kill 是向进程发送信号的命令。
    Nginx的信号
    1)、TERM、INT 快速关闭
    2)、QUIT从容关闭
    3)、HUP平滑重启,重新加载配置文件
    4)、USR1 重新打开日志文件
    5)、USR2 平滑升级可执行程序
    KILL 9 强制终止,直接杀

    二,nginx 指令
    root 的处理结果是:root路径 + location路径
    alias 的处理结果是:目录别名,使用alias 路径替换location 路径, alias 后面必须使用“/”结束,否则会找不到文件,而root可用可无.

    Nginx管理虚拟主机

    虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Intemet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机完全一样。
    利用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程。虚拟主机提供了在同一台服务器、同一组Nginx进程上运行多个网站的功能。

    基于域名的虚拟主机

    在nginx/conf/nginx.conf 配置文件中,有很多server 段配置。就是虚拟主机配置。
    在项目一般单独拿出来配置。

    server {
    #监听端口 80
    listen 80;
    #监听域名xxx.com;
    server_name xxx.com;
    location / {
    # 相对路径,相对nginx根目录。也可写成绝对路径
    root xxx;
    # 默认跳转到index.html页面
    index index.html;
    }
    }
    
    
    基于端口的虚拟主机配置
    server {
    #监听端口2022
    listen 2022;
    #监听域名 xxx
    server_name xxx.com;
    location / {
    #/home 目录绝对路径
    root /home;
    index index.html;
    }
    }
    
    
    基于IP地址虚拟主机配置
    server {
    #监听80端口
    listen 80;
    #监听ip地址 106.52.69.141
    server_name 119.23.225.141  ;
    location / {
    root ip;
    index index.html;
    }
    } 
    
    
    Location语法规则

    通过指定模式来与客户端请求的URI相匹配,基本语法如下:location [=||*|^~|@] pattern{……}

    以 = 开头,表示精确匹配;如只匹配根目录结尾的请求,后面不能带任何字符串。
    以^~ 开头,表示uri以某个常规字符串开头,不是正则匹配
    以~ 开头,表示区分大小写的正则匹配;
    以~* 开头,表示不区分大小写的正则匹配
    以/ 开头,通用匹配, 如果没有其它匹配,任何请求都会匹配到
    

    1:无修饰符号

    server {
        listen 80;
        server_name aliyun.loctest.com;
            #支持中文
        charset utf-8;
        #1。无修饰符,直接返回字符串
        location /abc{  
        default_type text/plain;
        return 502 "测试无符号修饰的匹配";
    }
    }
    
    

    配置windows域名

    C:\Windows\System32\drivers\etc
    的host 文件,添加
    119.23.225.141  aliyun.loctest.com
    

    支持访问的url:

    aliyun.loctest.com/abc
    aliyun.loctest.com/abc?p1
    aliyun.loctest.com/abc/
    aliyun.loctest.com/abcde
    .... 只要匹配上abc
    

    2:= 必须与指定的模式精确匹配

    server {
        listen 80;
        server_name aliyun.loctest002.com;
        charset utf-8;
    
        #1。无修饰符,直接返回字符串
        location /abc{  
        default_type text/plain;
        return 502 "测试无符号修饰的匹配";
        }
        
        #2.=修饰符,精确匹配,返回html标签
        location = /bcd{
        default_type text/html;
        return 502 "带=的精准匹配";
    }
    

    只支持
    aliyun.loctest.com/bcd
    截图路径忽略所有00x,没有备案被干掉,测试只能加域名


    image.png

    aliyun.loctest.com/bcd?xxx


    image.png
    其它基本就是404咯
    image.png

    /结束也不行:http://aliyun.loctest006.com/bcd/

    image.png

    3、~ 表示:指定的正则表达式要区分大小写

    server {
            listen 80;
            server_name aliyun.loctest005.com;
            charset utf-8;
    
            #1。无修饰符,直接返回字符串
            location /abc{
            default_type text/plain;
            return 502 "测试无符号修饰的匹配";
            }
    
            #2.=修饰符,精确匹配,返回html标签
            location = /bcd{
            default_type text/html;
            return 502 "带=的精准匹配";
            }
    
            #3.~ 正则表达式匹配,区分大小写
            location ~ /cde{
                #返回json
                default_type    application/json;
                return 502 '{"status":502,"msg":"测试正则表达式"}';
            }
    }
    

    正常 http://aliyun.loctest005.com/cde

    image.png

    大写 http://aliyun.loctest005.com/cDe

    image.png

    小写 http://aliyun.loctest005.com/cdexxx

    image.png
    用/结束可用http://aliyun.loctest006.com/cde/
    image.png
    #~* 正则表达式,不区分大小写
    server {
        listen 80;
        server_name aliyun.loctest007.com;
        charset utf-8;
    
        #1。无修饰符,直接返回字符串
        location /abc{  
        default_type text/plain;
        return 502 "测试无符号修饰的匹配";
        }
        
        #2.=修饰符,精确匹配,返回html标签
        location = /bcd{
        default_type text/html;
        return 502 "带=的精准匹配";
        }
    
        #3.~ 正则表达式匹配,区分大小写
        location ~ /cde{
            default_type    application/json;
                return 502 '{"status":502,"msg":"测试正则表达式"}';    
        }
    
        #~* 正则表达式,不区分大小写 ,配置了$只能匹配def
        location ~* ^/def$ {
            rewrite ^/ /a.html break;
                root html/static/;
    
        }
        #~* 正则表达式,不区分大小写,dfg,以及efgxxxx都可用匹配
        location ~* ^/efg {
            rewrite ^/ /b.html break;
                root html/static/;
    
        }
    
    
    
    }
    
    image.png
    image.png
    image.png
    image.png
    root ,alias 配置

    root与alias主要区别
    在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
    root的处理结果是:root路径 + location路径
    alias的处理结果是:使用alias路径替换location路径
    alias是一个目录别名的定义,root则是最上层目录的定义。
    还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的,而root则可有可无。
    使用root 一 location /abc 则在html 目录下一定要有abc 目录。否则404

      server_name aliyun.roottest015.com;
            charset utf-8;
          #root 配置 /  
            location / {
                    root html;
                    #访问目录权限
                    autoindex on;
            }
    
            location /abc {
                     root html;
                    #访问目录权限
                    autoindex on;
            }
            location /static{
                    root html;
                    #访问目录权限
                    autoindex on;
            }
    
            location /alias{
                     alias html;
                    #访问目录权限
                    autoindex on;
            }
    
            location /bcd{
                     alias html/static;
                    #访问目录权限
                    autoindex on;
            }
           location /absolute {
                 alias  /usr/local/nginx/html/static;
                #访问目录权限
                autoindex on;
           }
    
    
    }
    
    
    
    image.png
    image.png
    image.png
    image.png
    image.png

    8081虚拟主机

    server{
        listen 8081;
        server_name 106.52.69.141;
        charset utf-8;
        
        location / {
        
            default_type text/plain;
            return 502 "腾讯云8081监听端口,测试";
        
    }
    
    }
    

    8082虚拟主机

    server{
        listen 8082;
        server_name 106.52.69.141;
        charset utf-8;
        
        location / {
            default_type text/plain;
            return 502 "腾讯云8082监听端口,测试";
     }
    }
    
    
    
    

    反向代理

    server {
            listen       80;
            server_name  txunyun.proxypass.com;
    
            location / {
                proxy_pass http://106.52.69.141:8081;
    
            }
    
    
        }
    
    
    image.png

    负载均衡
    1、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
    2、weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。down 暂时不参与负载
    3、ip_hash:每个请求按访问ip的hash结果分配,这样同一客户端的请求总是发往同一个后端服务器,可以解决session的问题
    3

    #负载均衡器
    upstream nginx_port {
                    #ip_hash; # 根据IP hash负载,
                    server 106.52.69.141:8081  weight=2; #轮询权重
                    server 106.52.69.141:8082 weight=1;
             }
    server {
            listen       80;
            server_name  txunyun.upstream.com;
            location /nginx_port {
                  #代理
                    proxy_pass http://nginx_port;
            }
    
    

    访问url

    curl ,linux中请求路径的一个命令
     
    

    小阶段回顾

    一、nginx结构示意图
    image.png

    1、nginx上面记录后台两台tomcat1和tomcat2的访问路径。
    2、nginx监听系统port(如80端口),当有浏览器url请求到达时,nginx根据此url结构信息,将请求转发至后台两个tomcat
    3、转发至后台tomcat的策略,是一个负载均衡里的配置策略。
    4、以上三个步骤,均是在核心文件nginx.conf中配置(如下面这个配置信息)。


    image.png

    5、配置中的upstream里,记录了tomcat1和tomcat2的地址
    6、配置中的server里,监听了80端口
    7、配置中的location /dong,是分析url的结构(路径是/dong时),是这种结构的,就进入请求转发命令proxy_pass.
    8、proxy_pass是代理转发命令,将请求传递到 upstream(名字为nginx)配置对应的模块。
    9、upstream按负载策略(默认轮流两个地址),把请求发到配置的两后台tomcat地址

    二、nginx.conf中的server

    1、每一个server,对应一个监听port端口,一个ip/域名
    2、nginx里面可配置多个server,多个upstream
    3、每个server配置多个location
    4、一般配置方式:
    在/etc/nginx/con.d/目录下,放置多个server配置文件,每个配置文件里仅含一个server配置。
    然后在主配置nginx.conf中 : include 文件夹下所以server配置 .

    三、upstream/location/rewrite功用

    upstream --- 用以配置负载的策略,nginx自带的有:轮询/权重/ip_hash。特殊需求可用第三方策略(使用较少)。
    location:----用以匹配url信息结构,配足即进入对应逻辑块。是一套匹配逻辑的小型语法,核心是做url匹配。
    rewrite:----用以修改url信息(ip+port部分无法改)的path部分,做重定向。与servlet类似,有页面重定向和内部重定向两类。
    proxy_pass----用以转发命令。是实际的转发执行者。它可将流程转给upstream模块。

    四,nginx执行location流程示例

    一:springBoot项目,集成swagger,用maven 打成jar 包,使用WinSCP 上传到腾讯云服务器

    @RestController
    @RequestMapping("/api/home")
    @Api(value = "HomeController|一个用来测试swagger注解的控制器")
    public class HomeController {
    
        @GetMapping("/hello")
        public String hello() {
            return "hello";
        }
    
    
        @ApiOperation(value = "首页信息", notes = "invokePost说明", httpMethod = "GET")
        @GetMapping("/getPage")
        public String getPage() {
            return "我是订单子系统,您共完成10笔订单,金额5000元";
        }
    
        @ApiOperation(value = "模块信息", notes = "模块信息说明", httpMethod = "GET")
        @GetMapping(value = "/getInfo")
        public String getInfo() {
            return "你的商品订单iphoneX,正在运送途中,请注意收货";
        }
    }
    

    二打成jar包



    把target目录下的jar包


    image.png
    上传到服务器
    image.png

    执行启动项目

    java -jar xxxx.jar
    
    image.png

    访问:swagger


    image.png

    访问api接口


    image.png

    添加nginx 虚拟服务主机配置文件 txyunapi.conf

    server{
    listen 80;
    server_name txyun.api.com;
    
    
    #后台服务原始路径;http://106.52.69.141:8082/api/home/hello
    
    #无/ 结束,访问路径 http://txyun.api.com/api/home/hello
    location /api/home { #匹配路径/api/home ,剩余路径/hello
        proxy_pass http://106.52.69.141:8082; #此处未关闭,传递路径/api/home/hello  到目标ip:port
    }
    
    
    }
    
    

    配置windows host 文件
    添加ip 域名

    106.52.69.141 txyun.api.com
    

    访问 http://txyun.api.com/api/home/hello

    image.png

    添加/结束配置

    listen 80;
    server_name txyun.api.com;
    
    
    #后台服务原始路径;http://106.52.69.141:8082/api/home/hello
    
    #无/ 结束,访问路径 http://txyun.api.com/api/home/hello
    location /api/home { #匹配路径/api/home ,剩余路径/hello
        proxy_pass http://106.52.69.141:8082; #此处未关闭,传递路径/api/home/hello  到目标ip:port
    }
    
    # 有/结束,访问路径;http://txyun.api.com/dynamic/api/home/getPage
    location /dynamic { #匹配路径/dynamic ,剩余路径/api/home/getPage
        proxy_pass http://106.52.69.141:8082/; #此处/关闭,只传递/剩余路径 /api/home/getPage 到目标ip:port
    }
    
    }
    
    
    

    访问http://txyun.api.com/dynamic/api/home/getPage

    image.png

    添加静态配置:

    server{
    listen 80;
    server_name txyun.api.com;
    
    
    #后台服务原始路径;http://106.52.69.141:8082/api/home/hello
    
    #无/ 结束,访问路径 http://txyun.api.com/api/home/hello
    location /api/home { #匹配路径/api/home ,剩余路径/hello
            proxy_pass http://106.52.69.141:8082; #此处未关闭,传递路径/api/home/hello  到目标ip:port
    }
    
    # 有/结束,访问路径;http://txyun.api.com/dynamic/api/home/getPage
    location /dynamic { #匹配路径/dynamic ,剩余路径/api/home/getPage
            proxy_pass http://106.52.69.141:8082/; #此处/关闭,只传递/剩余路径 /api/home/getPage 到目标ip:port
    }
    
    #访问静态路径:http://txyun.api.com/static/a.html
    location /static { #匹配路径/static ,剩余路径/a.thml
            root html/;#root 声明,在html文件夹,查找 /static/a.html文件
    }
    
    
    }
    
    

    在nginx服务器上,html 目录下有static 目录,并且有对应的文件


    image.png image.png

    访问:http://txyun.api.com/static/a.html

    image.png

    添加alias配置

    server{
    listen 80;
    server_name txyun.api.com;
    
    
    #后台服务原始路径;http://106.52.69.141:8082/api/home/hello
    
    #无/ 结束,访问路径 http://txyun.api.com/api/home/hello
    location /api/home { #匹配路径/api/home ,剩余路径/hello
        proxy_pass http://106.52.69.141:8082; #此处未关闭,传递路径/api/home/hello  到目标ip:port
    }
    
    # 有/结束,访问路径;http://txyun.api.com/dynamic/api/home/getPage
    location /dynamic { #匹配路径/dynamic ,剩余路径/api/home/getPage
        proxy_pass http://106.52.69.141:8082/; #此处/关闭,只传递/剩余路径 /api/home/getPage 到目标ip:port
    }
    
    #访问静态路径:http://txyun.api.com/static/a.html
    location /static { #匹配路径/static ,剩余路径/a.thml
        root html/;#root 声明,在html文件夹,查找 /static/a.html文件
    }
    
    #访问路径:http://txyun.api.com/target/a.html 
    location /target { #匹配路径target ,剩余路径/a.html
        alias html/static/; # alias 声明在html/static/文件夹,查找a.html
    }
    
    
    

    访问: http://txyun.api.com/target/a.html

    image.png image.png

    相关文章

      网友评论

          本文标题:nginx学习笔记二 location配置

          本文链接:https://www.haomeiwen.com/subject/wesvuctx.html