テックブログ

技術ネタ

Nginxとワーカプロセス

初めまして、技術部のmnakamuraと申します。
ブログの順番が回ってきましたので、記念すべき初投稿です。

今回は初心者向けに、オープンソースWebサーバであるNginxの導入の基礎と、
ワーカプロセスについてご説明させて頂きます。

Nginxは大量のクライアントからの接続を同時に処理する為に開発された、
中~大規模で能力を発揮するスケーラビリティに優れたサービスです。

早速日頃私が使用している検証サーバに導入してみようと思いますが、
まずは導入前に最低限の確認を。

——————————————————————

[root@mnakamura ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_mnakamura-lv_root
18G 2.4G 14G 15% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 477M 132M 320M 30% /boot
/dev/sdb1 9.8G 23M 9.2G 1% /test

——————————————————————

ディスクの空き容量は十分です。

——————————————————————

[root@mnakamura ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)

——————————————————————

OSはCentOS6です。
今回はソースコードではなくパッケージから導入しますが、
NginxはCentOSの標準リポジトリからは提供されておりません。

ですので、まずはNginxの公式からリポジトリをインストールします。

——————————————————————————————————————————————————————————————————
[root@mnakamura ~]# yum localinstall http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
読み込んだプラグイン:fastestmirror
ローカルパッケージ処理の設定をしています
nginx-release-centos-6-0.el6.ngx.noarch.rpm | 4.2 kB 00:00
/var/tmp/yum-root-xENcvM/nginx-release-centos-6-0.el6.ngx.noarch.rpm を調べています: nginx-release-centos-6-0.el6.ngx.noarch
/var/tmp/yum-root-xENcvM/nginx-release-centos-6-0.el6.ngx.noarch.rpm をインストール済みとして設定しています
Determining fastest mirrors
* base: ftp.yz.yamagata-u.ac.jp
* extras: ftp.yz.yamagata-u.ac.jp
* updates: ftp.yz.yamagata-u.ac.jp
base | 3.7 kB 00:00
base/primary_db | 4.7 MB 00:00
extras | 3.4 kB 00:00
extras/primary_db | 25 kB 00:00
updates | 3.3 kB 00:00
updates/primary_db | 12 kB 00:00
zabbix | 2.9 kB 00:00
zabbix/primary_db | 135 kB 00:00
zabbix-non-supported | 951 B 00:00
依存性の解決をしています
–> トランザクションの確認を実行しています。
—> Package nginx-release-centos.noarch 0:6-0.el6.ngx will be インストール
–> 依存性解決を終了しました。

依存性を解決しました

========================================================================================================================================================================
パッケージ アーキテクチャ バージョン リポジトリー 容量
========================================================================================================================================================================
インストールしています:
nginx-release-centos noarch 6-0.el6.ngx /nginx-release-centos-6-0.el6.ngx.noarch 1.5 k

トランザクションの要約
========================================================================================================================================================================
インストール 1 パッケージ

合計容量: 1.5 k
インストール済み容量: 1.5 k
これでいいですか? [y/N]y
パッケージをダウンロードしています:
rpm_check_debug を実行しています
トランザクションのテストを実行しています
トランザクションのテストを成功しました
トランザクションを実行しています
インストールしています : nginx-release-centos-6-0.el6.ngx.noarch 1/1
Verifying : nginx-release-centos-6-0.el6.ngx.noarch 1/1

インストール:
nginx-release-centos.noarch 0:6-0.el6.ngx

完了しました!
——————————————————————————————————————————————————————————————————

リポジトリをインストール出来たので、Nginxをインストールします。

——————————————————————————————————————————————————————————————————

[root@mnakamura ~]# yum install nginx
読み込んだプラグイン:fastestmirror
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
* base: ftp.yz.yamagata-u.ac.jp
* extras: ftp.yz.yamagata-u.ac.jp
* updates: ftp.yz.yamagata-u.ac.jp
nginx | 2.9 kB 00:00
nginx/primary_db | 37 kB 00:00
依存性の解決をしています
–> トランザクションの確認を実行しています。
—> Package nginx.x86_64 0:1.14.0-1.el6.ngx will be インストール
–> 依存性解決を終了しました。

依存性を解決しました

========================================================================================================================================================================
パッケージ アーキテクチャ バージョン リポジトリー 容量
========================================================================================================================================================================
インストールしています:
nginx x86_64 1.14.0-1.el6.ngx nginx 956 k

トランザクションの要約
========================================================================================================================================================================
インストール 1 パッケージ

総ダウンロード容量: 956 k
インストール済み容量: 2.6 M
これでいいですか? [y/N]y
パッケージをダウンロードしています:
nginx-1.14.0-1.el6.ngx.x86_64.rpm | 956 kB 00:10
rpm_check_debug を実行しています
トランザクションのテストを実行しています
トランザクションのテストを成功しました
トランザクションを実行しています
インストールしています : nginx-1.14.0-1.el6.ngx.x86_64 1/1
———————————————————————-

Thanks for using nginx!

Please find the official documentation for nginx here:
* http://nginx.org/en/docs/

Please subscribe to nginx-announce mailing list to get
the most important news about nginx:
* http://nginx.org/en/support.html

Commercial subscriptions for nginx are available on:
* http://nginx.com/products/

———————————————————————-
Verifying : nginx-1.14.0-1.el6.ngx.x86_64 1/1

インストール:
nginx.x86_64 0:1.14.0-1.el6.ngx

完了しました!

——————————————————————————————————————————————————————————————————

インストールが完了。この状態でステータスを確認してみましょう。
デフォルトでは止まっていますね。構文には問題がありません。

———————————————————————-

[root@mnakamura ~]# /etc/init.d/nginx status
nginx は停止しています

[root@mnakamura ~]# /etc/init.d/nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@mnakamura ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

———————————————————————-

次に設定ファイルを確認してみましょう。
色々と記述されていますね。

———————————————————————-

[root@mnakamura ~]# cat /etc/nginx/nginx.conf

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

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 /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}

