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

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

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

    <p>修改limits.conf主配置文件</p>
    
    <blockquote>
    <p>vim /etc/security/limits.conf</p>
    </blockquote> <p>在主配置文件最后加入下面两句:</p> <blockquote>
    <p>* soft nofile 65535<br>
    * hard nofile 65535</p>
    </blockquote> <p><em>这两句话的含义是soft(应用软件)级别限制的最大可打开文件数的限制,hard表示操作系统级别限制的最大可打开文件数的限制</em>。</p> <p>保存这个文件后,配置是不会马上生效的,为了保证本次shell会话中的配置马上有效,我们需要通过ulimit命令更改本次的shell会话设置。</p> <blockquote>
    <p>ulimit -n 65535</p>
    </blockquote> <p>执行命令后,配置马上生效。您可以用ulimit -a 查看目前会话中的所有核心配置:</p> <blockquote>
    <p>ulimit -a<br>
    core file size (blocks, -c) 0<br>
    data seg size (kbytes, -d) unlimited<br>
    scheduling priority (-e) 0<br>
    file size (blocks, -f) unlimited<br>
    pending signals (-i) 7746<br>
    max locked memory (kbytes, -l) 64<br>
    max memory size (kbytes, -m) unlimited<br>
    open files (-n) 65535<br>
    pipe size (512 bytes, -p) 8<br>
    POSIX message queues (bytes, -q) 819200<br>
    real-time priority (-r) 0<br>
    stack size (kbytes, -s) 10240<br>
    cpu time (seconds, -t) unlimited<br>
    max user processes (-u) 7746<br>
    virtual memory (kbytes, -v) unlimited<br>
    file locks (-x) unlimited</p>
    </blockquote> <p>请注意open files这一项。</p>
    </li>
    <li>
    <p><strong>更改Nginx软件级别的“进程最大可打开文件数”的设置:</strong><br>
    刚才更改的只是操作系统级别的“进程最大可打开文件”的限制,作为Nginx来说,我们还要对这个软件进行更改。打开nginx.conf主陪文件。您需要配合worker_rlimit_nofile属性。如下:</p> <blockquote>
    <p>user root root;<br>
    worker_processes 4;<br><strong>worker_rlimit_nofile 65535;</strong></p> <p>#error_log logs/error.log;<br>
    #error_log logs/error.log notice;<br>
    #error_log logs/error.log info;</p> <p>#pid logs/nginx.pid;<br>
    events {<br>
    use epoll;<br><strong>worker_connections 65535;</strong><br>
    }</p>
    </blockquote> <p>这里只粘贴了部分代码,其他的配置代码和主题无关,也就不需要粘贴了。请注意代码行中加粗的两个配置项,请一定两个属性全部配置。配置完成后,请通过nginx -s reload命令重新启动Nginx。</p>
    </li>
    <li>
    <p><strong>验证Nginx的“进程最大可打开文件数”是否起作用:</strong></p> <p>在linux系统中,所有的进程都会有一个临时的核心配置文件描述,存放路径在/pro/进程号/limit。</p> <p>首先我们来看一下,没有进行参数优化前的进程配置信息:</p> <blockquote>
    <p>ps -elf | grep nginx<br>
    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<br>
    5 S root 1596 1594 0 80 0 - 6176 ep_pol 05:06 ? 00:00:00 nginx: worker process<br>
    5 S root 1597 1594 0 80 0 - 6176 ep_pol 05:06 ? 00:00:00 nginx: worker process<br>
    5 S root 1598 1594 0 80 0 - 6176 ep_pol 05:06 ? 00:00:00 nginx: worker process<br>
    5 S root 1599 1594 0 80 0 - 6176 ep_pol 05:06 ? 00:00:00 nginx: worker process</p>
    </blockquote> <p>可以看到,nginx工作进程的进程号是:1596 1597 1598 1599。我们选择一个进程,查看其核心配置信息:</p> <blockquote>
    <p>cat /proc/1598/limits</p>
    </blockquote> <p><img alt="这里写图片描述" class="has" src="https://img-blog.csdn.net/20150707204548230"></p> <p>请注意其中的Max open files ,分别是1024和4096。那么更改配置信息,并重启Nginx后,配置信息就是下图所示了:</p> <p><img alt="这里写图片描述" class="has" src="https://img-blog.csdn.net/20150707204756789"></p>
    </li>

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也会建立对应的两条连接到后端服务器。这样就是四条连接了。

