配置Nginx作为Web服务器

2016-08-31 12:34:59来源:oschina作者:Leech人点击

配置Nginx作为Web服务器是定义它处理URLs,和如何处理这些URLs资源的HTTP请求。底层,配置定


义一组虚拟主机控制特定域名或IP地址的请求。


HTTP通信的每个虚拟主机定义称为location的特定配置实例控制特定URIs集。每个location定义它


们自己映射请求的方案。每个location能代理请求或返回一个文件。此外,URI能被修改,因此请求


重定向到另一个location或虚拟主机。也可以返回一个特定的错误代码并且你能为每个错误代码配


置相应的错误页面。


1 设置虚拟主机

Nginx配置文件必须至少包括一个server指令定义一个虚拟主机。当Nginx处理请求时,首先选择服


务请求的虚拟主机。


虚拟主机通过http上下文中的server指令定义,例如:



http {


server {


# 虚拟主机配置


}


}



可以添加多个server指令到http上下文中定义多个虚拟主机。


server配置块通常包括listen指令指定IP地址和端口号(或Unix域名套接字和路径)在服务器上


监听请求。支持IPv4和IPv6地址;IPv6地址包裹在方括号中。


下面服务器配置的例子监听IP地址127.0.0.1和端口8080:



server {


listen 127.0.0.1:8080;


# 下面是IPv6的示例


# listen [fe80::20c:29ff:fecb:c6ca]:8080


# 其它配置


}



如果端口被忽略,标准端口(80)被使用。如果地址被忽略,服务器监听所有地址。如果没有


listen指令,标准端口是80/tcp,默认端口是8000/tcp,依赖于超级管理员权限。


如果有多个虚拟主机匹配请求的IP地址和端口,Nginx检查请求的Host头字段和server块中的


server_name指令。server_name可以是完整(精确)的名称,通配符或正则表达式。通配符是一


个开头、结尾或开头和结尾包含星号(*)的字符串;星号匹配任意序列的字符。Nginx使用Perl


语法的正则表达式;使用破折号(~)开头。下面例子是一个精确的名称:



server {


listen 80;


server_name example.org www.example.org;


...


}



如果多个名称匹配Host头,Nginx通过以下顺序选择一个:

精确名称


使用星号开头的较长通配符,例如*.example.org


使用星号结尾的较长通配符,例如mail.*


首先匹配的正则表达式(在配置文件中出现的顺序)

如果Host头字段没有匹配的虚拟主机名,Nginx路由请求到该端口的默认虚拟主机。默认虚拟主


机是nginx.conf文件中第一个虚拟主机,除非你在listen指令上包括default_server参数明确指


定。



server {


listen 80 default_server;


...


}



2 配置location

Nginx能将信息发送给不同的代理或基于请求URIs服务不同的文件。这些块使用放置在server指


令中的location指令定义。


例如,你能定义三个location块指示虚拟主机发送一些请求到一个代理服务器,发送其它请求到


另一个代理服务器,剩下的请求交付给本地文件系统服务。


Nginx检查请求URIs和所有location指令的参数并应用匹配location的指令定义。在每个


location块中,通常可以(少数例外)放置更多location进一步处理特定请求组。


location指令有两种类型的参数:前缀字符串(路径名)和正则表达式。对于匹配前缀字符串的


请求URI,必须以前缀字符串开始。


下面的例子,location使用路径名称参数(以/some/path/开始)匹配请求参数,例如/some


/path/document.html。(它不匹配/my-site/some/path,因为/some/path没有出现在


URI的开始位置。)



location /some/path/ {


...


}



正则表达式以破折号(~)开头表示区分大小写匹配,或破折号-星号(~*)表示不区分大小写匹


配。下面例子匹配在任意位置包括字符串.html或.htm的URLs。



location ~ /.html? {


...


}



为了找到最匹配的URI,Nginx比较URI的前缀字符串。然后使用正则表达式搜索location。


正则表达式优先级较高,除非使用^~修饰符。Nginx选择最特殊的前缀字符串(即,最长并且最


完整的字符串)。选择location处理请求的精确逻辑如下所示:

检查URI和搜索前缀字符串。


=(等于号)修饰符定义精确URI匹配和前缀字符串。如果精确匹配找到,搜索停止。


如果^~(托字符-破折号)修饰符优先考虑匹配最长前缀字符串,不检查正则表达式。


存储最长匹配的前缀字符串。


检查URI和正则表达式。


选择最先匹配的正则表达式并使用相应的location。


如果没有正则表达式匹配,使用存储的前缀字符串对应的location。

典型的用法,=修饰符请求/(反斜线)。如果频繁请求/,指定=/作为location的指令提升处理


速度,因为搜索匹配第一次停止。



location = / {


...


}



location上下文可以包含定义如何解析请求的指令——服务一个静态文件或传递请求给代理服务


器。以下例子,匹配第一个location上下文的请求被/data目录的文件服务,匹配第二个


location的请求传递给主机内容为www.example.com的代理服务器。



server {


location /images/ {


root /data;


}

location / {


proxy_pass http://www.example.com;


}


}



root指令指定文件系统路径搜索静态文件提供服务。请求URI关联的location附加到路径获取静


态文件的完整名称。在上面的例子中,响应请求/images/example.png,Nginx分配文件


/data/images/example.png。


proxy_pass指令传递请求给代理服务器。从代理服务器返回响应,然后传回给客户端。在上面的


例子中,所有请求URIs不以/images/开始的传递给代理服务器。


3 使用变量

