4.Nginx 静态内容服务配置

4.1 根目录及索引文件

root指令用于设置服务器查找文件的根目录,可用于http, serverlocation。示例如下:

server {
    root /www/data;

    location / {
    }

    location /images/ {
    }

    location ~ \.(mp3|mp4) {
        root /www/media;
    }
}

如果请求URL以/images/开头,那么Nginx就会在服务器的/www/data/images/目录查找请求的文件。如果请求URL以.mp3.mp4结尾,那么Nginx就会在服务器的/www/media/目录查找请求的文件。因为这条locationroot指令重新设定了查找根目录。

如果请求URL以/结尾(未指定具体的文件名),Nginx会认为客户端在请求访问一个目录,并在该目录中查找索引文件。默认的索引文件为index.html,可以通过index指令重新设定索引文件。如果索引文件不存在,Nginx默认会返回404(Not found)错误代码。

也可以通过如下配置,让Nginx自动生成文件目录:

location /images/ {
    autoindex on;
}

可以通过index指令指定不同的索引文件,示例如下:

location / {
    index index.htm index.html;
}

Nginx在查找索引文件时,先检查索引文件是否存在,然后在内部重定向到该索引文件的全路径的URI,从而导致对location的重新匹配。如下所示,假设请求URI为/path/,并且/data/path/index.html不存在,而 /data/path/index.php存在。那么内部重定向将最终导致第二个location匹配该请求。

location / {
    root /data;
    index index.html index.php;
}

location ~ \.php {
    fastcgi_pass localhost:8000;
    ...
}

4.2 尝试匹配

try_file可用于检查请求的资源是否存在,并做内部重定向,或返回一个状态代码。如下所示,Nginx根据root和请求uri检查资源是否存在,如果不存在,就发起一个内部重定向到/www/data/images/default.gif访问。

server {
    root /www/data;

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

try_file的第二个参数也可以是一个状态码(以=开头),或一个location的名字。如下所示,如果请求的资源都不存在,就会返回一个404错误。

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

在下面的例子中,如果请求资源不存在,就会跳转到一个命名的location。

location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://backend.example.com;
}

4.3 优化配置

启用sendfile

Nginx默认自己处理文件传输,在传输文件前,先将文件拷贝到缓冲区。启用sendfile指令,可以不用先将文件拷贝到缓冲区,而直接将文件拷贝到另外一个文件描述符。另一方面,也可以通过sendfile_max_chunk设置文件传输的大小,从而避免占用整个worker进程。示例如下:

location /mp3 {
    sendfile           on;
    sendfile_max_chunk 1m;
    ...
}

启用tcp_nopush

tcp_nopush指令与sendfile指令一起使用,可以让Nginx在同一个数据包里发送HTTP响应头部。

location /mp3 {
    sendfile   on;
    tcp_nopush on;
    ...
}

启用tcp_nodelay

tcp_nodelay指令用于禁用Nagle算法,该算法依赖于大量小数据包来处理在低速网络环境下传输问题,数据包传输时会有200毫秒延迟。现代网络环境下,可以立即传输大文件而无关数据包大小。这时,延迟就可能影响到在线应用(如ssh,在线游戏,在线交易等)。tcp_nodelay指令可以禁用Nagle算法,该指令仅适用于保持连接的情况。示例如下:

location /mp3  {
    tcp_nodelay       on;
    keepalive_timeout 65;
    ...
}

4.4 优化队列

Nginx一个重要的特性是可以快速处理连接的能力。连接建立后,一般会被放到监听端口的队列里。在普通负载的情况下,一般是一个低级的队列,或根本没有队列。在高负载的情况下,队列会大幅增长,从而导致性能不均衡、连接丢失以及延迟。

评估队列

第一步先通过下面命令来评估队列情况:

netstat -Lan

该命令输出如下:

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address         
0/0/128        *.12345            
10/0/128        *.80       
0/0/128        *.8080

如上所示,80端口上有一个最大长度为128的队列,该队列有10个未处理的连接请求。这是在普通负载下的情况。

但也可能是下面这种情况:

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen         Local Address         
0/0/128        *.12345            
192/0/128        *.80       
0/0/128        *.8080

如上所示,80端口上有192个未处理的连接请求,超过了队列的长度范围。在高负载时,这是很常见的情况。为了优化性能,需要增加队列的最大长度,来满足请求数量。这需要同时优化操作系统和Nginx。

优化操作系统

调整操作系统默认的net.core.somaxconn值,让它大于128。

  • FreeBSD,运行下面命令
sudo sysctl kern.ipc.somaxconn=4096
  • Linux,运行下面命令
sudo sysctl -w net.core.somaxconn=4096

打开/etc/sysctl.conf

vi   /etc/sysctl.conf

添加下面一行并保存

net.core.somaxconn = 4096

优化Nginx

如果设置somaxconn大于512,需要设置backlog参数如下:

server {
    listen 80 backlog=4096;
    # The rest of server configuration
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 配置运行Nginx服务器用户(组) 用于配置运行Nginx服务器用户(组)的指令是user,其语法格式为: use...
    吃瓜的东阅读 10,033评论 0 41
  • 《老男孩Linux运维》笔记 隐藏Nginx软件版本号 一般来说,软件的漏洞都和版本有关。因此要尽量隐藏对访问用户...
    Zhang21阅读 9,157评论 0 28
  • 1.ngnix介绍 ngnix www服务软件 俄罗斯人开发 开源 性能很高 本身是一款静态WWW软件 静态小文件...
    逗比punk阅读 6,450评论 1 6
  • 编译自:serving-static-content 本文将讲述如何配置 nginx 提供静态内容服务,如何定义文...
    C86guli阅读 12,341评论 0 3
  • 寒假回家过年,父母又在讨论我今后应该怎样怎样,他们给我找条件不错的对象,给我找轻轻松松的工作,这是父母半辈子努力的...
    杂草妖精阅读 1,810评论 0 0

友情链接更多精彩内容