1. nginxのインストール

1.1 安定版の選択

nginxを自分たちのモジュールに合わせてカスタマイズするためにコンパイルインストールします。マシンはCentOS 6.2 x86_64です。まず不足している依存パッケージをインストールします:

# yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel

これらのパッケージがyumにない場合はソースコードをダウンロードしてコンパイルインストールしてもかまいません。ただし、コンパイル時のデフォルトのインストールディレクトリに注意して、後でnginxをインストールする際にこれらのダイナミックライブラリファイルを見つけられるようにしてください(ldconfig)。

nginx 服务器安装及配置文件详解

からhttp://nginx.org/en/download.html安定版のnginx-1.6.3.tar.gzを/usr/local/srcにダウンロードして解凍します。

後続の準備のために、さらに2つのプラグインモジュールをダウンロードします:nginx_upstream_check_module-0.3.0.tar.gz—— バックエンドサーバーの状態をチェックする,nginx-goodies-nginx-sticky-module-ng-bd312d586752.tar.gz(/usr/local/srcで解凍後、ディレクトリをnginx-sticky-module-ng-1.2.5にリネームすることを推奨します)—— バックエンド側で負荷分散session sticky問題を解決します(upstream_checkモジュールと組み合わせて使用する場合は追加のパッチが必要です。参照:nginx負荷分散設定実践)。

プラグインとnginxのバージョン互換性に注意してください。一般的にプラグインは新しいほど良いですが、nginxは最新を追う必要はなく、安定性が第一です。nginx-1.4.7、nginx-sticky-module-1.1、nginx_upstream_check_module-0.2.0、この組み合わせでも問題ありません。sticky-1.1とnginx-1.6の組み合わせは、更新が追いつかずコンパイルエラーになります。(Tengineを直接使用してもかまいません。デフォルトでこれらのモジュールが含まれています)

[root@cachets nginx-1.6.3]# pwd
/usr/local/src/nginx-1.6.3
[root@cachets nginx-1.6.3]# ./configure --prefix=/usr/local/nginx-1.6 --with-pcre /
> --with-http_stub_status_module --with-http_ssl_module /
> --with-http_gzip_static_module --with-http_realip_module /
> --add-module=../nginx_upstream_check_module-0.3.0
[root@cachets nginx-1.6.3]# make && make install

1.2 よく使うコンパイルオプションの説明

nginxのよく使うモジュールのほとんどは、コンパイル時に./configure --helpで–withoutで始まるオプションが表示されますが、これらはデフォルトでインストールされます。

  • –prefix=PATH : nginxのインストールディレクトリを指定します。デフォルトは /usr/local/nginx
  • –conf-path=PATH : nginx.conf設定ファイルのパスを設定します。nginxはコマンドラインの-cオプションで異なる設定ファイルを使用して起動できます。デフォルトはprefix/conf/nginx.conf
  • –user=name: nginxのワーカープロセスのユーザーを設定します。インストール完了後、いつでもnginx.conf設定ファイルのuserディレクティブで変更できます。デフォルトのユーザー名はnobodyです。–group=nameも同様です。
  • –with-pcre : PCREライブラリのソースパスを設定します。すでにyumでインストールしている場合は、–with-pcreを使用するとライブラリファイルを自動的に見つけます。–with-pcre=PATHを使用する場合、PCREのWebサイトからpcreライブラリのソースコード(バージョン4.4 – 8.30)をダウンロードして解凍する必要があります。残りはNginxの./configureとmakeに任せます。perl正規表現はlocationディレクティブとngx_http_rewrite_moduleモジュールで使用されます。
  • –with-zlib=PATH : zlib(バージョン1.1.3 – 1.2.5)のソースの解凍ディレクトリを指定します。デフォルトで有効なネットワーク転送圧縮モジュールngx_http_gzip_moduleを使用する際にzlibが必要です。
  • –with-http_ssl_module : httpsプロトコルモジュールを使用します。デフォルトでは、このモジュールはビルドされません。前提としてopensslとopenssl-develがインストールされていること
  • --with-http_stub_status_module : Nginxの現在の状態を監視するために使用します
  • –with-http_realip_module : このモジュールにより、クライアントリクエストヘッダー内のクライアントIPアドレス値(例:X-Real-IP または X-Forwarded-For)を変更できます。その意味は、バックエンドサーバーが元のクライアントのIPアドレスを記録できるようにすることです。
  • –add-module=PATH : nginx-sticky-module-ngやキャッシュモジュールなどのサードパーティ製外部モジュールを追加します。新しいモジュールを追加するたびに再コンパイルする必要があります(Tengineは新しいmoduleを追加する際に再コンパイルが不要です)

