1.根目录和索引文件

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

root指令能放置的位置是:http,server,location。

上面的意思是:我所有的location定义都是基于根目录/www/data的,也就是说"/"指的就是/www/data/,而"/images/"指的就是/www/data/images/。

我们可以为每个目录都定义一个索引文件,默认是index.html。

index指令的值:可以是index.html或者index.htm,或者index.php。

如果我们的URI是/images/some/path,那么nginx返回的文件就是/www/data/images/some/path/index.html。当然,前提是这个index.html得存在,否则返回404错误。

假如我访问/images/some/path这个URI时,我希望在网页上展示的是列表,需要使用指令autoindex:会展示/www/data/images/some/path/目录下的所有文件夹和文件。

location /images/ {
autoindex on;
}

可以在index指令后添加多个索引文件,nginx会按顺序查找,找到哪个就使用哪个:

location / {
root html;
index index.html index.php index.htm index.$geo.html;
}

$geo是一个用geo指令设置的自定义变量,这个变量的值取决于客户端的IP地址。

index.php文件的重定向:

location / {
root /data;
index index.html index.php;
} location ~ \.php {
fastcgi_pass localhost:;
...
}

2.尝试多个选项

try_files用于提供备选方案,当用户请求的URI不存在时,给予用户一个备选的方案。

server {
root /www/data; location /images/ {
try_files $uri /images/default.gif;
}
}

我们的URI是/images/aa.png,匹配到location之后,首先尝试去查找/www/data/images/aa.png文件,发现没有,此时nginx就会将/www/data/images/default.gif文件

返回给用户。

(问题:我的浏览器显示的是www.example.com/images/aa.png,但实际上看到的文件却是www.example.com/images/default.gif,目前不知道原因)。

还有一点要注意:我们的替换方法(比如上面的/images/default.gif)一定要在root的范围内,也就是/www/data目录下寻找,你不能写成其他的。

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

如果匹配完所有的内容,都没能找到,就返回404错误。注意,如果你不明确指定404错误,那么nginx会返回500内部服务器错误的字样。

返回指定的错误页面:

error_page  /.html;

location = /.html {
root html;
}

重定向到命名location所代表的后端服务器:

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

当前面的$uri,$uri/都匹配不上时,就交给@backend所代表的http://backend.example.com去处理。