你能在配置文件中使用变量,Nginx进程请求不同依赖于定义情况。变量是运行时计算的有名字


的值,并且可以用于指令的参数。变量在它的名字前面用$(美元)符号表示。变量定义信息基


于Nginx的状态,例如,目前处理请求的属性。


有大量预定义变量,例如HTTP核心变量,你能使用set、map和geo指令自定义变量。大多数变量


是运行时计算,并包含相关请求的信息。例如,$remote_addr包含客户端IP地址,$uri保存当前


URI值。


4 返回特定状态码

一些网址URIs需要立即使用指定错误或重定向代码返回响应,例如,当一个页面暂时或永久移除


时。最简单的方式是使用return指令。例如:



location /wrong/url {


return 404;


}



return的第一个参数是响应代码。第二个可选参数可以是一个重定向的URL(301、302、303和


307)或返回响应体的文本。例如:



location /permanently/moved/url {


return 301 http://www.example.com/moved/here;


}



return指令能包含在location和server上下文。


5 重写请求URIs

在请求处理期间请求URI能通过rewrite指令修改多次,有一个可选两个必选参数。第一个(必


选)参数是请求必须匹配的正则表达式。第二个参数是替换匹配URI的URI。第三个可选参数是一


个标记能停止rewrite指令进一步处理或发生一个重定向(代码301或302)。例如:



location /users/ {


rewrite ^/users/(.*)$ /show?user=$1 break;


}



因为上面的例子,第二个参数users通过正则表达式匹配的捕获。


你能在server和location上下文中包括多个rewrite指令。Nginx按它们出现的顺序一一执行指


令。一旦server上下文被选择,server上下文中的rewrite指令被执行。


Nginx处理一组rewrite指令之后,它选择对应新URI的location上下文。如果选择的location包


含rewrite指令,它们将依次执行。如果URI匹配所有rewrite,所有定义的rewrite指令处理后开


始搜索新的location。


下面的例子演示rewrite指令联合return指令。



server {


...


rewrite ^(/download/.*)/media/(.*)/..*$ $1/mp3/$2.mp3 last;


rewrite ^(/download/.*)/audio/(.*)/..*$ $1/mp3/$2.ra last;


return 403;


...


}


该例子配置区分两组不同的URIs。例如,URIs /download/some/media/file变为/download


/some/map3/file.map3。因为last标签,后续指令(第二个rewrite指令和return指令)跳


过,但Nginx继续处理请求,现在有不同的URI。同样,URIs /download/some/audio/file替换


为/download/some/map3/file.ra。如果URI没有匹配所有的rewrite指令,Nginx返回403错误


代码给客户端。


有两个参数中断rewrite指令的处理:

last——停止rewrite指令在当前server或location上下文的执行,但Nginx搜索匹配重写URI的location,新location中的任意rewrite指令被应用(意味着会再次改变)。


break——类似于break指令,停止当前上下文中的rewrite指令的处理并取消搜索匹配重写URI的location。在新location中的rewrite指令不执行。

6 重写HTTP响应

有时你需要重写或改变HTTP响应内容,取代其它字符串。你能使用sub_filter指令定义重写应


用。指令支持变量和替换链,使改变更加复杂。


例如,你能绝对连接引用服务器其它代理:



location / {


sub_filter /blog/ /blog-staging/;


sub_filter_once off;


}



其它例子,从http://改变为https://并替换localhost地址为请求头字段的主机名。


sub_filter_once指令告诉Nginx连续在一个location应用sub_filter指令:



location / {


sub_filter 'href="http://127.0.0.1:8080/' 'href="http://$host/';


sub_filter 'img src="http://127.0.0.1:8080/' 'img src="http://$host/';


sub_filter_once on;


}



注意,响应的备份已经使用sub_filter修改,如果其它sub_filter匹配发生将不再替换。


7 处理错误

使用error_page指令,你能配置Nginx返回自定义错误页面,在响应中替换不同的错误码,或重


定向浏览器到不同的URI。在以下例子中,error_page指令指定页面(/404.html)使用404错误


码返回。



error_page 404 /404.html;


注意,该指令不意味着错误立即返回(return指令),仅指定当错误发生时如何处理错误。错误


代码能来自代理服务器或通过Nginx处理(例如,404导致Nginx不能找到客户端请求的文件)。


在下面例子中,当Nginx不能找到一个页面,它用代码301替代404,重定向客户端到


http://example.com/new/path.html。当客户端一直尝试访问老的URI该配置是有用的。301


代码通知浏览器页面永久移除,需要使用新地址替换老的地址。



location /old/path.html {


error_page 404 =301 http://example.com/new/path.html;


}



以下配置是传入请求没有找到文件。因为error_page指令的等于号后面没有状态码,代理服务器


返回,响应到客户端有状态码(不必是404)。



server {


...


location /images/ {


# 设置搜索文件的根目录


root /data/www;

# 禁用相关文件存在错误时的日志


open_file_cache_errors off;

# 如果文件没有找到,产生一个内部重定向


error_page 404 = /fetch$uri;


}

location /fetch/ {


proxy_pass http://backend/;


}


}



当文件没有找到时,error_page指令Nginx做一个内部重定向。$uri变量在最后一个参数


error_page指令保存当前请求的URI,在重定向时传递。


例如,如果/images/some/file没有找到,它被替换为/fetch/images/some/file并开始搜索


一个新的location。因此,请求最终在第二个location上下文结束,被代理到http://backend


/。


如果文件没有找到open_file_cache_errors指令抑制写一条错误消息。没有必要记录日志,因为


丢失的文件被正确处理。

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台