1.5 NGINX-基础配置优化详解

1.5 基础配置详解+优化

“nginx.conf”是NGINX的主配置文件,我们可以通过配置NGINX,从而实现NGINX的各种强大的功能。
“nginx.conf”的配置内容主要由三大部分组成:基础配置部分、事件配置部分、核心配置部分。

[root@localhost ~]# vim /etc/nginx/nginx.conf
#############
#==基础配置==#
#############
#env NGINX_VERSION=1.12.2
#设置可在NGINX配置文件中使用的变量,而非在系统环境中配置。
#daemon on;
#设置NGINX服务运行是否以守护进程方式后台运行。"on" or "off","on"表示启用则NGINX后台运行,"off"表示禁用,则NGINX前台运行,默认开启,关闭只适用于开发过程中。
user nginx;
#设置运行用户,当运行NGINX时,进程所使用的用户,则进程拥有该用户对文件或目录的操作权限。
worker_processes 4;
#设置工作进程数量,一般情况下工作进程数等于CPU核心数。
worker_cpu_affinity 0001 0010 0100 1000;
#设置工作进程绑定CPU核心,一个工作进程使用一个CPU核心,可以减少进程频繁切换导致CPU处理所导致的资源损耗。"0001"四位数表示CPU有四个核心,"1"在第几位表示使用第几个核心。
worker_rlimit_nofile 102400;
#设置每个工作进程可同时打开的文件描述符数量。在Linux系统中默认情况下为"1024",我们可以通过"ulimit -a |grep 'open files'"命令查看,设置此值可突破并发文件数量限制。
error_log /var/log/nginx/error.log error;
#设置错误日志文件路径,可设置错误日志记录的级别。
#错误日志级别有:
#   debug    调试,将记录详细的大量调试信息,适合开发人员开启
#   info     信息,记录更多的通知信息,不重要的
#   notice   通知,记录通知信息,不重要的
#   warn     警告,记录警告信息
#   error    错误,记录错误信息
#   crit     严重,只记录非常严重的错误信息
pid /run/nginx.pid;
#设置进程文件路径,运行NGINX会生成一个PID进程文件到指定路径,用于保证进程持久化运行。
#load_module /usr/lib64/nginx/modules/ngx_stream_module.so;
#加载动态模块。
include /usr/share/nginx/modules/*.conf;
#设置包含的其他配置文件,一些加载NGINX动态模块相关配置文件,由"load_moule"指令控制动态模块的加载。

#thread_pool default threads=32 max_queue=65536;
#设置线程池,"threads"参数定义池中的线程数量,"default"表示线程池的名字,"max_queue"参数定义队列长度,即队列中请求等待的数量,当请求等待数量超出指定值时,会返回错误,该配置只是设置线程池,我们还需要由"aio threads=default"指令调用它才会生效。#什么是线程池?一般情况下主机有几核处理器在启动NGINX时就会创建几个Worker工作进程,进程创建线程处理每一个请求,当在CPU密集型计算、资源访问的环境下,很多请求都会开启对应的线程,可能会由于磁盘IO限制导致的线程处理请求时间变长,这不是我们期望看到的,我们就可以启用线程池功能,让请求排队等待处理,并且可以充分利用CPU提高处理效率。开启线程池需要AIO的支持。线程池一般用于大文件传输的场景下,对于我们常发布的轻量型WEB应用无需使用。

#############
#==事件配置==#
#############
events {
   #use epoll;
   #设置要使用的连接处理方法,设置为"epoll"表示使用高效事件处理模型,一般情况下我们不需要设置它,因为NGINX默认会使用最有效的方法。
   worker_connections 102400;
   #设置每个Worker进程可处理的并发连接数量,可根据需求合理配置此值。建议与"worker_rlimit_nofile"指令的值一致或更小。
   #accept_mutex off;
   #设置工作进程工作模式,"on" or "off","on"表示启用,则所有的工作进程依次接受新的连接,串行工作模式。"off"表示禁用,则当有连接时,所有工作进程都会被唤醒,并行工作模式,如果新的连接数量很少,则某些工作进程可能只是浪费系统资源。默认情况下此项就是禁用的,所以我们也无需配置。
   #multi_accept off;
   #设置工作进程接受连接的方式,"on" or "off","on"表示工作进程一次接受多个新的连接,"off"表示工作进程一次只接受一个新的连接。我们设置为"off"则表示当有多个新的连接时多个工作进程同时工作效率更高。默认情况下此项就是禁用的,所以我们也无需配置。
   #debug_connection 127.0.0.1;
   #设置调试连接地址,用于为选定的客户端连接启用调试日志。则其他连接则将使用"error_log"指令设置的日志级别。
   #worker_aio_requests 32;
   #设置单个工作进程未完成的AIO操作的最大数量。
}

#############
#==核心配置==#
#############
http {
    include             /etc/nginx/mime.types;
   #设置还包含其他配置文件,“mime.types”文件,记录MIME类型与文件后缀的映射关系,MIME类型是互联网媒体类型的缩写。所以该文件是用于WEB服务可以识别的、允许用户上传的这些后缀相关的媒体文件。
    default_type        text/plain;
    #设置默认MIME类型,当用户上传一个文件,非“mime.types”文件中记录的后缀文件时的处理方式,则将该文件识别默认指定MIME类型的文件,"text/plain"表示将会保存为".txt"格式的文件。
    types_hash_max_size 2048;
    #设置类型哈希表的大小,单位为字节。用于将MIME类型的数据通过哈希后缓存到内存中,以提高对MIME类型映射表的读取效率。
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    #定义日志格式,“main”表示该日志格式名,用于下方“access_log”访问日志中调用
    #   $remote_addr            远程访问地址
    #   $remote_user            远程访问用户
    #   $time_local             访问时间
    #   $request                请求的URL与HTTP协议
    #   $status                 请求状态,成功为200
    #   $body_bytes_sent        发送给客户端文件主机内容大小
    #   $http_referer           从哪个页面连接访问过来的
    #   $http_user_agent        客户端浏览器的相关信息
    #   $http_x_forwarded_for   远程访问地址,与remote_addr相同
    access_log  /var/log/nginx/access.log  main;
    #设置访问日志文件路径,用于记录每个访问请求,“main”调用上面日志格式

    #aio off;
    #启用或禁用异步非阻塞性IO传输模式,"on" or "off","on"表示启用,"off"表示禁用。当请求时,线程需要通过内存去硬盘中获取数据的处理方式,线程无需等待内存完全的从硬盘中得到完整的数据,而是去做其他的事情了,等待内存获取完成,再分配一个新的线程去处理,然后将响应数据返回给用户,采用这种方式可以提高处理效率,一般用于大文件传输,对于小型的WEB应用,建议采用开启"Sendfile",当使用AIO功能时,有必要开启"directio"指令,用于设置AIO读取文件的大小,若不设置则将不允许文件传输。
    #directio off;
    #设置AIO读取的文件大小,单位为字节,"off"表示禁用,当AIO和Sendfile同时开启时,当传输文件大于等于此项设置的值时则采用AIO方式传输,否则采用Sendfile方式传输,一般用于大文件传输。
    sendfile            on;
    #启用或禁用"sendfile()"函数的调用,"on" or "off","on"表示启用,"off"表示禁用。当线程响应时,"sendfile()"函数会报告线程数据不在内存中而是在硬盘中,则线程直接去硬盘拿到响应数据直接传送给用户,而无需调用内存去硬盘拿响应数据,省去了调用内存的步骤,在小型WEB项目中可以提高请求响应效率,若是重量级WEB项目,为了平衡磁盘IO则不建议开启。我们也可以将此指令称之为高效传输模式。
    tcp_nopush          on;
    #启用或禁用TCP_NOPUSH套接字选项,"on" or "off","on"表示启用,启用此项的前提是必须开启"sendfile","off"表示禁用。有时候在传输一个响应数据时,可能会产生多个小块数据包传出,可能这个小块数据包头部大小为30字节,而真正数据信息只有1字节,在高并发环境下会导致网络拥塞、带宽不够用问题。开启此项则传出的数据包会积累一下在传出,可以防止网络拥塞,减少带宽的占用。
    tcp_nodelay         on;
    #启用或禁用TCP_NODELAY套接字选项,"on" or "off","on"表示启用,"off"表示禁用。此项与"tcp_nopush"的功能刚好相反,若开启此项则对于小块数据包不等待立即传输,有时候一个WEB应用期望发送小块数据时,则建议开启,当“tcp_nopush”和“tcp_nodelay”同时开启时,NGINX会平衡这两个功能的使用。
    keepalive_timeout   75s;
    #设置保持客户端连接活跃状态的超时时间,单位为秒。
    send_timeout 60s;
    #设置服务器将响应发送给客户端的超时时间,单位为秒。

    client_body_buffer_size 16k
    #设置读取客户端请求正文的缓冲区大小,如果请求主体大于缓冲区,则整个主体或仅其部分会被写入临时文件中。默认情况下,缓冲区大小等于两个内存页大小,在32位系统中建议大小为8k,在64位系统中建议大小为16k。
    client_body_temp_path /var/lib/nginx/tmp/client_body 1 2;
    #设置客户端主体临时文件存放目录路径,"1"表示使用1个字符命名一级目录,"2"表示使用2个字符命令二级目录,则临时文件存放在二级目录下。
    client_body_timeout 60s;
    #设置读取客户端请求正文的超时时间,单位为秒,这个超时时间取决于两个连续读取操作之间的时间段,而不是整个请求主体的传输,也就是说这个读了第一个请求,在读第二个请求时的超时时间,如果客户端在此期间未传输任何内容,则会返回408(请求超时)错误返回给客户端。
    client_header_buffer_size 1k;
    #设置缓冲区大小用于读取客户端请求的头部信息,对于大多数请求1k字节的缓冲区就足够了,但是如果请求包含较长的Cookie,则可能不适合1k,则分配由"large_client_header_buffers"指令配置缓冲区。
    large_client_header_buffers 4 8k;
    #设置用于读取客户端请求信息所使用的最大缓冲区大小,若请求头字段超过一个缓冲区大小,则会返回400(错误请求)错误。"4"表示缓冲区的个数,"8k"表示缓冲区的大小。
    client_header_timeout 60s;
    #设置读取客户端请求头部信息的超时时间,单位为秒。如果客户端在此时间内未传输整个标头,则会返回408(请求超时)错误返回给客户端。
    client_max_body_size 10m;
    #设置客户端请求主体的最大大小。此值控制用户上传文件大小,若请求中的大小超过此值,则会返回413(请求主体太大)错误返回给客户端,若设置为"0"则表示不限制。

    open_file_cache max=102400 inactive=20s;
    #设置打开文件描述符缓存,"max"参数定义缓存的最大文件描述符数量,与“worker_rlimit_nofile”配置项的值保持一致即可,当超出时此值时自动清理最近使用少的缓存元数据;"inactive"参数定义缓存失效时间,单位为秒,当在缓存数据没有被请求时则会进入失效时间,超出失效时间则缓存会被删除。
    open_file_cache_valid 30s;
    #设置检测有效的文件描述符缓存的时间间隔,也就是每隔多少秒就检测一次缓存状态,若缓存未被访问则就进入缓存失效时间,单位为秒。
    open_file_cache_min_use 2;
    #设置在缓存失效时间内用户可打开的文件数量。
    open_file_cache_errors on;
    #设置启用和禁用查找错误的打开文件描述符缓存,"on" or "off","on"表示启用,"off"表示禁用,若启用则NGINX会自动查找错误的打开文件描述符缓存条目,将其删除,所以开启它是必要的。
    
    gzip on;
    #启用传输压缩功能,采用GZIP方式对响应数据进行压缩传输,可提高传输效率。
    gzip_min_length 1k;
    #设置压缩文件最小长度,只压缩大于1KB的请求响应数据。
    gzip_comp_level 4;
    #设置压缩级别,0~9,选择折中为4,压缩级别越高则越消耗的CPU资源。
    gzip_buffers 4 16k;
    #设置用于压缩响应的缓冲区的数据和大小,"16k"表示缓冲区大小,"4"表示个数,此值可根据具体应用项目调整缓冲区使用的大小。
    gzip_http_version 1.1;
    #设置压缩的HTTP版本,目前大部分浏览器都支持GZIP解压。
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    #设置要压缩的数据类型,默认情况下“text/html”就算不指定也会被压缩。
    gzip_vary on;
    #开启vary_header支持,此选项可以缓存服务器经过压缩的页面。

    #connection_pool_size 512;
    #设置每个连接的内存分配大小,单位为字节。该指令对性能影响最小,通常不应使用。默认情况下,在32位系统中建议设置为256字节,在64位系统中建议设置为512字节。
    include /etc/nginx/conf.d/*.conf;
    #设置还包含其他配置文件,我们可以将一些其他配置分离到另外一个文件中处理,避免主配置文件因为配置太多导致混乱不方便管理,比如下面的"server {}",在NGINX中我们可以配置多个"server {}"则我们可以将每个"server {}"分离到另外一个配置文件中,即一个配置文件对应一个WEB站点。

################
#==WEB站点配置==#
################
    server {
        listen       80 default_server;
        #设置监听IPV4的地址与端口,地址为空表示监听所有,“default_server”即默认服务器,DNS映射一个域名到该主机,但是当用户访问的这个域名与这些WEB虚拟主机绑定的域名都不匹配的情况下,默认由监听“default_server”的虚拟主机呈现内容。
        listen       [::]:80 default_server;
        #设置监听IPV6的地址与端口。
        server_name  _;
        #设置域名绑定,绑定一个域名。
        root         /usr/share/nginx/html;
        #设置WEB应用根目录。
        location / {
        #设置访问位置(URI),即用户访问的URL的尾部部分。当匹配到请求的URI时,则呈现由"{ }"中定义的内容。location指令针对于匹配URI可以嵌入正则表达式,实现一些高级应用,详细用法请参考《HTTP配置高级指令》。
              index index.html;
        #设置默认首页文件,当用户访问域名或IP地址是自动索引呈现该文件中的内容,该文件在若为相对路径则会在WEB应用根目录下。
        }
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
              expires 30d;
             #设置浏览器缓存响应数据的时间。
       }
       #设置对于常见格式的图片、Flash文件在浏览器本地缓存30天。
       location ~ .*\.(js|css)?$ {
            expires 1h;
        }
       #设置对于js,css文件在浏览器本地缓存1个小时。
        error_page 404 /404.html;
        #当匹配到响应代码,则将请求重定向到指定的URI。
              location = /40x.html {
        #匹配上面重定向的URI,则呈现相关响应代码的会呈现给用户的内容。若"{}"为空则返回默认页面。
        }
        error_page 500 502 503 504 /50x.html;
              location = /50x.html {
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/network-ren/p/9510479.html
1.5