nginx里的location 命令
使用语法为:
location 匹配模式 匹配符号 {
执行指令
}
其中匹配符号有时候是可以省略的。
基本示例:使用不同的 root 目录 ¶
server {
listen 80;
server_name xxx.com;
index index.html;
location ^~ /aaa {
root /var/www/folder1; #目录1
}
location ^~ /bbb {
root /home/wwwroot/folder2; #目录2
}
}
以上用到了^~这个匹配符号,它的意思是匹配以某些字符串开头的 URI。
请求http://xxx.com/aaa/1.html的时候,会读取/var/www/folder1/aaa/1.html,因为 web 根目录被设定为/var/www/folder1。
而请求http://xxx.com/bbb/2.html的时候,会读取/home/wwwroot/folder2/bbb/2.html。
这个示例只是提供一个试验和理解,而在实践中基本不会有人这么用,首先就没什么这样的需求,极少。
正则匹配 ¶
以下是区分大小写的匹配模式:
location ~ /Aaa\d+ {
#...
}
匹配/Aaa321这个请求地址但不匹配/aaa321,如果要忽略大小写请改成~*匹配模式,比如location ~* /aaa\d+
正则的实际例子 ¶
匹配特定后缀的请求资源,缓存一定时长,下次再来请求就让浏览器读取浏览器自己的缓存。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
#缓存30天
expires 30d;
}
location ~ .*\.(js|css)?$
{
#缓存12小时
expires 12h;
}
匹配所有地址 ¶
如果希望无论任何请求都执行特定指令,可以直接loaction / { ... }就可以了,这个/就是匹配模式,表示匹配任何地址,这样的话也不需要说明匹配符号了,下面来个例子。
实例:所有请求地址都忽略 index.php ¶
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location =、、* 、^~等区别
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
location是Nginx对HTTP请求中的URI进行匹配处理的指令,location的语法形式如下:
location [=|~|~*|^~|@] pattern { ... }
= : 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。
~ : 为区分大小写匹配(可用正则表达式)
!~ : 为区分大小写不匹配
~* : 为不区分大小写匹配(可用正则表达式)
!~* : 为不区分大小写不匹配
^~ : 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。
修饰语“^~” : 完全匹配URI中除访问参数以外的内容,匹配项的内容如果不是正则表达式,则不再进 行正则表达式测试。
示例
location = / {
# 只匹配 / 查询。
}
location / {
# 匹配任何查询,因为所有请求都以 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
}
location ^~ /images/ {
# 匹配任何以 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
}
location ~*.(gif|jpg|jpeg)$ {
# 匹配任何以 gif、jpg 或 jpeg 结尾的请求。
}
location ~*.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
#防盗链
rewrite ^/ http://$host/logo.png;
}
}
location ^~ /images {
root /data/web;
}
修饰语“@”:定义一个只能内部访问的location区域,可以被其他内部跳转指令使用,如try_files或 error_page。
location @images {
proxy_pass http://images;
}
URL写法区别
结尾不带/
location /test { # 如果test目录不存在,nginx会偿试着把test当做文件去查找
........
}
结尾带/
location /test/ { # 如果test目录不存在,nginx则不会把test当做文件去查找,直接返回404
.......
}
注: 如果上面的URI没匹配成功,就不会以进入location中去执行其他命令,
而是会自己根据客户端发来的url去服务器找相对应的资源,有就返回内容,
没有就返回404
CGI(Common Gateway Interface,通用网关接口)CGI是一种通用网关接口规范,该规范详细描述了Web服务器和请求处理程序(脚本解析器)在获取及返 回数据过程中传输数据的标准,如HTTP协议的参数名称等。大多数Web程序以脚本形式接收并处理请求,然 后返回响应数据,如脚本程序PHP、JSP、Python等。
FastCGI (Fast Common Gateway Interface,快速通用网关接口)
FastCGI是Web服务器和动态脚本程序间的一个高速、可 伸缩的接口,它采用C/S架构,将Web服务器和动态脚本解析器分离,同时启动一个或多个脚本解析器守护进 程接收Web服务器的动态脚本解析请求。当用户向Nginx服务器发起动态脚本请求时,Nginx服务器将动态脚本解析任务交由FastCGI进程来执行,并将FastCGI解析的结果返回给用户。PHP-FPM是一个被编译到PHP内 核中的FastCGI应用,因为它是作为PHP的补丁开发的,所以它在PHP脚本的解析上更加高效。
SCGI(Simple Common Gateway Interface,简单通用网关接口)
SCGI是CGI的替代版本,它与FastCGI类似,同样是将请求处理程序独立于Web服务器之外,但更容易实 现,性能比FastCGI要弱一些。
WSGI(Web Server Gateway Interface,Web服务网关接口)
WSGI是为Python语言中定义的Web服务器与Python应用程序或框架间的通用通信接口,可以使Python 应用程序或框架与支持这一协议的不同Web服务器进行通信。常见的Python Web框架都实现了该协议的封 装。
uWSGI
uWSGI是Python实现WSGI、uWSGI(uWSGI独有的协议)、HTTP等协议功能的Web服务器,Nginx 通过ngx_http_uwsgi_module模块实现与uWSGI服务器的数据交换并完成Python网站的请求处理。该模块 默认编译在Nginx二进制文件中,无须单独编译。
