ネットワーク > Webサーバー > Nginx

Nginxとは?

Nginxは、最近人気のWebサーバソフトです。Apacheの代わりに使われだしています。

nginx - Wikipedia

nginx(「エンジンエックス」と発音) は、軽量高性能なWebサーバ/リバースプロキシであり、同時に電子メール(IMAP/POP3)プロキシである。BSD系ライセンスでリリースされている。Unix系、Linux、BSD系、Mac OS X、Solaris、Microsoft Windows(Cygwinを使用)で動作する。

リンク

参考書

#html{{

table border="0" cellpadding="5"><tr><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4048702270/vertex9-22/" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51xpswg%2BkkL._SL160_.jpg" border="0"></a></td><td> </td><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4048702270/vertex9-22/" target="_blank">ハイパフォーマンスHTTPサーバ Nginx入門</a><br>Clement Nedelcu<br>アスキー・メディアワークス<br>2011-04-21<br>¥ 3240</td></tr></table>
}}

インストール

Nginxを、CentOSに、ソースコードからコンパイルして、手動でインストールする手順のまとめ

(参考)

ダウンロード

Nginx最新安定版(stable)を公式サイトからダウンロードします。

  1. Nginx最新安定版のバージョンを公式サイトで確認します。
    http://nginx.org/en/download.html
    (例) Stable version nginx-1.2.6
  2. 作業ディレクトリ(tmp)に移動します。
    $ cd /tmp
  3. 圧縮ファイルをダウンロードします。
    $ wget http://nginx.org/download/nginx-1.2.6.tar.gz
    (wgetコマンドがインストールされていない場合は、「sudo yum install wget」)
  4. ダウンロードしたファイルを解凍します。
    $ tar zxf nginx-1.2.6.tar.gz
  5. カレントディレクトリを移動します。
    $ cd nginx-1.2.6

コンパイル

  1. Nginx用のユーザーを作成します。
    $ sudo useradd -s/sbin/nologin -d/usr/local/nginx -M nginx
  2. Nginxに必要なライブラリをインストールします。
    (例では、必須ライブラリの他にHTTPSのコンテンツを処理するOpenSSLライブラリもインストールしています。)
    $ sudo yum install gcc
    $ sudo yum install pcre pcre-devel
    $ sudo yum install zlib zlib-devel
    $ sudo yum install openssl openssl-devel
  3. 使用するオプションを付けてconfigureを実行します。
    $ ./configure --prefix=/usr/local/nginx-1.2.6 --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module
  4. コンパイルして、インストールします。
    $ make
    $ sudo make install

シンボリックリンクの作成

  1. Nginxをバージョンアップするごとに異なるprefixを指定するので、変更をやりやすくするために、prefixのディレクトリを指すシンボリックリンクを作成します。
    ln -s /usr/local/nginx-1.2.6 /usr/local/nginx

自動起動スクリプト

Nginxをソースからインストールした場合は、起動スクリプトが作成されないので自作します。

  1. /etc/init.dにnginxのプログラム起動スクリプトのファイルを作成します。
    # vi /etc/init.d/nginx
  2. ファイル内容は、以下のようにします。
    #!/bin/sh
    #
    # nginx - this script starts and stops the nginx daemon
    # cf. http://www.happytrap.jp/blogs/2012/02/23/8243/
    #
    # chkconfig:   - 85 15
    # description:  Nginx is an HTTP(S) server, HTTP(S) reverse
    #               proxy and IMAP/POP3 proxy server
    # processname: nginx
    
    # Source function library.
    . /etc/rc.d/init.d/functions
    
    # Source networking configuration.
    . /etc/sysconfig/network
    
    # Check that networking is up.
    [ "$NETWORKING" = "no" ] && exit 0
    
    nginx="/usr/local/nginx/sbin/nginx"
    prog=$(basename $nginx)
    
    NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
    
    lockfile=/usr/local/nginx/logs/nginx.lock
    
    start() {
        [ -x $nginx ] || exit 5
        [ -f $NGINX_CONF_FILE ] || exit 6
        echo -n $"Starting $prog: "
        daemon $nginx -c $NGINX_CONF_FILE
        retval=$?
        echo
        [ $retval -eq 0 ] && touch $lockfile
        return $retval
    }
    
    stop() {
        echo -n $"Stopping $prog: "
        killproc $prog -QUIT
        retval=$?
        echo
        [ $retval -eq 0 ] && rm -f $lockfile
        return $retval
    }
    
    restart() {
        configtest || return $?
        stop
        sleep 1
        start
    }
    
    reload() {
        configtest || return $?
        echo -n $"Reloading $prog: "
        killproc $nginx -HUP
        RETVAL=$?
        echo
    }
    
    force_reload() {
        restart
    }
    
    configtest() {
        $nginx -t -c $NGINX_CONF_FILE
    }
    
    rh_status() {
        status $prog
    }
    
    rh_status_q() {
        rh_status >/dev/null 2>&1
    }
    
    case "$1" in
        start)
            rh_status_q && exit 0
            $1
            ;;
        stop)
            rh_status_q || exit 0
            $1
            ;;
        restart|configtest)
            $1
            ;;
        reload)
            rh_status_q || exit 7
            $1
            ;;
        force-reload)
            force_reload
            ;;
        status)
            rh_status
        ;;
        condrestart|try-restart)
            rh_status_q || exit 0
                ;;
        *)
            echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
            exit 2
    esac
  3. 起動スクリプトに実行権限を付与します。
    $ sudo chmod +x /etc/init.d/nginx 
  4. 自動起動の設定をします。
    $ sudo chkconfig --add nginx
    $ sudo chkconfig nginx on
    これで、serviceコマンドでも起動・終了・再起動が実行できるようになります。
  5. 自動起動の設定(ランレベル)を確認します。
    $ sudo chkconfig --list nginx
    これで、
    nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
    と表示されたらOKです。