———————————————————————-

例えば、アクセスやエラーのログはここに配置されています。

———————————————————————-

[root@mnakamura ~]# ll /var/log/nginx/
合計 0
-rw-r—– 1 nginx adm 0 7月 6 17:53 2018 access.log
-rw-r—– 1 nginx adm 0 7月 6 17:53 2018 error.log

———————————————————————-

では、とりあえずnginxを起動してみましょう。
netstatコマンドでLISTENしていない事を確認してから実行…

——————————————————————————————————————————————–

[root@mnakamura ~]# netstat -ntpluw | grep nginx
[root@mnakamura ~]#

[root@mnakamura ~]# /etc/init.d/nginx start
nginx を起動中: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
[失敗]

——————————————————————————————————————————————–

…失敗してしまいました。何故でしょう?ここで確認して頂きたいのは、
【nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)】のエラーの出力。
どうやら、既にこのサーバは80番ポートを利用しているようです。netstatコマンドで確認してみましょう。

——————————————————————————————————————————————–

[root@mnakamura ~]# netstat -ntpluw | grep httpd
tcp 0 0 :::80 :::* LISTEN 1435/httpd
tcp 0 0 :::443 :::* LISTEN 1435/httpd

——————————————————————————————————————————————–

予想通り、このサーバでは既にApacheが80番で起動しています。
同じポート番号でWebサービスは起動出来ないので、Nginxを起動する為に、一時的にApacheを停止しましょう。

———————————————————————-

[root@mnakamura ~]# /etc/init.d/httpd status
httpd (pid 1435) を実行中…

[root@mnakamura ~]# /etc/init.d/httpd stop
httpd を停止中: [ OK ]

[root@mnakamura ~]# /etc/init.d/httpd status
httpd は停止しています

[root@mnakamura ~]# netstat -ntpluw | grep httpd
[root@mnakamura ~]#

———————————————————————-

Apacheが停止した事を確認出来ました。
では今度こそ、Nginxを起動します。

——————————————————————————————————————————————–

[root@mnakamura ~]# /etc/init.d/nginx start
nginx を起動中: [ OK ]

[root@mnakamura ~]# netstat -ntpluw | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 20296/nginx

[root@mnakamura ~]# cat /var/run/nginx.pid
20296

[root@mnakamura ~]# ps aux | grep nginx
root 20296 0.0 0.1 47324 1068 ? Ss 18:03 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 20298 0.0 0.2 47724 2136 ? S 18:03 0:00 nginx: worker process
root 20384 0.0 0.0 103336 920 pts/0 S+ 18:06 0:00 grep nginx

——————————————————————————————————————————————–

無事、起動に成功しました。さてここで、起動したプロセスを確認しますと、
【master process】と【worker process】という記述が見受けられます。
これは一体何なのでしょう?

じつはこれは、Nginxの動作モデルに関係があります。
Nginxは【マスタプロセス】と【ワーカプロセス】というマルチプロセスで動作しており、
これがNginxの強みであるスケーラビリティに関わってきます。

簡単に説明すれば、このワーカプロセスが実際のクライアントからの接続要求等の一連の処理をします。
それに対して、マスタプロセスはワーカプロセスに指示を出します。管理や制御をつかさどっています。

マスタープロセスはワーカプロセスのPIDを把握しています(上記の場合、ワーカプロセスのIDは20298)ので、
例えば設定を変更してNginxを再起動したい場合等は、まずマスタプロセスに対して指示を出し、
更にマスタプロセスがワーカプロセスに指示を出す…といった手順で実行されます。