さらに別のコンパイル方法を紹介します:

./configure /
> --prefix=/usr /
> --sbin-path=/usr/sbin/nginx /
> --conf-path=/etc/nginx/nginx.conf /
> --error-log-path=/var/log/nginx/error.log /
> --http-log-path=/var/log/nginx/access.log /
> --pid-path=/var/run/nginx/nginx.pid  /
> --lock-path=/var/lock/nginx.lock /   
> --user=nginx /
> --group=nginx /
> --with-http_ssl_module /
> --with-http_stub_status_module /
> --with-http_gzip_static_module /
> --http-client-body-temp-path=/var/tmp/nginx/client/ /
> --http-proxy-temp-path=/var/tmp/nginx/proxy/ /
> --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ /
> --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi /
> --with-pcre=../pcre-7.8
> --with-zlib=../zlib-1.2.3

1.3 nginxの起動と停止

## 检查配置文件是否正确
# /usr/local/nginx-1.6/sbin/nginx -t 
# ./sbin/nginx -V     # 可以看到编译选项
## 启动、关闭
# ./sbin/nginx        # 默认配置文件 conf/nginx.conf,-c 指定
# ./sbin/nginx -s stop
或 pkill nginx
## 重启,不会改变启动时指定的配置文件
# ./sbin/nginx -s reload
或 kill -HUP `cat /usr/local/nginx-1.6/logs/nginx.pid`

もちろん、nginxをシステムサービスとして管理することもできます。nginxスクリプトを/etc/init.d/にダウンロードし、中のパスを修正して実行権限を付与します。

# service nginx {start|stop|status|restart|reload|configtest}

1.4 yumによるインストール

yumでrpmパッケージをインストールするのはコンパイルインストールよりはるかに簡単で、デフォルトで多くのモジュールがインストールされます。しかし欠点として、後からサードパーティ製モジュールをインストールしたい場合、方法がありません。

# vi /etc/yum.repo.d/nginx.repo 
[nginx] 
name=nginx repo 
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ 
gpgcheck=0 
enabled=1

残りはyum install nginxで完了です。yum install nginx-1.6.3で特定のバージョンをインストールすることもできます(前提として、packagesに対応するバージョンがあることを確認してください。デフォルトは最新の安定版です)。

2. nginx.conf設定ファイル

Nginx設定ファイルは主に4つの部分に分かれます:main(グローバル設定)、server(ホスト設定)、upstream(上流サーバー設定、主にリバースプロキシ・負荷分散関連の設定)、location(URLが特定の位置にマッチした後の設定)です。各部分には複数のディレクティブが含まれます。main部分で設定されたディレクティブは他のすべての部分の設定に影響します。server部分のディレクティブは主に仮想ホストのドメイン名、IP、ポートを指定するために使用します。upstreamのディレクティブは一連のバックエンドサーバーを設定し、リバースプロキシとバックエンドサーバーの負荷分散を設定するために使用します。location部分はウェブページの位置(例:ルートディレクトリ"/"、"/images"など)をマッチングするために使用します。それらの関係は次のとおりです:serverはmainを継承し、locationはserverを継承します。upstreamはディレクティブを継承せず、継承もされません。独自の特別なディレクティブを持ち、他の場所で適用する必要はありません。

現在nginxがサポートしているいくつかのディレクティブのコンテキスト:

2.1 一般

以下のnginx.confは、nginxがフロントエンドでリバースプロキシサーバーとして動作する簡単な例です。js、pngなどの静的ファイルを処理し、jspなどの動的リクエストは他のサーバーのtomcatに転送します:

