nginx的配置、虚拟主机、负载均衡和反向代理(3)

https://www.zybuluo.com/phper/note/133244

前面几节,陆陆续续的说了nginx平时做的大部分工作。第3篇主要讲还是蛮重要的URL路由重写读写分离

nginx中的 location 正则模块

用过apache的知道,apache也是可以配置URL重写的,我之前一篇中也详细的写过:apache的虚拟域名rewrite配置以及.htaccess的使用

这一小节,主要来学习nginx中的URL重写怎么做。url重写模块,主要是在location模块面来实现,我们一点一点的看。

首先看下location 正则匹配的使用。

还记得之前是如何用location来定位.php文件的吗?

  1. location ~ \.php$ {
  2. fastcgi_pass 127.0.0.1:9000;
  3. fastcgi_index index.php;
  4. include fastcgi.conf;
  5. }

我们用~来表示location开启正则匹配, 这样:location ~

还可以用这个来匹配静态资源,缓存它们,设置过期时间:

  1. location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|mp3|mp4|swf){
  2. expires 15d;
  3. }
  4. location ~ .*\.(css|js){
  5. expires 12h;
  6. }

expires 用来设置HTTP应答中的ExpiresCache-Control的头标时间,来告诉浏览器访问这个静态文件时,不用再去请求服务器,直接从本地缓存读取就可以了。

  1. 语法: expires [time|epoch|max|off]
  2. 默认值: expires off
  3. 作用域: http, server, location

可以在time值中使用正数或负数。“Expires”头标的值将通过当前系统时间加上您设定的 time 值来获得。

可以设置的参数如下:

epoch 指定“Expires”的值为 1 January, 1970, 00:00:01 GMT。  max 指定“Expires”的值为 31 December 2037 23:59:59 GMT,“Cache-Control”的值为10年。  -1 指定“Expires”的值为 服务器当前时间 -1s,即永远过期  负数:Cache-Control: no-cache  正数或零:Cache-Control: max-age = #, # 会转换为指定时间的秒数。比如:1d2h3m。  off 表示不修改“Expires”和“Cache-Control”的值

比如再看个例子:

控制图片等过期时间为30天

  1. location~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
  2. expires 30d;
  3. }

我们还可以控制哪一个文件目录的时间,比如控制匹配/resource/或者/mediatorModule/里所有的文件缓存设置到最长时间。

  1. location ~ /(resource|mediatorModule)/ {
  2. root /opt/demo;
  3. expires max;
  4. }

实战一下。我们设置下过期时间,然后用chrome看下http头部情况。

我把这张图片的expires设置为30天,我们看图中的cache-controlExpires看到了,有30天的缓存了。说明生效了。我们再看下nginx的访问日志:

看下code码,都是304,表示未修改,告诉浏览器直接读本地的。也就是说缓存生效了。

URL重写模块(Rewrite)

