精华内容
下载资源
问答
  • Linux Nginx Rewrite

    2017-04-05 14:34:57
     重写模式 } 2.set #设置变量 3.return 返回状态码 4.break 跳出rewtire 5.rewrite 重写 if条件又怎么写? 答:3种写法 1: “=”来判断相等, 用于字符串比较 2: “~” 用正则来匹配(此处的正则区分大小写)

    重写中用到的指令

    1. if () {}

    If  语法格式

    If 空格 (条件) {

        重写模式

    }


    2.set   #设置变量

    3.return 返回状态码

    4.break 跳出rewtire

    5.rewrite 重写


    if条件又怎么写?

    答:3种写法

    1: “=”来判断相等, 用于字符串比较

    2: “~” 用正则来匹配(此处的正则区分大小写)

       ~* 不区分大小写的正则

    3: -f -d -e来判断是否为文件,为目录,是否存在.


    例子:

                if  ($remote_addr = 192.168.1.100) {

                    return 403;

                }

     

     if ($http_user_agent ~ MSIE) {

                    rewrite ^.*$ /ie.htm;

                    break; #(不break会循环重定向)

     }

     

                 if (!-e$document_root$fastcgi_script_name) {

                    rewrite ^.*$/404.html break;

                } 


    set 是设置变量用的, 可以用来达到多条件判断时作标志用.

    达到apache下的 rewrite_condition的效果

     

    如下: 判断IE并重写,且不用break; 我们用set变量来达到目的

    if ($http_user_agent ~* msie) {

                    set $isie 1;

                }

     

                if($fastcgi_script_name = ie.html) {

                    set $isie 0;

                }

     

                if ($isie 1) {

                    rewrite ^.*$ie.html;

                }
















    展开全文
  • Rewrite 规则使用 linux云计算架构-Apache高级调优 1. Apache运行模式介绍 web服务器apache共有3种稳定的MPM(multi-processing module,多进程处理模块)。profork(进程模式)、worker(线程模式)、event(事件...

    linux云计算架构-Apache高级调优【运行模式、rewrite模块】

    1. Apache运行模式介绍

    web服务器apache共有3种稳定的MPM(multi-processing module,多进程处理模块)。prefork(进程模式)worker(线程模式)event(事件模式)

    在configure配置编译参数时,可以使用--with-mpm=prefork|worker|event或者--enable-mpms-shared=all配置支持MPM。

    可以通过以下两种方式查看主机的apache是配置的哪种运行模式,源码安装的apache2.4.46自带的是workeryum安装的apache自带的是prefork
    源码查看:
    在这里插入图片描述
    在这里插入图片描述
    yum安装查看:
    在这里插入图片描述
    在这里插入图片描述

    ①prefork:实现了一个非线程的、多进程的、预派生的web服务器。在apache启动时,会预派生一些子进程,然后等待连接,可以减少频繁创建和销毁进程带来的开销。每个子进程只有一个线程,在某个时刻,只能处理一个请求。由于进程相对占用资源,消耗大量内存,不适用于高并发场景。将maxClients设置为一个足够大的数值以处理潜在请求高峰,但不能设置太大,导致需要使用的内存超过物理内存。在apache2.4版本以后,默认的MPM为worker。
    优点:每个进程使用独立的内存空间,当某个进程坏了,不影响其他进程,较安全。
    缺点:占用内存较大
    在这里插入图片描述

    ②worker:使用了多进程多线程混合模式,当apache启动时,主进程会预派生一些子进程,每个子进程又创建一些线程,其中包括一个监听线程一个线程处理一个请求。由于线程是共享父进程的内存空间,所以比起进程更轻量。当一个线程出了问题,只会影响同一父进程下的其他线程,而不会影响到其他进程下的线程,即影响到的仅仅是部分。当使用keepalive长连接时,线程会被占用一定时间,即使中间没有请求,也需要等待到超时才会被释放。
    优点:可以处理海量请求,系统资源开销小。
    缺点:当一个线程故障,整个进程都会故障。存在keepalive长连接占用资源时间过长的问题。

    在这里插入图片描述

    当一个进程中所有线程完成一定数量的请求后,自动关闭线程,再重新打开线程。【如一个线程完成10000个请求后,线程自动关闭再重新打开。】

    prefork和worker运行模式的共同点:都会提前派生子进程用来处理即将到来的请求,这样当客户端发起请求时,就不需要等待子进程的产生。

    ③event:该运行模式在2.4版本后稳定运行,是目前apache最新的工作模式。该工作模式相较于worker,解决了keepalive长连接占用线程资源导致资源浪费的问题。在event模式下,有一些专门的线程用来管理keepalive类型的线程,当有请求时,会将请求传递给服务器的线程,执行完毕后,当该连接没有新的请求时,会主动关闭连接
    在这里插入图片描述
    综上,在生产中,若要求有更高伸缩性和支持高并发,可以使用worker或event模式。若需要可靠安全或与旧软件兼容的站点,可以使用prefork。

    2. prefork模式优化

    # 将apache运行模式切换为prefork
    [root@server ~]# vim /usr/local/apache/conf/httpd.conf 
     66 LoadModule mpm_prefork_module modules/mod_mpm_prefork.so   # 去除注释
     67 #LoadModule mpm_worker_module modules/mod_mpm_worker.so    # 加上注释
    [root@server ~]# /etc/init.d/apache restart
    [root@server ~]# /usr/local/apache/bin/httpd -M | grep mpm
     mpm_prefork_module (shared)
    

    prefork模式优化:

    # 启用httpd-mpm.conf配置
    [root@server ~]# vim /usr/local/apache/conf/httpd.conf 
    464 # Server-pool management (MPM specific)
    465 Include conf/extra/httpd-mpm.conf
    # mpm具体配置
    [root@server ~]# vim /usr/local/apache/conf/extra/httpd-mpm.conf
     28 <IfModule mpm_prefork_module>
     29     StartServers             5  # 启动apache时创建的服务进程数
     30     MinSpareServers          5  # 最小空闲进程数
     31     MaxSpareServers         10  # 最大空闲进程数
     32     MaxRequestWorkers      250  # 最大并发进程数
     33     MaxConnectionsPerChild   0  # 最大连接限制数,0为不限制。
     34 </IfModule>
    

    prefork调优的几点解读:
    ①MinSpareServers:若当前空闲子进程数(没有正在处理请求的子进程)少于MinSpareServers,apache会以每秒2的n-1次方诞生子进程,直到MinSpareServers的值大于等于5,这些空闲的子进程用来应对即将到来的请求。
    ②MaxSpareServers:若当前空闲的子进程数多余MaxSpareServers,apache会杀死多余的子进程,使得当前空闲子进程小于等于MaxSpareServers。
    ③一般MinSpareServers和MaxSpareServers的值不宜设置过大,较多的空闲子进程会占用内存资源,一般设置为最大并发的十分之一。
    ④MaxRequestWorkers:最大同时处理请求的进程数,也是最大同时连接数,表示最大请求并发能力,超过该值的请求,将进行排队。
    ⑤MaxConnectionsPerChild:在一个进程的生命周期内,处理的最大请求数,处理的请求达到这个数值后,会终止进程,当进程处理完最后的请求,进程将自动被杀死。【若开启keepalive长连接,在一次连接中即使有多个请求,也只算一次请求。】
    ⑥将MaxConnectionsPerChild值设置非0,可以防止内存泄露无限进行,从而耗尽内存。给进程一个有限寿命,有助于当服务器负载减轻时减少活动进程的数量。

    3. worker模式优化

     44 <IfModule mpm_worker_module>
     45     StartServers             3  # 启动时apache产生的进程数
     46     MinSpareThreads         75  # 最小空闲线程数
     47     MaxSpareThreads        250  # 最大空闲线程数
     48     ThreadsPerChild         25  # 每个进程可以启动的线程数
     49     MaxRequestWorkers      400  # 所有线程数量的的最大值,通常表示可以同时处理的请求数。
     50     MaxConnectionsPerChild   0   # 最大连接数限制
     51 </IfModule>
    

    worker调优几点解读:
    ①MinSpareThreads:基于整个服务器监视的最小空闲线程数,若空闲线程小于设定值,apache会自动创建线程,若服务器负载较大,可以加大该值。
    ②MaxSpareThreads:基于整个服务器监视的最大空闲进程数,若空闲进程大于设定值,apache会自动杀死多余的进程,若服务器负载较大,可以加大改值。
    ③ThreadsPerChild:每个进程包含的线程数,若并发量较大,可以加大此值。影响较大,慎重使用。
    ④MaxRequestWorkers:所有线程数量的最大值,一般为web服务器的最大并发值,必须是ThreadsPerChild的整数倍。【MaxRequestWorkers = StartServers * ThreadsPerChild

    # event模式配置与worker模式配置一致。
    # event模式解决了keepalive长连接导致空闲进程过多,占用内存资源过多的问题
     61 <IfModule mpm_event_module>
     62     StartServers             3
     63     MinSpareThreads         75
     64     MaxSpareThreads        250
     65     ThreadsPerChild         25
     66     MaxRequestWorkers      400
     67     MaxConnectionsPerChild   0
     68 </IfModule>
    

    4. 常见worker模式配置实战:

    ①子进程数由StartServers的值决定
    在这里插入图片描述
    ②查看每个apache子进程占用的内存数

    # apache所有进程占用的内存数
    [root@server ~]# ps aux | grep httpd | awk '{print $6}'
    2936
    4204
    4208
    4192
    984
    
    # apache子进程占用的内存数
    [root@server ~]# ps aux | grep httpd | grep daemon | awk '{print $6}'
    4204
    4208
    4192
    
    # apache进程占用的总内存
    [root@server ~]# ps aux | grep httpd | awk '{sum += $6;n++};END{print sum}'
    16524
    
    # apache子进程占用的总内存 
    [root@server ~]# ps aux | grep httpd | grep daemon | awk '{sum += $6;n++};END{print sum}'
    12604
    
    # apache进程占用的平均内存
    [root@server ~]# ps aux | grep httpd | awk '{sum += $6;n++};END{print sum/n}'
    3304
    
    # apache子进程占用的平均内存
    [root@server ~]# ps aux | grep httpd | grep daemon | awk '{sum += $6;n++};END{print sum/n}'
    4201.33
    

    子进程使用的总内存大概12.31M。这是apache子进程占用的初始内存大小。随着服务器上线,apache进程处理的web请求的增加,每个进程使用的内存也会增加,建议上线一天后查看apache进程占用的内存数。
    通过apache每个进程所需内存大小,可以计算apache需要的总内存。

    ③cpu核心数和内存比例配置

    服务器类型cpu核心数内存大小cpu核心数:内存大小
    通用型服务器8核32G1:4
    计算型服务器8核16G1:2
    内存型服务器8核64G1:8

    了解了以上内容,下面来看两个实战:
    生产场景1:一台服务器,16核心cpu,64G内存,apache最大可以设置多少个work子进程,即多少个子进程,或者说StartServers的值最大是多少?
    关于内存分配,系统使用和apache使用占比如下:

    内存总量系统使用apache使用系统使用占比
    8G2G6G1/4
    16G4G12G1/4
    32G8G24G1/4
    64G8G56G1/8

    一般来说,系统使用8G内存就足够了。
    在本案例中,64G内存,可以提供给apache使用的应该是56G。为了方便计算,不妨假设当服务器上线后,每个work子进程需要使用内存56M,故最大work子进程数为:56*1024/56=1024个。即StartServers的值最大是1024。

    # 修改worker mpm配置
    [root@server ~]# vim /usr/local/apache/conf/extra/httpd-mpm.conf
    <IfModule mpm_worker_module>
        StartServers          1024
        MinSpareThreads        750
        MaxSpareThreads       2500
        ThreadsPerChild        250
        MaxRequestWorkers      25000
        MaxConnectionsPerChild   250000
    </IfModule>
    
    ==========================以下检测还是使用worker运行模式默认值=====================
    ==========================修改了worker运行模式的参数值,也可以使用以下方法监控=======
    <IfModule mpm_worker_module>
        StartServers             3
        MinSpareThreads         75
        MaxSpareThreads        250
        ThreadsPerChild         25
        MaxRequestWorkers      400
        MaxConnectionsPerChild   0
    </IfModule>
    
    # 重启服务后,持续监控
    # pgrep = ps + grep
    [root@server ~]# pgrep httpd | wc -l
    4
    # 查看apaceh最大连接数,每1秒刷新一次
    [root@server ~]# watch -n 1 "pgrep httpd | wc -l"
    
    # ab压测
    [root@server ~]# ab -n 10000 -c 100 http://192.168.8.138/index.html
    
    # 可以看到进程数为7,子进程数由3变为了6。
    # 这说明要处理10000个请求,预派生的3个子进程已经不够用了,第1秒1个子进程,第二秒1个子进程。故总共有3+1+2=6个子进程。
    # 第1秒产生多一个子进程,此时为4个,每个子进程最大产生25个线程,故总共有100个线程,此时的最大并发请求应该是100。
    # 而压测的并发请求就是100,故4个子进程无法稳定处理100个并发请求。
    # 故需要第2秒产生多2个子进程,此时为6个子进程,总共有150个线程,才能稳定的处理100个并发请求。
    [root@server extra]# ps aux | grep httpd
    root       6894  0.0  0.1  76996  2964 ?        Ss   07:33   0:00 /usr/local/apache/bin/httpd -k start
    daemon     8148  0.0  0.3 1547692 6100 ?        Sl   07:45   0:01 /usr/local/apache/bin/httpd -k start
    daemon     8149  0.0  0.3 1744300 6096 ?        Sl   07:45   0:01 /usr/local/apache/bin/httpd -k start
    daemon     8150  0.0  0.3 1678764 6128 ?        Sl   07:45   0:01 /usr/local/apache/bin/httpd -k start
    daemon     9350  0.5  0.3 1678764 6132 ?        Sl   08:30   0:00 /usr/local/apache/bin/httpd -k start
    daemon     9382  0.0  0.3 1547692 6060 ?        Sl   08:30   0:00 /usr/local/apache/bin/httpd -k start
    daemon     9383  0.0  0.3 1613228 6072 ?        Sl   08:30   0:00 /usr/local/apache/bin/httpd -k start
    root       9609  0.0  0.0 112728   988 pts/0    S+   08:32   0:00 grep --color=auto httpd
    [root@server extra]# pgrep httpd | wc -l
    7
    

    生产场景2:一台服务器,8核心cpu,32G物理内存,apache要达到2000并发,worker模式的参数应该怎么配置?

    # 根据内存分配,apache可以使用的内存应该24G。
    # StartServers一般可以设置为CPU核心数或者2倍CPU核心数。
    <IfModule mpm_worker_module>
        StartServers            16
        MinSpareThreads         75  # 假设最小并发是25,该值为最小并发的3倍。
        MaxSpareThreads       1250  # 假设最大并发为2500,该值为最大并发的一半
        ThreadsPerChild        125  # 子进程数为16,要完成2000的并发,每个子进程应该产生2000/16=125个线程。可以通过调大子进程数来增加并发值。
        MaxRequestWorkers     2000  # 所有线程数量的最大值,也称最大并发值。
        MaxConnectionsPerChild   12500 # 最大连接数限制。每个子进程处理12500个请求,平均下来每个线程处理100个请求,处理完12500个请求,该进程自动终止并关闭。这么做是为了预防线程处理太多的请求,出现内存溢出,导致进程崩溃。
    </IfModule>
    

    5. Rewrite 规则使用

    rewrite的功能是为了实现URL的跳转,也称为重定向,其正则表达式是基于perl语言的。

    为了使用该模块,可以在configure编译时增加参数--enable-rewrite安装该模块。也可以通过DSO模式安装动态安装。

    在rewrite模块使用方面,可以基于服务器设置(httpd.conf) 也可以基于目录设置(.htaccess) 重定向的范围。

    若基于服务器的设置,需要修改httpd.conf文件,在全局或者局部,或者每个virtualhost虚拟主机下,添加RewriteEngine on开启重定向rewrite功能

    # 在configure编译时加入了rewrite模块,但是还是没有安装上去。需要修改配置httpd.conf
    [root@server ~]# /usr/local/apache/bin/apachectl -M | grep rewrite
    [root@server ~]# vim /usr/local/apache/conf/httpd.conf 
    158 LoadModule rewrite_module modules/mod_rewrite.so
    [root@server ~]# /etc/init.d/apache restart
    [root@server ~]# /usr/local/apache/bin/apachectl -M | grep rewrite
     rewrite_module (shared)
    

    以下介绍两个使用rewrite模块的案例:
    案例1:当访问的主机名不是以www.abong.com或192.168.8.138为前缀的,都跳转到www.abong.com。

    [root@server ~]# vim /usr/local/apache/conf/httpd.conf
    RewriteEngine on   # 开启rewrite重定向功能
    RewriteCond %{HTTP_HOST} !^www.abong.com [NC]  # 访问的主机不是以www.abong.com前缀的
    RewriteCond %{HTTP_HOST} !^192.168.8.138 [NC]  # 访问的主机不是以192.168.8.138前缀的
    RewriteCond %{HTTP_HOST} !^$ # 访问的主机不是空地址
    RewriteRule ^/(.*) http://www.abong.com/ [L]   # 满足以上RewriteCond条件的请求,都直接跳转到http://www.abong.com/
    [root@server ~]# /etc/init.d/apache graceful   # 重新加载apache配置文件,不停服务。
    [root@server ~]# vim /etc/hosts    # 配置本地域名解析
    192.168.8.138 www.abong.com
    192.168.8.138 bbs.abong.com
    192.168.8.138 www.abong.cn
    192.168.8.138 bbs.abong.cn
    

    打开本地浏览器进行测试:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    通过以上测试结果,可以看到192.168.8.138虽然对应了4个域名,但访问不是www.abong.com的域名,都会被重定向到www.abong.com

    案例2:当访问www.abong.com时,自动跳转到www.jd.com

    [root@server ~]# vim /usr/local/apache/conf/httpd.conf
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.abong.com [NC]
    RewriteRule ^/(.*) http://www.jd.com/ [L]
    [root@server ~]# /etc/init.d/apache graceful
    [root@server ~]# vim /etc/hosts
    192.168.8.138 www.abong.com
    192.168.8.138 www.jd.com
    

    在这里插入图片描述
    经过以上两个案例,可以看出,rewrite模块的主要功能是实现URL的跳转。
    想要了解更多apache rewrite模块的内容,可以查看官网信息。
    http://httpd.apache.org/docs/current/mod/mod_rewrite.html

    6. apache防盗链配置

    apache防盗链设置,实际上即是使用rewrite模块,当请求主机名不是限定的部分时,会跳转到指定内容。

    RewriteEngine on
    RewriteCond %{HTTP_REFERER} !^http://www.abong.com/data$
    RewriteCond %{HTTP_REFERER} !^http://www.abong.com/data/.*$
    RewriteCond %{HTTP_REFERER} !^http://www.abong.com/data2$
    RewriteCond %{HTTP_REFERER} !^http://www.abong.com/data2/.*$
    RewriteRule .*\.(gif|jpg|swf|png)$ http://www.abong.com/
    

    从以上配置可以看出,当请求的地址是以.gif .jpg .swf .png结尾的,都会跳转到http://www.abong.com/,这样别人就无法引用自身服务器上的图片了,就不会被盗了。
    在本文中的rewrite模块的使用,仅仅是介绍基本的使用,在生产环境中,需要根据实际需求进行配置。

    7. 禁止解析某个目录下的php文件

    # 禁止访问网站数据目录下的data目录下的php文件
    [root@server ~]# vim /usr/local/apache/conf/httpd.conf 
    # DocumentRoot "/usr/local/apache/htdocs"
    # <Directory "/usr/local/apache/htdocs">
    # ...
    # </Directory>
    
    <Directory "/usr/local/apache/htdocs/data/">
    <Files ~ ".php">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all denied
    </Files>
    </Directory>
    

    apache调优总结:有关于apache调优的内容,记录了两篇博客。在实际生产环境中,可以根据其中介绍的各点排查服务器中的apache运行情况。生产环境的情况比测试环境复杂很多,需要根据实际需求,结合这两篇博客以及官方介绍进行配置。

    展开全文
  • 一、Rewrite 讲解 使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。 (1)跳转场景 (2)跳转实现 (3)Nginx 正则表达式 字符 意义 ^ 匹配输入字符串的起始...

    一、Rewrite 讲解

    使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。

    (1)跳转场景

    在这里插入图片描述

    (2)跳转实现

    在这里插入图片描述

    (3)Nginx 正则表达式
    字符意义
    ^匹配输入字符串的起始位置
    $匹配输入字符串的结束位置
    *匹配前面的字符零次或多次
    +匹配前面的字符一次或多次
    ?匹配前面的字符零次或一次
    .匹配除了“\n”之外的所有字符
    \将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用
    \d匹配纯数字
    {n}重复 n 次
    {n,}重复 n 次或更多次
    [c]匹配单个字符 c
    [a-z]匹配 a-z 小写字母的任意一个
    [a-zA-Z0-9]匹配所有大小写字母或数字
    ()表达式的开始和结束位置
    (4)语法格式
    rewrite <regex> <replacement> [flag];
    regex :表示正则匹配规则。
    replacement :表示跳转后的内容。
    flag :表示 rewrite 支持的 flag 标记。
    
    flag标记说明
    last :本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中。
    break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
    redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
    permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
    

    二、Rewrite 实验

    (1)基于域名的跳转

    现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

    vim /usr/local/nginx/conf/nginx.conf
    server {
    	listen       80;
    	server_name  www.kgc.com;	#域名修改	
    	charset utf-8;
    	access_log  /var/log/nginx/www.kgc.com-access.log  main; #日志修改
    	location / {
    	#添加域名重定向
            if ($host = 'www.kgc.com'){	 #$host为rewrite全局变量,代表请求主机头字段或主机名
    			rewrite ^/(.*)$ http://www.benet.com/$1 permanent;	#$1为正则匹配的内容,即域名后边的字符串
            }
            root   html;
            index  index.html index.htm;
        }
    }
    
    echo "IP www.kgc.com www.benet.com" >> /etc/hosts
    systemctl restart nginx
    
    浏览器输入模拟访问 http://www.kgc.com/test/1.html(虽然这个请求内容是不存在的)
    会跳转到www.benet.com/test/1.html
    查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。
    

    在这里插入图片描述

    (2)基于客户端 IP 访问跳转

    今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.90.14访问正常。

    vim /usr/local/nginx/conf/nginx.conf
    server {
    	listen       80;
    	server_name  www.kgc.com;		#域名修改	
    	charset utf-8;
    	access_log  /var/log/nginx/www.kgc.com-access.log;	#日志修改
    
    	#设置是否合法的IP标记
        set $rewrite true;							#设置变量$rewrite,变量值为boole值true
        
        #判断是否为合法IP
    	if ($remote_addr = "192.168.90.14"){		#当客户端IP为192.168.90.14时,将变量值设为false,不进行重写
            set $rewrite false;
        }
    	
    	#除了合法IP,其它都是非法IP,进行重写跳转维护页面
        if ($rewrite = true){						#当变量值为true时,进行重写
            rewrite (.+) /weihu.html;				#重写在访问IP后边插入/weihu.html
        }
        
        location = /weihu.html {
            root /var/www/html;						#网页返回/var/www/html/weihu.html的内容
        }
    	
    	location / {
            root   html;
            index  index.html index.htm;
        }
    }
    
    
    mkdir -p /var/www/html/
    echo "<h1>We are maintaining now</h1>" > /var/www/html/weihu.html
    systemctl restart nginx
    只有 IP 为 192.168.90.14 能正常访问,其它地址都是维护页面
    

    三、Location 讲解

    从功能看 rewrite 和 location 似乎有点像,都能实现跳转
    主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

    (1)Location 大致可以分为三类:
    • 精准匹配:location = / {}
    • 一般匹配:location / {}
    • 正则匹配:location ~ / {}
    (2)Location 常用的匹配规则:
    = :进行普通字符精确匹配,也就是完全匹配。 
    ^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。 
    ~ :区分大小写的匹配。 
    ~* :不区分大小写的匹配。 
    !~ :区分大小写的匹配取非。 
    !~* :不区分大小写的匹配取非。
    
    (3)location 优先级:
    首先精确匹配 =
    其次前缀匹配 ^~
    其次是按文件中顺序的正则匹配 ~或~*
    然后匹配不带任何修饰的前缀匹配
    最后是交给 / 通用匹配
    
    

    优先级实例

    • location = / {}
      =为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配 再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。

    • location / {} 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 /匹配, /data 也匹配, 但若后面是正则表达式会和最长字符串优先匹配(最长匹配)

    • location /documents/ {} 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它location 只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

    • location /documents/abc {} 匹配任何以 /documents/abc
      开头的地址,匹配符合以后,还要继续往下搜索其它 location 只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

    • location ^~ /images/ {} 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

    • location ~* .(gif|jpg|jpeg)$ {} 匹配所有以 gif、jpg或jpeg 结尾的请求 然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

    • location /images/abc {} 最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它location,会发现 ^~ 和 ~ 存在

    • location ~ /images/abc {} 匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

    • location /images/abc/1.html {} 匹配/images/abc/1.html 文件,如果和正则 ~/images/abc/1.html 相比,正则优先级更高
      优先级总结:

    (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)
    

    四、Location 实验

    实际网站使用中,至少有三个匹配规则定义:

    (1)第一个必选规则
    直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
    这里是直接转发给后端应用服务器了,也可以是一个静态首页

    location = / {
        proxy_pass http://tomcat_server/;
    }
    

    (2)第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
    有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

    location ^~ /static/ {
        root /webroot/static/;
    }
    
    location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
        root /webroot/res/;
    }
    

    (3)第三个规则就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
    非静态文件请求就默认是动态请求

    location / {
        proxy_pass http://tomcat_server;
    }
    
    展开全文
  • Nginx_Rewrite 一、介绍 Rewrite根据nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写和者重定向。 Rewrite和location类似,都可以实现跳转,区别是rewrite是在同一域名内更改url,而...

    Nginx_Rewrite

    • 一、介绍
      1. Rewrite根据nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写和者重定向。
      2. Rewrite和location类似,都可以实现跳转,区别是rewrite是在同一域名内更改url,而location是对同类型匹配路径做控制访问,或者proxy_pass代理到其他服务器。
      3. Rewrite和location执行顺序:
        • 执行server下的rewrite
        • 执行location匹配
        • 执行location下的rewrite
    • 二、语法和参数说明
      1. rewrite语法格式
      rewrite        <regex>        <replacement>        <flag>;
       关键字        正则表达式         代替的内容         重写类型
      
      Rewrite:一般都是rewrite
      Regex:可以是字符串或者正则来表示想要匹配的目标URL
      Replacement:将正则匹配的内容替换成replacement
      Flag:flag标示,重写类型:
        - last:本条规则匹配完成后,继续向下匹配新的location URI规则;相当于Apache里德(L)标记,表示完成rewrite,浏览器地址栏URL地址不变;一般写在server和if中;
        - break:本条规则匹配完成后,终止匹配,不再匹配后面的规则,浏览器地址栏URL地址不变;一般使用在location中;
        - redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址;
        - permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址;
      
      server {
        # 访问 /last.html 的时候,页面内容重写到 /index.html 中,并继续后面的匹配,浏览器地址栏URL地址不变
        rewrite /last.html /index.html last;
      
        # 访问 /break.html 的时候,页面内容重写到 /index.html 中,并停止后续的匹配,浏览器地址栏URL地址不变;
        rewrite /break.html /index.html break;
      
        # 访问 /redirect.html 的时候,页面直接302定向到 /index.html中,浏览器地址URL跳为index.html
        rewrite /redirect.html /index.html redirect;
      
        # 访问 /permanent.html 的时候,页面直接301定向到 /index.html中,浏览器地址URL跳为index.html
        rewrite /permanent.html /index.html permanent;
      
        # 把 /html/*.html => /post/*.html ,301定向
        rewrite ^/html/(.+?).html$ /post/$1.html permanent;
      
        # 把 /search/key => /search.html?keyword=key
        rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;
        
        # 把当前域名的请求,跳转到新域名上,域名变化但路径不变
        rewrite ^/(.*) http://www.jd.com/$1 permanent;
        }
      
      1. IF判断和内置全局环境变量
      if (表达式) {
      }
      
      #当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false直接比较变量和内容时,使用=或!=~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配
      
      $args :这个变量等于请求行中的参数,同$query_string
      $content_length : 请求头中的Content-length字段。
      $content_type : 请求头中的Content-Type字段。
      $document_root : 当前请求在root指令中指定的值。
      $host : 请求主机头字段,否则为服务器名称。
      $http_user_agent : 客户端agent信息
      $http_cookie : 客户端cookie信息
      $limit_rate : 这个变量可以限制连接速率。
      $request_method : 客户端请求的动作,通常为GET或POST。
      $remote_addr : 客户端的IP地址。
      $remote_port : 客户端的端口。
      $remote_user : 已经经过Auth Basic Module验证的用户名。
      $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
      $scheme : HTTP方法(如http,https)。
      $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
      $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
      $server_name : 服务器名称。
      $server_port : 请求到达服务器的端口号。
      $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
      $uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
      $document_uri : 与$uri相同。
       
      例子:
      URL:http://localhost:81/download/stat.php?id=1585378&web_id=1585378
      Server_Dir:/var/www/html
      $host:localhost
      $server_port:81
      $request_uri:/download/stat.php?id=1585378&web_id=1585378
      $document_uri:/download/stat.php
      $document_root:/var/www/html
      $request_filename:/var/www/html/download/stat.php
      
      # 如果文件不存在则返回400
      if (!-f $request_filename) {
          return 400;
      }
      
      # 如果host是www.360buy.com,则301到www.jd.com中
      if ( $host != "www.jd.com" ){
          rewrite ^/(.*)$ https://www.jd.com/$1 permanent;
      }
      
      # 如果请求类型是POST则返回405,return不能返回301,302
      if ($request_method = POST) {
          return 405;
      }
      
      # 如果参数中有 a=1 则301到指定域名
      if ($args ~ a=1) {
          rewrite ^ http://example.com/ permanent;
      }
      
      - 文件名及参数重写
       location = /index.html {
       # 修改默认值为
       set $name test;
      
       # 如果参数中有 name=xx 则使用该值
       if ($args ~* name=(\w+?)(&|$)) {
           set $name $1;
       }
      
       # permanent 301重定向
       rewrite ^ /$name.html permanent;
      }
      
      - 隐藏真实目录
      server {
        root /var/www/html;
        # 用 /html_test 来掩饰 html
        location / {
            # 使用break拿一旦匹配成功则忽略后续location
            rewrite /html_test /html break;
        }
      
        # 访问真实地址直接报没权限
        location /html {
            return 403;
        }
      }
      
      - 禁止指定IP访问
       location / {
              if ($remote_addr = 192.168.1.253) {
                      return 403;
              }
       }
      
      - 如果请求的文件不存在,则反向代理到localhost 。这里的break也是停止继续rewrite
      if (!-f $request_filename){
          break;
          proxy_pass http://127.0.0.1;
      }
      
      - 对/images/bla_500x400.jpg文件请求,重写到/resizer/bla.jpg?width=500&height=400地址,并会继续尝试匹配location。
      rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
      

    Proxy_Pass

    • Proxy_pass反向代理,用的是nginx的Proxy模块。

     

    第一种:
    location /proxy/ {
        proxy_pass http://127.0.0.1/;
    }
    代理到URL:http://127.0.0.1/test.html
    
    
    第二种:
    location /proxy/ {
        proxy_pass http://127.0.0.1;  #少/
    }
    代理到URL:http://127.0.0.1/proxy/test.html
    
    
    第三种:
    location /proxy/ {
        proxy_pass http://127.0.0.1/aaa/;
    }
    代理到URL:http://127.0.0.1/aaa/test.html
    
    
    第四种(相对于第三种,最后少一个 / )
    location /proxy/ {
        proxy_pass http://127.0.0.1/aaa;
    }
    代理到URL:http://127.0.0.1/aaatest.html
    

     

    - proxy_set_header  Host  $host;  作用web服务器上有多个站点时,用该参数header来区分反向代理哪个域名。比如下边的代码举例。
    - proxy_set_header X-Forwarded-For  $remote_addr; 作用是后端服务器上的程序获取访客真实IP,从该header头获取。部分程序需要该功能。
    

     

    - Proxy_pass配合upstream实现负载均衡
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
     
        upstream core_tomcat {
          server 192.168.1.253:80      weight=5  max_fails=3 fail_timeout=30;
          server 192.168.1.252:80      weight=1  max_fails=3 fail_timeout=30;
          server 192.168.1.251:80      backup;
        }
    
        server {
            listen       80;
            server_name  www.jd.com;
            location /web {
                proxy_pass http://core_tomcat;
                proxy_set_header  Host  $host;
            }
        }
     }
    
    • Nginx负载均衡的几种模式
      • 轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,就不在分配;
      upstream core_tomcat {
          server 192.168.1.253:80      max_fails=3 fail_timeout=30;
          server 192.168.1.252:80      max_fails=3 fail_timeout=30;
       }
      
      • 权重轮询:根据后端服务器性能不通配置轮询的权重比,权重越高访问的比重越高;
      upstream core_tomcat {
          server 192.168.1.253:80      weight=2  max_fails=3 fail_timeout=30;
          server 192.168.1.252:80      weight=8  max_fails=3 fail_timeout=30;
      }
      #假如有十个请求,八个会指向第二台服务器,两个指向第一台;
      
      • IP_Hash:根据请求的ip地址hash结果进行分配,第一次分配到A服务器,后面再请求默认还是分配到A服务器;可以解决Session失效重新登录问题;
      upstream core_tomcat {
        ip_hash;
        server 192.168.1.253:80      max_fails=3 fail_timeout=30;
        server 192.168.1.252:80      max_fails=3 fail_timeout=30;
      }
      
      • Fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配;
      upstream core_tomcat {
        fair;
        server 192.168.1.253:80      max_fails=3 fail_timeout=30;
        server 192.168.1.252:80      max_fails=3 fail_timeout=30;
      }
      
      • Url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效;
      upstream core_tomcat {
        hash  $request_uri;
        server 192.168.1.253:80      max_fails=3 fail_timeout=30;
        server 192.168.1.252:80      max_fails=3 fail_timeout=30;
      }
      

    参考文档:
    http://www.cnblogs.com/mikeluwen/p/7116967.html
    https://www.cnblogs.com/zl0372/articles/nginx.html
    https://blog.csdn.net/qq_28602957/article/details/61615876
    http://blog.51cto.com/liqilong2010/1837126
    https://www.cnblogs.com/likwo/p/6513117.html



    作者:ProMonkey_LAIN
    链接:https://www.jianshu.com/p/10ecc107b5ee
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 文章目录Nginx Rewrite相关功能1. ngx_http_rewrite_module模块指令1.1 if指令1.2 set指令1.3 break指令1.4 return指令1.5 rewrite_log指令2. rewrite指令2.1 rewrite flag使用介绍2.2 rewrite案例-域名永久与临时...
  • 这里,只谈Linux下的URL静态化处理 1. 确保你的apache 下已经加载了Rewrite模块,确保httpd.conf中已经包含mod_rewrite.so的加载语句如下: LoadModule rewrite_module modules/mod_rewrite.so 2. 在虚拟主机中...
  • URL重写有利于网站首选域的确定,对于同一资源页面多条路径的301重定向有助于URL权重的集中Nginx URL重写(rewrite)介绍和apache等web服务软件一样,rewrite的组要功能是实现RUL地址的重定向。Nginx的rewrite功能需要...
  • rewrite功能详解➤一、常见的Nginx正则表达式➤二、location➤1、location大致可以分为三类➤2、location常用的匹配规则:➤3、location 优先级:➤4、location 示例说明:➤5、三条匹配规则定义➤三、rewrite➤1、...
  • Nginx Rewrite

    2020-12-02 00:45:49
    文章目录Nginx Rewrite概述Nginx正则表达式Rewrite命令location分类比较rewrite和location Nginx Rewrite概述 Rewirte跳转场景 1.URL看起来更规范、合理。 2.企业会将动态URL地址伪装成静态地址提供服务。 3.网址换...
  • Nginx Rewrite跳转

    2021-06-10 15:38:38
    文章目录 前言:一、常用的 Nginx 正则表达式二、location(一)、location 大致... 四、Rewrite 跳转实现五、rewrite(一)、rewrite功能(二)、rewrite 执行顺序如下:(三)、语法 rewrite [flag];(四)、rewr..
  • # 将 RewriteEngine 模式打开 RewriteEngine On # 修改以下语句中的 /discuz 为你的论坛目录地址,如果程序放在根目录中,请将 /discuz 修改为 / RewriteBase / # Rewrite 系统规则请勿修改 RewriteCond %{QUERY_...
  • 兼容ThinkPHP三种url模式的nginx rewrite

    千次阅读 2017-06-24 21:12:15
    location / { root /var/www; index index.html index.htm index.php; if (!-e $request_filename) { rewrite ^/index.php(.*)$ /index.php?s=$1 last; rewrite ^(.*)$ /index.php?s=$1 last; break; } }
  • 一.rewrite跳转实现 二.rewrite实用场景 三.Nginx正则表达式 四.rewrite命令 五.location 六.rewrite与location比较 七.基于域名跳转 ​八基于客户端IP地址跳转 九.基于新旧域名跳转并且加目录 十.基于参数...
  • linux redis哨兵模式

    千次阅读 2018-08-16 14:53:02
    三台linux服务器 比如: 主:X.X.X.81 从:X.X.X.82 从:X.X.X.83 2.安装redis(三个环境都要这样安装) 1)安装redis之前先要安装gcc-c++和tcl   yum install gcc-c++ yum install tcl   2)新建用户...
  • 我直接把网站移到 Linux下,发现 127.0.0.1/index.php/a/b/c ,服务器会认为这个c是一个文件, 提示找不到文件,我在网上查资料,试图开启pathinfo模式之后,现在访问 127.0.0.1/index.php/a/b/c 不会直接404,...
  • Nginx Rewrite 功能

    2021-06-08 21:35:00
    Nginx服务器利⽤ngx_http_rewrite_module模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regularex pression),因此编译之前要安装PCRE库。 一、ngx_http_rewrite_module 模块指令 1.1 if 指令 ⽤...
  • Nginx之location与rewrite

    2021-03-31 14:12:05
    Nginx之location与rewrite一、常见的Nginx正则表达式二、location1、location大致可以分为三类2、location常用的匹配规则:3、location 优先级:4、location 示例说明:5、实际网站使用中,至少有三个匹配规则定义三...
  • 这样就能在linux,nginx环境下运行tp5了。 去掉/index.php/ 修改nginx.conf文件 location / { index index .html index .htm index .php; #autoindex on; if (!-e $request_filename) { ...
  • Rewrite Role

    2009-10-12 09:41:00
    1、Rewrite规则简介:Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。...方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,607
精华内容 8,242
关键字:

linuxrewrite模式

linux 订阅