基本操作

バーチャルホストの設定

バーチャルホスト設定ファイルの置き場を作る
バーチャルホストの設定は、nginx のインストールディレクトリにある nginx.conf に記述する。
このファイルに各ドメインの設定をそのままベタ書きしてもいいのだけど、そうすると管理が煩わしくなるので、ドメインごとに設定ファイルを作り、nginx.conf から読み込ませるようにする。
 
まず、nginxのインストールディレクトリにドメイン毎の設定ファイルを収めるディレクトリを作る。

sudo mkdir /usr/local/nginx/sites-available
sudo mkdir /usr/local/nginx/sites-enabled

Apache2 風の構成。
sites-available にドメイン毎の設定ファイルを置き、sites-enabled からシンボリックリンクを張り、nginx.conf からは sites-enabled を読み込ませるようにする。
こういうふうにしておくメリットは、いくつかある。
 
・バーチャルホストの使用/不使用を簡単に切り替えられる。
・あるドメインの利用を一時的に止めるときは、単にシンボリックリンクを削除するだけで済むし、再開するときはリンクを作り直すだけでいい。
・あるドメインが別のサーバに引越す際に、設定ファイルをそのまま持ち越せる。
・ドメイン毎に設定ファイルが分かれているため、編集失敗の影響が他に及びにくい。
 
ディレクトリを作ったら、nginx.conf の httpセクションに次の1行を加える。 

include /usr/local/nginx/sites-enabled/*;

記述場所は、33行目の「#gzip on;」の後あたりが分かりやすい。(serverセクションの中に入れてはいけない。)

なるほど~!(・∀・)

  1. Ubuntu+Apache2風のフォルダを用意して、バーチャルホストの設定ファイルの置き場所にする。
  2. バーチャルホストの設定(「server」セクションの部分)を、別ファイルに切り出して置く。
  3. シンボリックリンクで、バーチャルホストの稼動状態を切り替える。

バーチャルホストの数が少なくて、手動で管理するなら、この手法で十分でしょう。
(=もっと多くなったら、RDBを使って管理した方が良い?)

上記の方法をちょっと手直しするなら、自分の環境だと、「/usr/local/nginx」自体がシンボリックリンクになっているので、バーチャルホストの設定ファイル置き場は、「home」ディレクトリーに「nginx」というユーザーのディレクトリーを作り、そこの置くとかが良いかな?

# cd /home
# mkdir nginx
# chown nginx:nginx nginx
# chmod 0700 nginx
# ls -la
drwx------   2 nginx  nginx  4096 Jul 14 15:06 nginx
# mkdir /home/nginx/conf/sites-available
# mkdir /home/nginx/conf/sites-enabled
# vi /usr/local/nginx/conf/nginx.conf
include /home/nginx/conf/sites-enabled/*;

というかんじでOK。

バーチャルホストの設定ファイルを手動で管理

(Linuxコマンドの復習)

作業例

(1) サブドメインの設定ファイルを作成

$ su ← サーバー管理者になる
$ cd /home/nginx/conf/sites-available
$ cp virtualhost_template.conf virtualhost_subdomain.conf ← テンプレートをコピーする
$ chown nginx:nginx virtualhost_subdomain.conf ← 属性を変更する
$ vi virtualhost_subdomain.conf ← 設定ファイルの中身を編集する

(2) シンボリックリンクを作成

ln -s リンク元 リンク先

$ ln -s /home/nginx/conf/sites-available/virtualhost_subdomain.conf /home/nginx/conf/sites-enabled/virtualhost_subdomain.conf

(3) ディレクトリーの作成 [#z2d02504 Gateway Time-out が出た際は Elastic Load Balancing の設定にも注意しよう - Qiita http://qiita.com/kotarella1110/items/169ddcef03983f5d64b2927]

$ cd /…/public_html/ ←Web用の公開ディレクトリーへ移動
$ mkdir subdomain
$ chown nginx:nginx subdomain ← subdomainを利用する作業用ユーザー名(例:nginx)に合わせる

(4) Nginxを再起動

$ service nginx configtest ← 設定ファイルの文法チェック(念のため。エラー出たら中身を確認)
$ service nginx restart ← 再起動

504 Gateway Time-out の解決策

Nginxの設定ファイルを編集して、serverセクションにあるfastcgi_read_timeoutの秒数を増やせば、504 Gateway Time-outが解決するみたいです。

  1. サーバー側の処理時間がやけに長いなーと思って確認したら、MySQLで処理が重たい所があった!
  2. 根本的にはMySQLのインデックスをチューンナップしたりしないといけない。→EXPLAINでINDEXの効果を確認する。
  3. 欲張って、余計なINDEXを張っていたら、INSERT時にINDEXデータの追加で時間を食っていたみたい?

(参考)

解決方法
結論的にはNginxの設定ファイルでserverセクションに fastcgi_read_timeout 1000; とか追記したら行けるようになりました。

→1000秒(16分40秒)もかかる処理って、どんだけwww

server {
	listen       80;
	server_name  example.com;
	access_log   /var/log/nginx/access.log main;
	error_log    /var/log/nginx/error.log info;
	root         /var/www/nginx;

	# デフォルト 60秒を120秒までアップします。
	fastcgi_read_timeout 120;  
	...
}
最初に試してほしい対処法は処理の実行時間を延ばすことです。
必要な設定は以下の3つになります。

• php.ini
max_execution_time = 180
 
• php-fpm.conf
request_terminate_timeout 180
 
• nginx.conf
fastcgi_read_timeout 180

単純に解決しない場合は、Nginxの他に、PHPやPHP-FPMの設定など、他の場所も確認する必要もありそうですね。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS