• Post author:
  • Post category:nginx
  • Post comments:0评论

1、expires

expires用于控制页面缓存时间。属于ngx_http_headers_module模块。

Syntax: expires [modified] time;
        expires epoch | max | off;
Default:    expires off;
Context:    http, server, location, if in location

示例:控制图片静态资源在客户端浏览器缓存10天

location ~* \.(png|gif)$ {  
        root /code/images;
        expires 10d;    
}

2、error_page

  error_page可以针对指定的错误,给用户返回定义的URI的内容,即内部重定向到定义的URI。属于ngx_http_core_module模块。

Syntax: error_page code ... [=[response]] uri;
Default:    —
Context:    http, server, location, if in location

例如:

error_page 404             /404.html;
error_page 500 502 503 504 /50x.html;

当用户请求的uri不存在时,本来应该返回404状态码,给用户显示404错误。配置以上配置后:
1、用户遇上404,返回404状态码,给用户显示/404.html的内容。
2、用户遇上500、502、503、504时,放回对应的状态码,给用户显示/50x.html的内容。

当然,如果不想给用户返回对应状态码,可以使用" = response " 语法将响应代码更改为另一个。例如:

error_page 404 =200 /404.html;

当用户遇上404,本来返回404状态码的,改为返回200状态码,同时给用户显示/404.html的内容。

  如果错误响应是由代理服务器或FastCGI / uwsgi / SCGI / gRPC 服务处理的,并且服务器可能返回不同的响应代码(例如200、302、401或404),则可以使用返回的代码进行响应。例如:

error_page 404 = /404.php;

我们还可以使用下面方式将错误处理传递到命名位置:

location / {
    error_page 404 403 401 = @error;
}

location @error {
    default_type text/html;
    return 200 '网站正在维护中。';
}

也可以对错误使用URL重定向进行处理。

error_page 403      http://www.baidu.com;
error_page 404 =301 http://www.baidu.com;

注意,在这种情况下,默认情况下,会将响应状态码302返回给客户端。同时只能将其更改为301、302、303、307和308中的一个。

3、try_files

Syntax: try_files file ... uri;
        try_files file ... @name;
        try_files file ... =code;
Default:    —
Context:    server, location

  try_files指令,用于路径匹配,nginx会按它指定顺序检查文件是否存在,并使用找到的第一个文件进行请求处理。属于ngx_http_core_module模块。
  文件的路径是根据root和alias指令从file参数中构造的完整的文件路径。可以通过在名称末尾指定斜杠(如"uri /")来检查目录是否存在。如果未找到任何文件,则进行内部重定向到最后一个参数中指定的uri。例如:

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

location = /images/default.gif {
    expires 30s;
}

最后一个参数也可以指向一个命名的位置或者代码,如下面的示例所示。

server {
    listen 80;
    server_name test.cp.com;
    root /test;

    location / {
        index index.html;
        try_files $uri $uri/ $uri.html /test.html =401;
    }
}

当我们去访问http://test.cp.com/1.html时。
1、会先匹配到$uri,nginx会检查test目录下有没有1.html文件,有就返回响应,没有匹配下一个。

2、匹配到$uri/时,会检查有没有1.html目录,有默认返回这个目录下的index.html文件,没有匹配下一个。

3、匹配到$uri.html,会检查站点目录下有没有1.html.html,有返回响应,没有匹配下一个。

4、匹配到/test.html,会检查站点目录下有没有test.html,有就返回响应,没有匹配下一个。

5、匹配到=401,会给用户返回401状态码。

4、valid_referers

  指定"Referer"请求标头字段值,匹配到定义的值,将会导致变量 $invalid_referer 变为一个空字符串。否则,变量将设置为"1"。搜索匹配不区分大小写。属于ngx_http_referer_module模块。

