目录
5.1 ngx_http_rewrite_module 模块指令(if、set、break、return)
1、nginx 介绍
。。。。技术太多就省略介绍了
2、nginx 编译安装步骤
1、编译器准备
编译需要gcc(C语言)和依赖第三方库
2、解压nginx压缩包 和 创建用户
压缩包提前准备:
需要创建一个用户给nginx程序使用。 -s 不交互 -M 不设家目录 -------一般这样配置用户给程序使用
3、进入目录使用 ./configure 进行源码编译nginx,可以使用 --help 查看参数
4、make && make install
安装完成后查看程序目录,有四个主要目录
5、编译参数 和 验证版本
编译使调用脚本更方便
不做编译的方法。 做编译是为了更方便调用启动脚本
6、使用nginx
平滑升级和回滚案例 (不重启完成)
平滑的意思是在不重启服务,用户无感知的情况下升级nginx的版本。保证业务的持续服务。
平滑升级:
1、解压新版本和新模块
2、进入文件内编译新版本
--add-module 增加模块参数
3、make ,此时无需make install
查看objs/ 目录下生产的新版本nginx文件
4、备份旧的版本nginx文件,将新版本nginx文件复制过去
备份:
复制nginx文件替换旧版本:
5、检测有无问题
6、平滑升级 USR2可执行程序
1、查看当前版本:使用 echo -I 172……测试(不要nginx -V)
2、Ps aux 查看进程:
3、kill -USR2 7272 #nginx worker ID
4、再次查看进程:会发现多了一个新master进程
5、再次查看当前版本:使用 echo -I 172……测试(不要nginx -V)
还是旧版本!!!!!
7、回收旧版本kill -WINCH
旧版本的worker已经没有了
再次查看进程:版本以及变成新版本
此时也可以杀死旧版本master:
回滚:恢复旧版本
如果新版本发现问题,可以回滚到以前的版本!!!!!!!!!!
1、将旧nginx文件重新覆盖
2、 kill -USR2 可执行程序:
3、回收新版本master:
4、查看版本,已回到旧版本
3、nginx 核心配置详解
创建子配置文件
1、在主配置文件 nginx.conf 的http{} 模块中增加 include 参数:
2、在该路径中写入配置,没有目录手动创建,创建时最好复制,以免出错
3、去 root 路径下创建indxe.html 文件
4、nginx -s reload生效
root 和 alias
root:路径 = root + location
指定web 的文件位置
例:路径 = root + location =/usr/local/nginx/html/web
Nginx -s reload 刷新
访问:加路径 location ,也必须加//!!!!!!!!!!!!
alias:定义路径别名
例:访问location别名时,会显示到alias 定义的路径
Nginx -s reload 刷新
访问:加路径 location ,也必须加//!!!!!!!!!!!!
location 匹配方式的详细使用
= :只能指定文件!!文件
对文件匹配优先级:
=,~~*,不带符号,^~
nginx 网址的认证功能
由ngx_http_auth_basic_madule模块提供
1、创建认证信息
如果要建立多个账户,取消 -c 直接 -mb
2、配置server模块参数
auth_basic:此指令用于开启HTTP基本认证,并可以指定一个字符串作为认证领域的提示信息,例如 "Restricted" 或 "closed site"。如果设置为 off,则关闭认证
auth_basic_user_file: 后面跟认证信息的路径
3、访问该网址
自定义错误页面 (例:404)
自定义错误返回码相应的内容。例 返回404错误码时访问自定义的文件!!!
1、在server模块添加error_page参数 跟返回码(可同时指定多个)和location = 指定的文件名(404.html)
2、配置 location 定义路径 使用 " = " 精确匹配文件文件文件!!!!!!!
自定义错误日志文件
格式:
4、Nginx 高级配置
4.1 状态页
4.2 nginx压缩功能
压缩文件大小有助于传输时提升速度。但是压缩比越大,占用cpu资源越高!!!!
1、nginx.conf 主配置文件http模块中
压缩比为5;小于1k将不会被压缩,gzip_types 指定了哪些资源执行压缩操作。
2、访问测试:
准备一个大于1k大小的文件,小于1k将不会压缩
访问:--head 显示头部信息
4.3 nginx的版本隐藏
4.4 nginx 变量使用(内置和自定义变量)
内置变量:nginx模块自带变量。详情看文档
自定义变量:使用指令set $varname value 定义变量
测试:echo 功能不是自带的,在解析时加的
记得加解析
-b :给cookie值
-u:指定认证用户
5 、nginx rewrite 相关功能
- nginx利用ngx_http_rewrite_module模块解析和处理rewrite请求
- 此功能依赖PCRE
- rewrite是nginx服务的重要功能之一,用于实现URL的重写。用处有比如在改变网络结构后,不需要客户端修改原来的书签,也无需其他网址修改链接就可以设置访问。
- 一定程度上提高了安全性
5.1 ngx_http_rewrite_module 模块指令(if、set、break、return)
5.1.1 if 指令
用于条件匹配判断,并根据结果选择不同的nginx配置。在server或location中进行配置。只支持单词判断!!!
格式:
可使用正则表达式进行匹配:
测试:
访问:
5.1.2 set 指令
自定义变量,并可给定一个变量值
格式:
Set $key value
5.1.3 break 指令
用于中断当前的相同作用域location的配置,后面模块中的指令将不再执行。
注:!!!berak指令中断的是rewrite模块的指令!!!其他指令会继续执行
测试:
当没有添加break时:
添加后:由于break只能中断rewrite模块的指令,其他的会继续执行!!!$port 没成功就为空
5.1.4 return 指令
用于对请求的处理。并直接向客户端返回状态码。还可以指定重定向URL(301、302)。处于指令后的所有匹配讲不被执行。
格式:
测试:
1、测试返回状态码及内容: 内容吧状态码覆盖了
2、测试重定向:curl 不支持重定向,在浏览器尝试
5.2 rewrite 指令 ---- 匹配和改变uri
通过正则表达式的匹配来改变uri,可以有多个匹配条件,会按照顺序依次进行匹配。
Rewrite 主要针对用户请求的url或uri做具体处理!!
rewrite格式:
正则表达式格式:
[ Flag ] 说明:是rewrite跳转方式----四种
- Redirect :临时重定向,重写完成后以临时的方式返回给客户端。状态码 301
- Permanent :永久重定向。重写完成后以永久的方式返回给客户端。状态码 302
- Break :重写完成后,停止url在当前location中后续其他操作。然后直接跳转至重写的匹配块,结束循环。适用对uel一次重写!!
- Last :重写完成后,停止url在当前location中后续其他操作。但是跳转至新的url后会继续重新检查,如果有匹配跳转会继续匹配跳转。适用url多次重写!!!
Break 和last 详细介绍:
break:
当有多个rewrite匹配条件时,会自上而下以此检查匹配。被匹配规则匹配替换后,如果替换后的uri还有替换机制,会重新进行新一轮的替换检查,隐含有循环机制,但不超过10次。
当break不存在时,/break 中的rewrite 会匹配替换成test1,但是又会接着被下一条rewrite匹配,最终重写成 /test2 。
而当break存在时,匹配第一个rewrite后 ,重写成 test1 就结束后续的检查了。将test 1 返回给客户端
last:
不加last时会经过两次rewrite匹配至lee/test2/index.html:
加上last时,第一个rewrite 将匹配的uel重写为test1 ,并结束当前location的后续操作。但是会再次对新的url重写检查,于是匹配到了第二个location /test1 中,并执行该location中的其他指令!!!也就是return 返回666状态码和文本内容!!
5.3 nginx 的防盗链
所谓盗链就是通过另一个web站点通过链接盗取当前站点的某些资源信息而不是打开整个网址页面!!!!
而防盗链就是禁止其他web站点利用盗链该站点。
防盗链基于客户端携带的 referer 实现。Referer 是记录打开一个页面之前 是从哪个页面跳转过来的标记信息。
referer:
如果不是通过其他页面跳转而来的,referer为none ,没有信息。相反则会记录之前页面的网址域名
查看标记信息:tail /usr/local/nginx/logs/access.log
实现防盗链:
通过valid_referers 参数设定 referer 值为none 或 blocked 或 server_name 主机名包含自己或从百度跳转的可以访问
If ($invalid_referer)用来判定不属于上述值的访问时,可以指定返回404拒绝访问或者给他指定到其他的路径去!!
测试:记得删除缓存测试
404结果:
其他路径测试:照片改变了(示例)
6、nginx反向代理功能
通过location 实现的!!!将用户的请求通过某种预定义的协议转发至其他服务器处理!!!
同构代理:用户不需要其他程序的参与,直接通过http或tcp协议访问后端服务器。
异构代理:用户访问的资源需要经过处理后才能返回,例如php,python等。只有经过处理后才能访问!!!
6.1.1 反向代理配置参数
proxy_pass: 指定服务器主机
用来指定后端服务器的主机,可以是ip地址(+端口号)或主机名。
注:如果location 定义uri时使用了正则表达式(~、~*),那么proxy_pass后面不能使用uri,也就是不能加 / 。
proxy_hide_header: 隐藏信息
proxy_pass_header: 透传信息
proxy_pass_request_body on|off:
proxy_pass_request_headers on|off:
proxy_set_header:
6.1.2 案例:反向代理单台web服务器
Nginx 配置:
当访问这个地址时。Location 通过 proxy_pass 参数将请求转发给该主机!!!
测试:
6.1.2 案例: 指定location 实现反向代理
Nginx 配置:
指定location 反向代理的web服务器必须有对应的url
后端web:需要有代理服务器指定的url /static
测试:记得加斜杠 / !!!!!!!!!!!!!
6.1.3 案例:针对特定资源实现代理 (动静分离)
动静分离:通过location对请求的url进行匹配,将网站静态资源(html、css、img等),和动态资源(servlet、jsp等应用)分开部署 。
作用:将动态资源和静态资源分开部署后,可以根据需求分配不同的处理性能,提高相应的速度。
Nginx 动静分离看似是将资源分离,实际是通过nginx将动态请求和静态请求分离开来,在交给对应的服务器处理!!!
这样一来,只需提供不同的接口给不同的功能模块或平台使用,接口职责更加单一,更便于功能维护!!!!
Nginx 配置:
测试:
6.1.4 缓存功能!!
通过设置创建的目录缓存用户请求的资源,当下次用户请求同一资源时,将缓存的资源直接返回给用户!!!相应的时间相对于更快,缓存为王,即使再优化的策略也没有缓存来的快!!!!
6.2 http的反向代理负载均衡
nginx可以将客户端的请求转发至单台后端服务器,但是无法转发至特定的一组服务器,而且不能对后端服务器提供相应的状态监测。
Ngx_http_upstream_module:nginx可以基于此模块提供服务器的分组转发、权重分配、状体监测、调度算法等功能!
6.2.1 案例:多台web服务器负载均衡案例
Nginx 配置: