美文网首页nginx
Nginx配置入门(二):Nginx服务的基本配置

Nginx配置入门(二):Nginx服务的基本配置

作者: StephenCoder | 来源:发表于2019-11-06 18:51 被阅读0次

    Nginx服务的基本配置

    Nginx在运行时,至少必须加载一个事件类模块和几个核心类模块。这些模块运行时所支持的配置项成为基本配置。所谓基本配置,就是其他模块执行时都依赖的配置项。
    配置项种类繁多,按照用户使用时的预期功能分为以下4类:

    • 用于调试、定位问题的配置项。
    • 正常运行的必备配置项。
    • 优化性能的配置项。
    • 事件类配置项。

    1 用于调试进程和定位问题的配置项

    (1) 是否以守护进程方式运行Nginx
    语法 :daemon on | off;
    默认 :daemon on;
    守护进程是脱离终端并在在后台运行的进程。脱离终端是为了避免进程执行过程中的信息在任何终端显示,这样也保证进程不会被任何终端产生的信息所打断。Nginx毫无疑问是一个需要以守护进程方式运行的服务,因此,默认是打开的。

    (2) 是否以master/worker方式工作
    语法 :master_process on | off;
    默认 :master_process on;
    Nginx是以一个master进程管理多个worker进程的方式运行的,几乎所有的产品环境下,都以这种方式进行工作。关闭仅仅是为了方便调试。

    (3) error日志的设置
    语法 :error_log /path/file level;
    默认 :error_log logs/error.log error;
    我们可以根据自己的需求来配置error日志的路径和级别,/path/file参数是一个具体文件,默认情况下是logs/error.log,最好将其放在一个空间比较大的位置;/path/file如果是/dev/null,这样就不会输出任何日志了;/path/file也可以是stderr,这样日志就会输出到标准错误文件中。
    level是日志输出级别,取值范围是debug、info、notice、warn、error、crit、alert、emerg,从左至右级别依次增大。当设定一个级别时,大于等于该级别的日志都会被输入到/path/file中。

    如果日志级别设定成debug,必须在configure时加入 --with-debug配置项。

    (4) 是否处理几个特殊的测试点
    语法 :debug_points [stop | abort];
    Nginx在一些关键的错误逻辑中设置了调试点。如果设置了debug_points 为stop,那么Nginx代码执行到这些调试点时就会发出SIGSTOP信号以用于调试;如果debug_points 设置为abort,则会产生一个coredump文件,可以使用gdb来查看Nginx当时的各种信息。
    通常不会使用这个配置

    (5) 仅对指定的客户端输出debug级别的日志
    语法 :debug_connection [IP| CIDR];
    这个配置项属于事件类配置,必须放在events块中才有效。举例:

    events {
          debug_connection 10.224.66.14;
          debug_connection 10.224.57.0/24;
    }
    

    这样,仅仅是来自以上IP地址的请求才会输出debug级别的日志,其他请求仍然沿用error_log中配置的日志级别。

    (6) 限制coredump核心转储文件的大小
    语法 :worker_rlimit_core size;
    在Linux系统中,当进程发生错误或收到信号而终止时,系统会将进程执行时的内存内容(核心镜像)写入一个文件(core文件),以作调试之用,这就是所谓的核心转储。
    当Nginx进程出现一些非法操作导致进程直接被操作系统强制结束时,会生成核心转储文件,可以从core文件获取当前的堆栈、寄存器等信息,从而帮助我们解决问题。
    但是这种文件比较大,随便发生几次就会将硬盘占满。

    (7) 指定coredump文件生成目录
    语法 :working_directory path;

    2 正常运行的配置项

    (1) 定义环境变量
    语法 :env VAR; env VAR=VALUE;

    (2) 嵌入其他配置文件
    语法 :include /path/file;
    include配置项可以将其他配置文件嵌入到当前的nginx.conf文件中,它的参数可以是相对路径也可以是绝对路径,例如:

    include mime.types;
    include vhost/*.conf;
    

    (3) pid文件路径
    语法 :pid path/file;
    默认 :pid logs/nginx.pid;
    保存master进程id的pid文件存放路径,该文件直接影响Nginx是否可以运行。

    (4) Nginx worker 进程运行的用户及用户组
    语法 :user username [groupname];
    默认 :user nobody nobody;
    user用于设置master进程启动后,fork出的worker进程运行在哪个用户和用户组下。若用户在configure命令执行时使用了参数--user=username和--group=groupname,此时nginx.conf将使用参数中指定的用户和用户组。

    (5) 指定Nginx worker进程可以打开的最大句柄描述符个数
    语法 :worker_rlimit_nofile limit;

    (6) 限制信号队列
    语法 :worker_rlimit_sigpending limit;
    设置每个用户发送Nginx的信号队列的大小。当某个用户的信号队列满了,这个用户再发送的信号量会被丢掉。

    3 优化性能的配置项

    (1) Nginx worker进程个数
    语法 :work_processes number;
    默认 :work_processes 1;
    work进程的数量会直接影响性能。每个worker都是单线程的进程,它们会调用各个模块以实现多种多样的功能。如果这些模块确认不会出现阻塞式调用,那么,有多少个CPU内核就应该配置多少个worker进程;反之,如果有可能出现阻塞式调用,那么需要配置稍多一些的worker进程。
    多worker进程可以充分利用多核系统结构,但若worker进程的数量多于CPU内核,那么会增大进程间切换带来的消耗。一般情况下,用户要配置与CPU内核数相等的worker进程,并且配合worker_cpu_affinity配置来绑定CPU内核。

    (2) 绑定Nginx worker进程到指定CPU内核
    语法 :worker_cpu_affinity cpumask [cpumask...];
    4核CPU配置举例:

    worker_processes 4;
    worker_cpu_affinity 1000 0100 0010 0001; 
    

    worker_cpu_affinity 配置仅对Linux操作系统有效

    (3) SSL硬件加速
    语法 :ssl_engine device;

    (4) 系统调用gettimeofday的执行频率
    语法 :time_resolution t;
    早期内核中,每次内核的事件调用返回时,都会执行一次gettimeofday,实现用内核时钟来更新Nginx中的缓存时钟。而执行gettimeofday有一次内核态到用户态的内存复制,是有代价的。使用time_resolution 100ms 表示至少100ms才调用一次gettimeofday。
    而在目前的大多数内核中,gettimeofday只是一次vsyscall,仅仅对共享内存中的数据做访问,并不是通常的系统调用,代价并不大,一般不需要此配置。

    (5) Nginx worker进程优先级配置
    语法 :worker_priority nice;
    默认 :worker_priority 0;
    在Linux操作系统中,当许多进程都处于可执行状态时,将按照所有进程的优先级来决定内次内核选择哪一个进行执行。进程所分配的CPU时间片大小也与进程优先级相关。优先级高的进程会占有更多的系统资源。
    nice值的取值范围是[-20,+19],如果希望Nginx占有更多的系统资源,那么可以把nice值设置得小一点,但不建议比内核进程的nice值还要小。

    4 事件类配置项

    (1) 是否打开accept锁
    语法 :accept_mutex [on | off];
    默认 :accept_mutex on ;
    accept_mutex 是Nginx的负载均衡锁。这把锁可以让多个worker进程轮流地、序列化地与新客户端建立TCP连接。默认是打开的,如果关闭它,那么建立TCP连接的耗时会更短,但worker进程之间的负载会非常不均衡,因此不建议关闭。

    (2) lock文件的路径
    语法 :lock_file path/file;
    默认 :lock_file logs/nginx.lock;
    accept锁可能需要这个lock文件。如果accept锁关闭,lock_file配置完全不生效。如果打开了accept锁,并且由于编译程序、操作系统架构等因素导致Nginx不支持原子锁,这是才会用文件锁实现accept锁,这样lock_file指定的lock文件才会生效。

    (3) 使用accept锁后到真正建立连接之间的延迟时间
    语法 :accept_mutex_delay Nms;
    默认 :accept_mutex_delay 500ms;
    accept锁打开后,同一时间只能有一个worker进程获取到accept锁。这个锁不是阻塞锁,如果取不到会立刻返回。如果一个worker进程试图取accept锁而没有取到,它至少等待accept_mutex_delay定义的时间后才能再次试图取锁。

    (4) 批量建立新连接
    语法 :multi_accept [on | off];
    默认 :multi_accept off;

    (5) 选择事件模型
    语法 :use [kqueue | rtsig | epoll | /dev/poll | select | poll | eventport];
    默认 :Nginx会自动使用最适合的事件模型

    (6) 每个worker的最大连接数
    语法 :work_connections number;
    定义每个worker进程可以同时处理的最大连接数。

    相关文章

      网友评论

        本文标题:Nginx配置入门(二):Nginx服务的基本配置

        本文链接:https://www.haomeiwen.com/subject/javubctx.html