Syntax: valid_referers none | blocked | server_names | string ...;
Default:    —
Context:    server, location
后面参数可以是如下:
    • none:请求标头中没有"Referer"字段。
    • blocked:请求标头中有"Referer"字段,但其值已被防火墙或代理服务器删除,此类值是不以"http://" 或 "https://"开头。
    • server_names:"Referer"请求标头字段包含服务器名称(即nginx配置文件中定义的虚拟主机名称)之一。
    • arbitrary string:定义服务器名称和可选的URI前缀。服务器名称的开头或结尾可以带有"*"。在检查过程中,"Referer"字段中的服务器端口将被忽略。
    • regular expression:第一个符号应为"~"。应注意,表达式将与"http://" 或 "https://"之后的文本进行匹配。
注:"Referer"请求标头字段值记录的是从哪个页面链接访问过来的。

示例:

valid_referers none blocked server_names
               *.example.com example.* www.example.org/galleries/
               ~\.google\.;

if ($invalid_referer) {
    return 403;
}

  以上示例意思是当请求标头匹配到valid_referers定义的以上情况,则将变量 $invalid_referer 变为一个空字符串,接下来if判断$invalid_referer值是否为空,空则返回false,即if语句不执行;如果不符合以上定义情况, 则变量将设置为"1",if语句成立,执行返回403状态码。

5、root和alias的区别

  root与alias路径匹配主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上,alias是一个目录别名的定义,root则是最上层目录的定义。

root的处理结果是:root路径+用户URI请求。

server {
    listen 80;
    server_name root.cp.com;

    location /download {
        root /code;
    }
}

// 使用root时,当我请求 http://root.cp.com/download/1.jpg 时,实际上是去找服务器上 /code/download/1.jpg 文件

alias的处理结果是:使用alias定义的路径。

server {
    listen 80;
    server_name root.cp.com;

    location /download {
        alias /code;
    }
}

// 使用alias时,当我请求 http://root.cp.com/download/1.jpg 时,实际上是去找服务器上 /code/1.jpg 文件

示例:

server {
    listen 80;
    server_name image.driverzeng.com;

    location / {
        root /code;
    }

    location ~* ^.*\.(png|jpg|gif)$ {
        alias /code/images/;
    }
}

//注意:可能有些变量不适用,即
URL: http://linux.root.com/download/1.jpg
URI: /download/1.jpg
$request_filename: /code/download/1.jpg
$request_uri: /download/1.jpg

6、流量限制参数

limit_rate和limit_rate_after可以限制传输速率,属于ngx_http_core_module。

限制向客户端传输数据的速率,该速率以每秒字节数指定,零值禁用速率限制。

Syntax: limit_rate rate;
Default:    limit_rate 0;
Context:    http, server, location, if in location

注意:该限制是根据请求设置的,因此,如果客户端同时打开两个连接,则总速率将是指定速率的两倍。
     该参数值可包含在$limit_rate变量中。

设置初始值,传输达到这个值之后再对客户端传输数据的速率进行限制

Syntax: limit_rate_after size;
Default:    limit_rate_after 0;
Context:    http, server, location, if in location

示例:当向客户端传输的数据达到了500k,则将传输速率限制在50k每秒。

location /flv/ {
...
    limit_rate_after 500k;
    limit_rate       50k;
...
}

7、配置CPU亲和性

  CPU亲和性(affinity)可以将一个进程或者线程绑定到一个或一组CPU上运行,可以避免进程在CPU之间频繁迁移,提高了缓存命中率。

[root@web1 ~]# vim /etc/nginx/nginx.conf 
...
worker_processes  auto;
worker_cpu_affinity auto;
...

或者
...
worker_processes  4; 
worker_cpu_affinity 0001 0010 0100 1000;
...

配置后:

[root@web02 ~]# ps -eo pid,args,psr | grep [n]ginx
  6011 nginx: master process /usr/   1
  7012 nginx: worker process         0
  7013 nginx: worker process         1
  7014 nginx: worker process         2
  7015 nginx: worker process         3

发表评论

验证码: 4 + 2 =