nginx: http_core_module

陪她去流浪 桃子 2015年04月17日 编辑 阅读次数:3288
语法default_type mime-type;
默认default_type text/plain;
环境http, server, location

定义响应的默认MIME类型。

可以通过 types 指令来映射MIME类型。

语法root path;
默认root html;
环境http, server, location, if in location

设置请求的根目录。

最终所请求的文件路径只是把“root”指令的值加在URI后面而已。如果需要改变URI,可以使用别名指令“alias”。

对于以下例子:

location /i/ {
	root /data/w3;
}
,将发送文件“/data/w3/i/top.gif”用于响应请求“/i/top.gif”。

path 可以包含除“$documment_root”、“$realpath_root”之外的变量。

语法server { ... }
默认 
环境http

配置虚拟服务器(块)。

在块内,可以通过 listen 指定监听的端口,通过 server_name 列出该server适用的所有服务器的主机(名)。

参考:nginx 如何处理一个请求

语法server_name name ...;
默认server_name "";
环境server

设置虚拟服务器的名字。

举例:

server {
	server_name example.com www.example.com;
}

第1个名字将作为主要的服务器名字。服务器名字可以包含用于替换名字第1部分或最后一部分的通配符“*”:

server {
	server_name example.com *.example.com www.example.*;
}
前两者也可以合并成一个:
server {
	server_name .example.com;
}
同样可以在名字中使用正则表达式,只需要在名字前面加上一个波浪线即可:
server {
	server_name www.example.com ~^www\d+\.example\.com$;
}
正则表达式式中可以包含变量捕捉组,用于后续的使用:
server {
	server_name ~^(www\.)?(.+)$;
	
	location / {
		root /sites/$2;
	}
}

server {
	server_name _;
	
	location / {
		root /sites/default;
	}
}
捕捉组也可以有名字,同样用于在其它指令中使用该名字的变量值:
server {
	server_name ~^(www\.)?(?<domain>.+)$;
	
	location / {
		root /sites/$domain;
	}
}

server {
	server_name _;
	
	location / {
		root /sites/default;
	}
}

如果该指令的参数被设置为“$hostname”,那么server的名字就是当前主机的名字。

服务器的名字也可以是空的:

server {
	server_name www.example.com "";
}
它允许当前虚拟服务器代替默认虚拟服务器去处理那些没有 “Host” HTTP头的请求。

在通过请求的Host搜索该使用哪个虚拟服务器时,如果同时出现多个匹配(比如:含通配符的和正则的),ngx将按照以下顺序选择该使用哪一个服务器:

  1. 精确的名字
  2. 以“*”开始的最长的通配符名字,比如:*.example.com
  3. 以“*”结束的最长的通配符名字,比如:mail.*
  4. 第1个匹配的正则表达式(按出现在配置文件中的顺序)

更详细的文档被单独列于:Server Names

语法try_files file ... uri;
try_files file ... =code;
默认 
环境server, location

每处理一个请求时,按“try_files”参数列出的顺序依次检测该文件是否存在,并把第1个找到的文件用于请求处理。该请求于当前环境中被处理。文件的路径同样是根据“root”或“alias”来构造的。也可以通过在文件名的前面加一个斜杠(/)来检测目录是否存在。如果所有被检测的文件都不存在,则程序内部将重定向到最后一个参数的 uricode

比如:

location /images/ {
	try_files $uri /images/default.gif;
}

location = /images/default.gif {
	expires 30s;
}

最后一个参数还可以是一个HTTP状态码code,像下面那样:

location / {
	try_files $uri $uri/index.html $uri.html =404;
}

也可以是一个“具名的”位置:

location / {
	try_files	/system/maintenance.html
			$uri $uri/index.html $uri.html
			@mongrel;
}

location @mongrel {
	proxy_pass http://mongrel;
}

而我处理WordPress中“友好”博客地址的方式是这样的:

location / {
	try_files $uri $uri/ /index.php;
}
我这篇文章的 $uri 是“/nginx/http/core.html”,而实际上这个文件是不存在的,真正的请求则被nginx处理成了:
/index.php
了。

有人可能会纳闷,这样的话,岂不是所有的请求都一样了吗?其实不然。因为“/index.php”是存在于当前博客的目录下面的,在把当前请求转到index.php时,由于协议(fastcgi),index.php中的程序可以通过“$_SERVER['REQUEST_URI']”来取得真正的URI,也就是:/nginx/http/core.html,然后通过此参数的值作文章查找处理。

现在知道WordPress的文章别名为什么能正常工作了吗?
语法types { ... }
默认
types {
	text/html	html;
	image/gif	gif;
	image/jpeg	jpg;
}
环境http, server, location

映射文件扩展名到请求响应的MIME类型。

注:可能某些人不知道MIME有啥用?举个简单的例子吧!有时候你可能纳闷,为什么我请求“/path/file.zip”的时候浏览器却直接在浏览器窗口中显示该文件的内容(一堆乱码),而不是弹出“另存为”的框框呢?原因很可能就是MIME类型指定错误。对于zip/rar等格式的文件默认应该使用“application/octet-stream”类型。如果要直接在浏览器中显示(比如文本文件),则应设置为“text/plain”。而且nginx的默认类型(default_type)就是text/plain

扩展名区分大小写。多个扩展名可以映射到一种MIME类型:

types {
	application/octet-stream bin exe dll;
	application/octet-stream deb;
	application/octet-stream dmg;
}

nginx 本身也维护了一个更完整的MIME映射表,位于(conf/mime.types),你也可以直接修改它。

如果要使某“location”下面的所有请求都作为“application/octet-stream”,可以按照类似下面这种方式配置:

location /download/ {
    types        { }
    default_type application/octet-stream;
}

变量列表

nginx 支持和 Apache Server 相同的变量名。这些变量代表客户端请求的头字段,比如 $http_user_agent$http_cookie 等等。nginx 还支持下面这些变量:
$arg_name
请求URI中名为 name 的参数。
$args
请求URI中的所有参数。
$document_root
针对于当前请求的 rootalias 指令的值。
$document_uri
等同于 $uri
$host
按以下顺序取值:
  1. URL中的主机名。
  2. HTTP请求头部的“Host”字段。
  3. 匹配当前请求的“server_name”。
$hostname
主机名(也就是第1种情况的“$host”)。
$uri
已正常化的请求的URI

在处理请求的过程中,$URI的值可能会发生改变!比如:内部重定向、使用索引(index)文件。

标签:nginx