Nginx介绍
Nginx是什么
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
Nginx的主要用途
Nginx是一个异步框架的Web服务器,可以用作反向代理服务、负载均衡、API服务、静态资源服务和HTTP缓存服务。
Nginx 经典应用场景
正向代理与反向代理
正向代理是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。 这种代理其实在生活中是比较常见的,比如访问外国网站技术,其用到的就是代理技术。 有时候,用户想要访问某国外网站,该网站无法在国内直接访问,但是我们可以访问到一个代理服务器,这个代理服务器可以访问到这个国外网站。这样呢,用户对该国外网站的访问就需要通过代理服务器来转发请求,并且该代理服务器也会将请求的响应再返回给用户。这个上网的过程就是用到了正向代理。 所以,正向代理,其实是"代理服务器"代理了"客户端",去和"目标服务器"进行交互。 通过正向代理服务器访问目标服务器,目标服务器是不知道真正的客户端是谁的,甚至不知道访问自己的是一个代理.
反向代理是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 我们在租房子的过程中,除了有些房源需要通过中介以外,还有一些是可以直接通过房东来租的。用户直接找到房东租房的这种情况就是我们不使用代理直接访问国内的网站的情况。 还有一种情况,就是我们以为我们接触的是房东,其实有时候也有可能并非房主本人,有可能是他的亲戚、朋友,甚至是二房东。但是我们并不知道和我们沟通的并不是真正的房东。这种帮助真正的房主租房的二房东其实就是反向代理服务器。这个过程就是反向代理。 对于常用的场景,就是我们在Web开发中用到的负载均衡服务器(二房东),客户端(租客)发送请求到负载均衡服务器(二房东)上,负载均衡服务器(二房东)再把请求转发给一台真正的服务器(房东)来执行,再把执行结果返回给客户端(租客)。 所以,反向代理,其实是"代理服务器"代理了"目标服务器",去和"客户端"进行交互。 通过反向代理服务器访问目标服务器时,客户端是不知道真正的目标服务器是谁的,甚至不知道自己访问的是一个代理。
负载均衡
将服务器接收到的请求按照规则分发的过程,称为负载均衡。 负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如 F5 负载均衡,相对造价昂贵成本较高。 但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作。 更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。
Nginx 的整体架构
Nginx是由一个master管理进程,多个worker进程处理工作的多进程模型。
基础架构设计
进程组件
- Master 进程:监视工作进程的状态;当工作进程死掉后重启一个新的;处理信号和通知工作进程。
- Worker 进程:处理客户端请求,从主进程处获得信号做相应的事情。
- Cache Loader 进程:加载缓存索引文件信息,然后退出。
- Cache Manager进程:管理磁盘的缓存大小,超过预定值大小后最少使用数据将被删除。
总之,master 进程并不处理网络请求,主要负责调度work工作进程:加载配置、启动工作进程及非停升级。 worker 进程负责处理网络请求与响应。 整个框架被设计为一种依赖事件驱动、异步、非阻塞的模式。
master进程功能 master进程主要用来管理worker进程,具体包括如下4个主要功能:
- 接收来自外界的信号。
- 向各worker进程发送信号。
- 监控woker进程的运行状态。
- 当woker进程退出后(异常情况下),会自动重新启动新的woker进程。
work进程功能 woker进程主要用来处理基本的网络事件:
- 多个worker进程之间是对等且相互独立的,他们同等竞争来自客户端的请求。
- 一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
- worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。同时,nginx为了更好的利用多核特性,具有cpu绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。
Nginx的进程模型
nginx采用多进程的模式,nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
worker的工作模式
worker对于连接是采用争抢的模式,谁先抢到就先交给谁处理,如果想要重新更新配置,由于已经抢到任务的worker不会参与争抢,那些空闲的worker就会去争抢连接,拿到连接后会自动更新配置信息,当那些有任务的worker完成任务后,会自动更新配置,这样就实现了无缝热部署。 每个worker是独立的进程,如果有其中的一个worker出现问题,并不会影响其它worker继续进行争抢,在实现请求的过程,不会造成服务中断,建议worker数和服务器的CPU数相等是最为适宜的。
Ngnix 如何实现高性能
事件驱动模型 Worker进程在处理网络事件时,依靠epoll模型,来管理并发连接,实现了事件驱动、异步、非阻塞等特性。 基于异步及非阻塞的事件驱动模型,可以说是 Nginx 得以获得高并发、高性能的关键因素。这一点上和 Netty 类似,底层都是使用的 BSD kqueue、Linux epoll 及Solaris event ports。
多进程机制 使用多进程的好处有两点:
- 进程之间不共享资源,不需要加锁,减少了使用锁对性能造成的影响,同时降低
编程的复杂度,降低开发成本。 - 采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出
时,其它进程正常工作,master 进程则很快启动新的 worker 进程,确保服务 不会中断,从而将风险降到最低。
内存池 为了避免出现内存碎片,减少向操作系统申请内存的次数、降低各个模块的开发复杂度,Nginx 设计了简单的内存池,它的作用主要是把多次向系统申请内存的操作整合成一次,这大大减少了 CPU 资源的消耗,同时减少了内存碎片。
Nginx安装
yum安装(推荐)
yum安装(最好使用官方的源,epel源安装的nginx配置文件内容比较乱) 官方安装指导文档:http://nginx.org/en/linux_packages.html#RHEL-CentOS
- 添加nginx的官方源
vim /etc/yum.repos.d/nginx.repo - 下载nginx软件 yum install nginx -y
- 查看nginx版本 nginx -v
源码安装
源码编译安装(按照nginx指定的参数进行源码包编译安装)
- 下载源码包 wget http://nginx.org/download/nginx-1.20.0.tar.gz
- 解压nginx源码包 tar -xf nginx-1.20.0.tar.gz
- 安装进行编译时所缺少的库 yum install pcre pcre-devel -y
- 安装进行编译时所缺少的库 yum -y install openssl openssl-devel
- 编译前系统检查
cd nginx-1.20.0/ ./configure (后面跟–prefix=/etc/nginx… nginx当前的参数,如果没有需求跟指定 的nginx参数的话,直接使用命令即可) - 开始进行编译并安装
make && make install - 运行nginx
/usr/local/nginx/sbin/nginx 我们安装完成后,可以打开浏览器,输入虚拟机的IP。如果显示出**Welcome to nginx!那就是代表安装完成。 - 添加环境变量
vim /root/.bash_profile 添加服务器系统的环境变量
NGINX_HOME=/usr/local/nginx/sbin
PATH=$PATH:$NGINX_HOME
export PATH
重载root用户系统的环境变量 source /root/.bash_profile 加载完环境变量之后,执行nginx,**就不需要再加文件路径了
nginx启动与停止
方式一:适用于yum安装
systemctl start nginx 启动 systemctl restart nginx 重启 systemctl stop nginx 停止
方式二:适用于源码编译安装
nginx 启动 nginx -s stop 停止 nginx -s restart/reload 重启
注意:不要混合使用这两种方式,如果我们使用第一种方式启动nginx,那么是无法 使用第二种方式进行管理的。
Nginx常用命令
nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload 因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen 重新打开日志文件。
nginx -c filename 为Nginx指定一个配置文件,来代替缺省的。
nginx -t 不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确
性,并尝试打开配置文件中所引用到的文件。
nginx -v 显示 nginx 的版本。
nginx -V 显示 nginx 的版本,编译器版本和配置参数。
Nginx配置文件解读
nginx目录结构
[root@realserver2 ~]# rpm -ql nginx #查看nginx目录结构(yum安装的可使用rpm命令查看nginx目录结构)
/etc/logrotate.d/nginx #日志轮转
/etc/nginx #默认的配置文件
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/mime.types #存放静态资源的关系映射文件
/etc/nginx/modules #模块
/etc/nginx/nginx.conf #主配置文件
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
/usr/sbin/nginx #nginx命令执行文件
/usr/sbin/nginx-debug
/usr/share/doc/nginx-1.22.0
/usr/share/doc/nginx-1.22.0/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx #默认的网站页面
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
/var/cache/nginx #缓存
/var/log/nginx #日志
Nginx配置文件
Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。每一个区块以一对大括号{}来表示开始与结束。 Nginx主配置文件整体分为三块,分别是CoreModule(核心模块),EventModule(事件驱动模块),HttpCoreModule(http内核模块)。
核心模块
就是配置文件从头开始到 events 块之间的内容, 主要设置的是影响nginx服务器整体运行的配置指令 比如 worker_process, 值越大,可以支持的并发处理量也越多,但是还是和服务器的硬件相关。
事件模块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
http模块:
包括 http 全局块,以及多个 server 块
http全局块
http 全局块配置的指令包括文件引入、 MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server 块
- 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
- 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机
- 而每个server 块也分为 全局 server 块 ,以及可以同时包含 多个 location 块 。
server 全局块
最常见的配置是本虚拟机主机的 监听配置和本虚拟主机的名称或 IP 配置 。
#这一行表示这个server块监听的端口是80,只要有请求访问了80端口,此server块就处理请求
listen 80;
# 表示这个server块代表的虚拟主机的名字
server_name localhost;
location 块
- 一个 server 块可以配置多个 location 块。
- 主要作用是根据请求地址路径的匹配,匹配成功进行特定的处理
- 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
# 表示如果请求路径是/就是用这个location块进行处理
location / {
root html;
index index.html index.htm;
}
Nginx日志
Nginx有非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令定义格式。 默认Nginx定义的访问日志语法格式如下:
log_format main '$remote_addr - $remote_user [$time_local]
"$request" '
' $status $body_bytes_sent "$http_referer" '
' "$http_user_agent" "$http_x_forwarded_for" ';
Nginx日志格式允许包含的内置变量 注:如果Nginx位于负载均衡器,nginx反向代理之后,为服务器无法直接获取客户端的真实IP地址。 $remote_addr获取的是反向代理的IP地址。反向代理服务器在转发请求的http头信息中。增加x-forwarded-for信息,用来记录客户端IP地址和客户端请求的服务器地址。
日志格式修改案例
修改主配置文件访问日志的格式,进行测试 vim /etc/nginx/nginx.conf 测试: 我们刷新http://test01.nebula.com/浏览器页面做测试, tail -1 /var/log/nginx/access.log
# 192.168.42.1 - - [06/May/2021:15:48:56 +0800] "GET / HTTP/1.1" 200 14 "-" "0.000"
可以看到日志格式已经发生更改 按照我们提供的方式实现日志格式化输出
Nginx访问日志与错误日志
访问日志
默认访问日志路径/var/log/nginx/access.log ?如果在http层配置了access_log,在server层没有配置,那么所有的server日志都写入http层。 ?如果在http层和server层都配置了access_log,那么所有的server日志都写入server层。 ?server层日志写入的优先级高于http层。 在server层配置access_log做访问测试 1.将当前的server网站的访问日志记录至对应的目录,使用main格式 vim test01.nebula.com.conf 2. 重启服务 nginx -t systemctl restart nginx
在浏览器清空缓存重载http://test01.nebula.com/,查看日志文件下的内容
ls /var/log/nginx/ access.log error.log test01.log
tail -f /var/log/nginx/test01.log 192.168.42.1 - - [06/May/2021:16:25:46 +0800] “GET / HTTP/1.1” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit**/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg**/90.0.818.51” “-”
错误日志
默认错误日志路径/var/log/nginx/error.log
- 模拟访问请求报错(1):
我们在浏览器中故意输错域名: http://test01.nebula.com/xxx 查看错误日志报错信息 tail -f /var/log/nginx/error.log 2021/05/06 16:44:47 [error] 2882#2882: *1 open() “/code/test01/xxx” failed (2: No such file or directory), client: 192.168.42.1, server: test01.nana.com, request: “GET /xxx HTTP/1.1”, host: “test01.nebula.com” - 模拟访问请求报错(2): 我们将server层中指定的文件index.html,文件名故意改成
index.htm cd /code/test01/ mv index.html index.htm 查看错误日志报错信息 tail -f /var/log/nginx/error.log 2021/05/06 16:48:55 [error] 2882#2882: *5 directory index of “/code/test01/” is forbidden, client: 192.168.42.1, server: test01.nebula.com, request: “GET / HTTP/1.1”, host: “test01.nebula.com”
日志的切割logrotate
日志的记录如果一直记录在一个日志文件中,随着时间的推移,日志文件会变得越来越大,可能会导致日志文件无法查看。为了解决这个问题,nginx服务自带了日志切割(logrotate)的功能。
源码编译可能会需要自己去写脚本,yum安装nginx会自带日志自动切割功能。
查看日志切割默认的配置文件 cat /etc/logrotate.d/nginx
nginx之location规则详解
Location规则 语法规则: location [=||*|^~] /uri/ {… }
- = 开头表示精确匹配
- ^~ 开头表示uri以某个常规字符串开头,理解为匹配url路径即可(非正则) ~ 开头表示区分大小写的正则匹配
- ~* 开头表示不区分大小写的正则匹配
- !~ 和 !~* 分别为区分大小写不匹配及不区分大小写不匹配的正则
- / 通用匹配,任何请求都会匹配到
优先级:
- 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他location的匹配项
- ^~和通用匹配。使用前缀匹配,不支持正则表达式,如果有多个location匹配成功的话,不会终止匹配过程,会匹配表达式最长的那个
- 如果上一步得到的最长的location为^~类型,则表示阻断正则表达式,不再匹配正则表达式
- 如果上一步得到的最长的location不是^~类型,继续匹配正则表达式,只要有一个正则成功,则使用这个正则的location,立即返回结果,并结束解析过程
首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。 当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
精确匹配
在conf.d文件夹下创建配置文件test.com.conf,内容如下: 上图中第一个和第二个location匹配条件一样,都是/test.html,但第二个为精准匹配到静态路径,因此第一个不会执行,会执行第二个,www.test.com为本地域名解析。 通过域名和路径访问后的内容如下: 注意:路径/usr/share/nginx/test_html文件夹下需要有test.html才可以正常访问
root和alias区别
上图中指定静态资源路径用的关键字root,还可以用alias,那么root和alias的区别是什么?
- 用root属性指定的值是要加入到最终路径中的,匹配条件会拼接到路径中
- 用alias属性指定的值不需要加入到最终路径中
如上图中所示,请求的条件为test.html,通过root指定的路为/usr/share/nginx/test_html,因此在匹配的时候,这个路径下就必须要有test.html这个文件才可以,否则就会找不到而报错,如果用alias,那么通过浏览器进行请求的时候,alias也是指定到/usr/share/nginx/test_htm路径下,但是会匹配默认的index.html,而无须强制匹配test.html,但是此时就不能使用”=”来进行精确匹配,现在将root改为alias,如图: 注意:alias指定的路径结尾要加”/”
下面的配置文件采用roo指定路径,当通过域名请求http://www.test.com/html/的时候,将跳转到/usr/share/nginx/html/下的index.html页面,如图: 下面的配置文件采用alias指定路径,请求http://www.test.com/linshi/的时候,将跳转到/usr/share/nginx/test_html/index.html页面,如图:
通过^~方式实现匹配
例如:下面配置文件有两条规则,分别匹配url以字母a开头,但是长度不同,首先将长的规则先注释掉,如图: 通过curl请求查看状态码,如图: 说明:当前只有一个规则开启,因此当匹配url以/a/开头的任何url时,都会返回状态码666 现在配置第二条规则如图所示: 再次发起同样的请求,观察返回状态码,如图: 从上图可以看出,两条规则同时被匹配成功,但是第二条规则比较长,因此第二条规则优先被匹配,如果^~匹配成功了,那么表示阻断正则表达式,不再进行正则匹配。
通过”~”方式实现匹配
上图中的匹配规则都是通过”^~”方式来实现的,那么在匹配最长规则的时候又分为两种情况:
- 第一种:最长规则通过^~来实现匹配
(上图中的最长规则就是通过^~实现) - 第二种:最长的规则不是通过^~实现匹配,而是通过普通匹配来实现
当最长规则是通过普通匹配的时候,将会继续正则匹配, 只要有一个正则成功,则使用这个正则的location,停止继续匹配,返回结果 现在将第二条规则改为普通匹配,并添加一条正则匹配,如图: 再次执行同样的请求命令,得到的状态码如下: 说明:从上图可以看出请求/a/b/的时候,首先会到达第二条规则(最长规则),由于第二条规则为普通匹配(不是^~匹配),因此会继续去匹配正则,也就是第三条规则,因此最终返回状态码为888
通过"~*"方式实现匹配
” ~* ” 表示不区分大小写的正则匹配 例如:通过url请求/a/b/或者/A/B/,查看返回状态码,如图: 请求结果如下: 从上图可以看出,无论匹配的是大写还是小写,都会返回对应状态码888 常用方法还有匹配图片后缀,并返回指定信息,如图:
通过”/” 实现通用匹配
本例子中,9091服务为httpd 第一种情况:proxy_pass最后面没有斜杠,匹配路径有斜杠(/bbb/),如图: vim proxy_pass.conf 说明:proxy_pass最后面没有斜杠”/”,此时通过浏览器请求http://192.168.42.209/bbb/,那么实际访问的地址就是 http://192.168.42.209:9091/bbb/,会将匹配路径/bbb一起加过去,此时如果在http的页面发布目录/var/www/html中创建目录bbb,在bbb目录下创建文件index.html,然后即可实现正常访问,如图: 第二种情况: proxy_pass最后面有斜杠 “/”,匹配路径也有斜杠(/bbb/),如图: 说明:proxy_pass最后面有斜杠”/”,此时通过浏览器请求http://192.168.42.209/bbb/,那么实际访问的地址就是 http://192.168.42.209:9091,会将/bbb抛弃的,如图: 第三种情况:proxy_pass后面还有其他路径但是最后没有 “/”, 匹配路径也有斜杠(/bbb/) ,如图: 说明,此时通过浏览器访问http://192.168.42.209/bbb/index.html,实际请求的是http://192.168.42.209/cccindex.html(注意位置是默认路径下,不是ccc路径下,如果proxy_pass的路径为/ccc/ddd,那么实际请求的就是ccc路径下的index.html)
在httpd的发布路径下创建文件cccindex.html,文件内容可以跟默认路径下的index.html内容相同,然后访问,如图: 跟直接访问209的http服务器的页面效果是一致的 第四种情况: proxy_pass后面还有其他路径但是最后有 “/”, 匹配路径也有斜杠(/bbb/) ,如图: 说明:此时通过浏览器访问:http://192.168.42.209/bbb/index.html,实际访问的是http://192.168.42.209/ccc/index.html
在httpd发布路径下创建一个名称为ccc的文件夹,在内部定义一个index.html,然后访问,如图: 第五种情况:location匹配路径末尾没有 “/”,proxy_pass后面也没有”/ ”,如图: 说明:如果匹配路径和proxy_pass后都没有”/”,那么此时访问http://192.168.42.209/bbb,默认将请求到http://192.168.42.209:9091/bbb/index.html的内容,此时在httpd发布路径下bbb目录的index.html添加新内容为:i am match bbb,通过IP请求如图: 总结:
- proxy_pass最后面没有斜杠,匹配路径有斜杠(/bbb/),则跳转访问的时候会将匹配路径/bbb一起加过去
- proxy_pass最后面有斜杠 “/”,匹配路径也有斜杠(/bbb/),则不会带匹配路径页面内容访问
- proxy_pass后面还有其他路径(bbb)但是最后没有 “/”, 匹配路径也有斜杠(/bbb/),则跳转访问的路径不会带其他路径
- proxy_pass后面还有其他路径但是最后有 “/”, 匹配路径也有斜杠(/bbb/) ,则跳转访问带其他路径的页面内容
- proxy_pass后面没有 “/”, 匹配路径也没有斜杠(/bbb/) ,则跳转访问其匹配路径后的页面内容
ReWrite语法
Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。 rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用。 Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。 通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。rewrite 是实现 URL 重写的关键指令,根据 regex(正则表达式)部分内容,重定向到replacement,结尾是 flag 标记。
rewrite 语法格式及参数语法说明如下:
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag 标记
关键字:其中关键字 rewrite 不能改变 正则:perl 兼容正则表达式语句进行规则匹配 替代内容:将正则匹配的内容替换成 replacement flag 标记:rewrite 支持的 flag 标记 flag 标记说明:
ReWrite相关指令
Rewrite全局变量
Rewrite语法规则
if指令
return指令
1.首先从访问日志access_log中查出需要限制的ip 修改conf配置文件
rewrite指令
判断目录是否存在 服务器内部的rewrite和302跳转不一样.跳转的话URL都变了,变成重新http请求index.html,而内部rewrite,上下文没变。 随便访问不存在的资源,然后返回404 那我们需要一个跳转新页面的配置,不去调用上下文路径,可配置两种跳转,如下: 301永久跳转 301永久跳转:当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息中的状态码的一种,表示本网页永久性转移到另一个地址。 找到域名配置文件的Server或者location段,适当位置添加下面代码: rewrite ^/(.) http://www.server110.com/$1 permanent; 302临时跳转 302临时跳转:也是状态码的一种,意义是暂时转向到另外一个网址。 找到域名配置文件的Server或者location段,适当位置添加下面代码:rewrite ^/(.) 1 redirect; 解释说明:后面的$1代表链参数也一起跳转。比如访问server110.com/123就会跳转到www.server110.com/123 没有的话。就会直接跳转到www.server110.com
修改后的写法:如果是本地跳转,需要增加对应路径的匹配,因为/的匹配文件已经不存在 解释说明:因为是本地跳转后访问/code/index.html因此得有匹配此路径的location,否则跳转后404
set指令
set指令是设置变量用的,可以用来达到多条件判断时作标志用 判断IE并重写,且不用break;我们用set变量来达到目的
栗子:
|