user  www www;
worker_processes  2;
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    use epoll;
    worker_connections  2048;
}
http {
    include       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  logs/access.log  main;
    sendfile        on;
    # tcp_nopush     on;
    keepalive_timeout  65;
  # gzip压缩功能设置
    gzip on;
    gzip_min_length 1k;
    gzip_buffers    4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 6;
    gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;

  # http_proxy 设置
    client_max_body_size   10m;
    client_body_buffer_size   128k;
    proxy_connect_timeout   75;
    proxy_send_timeout   75;
    proxy_read_timeout   75;
    proxy_buffer_size   4k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size   64k;
    proxy_temp_file_write_size  64k;
    proxy_temp_path   /usr/local/nginx/proxy_temp 1 2;
  # 设定负载均衡后台服务器列表 
    upstream  backend  { 
              #ip_hash; 
              server   192.168.10.100:8080 max_fails=2 fail_timeout=30s ;  
              server   192.168.10.101:8080 max_fails=2 fail_timeout=30s ;  
    }
  # 很重要的虚拟主机配置
    server {
        listen       80;
        server_name  itoatest.example.com;
        root   /apps/oaapp;
        charset utf-8;
        access_log  logs/host.access.log  main;
        #对 / 所有做负载均衡+反向代理
        location / {
            root   /apps/oaapp;
            index  index.jsp index.html index.htm;
            proxy_pass        http://backend;  
            proxy_redirect off;
            # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header  Host  $host;
            proxy_set_header  X-Real-IP  $remote_addr;  
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

        }
        #静态文件,nginx自己处理,不去backend请求tomcat
        location  ~* /download/ {  
            root /apps/oa/fs;  

        }
        location ~ .*/.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$   
        {   
            root /apps/oaapp;   
            expires      7d; 
        }
           location /nginx_status {
            stub_status on;
            access_log off;
            allow 192.168.10.0/24;
            deny all;
        }
        location ~ ^/(WEB-INF)/ {   
            deny all;   
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
  ## 其它虚拟主机,server 指令开始
}

2.2 よく使うディレクティブの説明

2.2.1 mainグローバル設定

nginxの実行時における、具体的な業務機能(httpサービスやemailサービスプロキシなど)とは無関係ないくつかのパラメータ、例えばワーカープロセス数、実行時の身分などです。

  • woker_processes 2
    設定ファイルの最上位main部分では、worker役割のワーカープロセスの数を設定します。masterプロセスはリクエストを受け取り、workerに割り当てて処理させます。この数値は簡単にCPUのコア数(grep ^processor /proc/cpuinfo | wc -l)に設定できます。これはauto値にもなります。さらに、sslとgzipを有効にしている場合は、論理CPU数と同じか、場合によっては2倍に設定すべきです。I/O操作を減らせます。nginxサーバーが他のサービスも実行している場合は、適切に減らすことを検討してください。
  • worker_cpu_affinity
    これも記述するのはmain部分です。高並行の状況では、CPUアフィニティを設定することで、複数のCPUコア切り替えによるレジスタ等のコンテキスト再構築による性能損失を低減します。例:worker_cpu_affinity 0001 0010 0100 1000; (4コア)。
  • worker_connections 2048
    記述するのはevents部分です。各workerプロセスが同時に処理(発起)できる最大接続数(クライアントまたはバックエンドのプロキシサーバー間など、すべての接続数を含む)です。nginxがリバースプロキシサーバーとして動作する場合、計算式は 最大接続数 = worker_processes * worker_connections/4 となり、この場合のクライアント最大接続数は1024です。これは状況に応じて8192まで増やしても問題ありませんが、後述のworker_rlimit_nofileを超えてはいけません。nginxがhttpサーバーとして動作する場合、計算式では2で割ります。
  • worker_rlimit_nofile 10240
    記述するのはmain部分です。デフォルトでは設定されておらず、オペレーティングシステムの最大制限65535に制限できます。
  • use epoll
    events部分に記述します。Linuxオペレーティングシステムでは、nginxはデフォルトでepollイベントモデルを使用します。これにより、nginxはLinuxオペレーティングシステム上で非常に高い効率を発揮します。同時にNginxはOpenBSDまたはFreeBSDオペレーティングシステム上で、epollに類似した高効率イベントモデルであるkqueueを採用します。オペレーティングシステムがこれらの高効率モデルをサポートしていない場合にのみselectを使用します。

2.2.2 httpサーバー

httpサービスを提供することに関連するいくつかの設定パラメータです。例:keepaliveを使用するかどうか、gzipで圧縮するかどうかなどです。

  • sendfile on
    高効率ファイル転送モードを有効にします。sendfileディレクティブは、nginxがsendfile関数を呼び出してファイルを出力するかどうかを指定し、ユーザー空間からカーネル空間へのコンテキストスイッチを減らします。通常のアプリケーションでは on に設定します。ダウンロードなどディスクI/Oに高負荷がかかるアプリケーションでは off に設定して、ディスクとネットワークのI/O処理速度のバランスを取り、システムの負荷を下げることができます。
  • keepalive_timeout 65 : 長接続タイムアウト時間。単位は秒。このパラメータは非常に敏感で、ブラウザの種類、バックエンドサーバーのタイムアウト設定、OSの設定などに関係するため、別の記事にできるほどです。長接続で大量の小ファイルをリクエストする場合、接続再確立のオーバーヘッドを減らせますが、大きなファイルのアップロードがある場合、65秒以内にアップロードが完了しないと失敗します。設定時間が長すぎてユーザーが多いと、長時間接続を保持することで大量のリソースを消費します。
  • send_timeout : クライアントへ応答するタイムアウト時間を指定するために使用します。このタイムアウトは2つの接続アクティビティ間の時間に限られます。この時間を超えてクライアントにアクティビティがない場合、Nginxは接続を閉じます。
  • client_max_body_size 10m
    クライアントがリクエストできる最大単一ファイルのバイト数。大きなファイルをアップロードする場合は、その制限値を設定してください。
  • client_body_buffer_size 128k
    バッファがプロキシするクライアントリクエストの最大バイト数。
モジュールhttp_proxy:

このモジュールは、nginxがリバースプロキシサーバーとして機能する機能を実装します。キャッシュ機能も含みます(別参照記事)

  • proxy_connect_timeout 60
    nginxとバックエンドサーバーとの接続タイムアウト時間(プロキシ接続タイムアウト)
  • proxy_read_timeout 60
    接続成功後、バックエンドサーバーとの2つの成功した応答操作間のタイムアウト時間(プロキシ受信タイムアウト)
  • proxy_buffer_size 4k
    プロキシサーバー(nginx)がバックエンドのrealserverからユーザー情報を読み取り、保存するためのバッファサイズを設定します。头デフォルトではproxy_buffersと同じサイズですが、実際にはこのディレクティブの値はもう少し小さく設定できます。
  • proxy_buffers 4 32k
    proxy_buffersバッファ。nginxは単一の接続に対してバックエンドのrealserverからの応答をキャッシュします。応答、Webページの平均が32k以下の場合は、このように設定します。
  • proxy_busy_buffers_size 64k
    高負荷時のバッファサイズ(proxy_buffers*2)
  • proxy_max_temp_file_size
    proxy_buffersがバックエンドサーバーの応答内容を収容できない場合、一部をハードディスクの一時ファイルに保存します。この値は最大一時ファイルサイズを設定するために使用され、デフォルトは1024Mです。これはproxy_cacheとは関係ありません。この値より大きい場合、upstreamサーバーから転送されます。0に設定すると無効になります。
  • proxy_temp_file_write_size 64k
    プロキシされたサーバーの応答を一時ファイルにキャッシュするとき、このオプションは一時ファイルへの書き込みサイズを毎回制限します。proxy_temp_path(コンパイル時に指定可能)でどのディレクトリに書き込むかを指定します。

proxy_pass、proxy_redirectはlocationの部分を参照してください。

モジュールhttp_gzip:
  • gzip on : gzip圧縮出力を有効にし、ネットワーク転送を削減します。
    • gzip_min_length 1k : 圧縮を許可するページの最小バイト数を設定します。ページのバイト数はヘッダーのcontent-lengthから取得します。デフォルト値は20です。1kより大きいバイト数に設定することをお勧めします。1k未満だと圧縮によってかえって大きくなる可能性があります。
    • gzip_buffers 4 16k : gzipの圧縮結果データストリームを格納するためにシステムが取得するキャッシュの単位数を設定します。4 16kは16k単位で、元データサイズに基づいて16k単位の4倍のメモリを確保することを意味します。
    • gzip_http_version 1.0 : HTTPプロトコルのバージョンを識別するために使用します。初期のブラウザはGzip圧縮をサポートしていないため、ユーザーは文字化けを目にすることになります。そのため、初期バージョンをサポートするためにこのオプションが追加されました。Nginxのリバースプロキシを使用していてGzip圧縮も有効にしたい場合、末端の通信はhttp/1.0であるため、1.0に設定してください。
    • gzip_comp_level 6 : gzip圧縮率。1は圧縮率が最小で処理速度が最速、9は圧縮率が最大ですが処理速度が最も遅いです(転送は速いがCPUを比較的消費します)。
    • gzip_types : MIMEタイプに一致するものを圧縮します。指定の有無にかかわらず、"text/html"タイプは常に圧縮されます。
    • gzip_proxied any : Nginxがリバースプロキシとして動作するときに有効です。バックエンドサーバーが返す結果を圧縮するかどうかを決定します。マッチングの前提として、バックエンドサーバーは"Via"を含むヘッダーを返す必要があります。
    • gzip_vary on : HTTPヘッダーに関係します。応答ヘッダーに Vary: Accept-Encoding を追加します。これにより、フロントエンドのキャッシュサーバーがgzip圧縮されたページをキャッシュできるようになります。例えば、Squidを使用してNginxで圧縮されたデータをキャッシュできます。

2.2.3 server仮想ホスト

HTTPサービスは複数の仮想ホストをサポートします。各仮想ホストには対応するserver設定項目があり、その仮想ホストに関連する設定が含まれます。メールサービスのプロキシを提供する場合も、複数のserverを設定できます。各serverはリッスンアドレスまたはポートによって区別されます。

  • listen
    リッスンポート。デフォルトは80。1024未満の場合はrootで起動する必要があります。listen *:80、listen 127.0.0.1:80 などの形式にできます。
  • server_name
    サーバー名。例: localhost、www.example.com。正規表現でマッチングできます。
モジュールhttp_stream

このモジュールは、シンプルなスケジューリングアルゴリズムを使用して、クライアントIPからバックエンドサーバーへの負荷分散を実現します。upstreamの後にはロードバランサーの名前を置き、バックエンドのrealserverは host:port options; の形式で {} 内に構成します。バックエンドのプロキシ対象が1台だけの場合は、proxy_pass に直接記述することもできます。

2.2.4 location

HTTPサービスにおいて、特定のURLに対応する一連の設定項目。

  • root /var/www/html
    サーバーのデフォルトのWebサイトルートディレクトリの場所を定義します。locationのURLがサブディレクトリまたはファイルにマッチする場合、rootはあまり効果がありません。通常はserverディレクティブ内または/の下に置きます。
  • index index.jsp index.html index.htm
    パス下でデフォルトでアクセスするファイル名を定義します。通常はrootに合わせて置きます。
  • proxy_pass http:/backend
    リクエストをbackendで定義されたサーバーリストに転送します。すなわちリバースプロキシで、upstreamロードバランサーに対応します。proxy_pass http://ip:port とすることもできます。
  • proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    これら4つはひとまずこのように設定します。深く追究すると、それぞれが非常に複雑な内容に関係するため、別の記事で解説する予定です。

locationマッチングルールの書き方について、特に重要かつ基礎的と言えます。参考記事:nginxのlocation設定まとめとrewriteルールの書き方;

2.3 その他

2.3.1 アクセス制御 allow/deny

Nginxのアクセス制御モジュールはデフォルトでインストールされ、書き方も非常に簡単です。複数のallow,denyをそれぞれ設定でき、特定のIPまたはIPレンジのアクセスを許可または禁止します。いずれかのルールに一致すると、それ以降のマッチングを停止します。例:

location /nginx-status {
  stub_status on;
  access_log off;
#  auth_basic   "NginxStatus";
#  auth_basic_user_file   /usr/local/nginx-1.6/htpasswd;
  allow 192.168.10.100;
  allow 172.29.73.0/24;
  deny all;
}

また、httpd-develツールのhtpasswdを使用して、アクセスパスにログインパスワードを設定することもよくあります。

# htpasswd -c htpasswd admin
New passwd:
Re-type new password:
Adding password for user admin
# htpasswd htpasswd admin    //修改admin密码
# htpasswd htpasswd sean    //多添加一个认证用户

これでデフォルトでCRYPT暗号化を使用するパスワードファイルが生成されます。上記のnginx-statusの2行のコメントを解除し、nginxを再起動すると有効になります。

2.3.2 ディレクトリ一覧表示 autoindex

Nginxはデフォルトではディレクトリ全体の一覧表示を許可しません。この機能が必要な場合は、nginx.confファイルを開き、location、server、またはhttpセクションにautoindex on; を追加します。また、他の2つのパラメータも追加することをお勧めします:

  • autoindex_exact_size off; デフォルトはonで、ファイルの正確なサイズをbytes単位で表示します。offに変更すると、ファイルのおおよそのサイズをkBまたはMBまたはGB単位で表示します。
  • autoindex_localtime on;
    デフォルトはoffで、表示されるファイル時刻はGMT時間です。onに変更すると、表示されるファイル時刻はファイルのサーバー時間になります。
location /images {
  root   /var/www/nginx-default/images;
  autoindex on;
  autoindex_exact_size off;
  autoindex_localtime on;
}

参考