• nginx配置项概括说明


    1、重要配置项

    以下是一个完整的nginx配置信息。

    1.  
      #================================以下是全局配置项
    2.  
      #指定运行nginx的用户和用户组,默认情况下该选项关闭(关闭的情况就是nobody)
    3.  
      #user nobody nobody;
    4.  
      #运行nginx的进程数量,后文详细讲解
    5.  
      worker_processes 1;
    6.  
      #nginx运行错误的日志存放位置。当然您还可以指定错误级别
    7.  
      #error_log logs/error.log;
    8.  
      #error_log logs/error.log notice;
    9.  
      #error_log logs/error.log info;
    10.  
      #指定主进程id文件的存放位置,虽然worker_processes != 1的情况下,会有很多进程,管理进程只有一个
    11.  
      #pid logs/nginx.pid;
    12. events {
      #每一个进程可同时建立的连接数量,后问详细讲解 
      worker_connections 1024; 
      #连接规则,可以采用[kqueue rtsig epoll select poll eventport ],后文详细讲解
      use epoll; 
      }
    13.  
      #================================以上是全局配置项
       
    14.  
      #================================以下是Nginx后端服务配置项
    15.  
      upstream backendserver1 {
    16.  
      #nginx向后端服务器分配请求任务的方式,默认为轮询;如果指定了ip_hash,就是hash算法(上文介绍的算法内容)
    17.  
      #ip_hash
    18.  
      #后端服务器 ip:port ,如果有多个服务节点,这里就配置多个
    19.  
      server 192.168.220.131:8080;
    20.  
      server 192.168.220.132:8080;
    21.  
      #backup表示,这个是一个备份节点,只有当所有节点失效后,nginx才会往这个节点分配请求任务
    22.  
      #server 192.168.220.133:8080 backup;
    23.  
      #weight,固定权重,还记得我们上文提到的加权轮询方式吧。
    24.  
      #server 192.168.220.134:8080 weight=100;
    25.  
      }
    26.  
      #================================以上是Nginx后端服务配置项
    27.  
       
    28.  
      #=================================================以下是 http 协议主配置
    29.  
      #安装nginx后,在conf目录下除了nginx.conf主配置文件以外,有很多模板配置文件,这里就是导入这些模板文件
    30.  
      include mime.types;
    31.  
      #HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式
    32.  
      default_type application/octet-stream;
    33.  
      #日志格式
    34.  
      #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    35.  
      '$status $body_bytes_sent "$http_referer" '
    36.  
      '"$http_user_agent" "$http_x_forwarded_for"';
    37.  
       
    38.  
      #日志文件存放的位置
    39.  
      #access_log logs/access.log main;
    40.  
       
    41.  
      #sendfile 规则开启
    42.  
      sendfile on;
    43.  
      #指定一个连接的等待时间(单位秒),如果超过等待时间,连接就会断掉。注意一定要设置,否则高并发情况下会产生性能问题。
    44.  
      keepalive_timeout 65;
    45.  
       
    46.  
      #开启数据压缩,后文详细介绍
    47.  
      gzip on;
    48.  
      #=================================================以上是 http 协议主配置
    49.  
       
    50.  
      #=================================================以下是一个服务实例的配置
    51.  
      server {
    52.  
      #这个代理实例的监听端口
    53.  
      listen 80;
    54.  
      #server_name 取个唯一的实例名都要想半天?
    55.  
      server_name localhost;
    56.  
      #文字格式
    57.  
      charset utf-8;
    58.  
      #access_log logs/host.access.log main;
    59.  
       
    60.  
      #location将按照规则分流满足条件的URL。"location /"您可以理解为“默认分流位置”。
    61.  
      location / {
    62.  
      #root目录,这个html表示nginx主安装目录下的“html”目录。
    63.  
      root html;
    64.  
      #目录中的默认展示页面
    65.  
      index index.html index.htm;
    66.  
      }
    67.  
       
    68.  
      #location支持正则表达式,“~” 表示匹配正则表达式。
    69.  
      location ~ ^/business/ {
    70.  
      #方向代理。后文详细讲解。
    71.  
      proxy_pass http://backendserver1;
    72.  
      }
    73.  
       
    74.  
      #redirect server error pages to the static page /50x.html
    75.  
      #error_page 404 /404.html;
    76.  
      error_page 500 502 503 504 /50x.html;
    77.  
      location = /50x.html {
    78.  
      root html;
    79.  
      }
    80.  
      }
    81. }
    82.  
      #=================================================以上是一个服务实例的配置 

    2、use [ kqueue | rtsig | epoll | select | poll ]

    依靠event loop机制,单个线程可以同时处理多个request请求,并在处理完产生response的时候,回调相关的远程事件。根据NIO实现机制的不同,技术名称也就不同了。

    epoll、kqueue 等这些组件都是对多路复用网络I/O模型的实现,其中epoll是poll的升级版本,在linux环境下可以使用但限于linux2.6及以上版本。kqueue用在bsd上使用。

    3、worker_processes和worker_connections

    worker_processes:操作系统启动多少个工作进程运行Nginx。注意是工作进程,不是有多少个nginx工程。在Nginx运行的时候,会启动两种进程,一种是主进程master process;一种是工作进程worker process。例如我在配置文件中将worker_processes设置为4,启动Nginx后,使用进程查看命令观察名字叫做nginx的进程信息,我会看到如下结果:

    这里写图片描述

    图中可以看到1个nginx主进程,master process;还有四个工作进程,worker process。主进程负责监控端口,协调工作进程的工作状态,分配工作任务,工作进程负责进行任务处理。一般这个参数要和操作系统的CPU内核数成倍数。

    worker_connections:这个属性是指单个工作进程可以允许同时建立外部连接的数量。无论这个连接是外部主动建立的,还是内部建立的。这里需要注意的是,一个工作进程建立一个连接后,进程将打开一个文件副本。所以这个数量还受操作系统设定的,进程最大可打开的文件数有关

    • 更改操作系统级别的“进程最大可打开文件数”的设置

      修改limits.conf主配置文件

      vim /etc/security/limits.conf

      在主配置文件最后加入下面两句:

      * soft nofile 65535
      * hard nofile 65535

      这两句话的含义是soft(应用软件)级别限制的最大可打开文件数的限制,hard表示操作系统级别限制的最大可打开文件数的限制

      保存这个文件后,配置是不会马上生效的,为了保证本次shell会话中的配置马上有效,我们需要通过ulimit命令更改本次的shell会话设置。

      ulimit -n 65535

      执行命令后,配置马上生效。您可以用ulimit -a 查看目前会话中的所有核心配置:

      ulimit -a
      core file size (blocks, -c) 0
      data seg size (kbytes, -d) unlimited
      scheduling priority (-e) 0
      file size (blocks, -f) unlimited
      pending signals (-i) 7746
      max locked memory (kbytes, -l) 64
      max memory size (kbytes, -m) unlimited
      open files (-n) 65535
      pipe size (512 bytes, -p) 8
      POSIX message queues (bytes, -q) 819200
      real-time priority (-r) 0
      stack size (kbytes, -s) 10240
      cpu time (seconds, -t) unlimited
      max user processes (-u) 7746
      virtual memory (kbytes, -v) unlimited
      file locks (-x) unlimited

      请注意open files这一项。

    • 更改Nginx软件级别的“进程最大可打开文件数”的设置:
      刚才更改的只是操作系统级别的“进程最大可打开文件”的限制,作为Nginx来说,我们还要对这个软件进行更改。打开nginx.conf主陪文件。您需要配合worker_rlimit_nofile属性。如下:

      user root root;
      worker_processes 4;
      worker_rlimit_nofile 65535;

      #error_log logs/error.log;
      #error_log logs/error.log notice;
      #error_log logs/error.log info;

      #pid logs/nginx.pid;
      events {
      use epoll;
      worker_connections 65535;
      }

      这里只粘贴了部分代码,其他的配置代码和主题无关,也就不需要粘贴了。请注意代码行中加粗的两个配置项,请一定两个属性全部配置。配置完成后,请通过nginx -s reload命令重新启动Nginx。

    • 验证Nginx的“进程最大可打开文件数”是否起作用:

      在linux系统中,所有的进程都会有一个临时的核心配置文件描述,存放路径在/pro/进程号/limit。

      首先我们来看一下,没有进行参数优化前的进程配置信息:

      ps -elf | grep nginx
      1 S root 1594 1 0 80 0 - 6070 rt_sig 05:06 ? 00:00:00 nginx: master process /usr/nginx-1.8.0/sbin/nginx
      5 S root 1596 1594 0 80 0 - 6176 ep_pol 05:06 ? 00:00:00 nginx: worker process
      5 S root 1597 1594 0 80 0 - 6176 ep_pol 05:06 ? 00:00:00 nginx: worker process
      5 S root 1598 1594 0 80 0 - 6176 ep_pol 05:06 ? 00:00:00 nginx: worker process
      5 S root 1599 1594 0 80 0 - 6176 ep_pol 05:06 ? 00:00:00 nginx: worker process

      可以看到,nginx工作进程的进程号是:1596 1597 1598 1599。我们选择一个进程,查看其核心配置信息:

      cat /proc/1598/limits

      这里写图片描述

      请注意其中的Max open files ,分别是1024和4096。那么更改配置信息,并重启Nginx后,配置信息就是下图所示了:

      这里写图片描述

    4、max client的计算方式:

    这个小结我们主要来说明两个在网上经常说的公式:

    • max_client = worker_processes * worker_connections

    • max_client = worker_processes * worker_connections / 4

    这两个公式分别说明,在Nginx充当服务器(例如nginx上面装载PHP)的时候,Nginx可同时承载的连接数量是最大工作线程 * 每个线程允许的连接数量;当Nginx充当反向代理服务的时候,其可同时承载的连接数量是最大工作线程 * 每个线程允许的连接数量 / 4。

    第一个问题很好理解,关键是第二个问题:为什么会除以4。在nginx官方文档上有这样一句话:

    Since a browser opens 2 connections by default to a server and nginx uses the fds (file descriptors) from the same pool to connect to the upstream backend。

    翻译成中文的描述就是,浏览器会建立两条连接到Nginx(注意两条连接都是浏览器建立的),Nginx也会建立对应的两条连接到后端服务器。这样就是四条连接了。

  • 相关阅读:
    SpringMVC视图解析器
    JavaEE PO VO BO DTO POJO DAO 整理总结
    Android Studio JNI开发入门教程
    javah的使用
    右键“在此处打开命令行窗口”的一个小秘密
    URL和URI的区别
    自学使用
    Ribbon使用
    Eureka集群搭建
    ssm常见面试题
  • 原文地址:https://www.cnblogs.com/yblackd/p/14533404.html
Copyright © 2020-2023  润新知