nginx重要配置项简要说明的更多相关文章

  1. nginx.conf配置项

    环境:centos7  nginx1.16.1 以下配置均在配置文件中进行:/etc/nginx/nginx.conf 1.设置工作进程的所有者和所属组 user  所有者  所属组: 设置后要在操作 ...

  2. linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录

    可以先总结下:大都是先用 which 获取目录:然后再获取配置项位置: which  mysql /usr/bin/mysql /usr/bin/mysql --help | grep -A1 'De ...

  3. Nginx 配置简述

    不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要 ...

  4. nginx缓存设置proxy_cache

    http://www.cnblogs.com/dudu/p/4597351.html http块: proxy_cache_path /tmp/cache levels=1:2 keys_zone=n ...

  5. Nginx之负载均衡服务器揭秘

    Nginx代理服务器, 一次性代理多台后端机器, 利用负载算法, 决定将当前请求传递给某台服务器执行. 有哪些后台服务器?例如微软的IIS,Apache,Nginx 负载算法是什么? 加权轮询. ng ...

  6. Awstats分析Nginx日志

    1.nginx日志格式设定 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$ ...

  7. nginx缓存优先级(缓存问题者必看)

    接触nginx的兄弟或多或少都有遇到缓存问题,要么是nginx为什么不缓存,要么就是nginx缓存很快就失效等等问题,在网上找了一遍nginx缓存优先级的文章,大家可以参考下. 架构图client端  ...

  8. 征服 Nginx + Tomcat

    2年前一直折腾Apache,现如今更习惯Nginx. 搭建网站又遇到2年前遇到的问题——Session同步. (参考我以前的帖子——征服 Apache + Tomcat)只不过现今担当负载均衡的Apa ...

  9. 征服 Nginx + Tomcat【转】

    征服 Nginx + Tomcat Server Architecture/Distributed nginxtomcatsessioncluster  2年前一直折腾Apache,现如今更习惯Ngi ...

随机推荐

  1. Union-find 并查集

    解决问题 给一系列对点0~N-1的连接,判断某两个点p与q是否相连. private int[] id; // 判断p和q是否属于同一个连通分量 public boolean connected(in ...

  2. P2419 [USACO08JAN]牛大赛Cow Contest

    P2419 [USACO08JAN]牛大赛Cow Contest 题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, conveniently number ...

  3. Fiddler安卓抓包详细教程

    电脑端抓包一般图方便就用浏览器自带的,最近需要分析安卓一个APP的HTTP请求,尝试了wireshark(功能太强大了,然而我并不会用),tcpdump(用起来还是比较麻烦),网上搜了一下,还是使用F ...

  4. Qt Qwdget 汽车仪表知识点拆解5 标题栏图标闪烁

    先贴上效果图,注意,没有写逻辑,都是乱动的 看下最上面的部分,有一些仪表图标在闪烁,如果一个一个写,也是可以实现的,不过感觉要累死的节奏 这里我写了一个我自己的Label,完了把把这些QLabel提升 ...

  5. 企业级Nginx Web服务优化实战

    web优化一览总结表 优化类型 优化说明 优化方法 安全优化 隐藏nginx版本信息优化 修改nginx配置文件实现优化 server_tokens off: 修改nginx版本信息优化 修改ngin ...

  6. LeetCode 2——两数相加

    1. 题目 2. 解答 循环遍历两个链表 若两个链表都非空,将两个链表结点的值和进位相加求出和以及新的进位 若其中一个链表为空,则将另一个链表结点的值和进位相加求出和以及新的进位 然后将每一位的和添加 ...

  7. Python 3 学习笔记之——标准库概述

    1. 操作系统接口 os 模块提供了一些与操作系统相关联的函数. >>> os.getcwd() # 获取当前工作目录 '/home/senius' >>> os. ...

  8. PAT——甲级1012:The Best Rank(有坑)

    1012 The Best Rank (25 point(s)) To evaluate the performance of our first year CS majored students, ...

  9. 第十四次ScrumMeeting会议

    第十三次Scrum Meeting 时间:2017/12/2 地点:咖啡馆 人员:策划组美工组 目前工作情况 名字 完成的工作 计划工作 蔡帜 科技树策划设计,科技图鉴蓝图设计 员工方面细节设定 游心 ...

  10. lintcode-118-不同的子序列

    118-不同的子序列 给出字符串S和字符串T,计算S的不同的子序列中T出现的个数. 子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响.(比如,&q ...