如何监控 Nginx? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OneAPM
V2EX    推广

如何监控 Nginx?

  •  2
     
  •   OneAPM 2016-01-20 14:13:28 +08:00 2426 次点击
    这是一个创建于 3629 天前的主题,其中的信息可能已经有所发展或是发生改变。

    什么是 Nginx ?

    Nginx("engine-x")是一个 HTTP 和反向代理服务器,同时也是一个邮件代理服务器和通用的 TCP 代理服务器。作为一个免费开源的服务器, Nginx 具有高性能、稳定和较低的资源占用的特点。它拥有丰富的特征集,同时配置也很简单。

    Nginx 是少数几个可以解决 C10K 问题的服务器之一。不同于传统服务器,它使用可扩展的时间驱动(异步)架构替代线程来处理请求。尤为重要的是,该架构占用负载下的内存小,且可预测。即便不需要同时处理数千的网络请求,你仍然能从 Nginx 的高性能和低内存占用中受益。从最小的 VPS 到大型集群服务器,Nginx 都能适用。

    Nginx 还有一个商业版 Nginx Plus,功能更加丰富。

    监控 Nginx 的参数

    Nginx 提供哪些监控参数

    下表是 Nginx 提供的监控参数及其简单释义。
    <table>

    <thead>
    <tr>
    <th>参数名称</th>
    <th>参数描述</th>
    </tr>
    </thead>

    <tbody>
    <tr>
    <td>Active connections </td>
    <td>当前活跃的用户连接(包含 Waiting 状态) </td>
    </tr>
    <tr>
    <td>accepts </td>
    <td>接收到的用户连接总数 </td>
    </tr>
    <tr>
    <td>handled </td>
    <td>Nginx 处理的用户连接总数 </td>
    </tr>
    <tr>
    <td>requests </td>
    <td>用户请求总数 </td>
    </tr>
    <tr>
    <td>Reading </td>
    <td>当前连接中 Nginx 读取请求首部的个数 </td>
    </tr>
    <tr>
    <td>Writing </td>
    <td>当前连接中 Nginx 写返回给用户的个数 </td>
    </tr>
    <tr>
    <td>Waiting </td>
    <td>当前没有请求的活跃用户连接数 </td>
    </tr>

    </tbody>
    </table>

    通过下面的图,可以清晰的看到参数的具体意义和作用。

    nginx 数据流

    当用户请求连接 Nginx 服务器时, accepts 计数器会加一。且当服务器处理该连接请求时, handled 计数器同样会加一。一般而言,两者的值是相等的,除非达到了某些资源极限(如 worker_connection 的限制)。

    用户连接请求被处理,就会进入 active 状态。如果该连接没有其他 request ,则进入 waiting 的子状态;如果有 request , nginx 会读取 request 的 header ,计数器 request 加一,进入 reading 的子状态。 reading 状态持续时间非常短, header 被读取后就会进入 writing 状态。事实上,直到服务器将响应结果返回给用户之前,该连接会一直保持 writing 状态。所以说, writing 状态一般会被长时间占用。

    Nginx 提供哪些监控参数

    下表是 Nginx Plus 提供的主要监控参数、说明以及和 Nginx 的差异。

    <table>

    <thead>
    <tr>
    <th>参数名称</th>
    <th>参数描述</th>
    <th>与 Nginx 差异</th>
    </tr>
    </thead>

    <tbody>
    <tr>
    <td>Active </td>
    <td>当前活跃的用户连接(不包含 Idel 状态) </td>
    <td>等同 Active connections </td>
    </tr>
    <tr>
    <td>Accepted </td>
    <td>接收到的用户连接总数 </td>
    <td>等同 accepts </td>
    </tr>
    <tr>
    <td>Dropped </td>
    <td>Nginx 丢弃的用户连接总数 </td>
    <td>accepts - handled </td>
    </tr>
    <tr>
    <td>Idle </td>
    <td>当前没有请求的活跃用户连接数 </td>
    <td>等同 Waiting </td>
    </tr>
    <tr>
    <td>Total </td>
    <td>用户请求总数 </td>
    <td>等同 requests </td>
    </tr>
    <tr>
    <td>Current(Requests) </td>
    <td>当前有请求的活跃用户连接数(等同 Active)</td>
    <td>Reading + Writing </td>
    </tr>
    <tr>
    <td>Current(Connections) </td>
    <td>当前在线用户数(Active + Idle) </td>
    <td>Reading + Writing + Waiting </td>
    </tr>

    </tbody>
    </table>

    主要参数和开源的 Nginx 相比较,区别不大。主要就是换了名字,以及通过加减法的参数整合。同样,通过下面的图也能看清这些参数的作用。

    nginx-plus 数据流

    具体运作和 Nginx 并无不同,故不赘述。当然,作为商业版,它提供的参数还有很多,可以在这里看。

    怎么利用这些参数

    开源的 Nginx 提供的原始参数中,实时性的会比较有用,如 Active connections 、 Reading 、 Writing 以及 Waiting 。这些数据能够反映当前 Nginx 的负载情况,方便在服务器出现问题时及时发现问题。而另一些数据由于不是状态量, Nginx 无法计算当前的量值而改做其统计数,如 accepts 、 handled 和 requests 。

    对于维护网站人员, accepts 、 handled 和 requests 的统计值用处是不大的,值得参考的是短时间内这三者数值的增量。这个短时间可以是一秒,如 accepts_per_second 、 handled_per_second 和 requests_per_second 。一个简单的做法就是每秒都去读取这些参数,返回一个和上一秒的差值就行。当然, handled_per_second 替换成 dropped_per_secOnd=accepts_per_second-handled_per_second 就更完美了。

    通过这七个参数,就可以从连接到请求全方位的监控起 Nginx 的运行状态。为了方便检测,对每次获取的参数保留下来,然后按时间展现出来。下图展示了 Nginx 在运行时的参考数据。
    nginx 折线图

    如何获取 Nginx 性能监控参数

    开源的 Nginx 会提供一个子网页显示前文提到的监控参数。该网页默认时不开启的,需要开放 ngx_http_stub_status_module 来解锁。默认该模块是开放的,通过以下命令,可以快速确定该模块是否已被开放。

    nginx -V 2>&1 | grep -o with-http_stub_status_module

    如过返回 with-http_stub_status_module,则说明该模块已被开放,而什么都不返回的话就是没有被开放。需要通过原码构建 Nginx 加上配置参数 --with-http_stub_status_module:

    ./configure \
    … \
    --with-http_stub_status_module
    make
    sudo make install

    以上步骤搞定后,还有需要一个配置 URL 来开启 Nginx 状态页。打开你的网站对应 Nginx 的配置文件,添加以下修改:

    server{
    listen your-website-port;
    location /basic_status {
    stub_status;
    }
    }

    如果 Nginx 版本低于 1.7.5 ,则需要语法指令添加参数(任意参数):

    server{
    listen your-website-port;
    location /basic_status {
    stub_status on;
    }
    }

    修改完成后,需要重新载入 Nginx ,键入命令 nginx -s reload,然后就能在状态页(127.0.0.1:your-website-port/basic_status)看见你的监控参数了。大概是这个样子:

    Active connections: 1
    server accepts handled requests
    38 38 38
    Reading: 0 Writing: 1 Waiting: 0

    Nginx Plus 和 Nginx 在前面的设置差不多。配置状态页时,需要在配置文件中加上 server 模块:
    ```
    server {
    listen your-website-port;

    location /status { status; } location = /status.html { } 

    }
    ```
    重载一下 Nginx ,你会在状态页(127.0.0.1:your-website-port/status.html)看到大概这个样子:

    Nginx-plus-example

    顺便安利一下,装一个 Ci,就能看到前面关于 Nginx 基于时间的运行状态的图了。免费注册免费使用,还能设置报警策略。具体,戳这里

    Cloud Insight 集监控、管理、计算、协作、可视化于一身,帮助所有 IT 公司,减少在系统监控上的人力和时间成本投入,让运维工作更加高效、简单。
    本文系国内 ITOM 行业领军企业 OneAPM 工程师原创。想阅读更多技术文章,请访问 OneAPM 官方技术博客
    本文转自 OneAPM 官方博客

    2 条回复    2016-01-21 09:57:17 +08:00
    abelyao
        1
    abelyao  
       2016-01-20 15:07:38 +08:00
    请发到推广节点。
    CC @Livid
    hayao650
        2
    hayao650  
       2016-01-21 09:57:17 +08:00 via Android
    学习
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     838 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 22:12 PVG 06:12 LAX 14:12 JFK 17:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86