nginx的配置虚拟主机负载均衡和反向代理三
老吾老,以及人之老;幼吾幼,以及人之幼。
nginx中的 location 正则模块
首先看下location 正则匹配的使用。
还记得之前是如何用location来定位.php文件的吗?
1 | location ~ \.php$ { |
我们用~来表示location开启正则匹配, 这样:location ~。
还可以用这个来匹配静态资源,缓存它们,设置过期时间:
1 | location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|mp3|mp4|swf){ |
expires 用来设置HTTP应答中的Expires和Cache-Control的头标时间,来告诉浏览器访问这个静态文件时,不用再去请求服务器,直接从本地缓存读取就可以了。
1 | 语法: expires [time|epoch|max|off] |
可以在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 = #, # 会转换为指定时间的秒数。比如:1d、2h、3m。
- off 表示不修改“Expires”和“Cache-Control”的值
比如再看个例子:
控制图片等过期时间为30天
1 | location~ \.(gif|jpg|jpeg|png|bmp|ico)$ { |
我们还可以控制哪一个文件目录的时间,比如控制匹配/resource/或者/mediatorModule/里所有的文件缓存设置到最长时间。
1 | location ~ /(resource|mediatorModule)/ { |
URL重写模块(Rewrite)
重写模块与很多模块一起使用。先看一下是怎么用的,看2个例子,然后我们再一点一点讲每个的使用方法:
1 | location /download/ { |
1 | location / { |
break
break 和变成语言中的用法一样,就是跳出某个逻辑。
语法:break
默认值:none
使用字段:server, location, if
1 | if (!-f $request_filename) { |
上面这个例子就是在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) { |
$http_user_agent变量获取浏览器的agent,使用~ 来匹配大小写
用户如果使用的IE 浏览器,就执行if 里面的操作。
1 | if ($request_method = POST ) { |
$request_method变量获取请求的方法,使用=来判断是否等于POST 。如果复合,就执行if 里面的操作。
```php
if (!-f $request_filename) {
break;
proxy_pass http://127.0.0.1;
}
``
$request_filename变量获取请求的文件名,使用!-f来匹配文件,如果不是一个文件名,就执行if 里面的逻辑。