Nginx服务静态内容

摘要:摘要: Nginx 服务静态内容

1 根目录和index文件

root目录指令指定用于搜索的根目录。为了获取请求文件的路径,Nginx附着请求URI到root指令指定的路径后面。指令能放置在http、server或location上下文上的任意级别。在下面的例子中,root指令定义在虚拟主机中。它应用于所有没有明确定义root指令的location块:

timg (8).jpg

server {

root /www/data;

 

location / {

}

 

location /images/ {

}

 

location ~ .(mp3|mp4) {

root /www/media;

}

}

这里,Nginx在文件系统的/www/data/images/目录中搜索以/images/开头的URI。但只有URI以.map3或.map4扩展名结尾,Nginx在/www/media/目录搜索文件,因为它在location块中定义匹配。

如果请求以斜杠结尾,Nginx把它作为目录请求并尝试找到目录的一个index文件。Index指令定义index文件的名称(默认值是index.html)。为了继续使用例子,如果请求URI是/images/some/path/,Nginx分发请求给/www/data/images/some/path/index.html(如果存在),如果文件不存在,Nginx默认返回HTTP代码404(没有找到)。为了配置Nginx返回一个自动生成的目录清单替代,使用autoindex指令:

ocation /images/ {

autoindex on;

}

你能在index指令上列出多个文件名。Nginx按指定顺序搜索并返回第一个找到的。

location / {

index index.$geo.html index.htm index.html;

}

在这里使用$geo变量,通过geo指令设置自定义变量。变量的值依赖于客户端IP地址。为了范围index文件,Nginx检查它的存在性,然后通过附着index文件名到基础URI后面产生一个内部重定向URI。内部重定向导致重新搜索location。

location / {

root /data;

index index.html index.php;

}

 

location ~ .php {

fastcgi_pass localhost:8000;

...

}

如果URI是/path/,并且/data/path/index.html不存在,但/data/path/index.php存在,内部重定向为/path/index.php映射到第二个location。因此,请求被代理。

2 Trying Several Optionstry_files指令能用于检查是否指定文件或目录存在并产生一个内部重定向,如果不存在返回指定的状态码。例如:

server {

root /www/data;

 

location /images/ {

try_files $uri /images/default.gif;

}

}

 

文件指定为URI格式,使用root或alias指令设置在当前location或虚拟主机上下文中处理。在这种情况下,如果文件相应的原始URI不存在,Nginx使用最后一个参数产生一个内部重定向URI,返回/www/data/images/default.gif。最后一个参数也可以是一个状态码(直接在等于号后面)或location的名字。在下面的例子中,如果try_files指令解析没有存在的文件或目录返回404错误返回。

location / {

try_files $uri $uri/ $uri.html =404;

}

在下面的例子中,如果原始URI和URI后附着斜线都不存在,请求重定向到代理服务器。

location / {

try_files $uri $uri/ @backend;

}

 

location @backend {

proxy_pass http://backend.example.com;

}

3 优化Nginx内容服务速度

加载速度是服务任意内容的关键因素。NGINX局部优化配置可能促进生产力和帮助达到最佳性能。

3.1 启用sendfile

默认,Nginx自己处理文件传输,发送文件前先复制到缓存。启用sendfile指令将消除复制文件到缓存的步骤和启用直接从一个文件描述符复制数据到另一个。或者,抑制一个快速连接为完全占有worker进程,你可以使用sendfile_max_chunk指令限制单个sendfile()调用传输的数据量:

location /mp3 {

sendfile on;

sendfile_max_chunk 1m;

...

}

3.2 启用tcp_onpush

使用tcp_nopush选项联合sendfile on;。选项将让Nginx在通过sendfile获取数据块之后在一个包中发送HTTP响应头。

location /mp3 {

sendfile on;

tcp_nopush on;

...

}

3.3 启用tcp_nodelay

tcp_nodelay选项允许覆盖纳吉尔算法,最初设计为解决在网络缓慢下使用小包哦的问题。算法整合大量小包为一个大包,发包有200ms延迟。现今,服务大静态文件时,无论包大小数据都能立即发送。延迟也会影响在线应用(ssh、在线游戏、在线交易)。默认,tcp_nodelay指令设置为on表示纳吉尔算法被禁用。选项只用于keepalive连接:

ocation /mp3 {

tcp_nodelay on;

keepalive_timeout 65;

...

}

3.4 优化积压队列

Nginx能快速处理传入请求的主要因素之一。总的原则是建立连接,放入“监听”套接字队列。在正常负载下,有较少队列,或者没有队列。但在高负载下,队列可以大幅度增长导致不均匀性能,连接丢失和延迟。

3.4.1 监测监听队列

让我们检测当前监听队列。运行以下命令:

netstat -Lan

命令输出以下内容:

Current listen queue sizes (qlen/incqlen/maxqlen)

Listen Local Address

0/0/128 *.12345

10/0/128 *.80

0/0/128 *.8080

 

命令输出显示,有10个未接收的连接在80端口监听队列,而连接限制是128个连接,这种情况是正常的。

然而,命令输出以下内容:

Current listen queue sizes (qlen/incqlen/maxqlen)

Listen Local Address

0/0/128 *.12345

192/0/128 *.80

0/0/128 *.8080

命令输出显示192未接收连接,超过128个连接限制。当网站繁忙时这是很常见的。为了获得更高的性能你需要增加最大连接数,需要修改你的操作系统和Nginx配置文件。

3.4.2 调优操作系统

增加net.core.somaxconn键的值(默认值为128)到足够处理高并发的值:

FreeBSD

sudo sysctl kern.ipc.somaxconn=4096

Linux

sudo sysctl -w net.core.somaxconn=4096

打开文件:/etc/sysctl.conf

vim /etc/sysctl.conf

添加以下内容到文件并保存文件:

net.core.somaxconn = 4096

3.4.3 调优Nginx

如果你设置somaxconn键的值大于512,改变Nginx listen指令的backlog参数为:

listen 80 backlog 4096;