zoukankan      html  css  js  c++  java
  • nginx学习之静态内容篇(五)

    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:8000;
        ...
    }

    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错误。注意,如果你不明确指定404错误,那么nginx会返回500内部服务器错误的字样。

    返回指定的错误页面:

    error_page 404 /404.html;
    
    location = /404.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 65;
        ...
    }

    这个选项用于覆盖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         
    0/0/128        *.12345            
    10/0/128        *.80       
    0/0/128        *.8080

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

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

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

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

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

    首先是调整操作系统:

    sysctl -w net.core.somaxconn=4096

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

    vim /etc/sysctl

    net.core.somaxconn = 4096

    然后是调整nginx:

    server {
        listen 80 backlog 4096;
        # The rest of server configuration
    }
  • 相关阅读:
    101. Symmetric Tree(js)
    100. Same Tree(js)
    99. Recover Binary Search Tree(js)
    98. Validate Binary Search Tree(js)
    97. Interleaving String(js)
    96. Unique Binary Search Trees(js)
    95. Unique Binary Search Trees II(js)
    94. Binary Tree Inorder Traversal(js)
    93. Restore IP Addresses(js)
    92. Reverse Linked List II(js)
  • 原文地址:https://www.cnblogs.com/t-road/p/6738888.html
Copyright © 2011-2022 走看看