nginx系列-02-常用配置和优化选项

[TOC]

本文章是查找多方资料(马哥教育、极客学院等)整合而来。
在此处先感谢下 马哥教育 http://www.magedu.com/

1 nginx配置文件结构

默认情况下,nginx的配置文件位置为:/etc/nginx/目录
其中的nginx.conf为主配置文件

这篇文章先来看看主配置文件nginx.conf的配置

nginx.conf中的配置大概可以分为main、server、location这几个作用域或者叫“段”。
所以,可以将这配置文件nginx.conf的内容分为main段、server段和location段。

  • main段的配置一般来讲在main、server、location中都有效
  • server段的配置一般来讲在server和location中生效
  • location段的配置一般来讲只在location段中生效
......
events{
    ......
}
http{
    ......
    server{
        ......
    }
    server{
        ......
    }
    ......
}

2 http段常用指令

# 包含了同一目录下的mime.types文件内容,MIME类型映射相关配置
include       mime.types;
# 默认的MIME类型
default_type  application/octet-stream;

#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                  '$status $body_bytes_sent "$http_referer" '
#                  '"$http_user_agent" "$http_x_forwarded_for"';

# 访问日志
#access_log  logs/access.log  main;
# 错误日志
#error_log logs/error.log crit;

# 内核复制模式,启用可达到最大IO效率
sendfile        on;
#tcp_nopush     on;

# 和HTTP/1.1长连接相对应的配置
#keepalive_timeout  0;
keepalive_timeout  65;



# 内容压缩相关配置
# 内容压缩,可提高网络IO效率
gzip  on;
# 内容长度大于gizp_min_length才启用压缩
gzip_min_length 1000;
# 压缩级别1~9,级别越高,压缩率越高,同时系统开销越大。
gzip_comp_level 4;
# 可用于压缩的MIME类型
gzip_types text/plain text/xml text/css application/json application/x-javascript;   



# 静态文件缓存的相关配置
# 最大缓存数量
open_file_cache max=655350 inactive=20s;
# 验证缓存有效期时间间隔
open_file_cache_valid 30s;
# 有效期内文件最少使用次数
open_file_cache_min_uses 2;

3 location段

一般情况下一个请求到达后对其对应的url,nginx会将它解析到某一个location来处理。这个解析的过程实际上根据location的配置基本可以分为字符串匹配和正则表达式匹配这2种。

3.1 一般语法

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
  • =:精确匹配
  • ~:正则匹配,区分大小写
  • ~*:正则匹配,不区分大小写
  • ^~:关闭正则查找功能

可以大致分为两类,普通匹配和正则匹配。

3.2 匹配过程

  • (1) 精确匹配

  • (2) ^~

  • (3) ~ 或 ~*

  • (4) 不带任何符号的URL

注意

  • 当两个location的优先级一样,以最长前缀为准
  • 当优先级一样,最长前缀一样,以定义顺序为准

4 nginx.conf常用优化选项

4.1 配置示例


# 用户
#user  nobody;

# worker进程数
# 通常应该小于等于CPU核心的数目
worker_processes  1;

# 错误日志路径
# 错误日志级别可以为:debug|info|notice|warn|error|crit
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# pid文件路径
# 默认为/var/run/nginx/nginx.pid
#pid        logs/nginx.pid;

# 每进程最大可用文件描述符数,文件描述符用完会拒绝新的连接产生502类错误
worker_rlimit_nofile 655350;

# 事件模型相关的配置

events {

    # 每进程最大的同时连接数
    # 服务器最大连接数 maxConnections = worker_connections * worker_processes

    # 当今浏览器一般会同时打开两个连接到服务器,
    # 所以,做静态服务器时,最大客户端数 maxClient = maxConnections / 2

    # 做反向代理时 maxClient =  maxConnections / 4
    worker_connections  1024;

    # 指定网络模型 epoll或者kquene
    # Linux推荐采用epoll,FreeBSD推荐采用kquene
    use epoll;
}


# http相关配置

