パフォーマンスの監視とnginxのをチューニング

ngx_http_stub_statusモニタ接続情報

nginxのは、最も広く使用されているWebサーバとなり、リバース・プロキシ・サーバー、Tomcatサーバーは、通常、負荷分散を実現するために、私たちのオンラインnginxので表されています。その後、nginxのは、あまりにも広く適用されているので、私たちはnginxのためにパフォーマンスの監視を行う方法を学ぶようになってきました。このセクションでは、ngx_http_stub_status nginxのモジュールが接続情報を監視して使用する方法について説明します。デフォルト紙の読者基礎nginxの、ので、いくつかの基本的なことはあまり紹介はありません。

モジュール上の文書の公式アドレスは次のとおりです。

http://nginx.org/en/docs/http/ngx_http_stub_status_module.html

あなたはnginxのを使用している場合はyumをインストールし、その後、通常このモジュールが付属して、あなたはモジュールをインストールし、再コンパイルngx_http_stub_status nginxの一部をインストールするために、次の期間を無視することができます。私のnginxのは、コンパイルとインストールされているので、コンパイルするには、このモジュールを追加し、今再コンパイルし、一度インストールする必要はありませんでした。次のようにプロセスは以下のとおりです。

[root@01server ~]# /usr/local/nginx/sbin/nginx -V  # 列出安装了哪些模块,可以看到我这里没有安装任何模块
nginx version: nginx/1.12.1
built by gcc 4.8.5 20150623 ( 4.8.5-11) (GCC) 
configure arguments: --prefix=/usr/local/nginx
[root@01server ~]# rm -rf /usr/local/nginx/  # 删除原本的nginx
[root@01server ~]# cd /usr/local/src/  # 进入存放安装包的路径  
[root@01server /usr/local/src]# ls  
nginx-1.12.1    nginx-1.12.1.tar.gz
[root@01server /usr/local/src]# cd nginx-1.12.1  # 进入之前已经解压好的目录
[root@01server /usr/local/src/nginx-1.12.1]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module  # 加入编译参数,指定需要安装的模块
[root@01server /usr/local/src/nginx-1.12.1]# make && make install  # 编译安装
[root@01server /usr/local/src/nginx-1.12.1]# cd /usr/local/nginx/sbin/
[root@01server /usr/local/nginx/sbin]# ./nginx -V # 可以已经把模块安装好了
nginx version: nginx/1.12.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module  
[root@01server /usr/local/nginx/sbin]# 

インストールしたら、またあなたはnginxのデフォルトの設定ファイルを使用していない、いくつかの設定ファイルを編集する必要があります。

[root@01server /usr/local/nginx/sbin]# cd ../conf/
[root@01server /usr/local/nginx/conf]# mv nginx.conf nginx.conf.bak  # 不使用nginx自带的配置文件
[root@01server /usr/local/nginx/conf]# vim nginx.conf  # 将以下内容粘贴进去
user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

events
{
    use epoll;
    worker_connections 1024;
}

