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
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

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