这里可以查看nginx的Content Caching(https://www.nginx.com/resources/webinars/content-caching-nginx-plus/),看它如何戏剧性地提高站点的性能,同时深入

理解Nginx的缓存功能。

3.优化Nginx提供内容的速度

对nginx的配置做少许的修改,就能提高nginx的性能。

(1)开启sendfile

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

如果不开启sendfile,nginx会自己处理文件的传输,在发送数据之前,会将数据拷贝到buffer区域。

如果开启sendfile,就会省略拷贝到buffer区域的步骤,而是会直接从一个文件描述符拷贝到另一个文件描述符。

如果一个连接传输数据很快,那么它会一个人霸占一个工作进程,那么可以限制sendfile()方法每次传输的数据量大小,那么可以定义sendfile_max_chunk指令,从而限制每

个连接中最大可以传输的数据量。

(2)开启tcp_nopush

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

tcp_nopush需要和sendfile一起使用,它的作用是:让HTTP响应头和sendfile()发送的数据混合为一个数据包发送出去。

(3)开启tcp_nodelay

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

这个选项用于覆盖Nagle's算法。

Nagle's算法原本的作用是:用于解决在缓慢的网络中传输很小的数据包问题。它的做法是在200ms的延迟时间内,将多个小的数据包组合为一个大的数据包,然后发出去。

当nginx提供大的静态文件时,它不管文件大小,都是立即发送出去。

delay会影响在线应用程序,比如ssh,在线游戏,在线交易。

tcp_nodely设置为on,表示关闭Nagle's算法。

必须开启keepalive,才能使用这个指令,否则不能使用。

(4)优化Backlog Queue

有一个重要的因素是:Nginx处理incoming connections时,有多快?

监听套接字的监听队列:listen socket的"listen" queue

一般规则是:当一个连接建立后,它就会被放入这个"listen" queue中去。

在正常情况下,要么是低队列,要么根本就没有队列。

但是在高负载情况下,这个队列就会很高,可能会造成不稳定的性能、可能会丢弃连接,可能会出现延时。

- 测量"listen" queue的长度

netstat -Lan   (这个命令可能不对,但重要的是下面的结果)

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen Local Address
// *.
// *.
// *.

我们看端口80的listen queue,队列中目前有10个未接受的连接,这个队列的最大长度是128,也就是可以有128个连接在队列中。这是正常的结果。

如果出现的是下面的结果:

Current listen queue sizes (qlen/incqlen/maxqlen)
Listen Local Address
// *.
// *.
// *.

我们看到192超出了最大限制,这在网站繁忙时很容易看到。

我们需要做一些调整,允许更多的连接来排队。从2个层面来调整,一个是操作系统,一个是nginx自身。

首先是调整操作系统:

sysctl -w net.core.somaxconn=4096

这里的somaxconn指的是socket max connections,指的是监听套接字的最大连接数。

vim /etc/sysctl

net.core.somaxconn = 4096

然后是调整nginx:

server {
listen backlog ;
# The rest of server configuration
}

nginx学习之静态内容篇(五)的更多相关文章

  1. Nginx学习笔记之应用篇

    Nginx服务器的安装请参考Nginx学习笔记之安装篇 关于Nginx配置文档的API在这里就不一一列出,现在我们来配置第一个Nginx架构实现负载均衡的网站. 1.打开IIS,配置如下站点 重复上述 ...

  2. Nginx学习笔记之加强篇

    在上一篇文章Nginx学习笔记之应用篇中,我们已经可以正式运行自己的网站了.但是在使用Nginx服务器时还需要注意几个问题: 1.Nginx服务器上配置的单个站点的并发量不超过1024 2.Nginx ...

  3. Nginx 学习笔记之安装篇

    在windows下安装Nginx其实非常简单,只需如下几个步骤: 1. 在Nginx官网下载相应版本的安装程序,上面有最新版.稳定版等各种版本,正式运营的项目建议下载最新的稳定版 2.将下载后的压缩包 ...

  4. nginx学习之详细安装篇(二)

    1. 选择稳定版还是主线版 主线版:包含最新的功能和bug修复,但该版本可能会含有一些属于实验性的模块,同时可能会有新的bug,所以如果只是做测试使用,可以使用主线版. 稳定版:不包含最新的功能,但修 ...

  5. nginx学习之反向代理篇(六)

    在本节,你将学会: --如何根据不同的协议,将请求转发到后端服务器: --修改发送到后端服务器的请求头: --以及配置是否buffering从后端服务器返回来的响应. 1. 将请求转发给后端服务器 当 ...

  6. nginx学习之进程控制篇(三)

    1. 进程 nginx有一个master进程和一个或多个工作进程. master process worker process or master process worker process wor ...

  7. nginx学习之简化安装篇(一)

    环境:CentOS 6.5 1. 安装依赖环境 [root@localhost ~]# yum install pcre-devel zlib-devel openssl-devel -y 2. 安装 ...

  8. nginx 学习笔记(2) nginx新手入门

    这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作.前提是nginx已经被安装到你的服务器上.如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装.这篇手册主要内容:1. ...

  9. Nginx使用教程(五):使用Nginx缓存之缓存静态内容

    NGINX虽然已经对静态内容做过优化. 但在高流量网站的情况下,仍然可以使用open_file_cache进一步提高性能. NGINX缓存将最近使用的文件描述符和相关元数据(如修改时间,大小等)存储在 ...

随机推荐

  1. 转:大数据 2016 landscape

    如图:

  2. 《Qt on Android核心编程》相关资源

    有不少朋友反馈在搭建 Qt on Android 开发环境时遇到了问题,诸如 Android SDK 无法下载. jdk 找不到合适的版本号.创建 AVD 出错等等.为此我把与<Qt on An ...

  3. iOS8.0 使用Photos.framework对相册的常用操作

    转载自:http://blog.csdn.net/longitachi/article/details/50130957 1.判断相册访问权限 首先我们访问相册,肯定有需要判断是否有访问权限的时候,然 ...

  4. JVM源码分析之FinalReference完全解读

    Java对象引用体系除了强引用之外,出于对性能.可扩展性等方面考虑还特地实现了4种其他引用:SoftReference.WeakReference.PhantomReference.FinalRefe ...

  5. C中的C文件与h文件辨析

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:       1.预处理阶段 2.词法与语法分析阶段 .编译阶段,首先编译成纯 ...

  6. 【BIEE】02_新建资料库并创建简单分析

    一.新建资料库 1.开始→打开BI管理→点击新建资料库 2.文件→新建资料档案库 下一步 在下面的框中一次填入 连接类型:OCI 10g/11g(直接选择即可) 数据库名称:(DESCRIPTION ...

  7. 【Excle数据透视】如何隐藏数据透视表字段的分类汇总

    如下图:是显示数据透视表的分类汇总 那么我们现在想弄成以下这样,不显示分类汇总 如何操作呢? 步骤 单击数据透视表任意单元格→数据透视表工具→设计→分类汇总→不显示分类汇总 ***显示分类汇总*** ...

  8. 安装npm install时,长时间停留在某一处的解决方案

    默认情况npm install安装时,会从 github.com 上下载文件,大部分安装不成功的原因都源自这里 因为 GitHub Releases 里的文件都托管在 s3.amazonaws.com ...

  9. Nginx之红黑树

    /*  * Copyright (C) Igor Sysoev  * Copyright (C) Nginx, Inc.  */ #ifndef _NGX_RBTREE_H_INCLUDED_ #de ...

  10. 【Hadoop基础教程】3、Hadoop之伪分布式环境搭建(转)

    伪分布式模式即单节点集群模式,所有的守护进程都运行在同一台机器上.这种模式下增加了代码调试功能,可以查看内存.HDFS文件系统的输入/输出,以及与其他守护进程交互.以hadoop用户远程登录K-Mas ...