http
{
    include mime.types;
    default_type application/octet-stream;
    server_names_hash_bucket_size 3526;
    server_names_hash_max_size 4096;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /usr/local/nginx/logs/access.log  main;
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 30;
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;
    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 8 4k;
    request_pool_size 4k;
    output_buffers 4 32k;
    postpone_output 1460;
    client_max_body_size 10m;
    client_body_buffer_size 256k;
    client_body_temp_path /usr/local/nginx/client_body_temp;
    proxy_temp_path /usr/local/nginx/proxy_temp;
    fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
    fastcgi_intercept_errors on;
    tcp_nodelay on;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 8k;
    gzip_comp_level 5;
    gzip_http_version 1.1;
    gzip_types text/plain application/x-Javascript text/css text/htm 
    application/xml;
    include vhost/*.conf;
}
[root@01server /usr/local/nginx/conf]# mkdir vhost
[root@01server /usr/local/nginx/conf]# vim vhost/default.conf  # 虚拟主机配置文件,将以下内容粘贴进去
server{
        listen 80;
        server_name localhost;
        index index.html index.htm index.php;
        root /usr/local/nginx/html;

        location = /nginx_status{  # 配置访问路径,即uri
            stub_status on;  # 开启该模块
            access_log off;  # 关闭日志
            allow 101.106.102.129;  # 允许访问的ip,即白名单ip 
            allow 127.0.0.1;
            deny all;  # 拒绝白名单ip以外的ip访问
       }
}
[root@01server ~]# 

nginxのを起動します。

[root@01server /usr/local/nginx/conf]# cd ../sbin/
[root@01server /usr/local/nginx/sbin]# ./nginx -t  # 检查nginx的配置文件是否正常
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful 
[root@01server /usr/local/nginx/sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf  # 启动nginx
[root@01server /usr/local/nginx/sbin]# netstat -lntp |grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      22713/nginx: master 
[root@01server /usr/local/nginx/sbin]# 

次のように正常に起動した後、/ nginx_statusにアクセスするには、ブラウザを使用して、情報にアクセスするための正常な応答は次のようになります。
パフォーマンスの監視とnginxのをチューニング

説明:

  • (待機も含む)、現在アクティブな接続アクティブな接続の数
  • 接続の受信総数を受け付け
  • 処理された接続の合計数は、処理します
  • リクエストの現在の合計数を要求
  • 読まれている接続の読み込みnginxの数
  • 接続数が執筆nginxのに応答しています
  • 空き接続の現在の数を待っています

図から分かるように、現在の接続情報は、これらの単純なパラメータをnginxの。並行性の高いシナリオでは、人はあなたが現在nginxの忙しいかどうかを私たちに伝えることができるパラメータを読み込み、アクティブな接続に基づい同時パラメータの現在の数を決定することができます。もちろん、これはただのnginxを監視するための最も簡単な方法ですので、それだけでいくつかのパラメータでした。しかし、これらは他のより高度な監視ツールの基礎となっているので、これらの基本的な監視を理解することも必要です。


ngxtop監視要求情報

前のセクションでは、我々は、nginxのを監視するために、接続情報ngx_http_stub_statusモジュールを使用する方法を紹介します。このセクションでは、nginxのの要求情報をngxtop監視するためのツールを使用する方法について説明します。

ngxtop nginxのアクセスログをリアルタイムで解析され、そして端末に処理結果を出力することができる、機能は、システム・コマンド・トップに似ているので、ソフトウェアがngxtop名前。ngxtopを使用すると、ログの末尾を参照するには、画面をリフレッシュする必要はもはや、nginxの状況に現在のリアルタイムのアクセスを理解することはできません。

ngxtopプロジェクト住所:

https://github.com/lebinh/ngxtop

インストールngxtop:

[root@01server ~]# yum install -y epel-release
[root@01server ~]# yum install -y python-pip

ピップは、その後、次のコマンドをngxtopマウント:

[root@01server ~]# pip install ngxtop

ngxtop使用:

[root@01server ~]# ngxtop --help
ngxtop - ad-hoc query for nginx access log.

Usage:
    ngxtop [options]
    ngxtop [options] (print|top|avg|sum) <var> ...
    ngxtop info
    ngxtop [options] query <query> ...

Options:

-l <file>, --access-log <file>  # 需要分析的访问日志
    -f <format>, --log-format <format>  # log_format指令指定的日志格式 [默认: combined]
    --no-follow  ngxtop default behavior is to ignore current lines in log
                     and only watch for new lines as they are written to the access log.
                     Use this flag to tell ngxtop to process the current content of the access log instead.  # 简而言之,对历史信息进行统计
    -t <seconds>, --interval <seconds>  report interval when running in follow mode [default: 2.0]  # 指定监控信息刷新的间隔,单位为秒 [默认: 2.0]
    -g <var>, --group-by <var>  # 根据变量分组 [默认: request_path]
    -w <var>, --having <expr>  # 具备子句 [默认: 1] having clause [default: 1]
    -o <var>, --order-by <var>  # 排序 [默认: count]
    -n <number>, --limit <number>  # 显示的条数 [默认: 10]
    -a <exp> ..., --a <exp> ...  add exp (must be aggregation exp: sum, avg, min, max, etc.) into output  # 添加聚合表达式到输出信息中

    -v, --verbose  # 更多的输出
    -d, --debug  # 打印所有行和解析记录,debug
    -h, --help  # 当前帮助信息.
    --version  # 输出版本信息.

詳細オプション:

-c <file>, --config <file>  # 运行ngxtop解析nginx配置文件
-i <filter-expression>, --filter <filter-expression>  filter in, records satisfied given expression are processed.  # 根据指定的表达式进行过滤,仅显示过滤后的信息
-p <filter-expression>, --pre-filter <filter-expression> in-filter expression to check in pre-parsing phase.  # 在筛选器表达式中检查预解析阶段

例:

All examples read nginx config file for access log location and format.
If you want to specify the access log file and / or log format, use the -f and -a options.
"top" like view of nginx requests

指定配置文件启动ngxtop: 
$ ngxtop -c /usr/local/nginx/conf/nginx.conf

404前十的请求:
$ ngxtop top request_path --filter 'status == 404'

总流量前十的请求:
$ ngxtop --order-by 'avg(bytes_sent) * count'

访问量前十的ip地址:
$ ngxtop --group-by remote_addr

输出400以上状态码的请求以及请求来源:
$ ngxtop -i 'status >= 400' print request status http_referer

Average body bytes sent of 200 responses of requested path begin with 'foo':
$ ngxtop avg bytes_sent --filter 'status == 200 and request_path.startswith("foo")'

nginxのは、ブートにコンフィギュレーションファイルを指定しました:

[root@01server ~]# ngxtop -c /usr/local/nginx/conf/nginx.conf

次のように起動した後:
パフォーマンスの監視とnginxのをチューニング

注:要求された情報の同等の概要概要、自然詳細は、要求の詳細です。2XX、3XX、4XX、および5xxのは、HTTPの状態が表現されています。avg_bytes_sentが要求を送信したバイト数の平均値を表し、request_path要求パスは、カウントが要求の合計数を表しています。

デフォルトでは、ngxtop要求情報がスタートngxtop前に表示されていない、ngxtop要求情報の後に、新たなスタートを表示します。だから我々はいくつかのページに、人工のいくつかの要求を訪問し、リフレッシュするために、ブラウザに行くことができます。次の図は、その後、あなたは成功した情報を要求するために監視ngxtop見ることができます。
パフォーマンスの監視とnginxのをチューニング

私たちは、あなたが指定した-iを使用することができ、例えば、私は唯一のHTTPステータスが200で表示する、オプションのためのいくつかの条件を指定することができます。

[root@01server ~]# ngxtop -c /usr/local/nginx/conf/nginx.conf -i 'status == 200'

次のように:
パフォーマンスの監視とnginxのをチューニング

例えば、私が最も訪問されたIPアドレスを表示したい、-gで指定することができます。

[root@01server ~]# ngxtop -c /usr/local/nginx/conf/nginx.conf -g remote_addr

次のように:
パフォーマンスの監視とnginxのをチューニング

あなたは、統計の歴史を行うために情報の要求に相当--no-フォローオプションを使用する前に、次のように、要求された情報を表示したい場合は:
パフォーマンスの監視とnginxのをチューニング

ngxtop共通の操作について簡単にこれを説明します、私は最も直接的についての詳細を学ぶことを願っていgithubの上で、プロジェクトの文書を検査することです。


nginxの-RRDグラフィカルな監視

2つのサブセクションでは、我々は、接続情報と要求情報を監視する2 nginxのベースのツールを紹介し、それらがコマンドラインに基づいています。このセクションでは、nginxのnginxの-RRDグラフィカル監視ツールが記載されています。nginxの-RRDは、nginxのnginxの公式は、あなたが簡単にnginxの-RRDチャートの使用は、それが接続情報を監視し、情報を要求することができます生成できる監視ツールをお勧めです。

nginxの-RRD公式ウェブサイトのアドレス:

https://www.nginx.com/resources/wiki/modules/rrd_graph/

だから我々は、nginxの-RRDそれをインストールして使用する方法を見てみましょうしようとしています。nginxの-RRDの一部機能が実装され導入された2つのサブセクションツールに基づいており、インストールnginxの-RRD 2の導入前に必要なをインストールする必要があります。nginxの-RRDは、PHPを使用する前にして実装されているため、PHP我々は動作環境だけでなく、rrdtoolのの依存関係のインストールをインストールする必要があります。私は次のようにyum installコマンドを使用するためにここにいます:

[root@01server ~]# yum install -y php php-gd php-soap php-mbstring php-xmlrpc php-dom php-fpm
[root@01server ~]# yum install -y perl rrdtool perl-libwww-perl libwww-perl perl-rrdtool

動作環境およびPHPのrrdtoolのをインストールした後、我々はまた、nginxのとPHP-FPMを統合する必要があります。PHP-FPM変更された構成ファイル、ユーザにマッチするように修正nginx.confファイルのユーザーおよびグループ:

[root@01server ~]# vim /etc/php-fpm.d/www.conf
user = nobody
group = nobody
[root@01server ~]# 

nginxのサポートは、仮想ホストの設定ファイルに、PHPを解析するようにする必要があり、次の行を追加します。

[root@01server ~]# vim /usr/local/nginx/conf/vhost/default.conf  # 添加以下内容
location ~ \.php$
{
    include fastcgi_params;
    fastcgi_pass unix:/tmp/php-fcgi.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
}
[root@01server ~]# 

設定が完了すると、PHP-FPMサービスを開始し、nginxのをリロードします。

[root@01server ~]# systemctl start php-fpm
[root@01server ~]# netstat -lntp |grep 9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      24418/php-fpm: mast 
[root@01server ~]# nginx -s reload

そして、仮想ホストの設定ファイルでnginxのは、適切にPHPコードを解決することができたかどうかをテストするために、単純なPHPのドキュメントを作成し、サイトのルートディレクトリで指さ:

[root@01server ~]# vim /usr/local/nginx/html/index.php  # 文件内容如下
<?php phpinfo(); ?>
[root@01server ~]# 

そして、それはnginxの代表であるとしてブラウザへの訪問は、分析PHPをサポートすることができました:
パフォーマンスの監視とnginxのをチューニング


今、私たちは最初に圧縮されたパッケージのnginx-RRDをダウンロードするには、次のコマンドを使用し、nginxの-RRDのインストールを開始することができます:

[root@01server ~]# cd /usr/local/src/
[root@01server /usr/local/src]# wget http://soft.vpser.net/status/nginx-rrd/nginx-rrd-0.1.4.tgz

その後、解凍して、適切なシステムディレクトリにスクリプトファイルと設定ファイルの数をコピーします:

[root@01server /usr/local/src]# tar -zvxf nginx-rrd-0.1.4.tgz
[root@01server /usr/local/src]# cd nginx-rrd-0.1.4
[root@01server /usr/local/src/nginx-rrd-0.1.4]# ls
etc  html  usr
[root@01server /usr/local/src/nginx-rrd-0.1.4]# cp etc/nginx-rrd.conf /etc
[root@01server /usr/local/src/nginx-rrd-0.1.4]# cp usr/sbin/* /usr/sbin
[root@01server /usr/local/src/nginx-rrd-0.1.4]# rm -rf /usr/local/nginx/html/index.php  # 删除之前测试用的php文件
[root@01server /usr/local/src/nginx-rrd-0.1.4]# cp html/index.php /usr/local/nginx/html/

nginxの-RRD次のように、コンフィギュレーション・ファイル、コンフィギュレーションデータ格納ディレクトリおよび画像の保存ディレクトリを変更します。

[root@01server ~]# vim /etc/nginx-rrd.conf
# dir where rrd databases are stored
RRD_DIR="/usr/local/nginx/html/nginx-rrd";  # 数据存储目录
# dir where png images are presented
WWW_DIR="/usr/local/nginx/html";  # 图片存储目录
[root@01server ~]# 

設定した後、我々はまた、nginxの-RRDは、モニターの効果を達成するために、データを収集するための時間を必要とするためのnginx-RRD 2つのスクリプトを定期的に実施するための新しいcrontabのスケジュールされたタスクを使用する必要があります。

[root@01server ~]# crontab -e
* * * * * /bin/sh /usr/sbin/nginx-collect  # 采集数据脚本
*/1 * * * * /bin/sh /usr/sbin/nginx-graph  # 生成图片脚本
[root@01server ~]# 

1分ごとに実行され、ここで設定し私たちの定期的なタスクは、あなたがの実装で定期的なタスクがあるかどうかを確認するには、次のコマンドを使用することができます。

[root@01server ~]# tail -f /var/log/cron

タスクの正常な実行タイミングを確認した後、我々はApacheの圧力測定ツールをインストールし、我々は要求大量のデータを容易:

[root@01server ~]# yum -y install httpd-tools

インストールが完了したら、nginxの圧力を測定するために、次のコマンドを使用して、複数回行うことができます。

[root@01server ~]# ab -n 10000 -c 10 http://127.0.0.1/index.html

コマンド説明:

  • -n要求の合計数を指定します
  • どのように多くの要求を同時に指定-c

リクエストデータの一部がプレス計測ツールを使用して生成された後、ブラウザのnginx-RRDのindex.phpファイルへのアクセス、次の結果:
パフォーマンスの監視とnginxのをチューニング


nginxの最適化

上記のセクションでは、我々はいくつかのnginxの監視ツールを紹介します。後にパフォーマンス監視をnginxの方法を知って、私たちは自然のパラメータと設定のいくつかの一般的なnginxの最適化を知っている必要がありますので、このセクションでは、nginxのを最適化する一般的な方法のいくつかを紹介することです。

1.ワーカー・プロセスの数や同時接続数を設定します。

デフォルトでは、nginxのは、唯一のワーカープロセス、1024年の同時接続です。私たちは、同時nginxの負荷容量を改善する必要がある場合は、作業プロセスの数や同時接続数を増やすために、適切なことができます。でnginx.confで構成されました:

[root@01server ~]# vim /usr/local/nginx/conf/nginx.conf  # 修改或增加如下几个参数
worker_processes 2;  # 工作进程数受cpu核心数的限制,数量不能超过cpu的核心数
events
{
    use epoll;  # 使用epoll模型,可以提高并发效率
    multi_accept on;  # 开启一次建立多个连接
    worker_connections 10240; # 每一个工作进程能够打开的最大连接数,包含了nginx与客户端和nginx与upstream之间的连接
}
[root@01server ~]# 

長い接続の2リバースプロキシ構成(サーバー後端)

デフォルト短い接続の後端に接続された上流のnginxのは、HTTP / 1.0、リクエスト及び「接続」ヘッダが「近く」に設定されるの後端部を介して接続を開始します。長い接続のフロントエンドとnginxのデフォルト接続、ユーザーnginxのとの接続を確立した後、長い間接続を介して複数のリクエストを送信します。あなただけnginxの場合、ユーザーは、後端部に接続され、短いリバースプロキシを複数接続する必要があります。並行処理に接続されているバックエンドサーバ(またはソースステーションキャッシュサーバ)が強くない場合には、ボトルネックが発生することがあります。だから我々は、ボトルネックの問題を軽減するために、リバースプロキシが長い接続で設定する必要があります。例えば、以下のように構成される。

[root@01server ~]# vim /usr/local/nginx/conf/vhost/default.conf
upstream server_pool{
    server localhost:8080 weight=1 max_fails=2 fail_timeout=30s;
    server localhost:9080 weight=1 max_fails=2 fail_timeout=30s;
    keepalive 300;  # 设置300个长连接,长连接能够大大提高请求转换的效率
}

location / {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_pass http://server_pool/;
}
[root@01server ~]# 

3.設定のgzip圧縮

私たちは、テキストデータは、基本的には、HTTP伝送であることを知っている、テキストデータが圧縮され、データの量を低減することができます。これは、大幅にページのアクセスの効率化、および読み込み速度を向上させることができ、また、帯域幅リソースの消費を削減します。例えば、以下のように構成される。

[root@01server ~]# vim /usr/local/nginx/conf/nginx.conf
gzip on;  # 开启Gzip
gzip_http_version 1.1;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";  # ie6不提供gzip
gzip_proxied any;
gzip_types text/plain application/x-javascript text/css application/xml application/json application/x-font-ttf application/sfg+xml application/x-icon text/javascript application/x-httpd-php image/jpeg image/gif image/png;  # 需要压缩的类型
gzip_vary on;
gzip_static on;  # 如果有压缩好的,直接使用
[root@01server ~]# 

4.オペレーティングシステムの最適化

Linuxオペレーティングシステムでは、我々は変更することができる/etc/sysctl.confパラメータTCP / IP接続を設定するために、あなたは、オペレーティング・システム・レベルでのネットワーク接続の効率を向上させることができ、構成ファイル・システムを。例えば、以下のように構成される。

[root@01server ~]# vim /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1 # 防止一个套接字在有过多试图连接到达时引起过载
net.core.somaxconn = 1024  # 连接队列的长度,默认值为128,
net.ipv4.tcp_fin_timeout = 10  # timewait的超时时间,设置短一些
net.ipv4.tcp_tw_reuse = 1  # os直接使用timewait的连接
net.ipv4.tcp_tw_recycle = 0  # 回收禁用,不回收timewait连接
[root@01server ~]#

また、中に/etc/security/limits.confコンフィギュレーション・ファイル、コンフィギュレーション・プロセスは、ファイルの最大数を開くことができます。例えば、以下のように構成される。

[root@01server ~]# vim /etc/security/limits.conf
* hard nofile 204800
* soft nofile 204800
* soft core unlimited
* soft stack 204800
[root@01server ~]#

5.その他の最適化:

例えば、以下のように構成される。

[root@01server ~]# vim /usr/local/nginx/conf/nginx.conf
sendfile on;  # 减少文件在应用和内核之间的拷贝
tcp_nopush on;  # 当数据包达到一定大小再发送,避免频繁发送数据包
tcp_nodelay off;  # 关闭有数据就随时发送,也是避免频繁发送数据包
[root@01server ~]# 

おすすめ

転載: www.linuxidc.com/Linux/2019-07/159486.htm