重写模块与很多模块一起使用。先看一下是怎么用的,看2个例子,然后我们再一点一点讲每个的使用方法:

  1. location /download/ {
  2. if ($forbidden) {
  3. return 403;
  4. }
  5. if ($slow) {
  6. limit_rate 10k;
  7. }
  8. rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
  1. location / {
  2. root html;
  3. index index.html index.htm;
  4. rewrite ^/bbs/(.*)$ http://192.168.18.201/forum/$1;
  5. }

上面2个例子就是利用rewrite来完成URL重写的。我们慢慢来看它的用法。

break

break 和变成语言中的用法一样,就是跳出某个逻辑。

语法:break  默认值:none  使用字段:server, location, if

  1. if (!-f $request_filename) {
  2. break;
  3. }

上面这个例子就是在if里面使用break,意思是如果访问的文件名不存在,就跳出。后续会有更多的例子。

if

语法:if (condition) { … }  默认值:none  使用字段:server, location

if 判断一个条件,如果条件成立,则后面的大括号内的语句将执行,相关配置从上级继承。

可以在判断语句中指定下列值:

  • 一个变量的名称;不成立的值为:空字符传”“或者一些用“0”开始的字符串。
  • 一个使用=或者!=运算符的比较语句。
  • 使用符号~*和~模式匹配的正则表达式:
  • ~为区分大小写的匹配。
  • ~*不区分大小写的匹配(firefox匹配FireFox)。
  • !~和!~*意为“不匹配的”。
  • 使用-f和!-f检查一个文件是否存在。
  • 使用-d和!-d检查一个目录是否存在。
  • 使用-e和!-e检查一个文件,目录或者软链接是否存在。
  • 使用-x和!-x检查一个文件是否为可执行文件。

我们一一来举例看看。

  1. if ($http_user_agent ~ MSIE) {
  2. rewrite ^(.*)$ /msie/$1 break;
  3. }

$http_user_agent变量获取浏览器的agent,使用~ 来匹配大小写  用户如果使用的IE 浏览器,就执行if 里面的操作。

  1. if ($request_method = POST ) {
  2. return 405;
  3. }

$request_method变量获取请求的方法,使用=来判断是否等于POST 。如果复合,就执行if 里面的操作。

  1. if (!-f $request_filename) {
  2. break;
  3. proxy_pass http://127.0.0.1;
  4. }

$request_filename变量获取请求的文件名,使用!-f来匹配文件,如果不是一个文件名,就执行if 里面的逻辑。

return

语法:return code  默认值:none  使用字段:server, location, if

这个指令结束执行配置语句并为客户端返回状态代码,可以使用下列的值:204,400,402-406,408,410, 411, 413, 416与500-504。此外,非标准代码444将关闭连接并且不发送任何的头部。

rewrite

语法:rewrite regex replacement flag  默认值:none  使用字段:server, location, if

rewrite用来重写url,有3个位置:

regex 表示用来匹配的正则  replacement 表示用来替换的  flag 是尾部的标记:

flag可以是以下的值:

  • last - url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变
  • break - url重写后,直接使用当前资源,不再执行location里余下的语句,完成本次请求,地址栏url不变
  • redirect - 返回302临时重定向,url会跳转,爬虫不会更新url。
  • permanent - 返回301永久重定向。url会跳转。爬虫会更新url。
  • 为空 - URL 不会变,但是内容已经变化,也是永久性的重定向

上面的正则表达式的一部分可以用圆括号,方便之后按照顺序用$1-$9来引用。

我们来看几个例子:

我们需要将/photos/123456重写成/path/to/photos/12/1234/123456.png

可以这样:

  1. rewrite "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;

下面是一些简单的常见的重写。

  1. rewrite ^/js/base.core.v3.js /js/base.core.v3.dev.js redirect;
  2. rewrite ^/js/comment.frame.js /js/comment.frame.dev.js redirect;
  3. rewrite ^/live-static/(.*)$ http://live.bilibili.com/public/$1 last;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我的博客

CI基础知识笔记

1.知识点 $config[‘url_suffix’] = ”;//url后缀 $config[‘enable_query_strings’] = FALS...

2853
来自专栏Android 研究

Android系统启动——3init.rc解析

init.rc文件是以“块”(section)为单位服务的,,一个“块”(section)可以包含多行。“块”(section)分成两大类:一类称为"动作(ac...

4602
来自专栏枕边书

PHP模拟发送POST请求之二、用PHP和JS处理URL信息

明白了HTTP请求的头信息后,我们还需要对请求地址有所了解。再者,HTTP GET请求是靠URL实现的,所以了解URL的构造,处理URL的重要性不言而喻。 在P...

2315
来自专栏大闲人柴毛毛

Java并发编程的艺术(十二)——线程安全

1. 什么是『线程安全』? 如果一个对象构造完成后,调用者无需额外的操作,就可以在多线程环境下随意地使用,并且不发生错误,那么这个对象就是线程安全的。 2. ...

3765
来自专栏腾讯IVWEB团队的专栏

nodejs 中错误捕获的一些最佳实践

本文为翻译文章,原文比较长,感觉也有点啰嗦,所以根据个人理解猜测梳理出本文。

6470
来自专栏工科狗和生物喵

【计算机本科补全计划】指令:计算机的语言(MIPS) --计算机组成原理 Part2

正文之前 今天折腾了一天的ubuntu windows双系统,在windows下安装ubuntu 16.04 然后 安装引导启动器的时候选择的是/boot所在的...

3104
来自专栏北京马哥教育

linux bash环境变量简单总结

一.环境变量简介 Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都 是相同的,这个默认环境实际...

3546
来自专栏python3

Django的路由控制

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于...

3872
来自专栏UDNZ

记一次 .NET Framework 不兼容 HTTP COOKIE 协议标准的问题跟踪

我们在后端系统实现了 HTTP 请求的代理类,用于请求其他第三方系统。

3218
来自专栏york技术分享

sed 使用教程 - 通读篇(30分钟入门系列)

和上篇 awk 分享一样,作为通读性的分享,不想引入太过复杂的东西,依然从日常工作中碰到的 80% 的需求出发,重点阐述最重点的部门,工作原理等,普及一些对se...

50122

扫码关注云+社区

领取腾讯云代金券