http {

    # 包含了同一目录下的mime.types文件内容,MIME类型映射相关配置
    include       mime.types;
    # 默认的MIME类型
    default_type  application/octet-stream;

    # 该项一般由HTML代码中的meta来设置
    #charset utf-8;


    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffer_size 4 32k;
    # 客户端能够提交的最大数据大小
    client_max_body_size 32m;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    # 访问日志
    #access_log  logs/access.log  main;
    # 错误日志
    #error_log logs/error.log crit;

    # 内核复制模式,启用可达到最大IO效率
    sendfile        on;
    #tcp_nopush     on;

    # 和HTTP/1.1长连接相对应的配置
    #keepalive_timeout  0;
    keepalive_timeout  65;



    # 内容压缩相关配置
    # 内容压缩,可提高网络IO效率
    gzip  on;
    # 内容长度大于gizp_min_length才启用压缩
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    # 压缩级别1~9,级别越高,压缩率越高,同时系统开销越大。
    gzip_comp_level 4;
    # 可用于压缩的MIME类型
    gzip_types text/plain text/xml text/css application/json application/x-javascript;
    # gzip_vary on;  



    # 静态文件缓存的相关配置
    # 最大缓存数量
    open_file_cache max=655350 inactive=20s;
    # 验证缓存有效期时间间隔
    open_file_cache_valid 30s;
    # 有效期内文件最少使用次数
    open_file_cache_min_uses 2;
    




    # server表示一个虚拟主机,可以配置多个虚拟主机
    server {
        # 监听的端口
        listen       80;
        # 匹配的域名
        server_name  localhost;

        # 字符集设置
        #charset utf-8;

        # 访问日志文件路径
        #access_log  logs/host.access.log  main;

        location / {
            # 根目录
            root   html;
            # 默认主页
            index  index.html index.htm;
            expires 2h;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

}

4.2 常见选项说明

  • tcp_nodelay on|off
在keepalive模式下时,多个小报文合并为一个报文发送,提供带宽利用率。
一般为off。
  • sendfile on|off
这个和内核空间与用户空间,以及nginx的工作原理相关,还牵扯到操作系统。一两句话说不清。
  • tcp_nopush on|off
在sendfile 为on的时候才生效。表示是否启用tcp_nopush(freeBSD)或tcp_cork(linux)。
一般为off。
  • aio on | off
是否启用异步IO
  • directio off | size
是否启用直接IO,不在内存中缓存。
  • open_file_cache
open_file_cache off;
    max=number
        超过max设置的值时,会采用一定的算法(比如LRU)淘汰缓存。
    inactive=time
        在指定的时长time内没有被访问过的缓存条目被视为无效缓存条目,
        淘汰策略对于此类缓存条目直接删除

该指令可以影响以下属性:
    缓存的文件信息:
        文件描述符,文件大小,文件最近一次修改时间
    缓存的目录信息:
        打开的目录结构
    缓存的以前操作失败的文件:
        文件不存在
        没权限操作的文件等

  • open_file_cache_errors on | off
表示是否缓存访问出错的文件的相关信息,比如文件不存在、文件操作权限不足等
  • open_file_cache_valid time
每隔多久检测缓存条目的有效性
open_file_cache_valid 60s;
  • open_file_cache_min_uses count
open_file_cache_min_uses 1;
  • alias
只能用于location段。注意和root指令的区别:
location /test1/ {
    # root可以出现于location、server段
    root /web/resources/;
}

location /test2/ {
    # alias只能出现于location段
    alias /web/resources/;
}

对于以上配置:

http://xxx.com/test1/1.html
    ===> /web/resources/test1/1.html文件
http://xxx.com/test2/1.html
    ===> /web/resources/1.html文件
  • error_page err_code... [=respCode] path/to/page
error_page 404 /404.html;

# 将404的返回码改成200回送给客户端
error_page 404 =200 /404.html;

  • try_files

指定一系列资源路径(n个),当某个资源访问不到时,依次尝试该系列资源路径(1到n-1),最后一个往往是一个URL,当前面n-1个资源都找不到时将跳转至该URL。
并且,为了避免循环重定向等异常情况,最后一个URL应该是可靠的。

location =/favicon.icon {
    # 当favicon.icon找不到时会依次尝试f.ico,f1.ico,f2.ico
    try_files /f.ico /f1.ico /f2.ico;
}
# 最后一个URL应该确保它是可靠的(但不是必须的V_V)
location =/f2.ico {
    # ......
    # expire 30s;
}
  • keepalive_timeout time
time为0表示禁用keepalive功能

keepalive_timeout 20s;
  • keepalive_requests count
在持久连接上所允许请求的最大资源数量
keepalive_requests 100;
  • keepalive_disable none | browser1 browser2...
禁止特定类型浏览器的浏览器的keepalive功能。
  • send_timeout time
回送响应报文的超时时长
send_timeout 60s;
  • client_body_buffer_size size
# 客户端请求报文body的最大缓存大小,超出此值,将存储到磁盘
client_body_buffer_size 16k;
  • client_body_temp_path path [l1 [l2 [l3]]]
客户端请求body超出client_body_buffer_size(比如文件上传),
将存储到该值指定的磁盘位置

# 16进制字符命名的目录,数字表示目录名里面十六进制字符的个数
client_body_temp_path /tmp/nginx/client_body 1 2 3;
# 表示16个一级目录
# 每个一级目录下有16^2个二级目录
# 每个二级目录下有16^3个三级目录
  • limit_except httpMethod {...}
对指定范围之外的请求方法进行额外限制

# GET 方法只允许127.0.0.1访问
limit except GET {
    allow 127.0.0.1;
    deny all;
}
  • limit_rate speed
限制客户端每秒钟所能传输的字节数
0表示无限制

limit_rate 256k;

你可能感兴趣的:(nginx系列-02-常用配置和优化选项)