尚、マスタープロセスは1つのみですが、ワーカプロセスは複数起動可能です。
ここでは詳しい説明は省きますが、本来シングルスレッドで動作するワーカプロセスでも、
I/O MultiplexingやノンブロッキングI/O等の機能を備えたNginxは、
複数のクライアントの処理を同時に実施する事が可能なのです。

では試しに、ワーカプロセスの数を増やしてみましょう。

まずは設定ファイルのバックアップを取得しておきます。

——————————————————————————————————————————————–

[root@mnakamura ~]# ll -A /etc/nginx/
合計 40
drwxr-xr-x 2 root root 4096 7月 6 17:53 2018 conf.d
-rw-r–r– 1 root root 1007 4月 18 00:47 2018 fastcgi_params
-rw-r–r– 1 root root 2837 4月 18 00:47 2018 koi-utf
-rw-r–r– 1 root root 2223 4月 18 00:47 2018 koi-win
-rw-r–r– 1 root root 5170 4月 18 00:47 2018 mime.types
lrwxrwxrwx 1 root root 29 7月 6 17:53 2018 modules -> ../../usr/lib64/nginx/modules
-rw-r–r– 1 root root 643 4月 18 00:46 2018 nginx.conf
-rw-r–r– 1 root root 636 4月 18 00:47 2018 scgi_params
-rw-r–r– 1 root root 664 4月 18 00:47 2018 uwsgi_params
-rw-r–r– 1 root root 3610 4月 18 00:47 2018 win-utf

[root@mnakamura ~]# cp -ip /etc/nginx/nginx.conf{,.$(date +%Y%m%d)}
[root@mnakamura ~]# ll -A /etc/nginx/ | grep nginx.conf
-rw-r–r– 1 root root 643 4月 18 00:46 2018 nginx.conf
-rw-r–r– 1 root root 643 4月 18 00:46 2018 nginx.conf.20180706

——————————————————————————————————————————————–

続いて、ワーカプロセスのディレクディブを確認し、パラメータを調節します。
今回はデフォルトで1つだったものを、3つにしてみましょう。

——————————————————————————————————————————————–

[root@mnakamura ~]# vi /etc/nginx/nginx.conf
[root@mnakamura ~]# diff /etc/nginx/nginx.conf{,.$(date +%Y%m%d)}
3c3
< worker_processes 3; --- > worker_processes 1;

——————————————————————————————————————————————–

調節が完了したので、Nginxを再読み込み(reload)しましょう。
プロセスを確認してみると、今回は再起動(restart)ではないので、
マスタプロセスのIDが先程の20296から変化していない事が確認出来ます。

——————————————————————————————————————————————–

[root@mnakamura ~]# nginx -s reload

[root@mnakamura ~]# cat /var/run/nginx.pid
20296

[root@mnakamura ~]# ps aux | grep nginx
root 20296 0.0 0.1 47452 1944 ? Ss 18:03 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 20690 0.0 0.2 47856 2172 ? S 18:20 0:00 nginx: worker process
nginx 20691 0.0 0.1 47856 1848 ? S 18:20 0:00 nginx: worker process
nginx 20692 0.0 0.1 47856 1848 ? S 18:20 0:00 nginx: worker process
root 20695 0.0 0.0 103336 916 pts/0 S+ 18:20 0:00 grep nginx

——————————————————————————————————————————————–

上記の通り、ワーカプロセスの数が3つに増加している事が確認出来ました。
尚、【worker_processes auto;】と記述することで、
ワーカプロセス数をCPUのコア数で自動決定出来る機能もあり、
CPUを効率よく使用可能な為よく設定されます。

——————————————————————————————————————————————–

[root@mnakamura ~]# grep -i name /proc/cpuinfo
model name : Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz

[root@mnakamura ~]# vi /etc/nginx/nginx.conf
[root@mnakamura ~]# grep “worker_processes” /etc/nginx/nginx.conf
worker_processes auto;

[root@mnakamura ~]# nginx -s reload

[root@mnakamura ~]# ps aux | grep nginx
root 20296 0.0 0.1 47448 1952 ? Ss Jul06 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 23482 0.0 0.1 47888 1896 ? S 18:22 0:00 nginx: worker process
root 23489 0.0 0.0 103336 920 pts/0 S+ 18:22 0:00 grep nginx

——————————————————————————————————————————————–

この検証サーバではCPUのコアが1つしか存在しない為、
autoに設定してもワーカプロセスは1つですが、
コア数の多いサーバで設定すれば一目瞭然です。

今回は本当に基本的な事だけでしたので、
次の機会にはもう少し踏み込んだ説明をしようかと思います。

では、またの機会に。

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください