ハイパフォーマンス・サーバーNginxを使いましょう。①インストールと主な設定②Djangoとの連携③PHPの導入ーなどを予定しています。
まずは、Nginxの特長について、日本の公式サイト?から引用させていただきます。
=====================================================
Nginxt(えんじんえっくす)は無料で利用できるオープンソースのハイパフォーマンスHTTPサーバ且つリバースプロキシで、IMAP/POP3のプロキシサーバとしても動作します。Igor Sysoevによって2002年に開発が始まり、2004年に最初のバージョンが公開されました。今では世界中のドメインのおよそ12.18% (22.2M)のWebサイトをNginxが稼働させています。 Nginxはその高いパフォーマンスと安定性、豊富な機能、設定の容易さ、消費リソースの低さで知られています。
NginxはC10K問題に取り組むべく開発された一握りのサーバのうちの一つです。従来のサーバとは異なり、Nginxはリクエストの処理をスレッドに依存していません。その代わりにもっとスケーラブルな(非同期の)イベント駆動アーキテクチャを使用しています。このアーキテクチャはメモリ使用量が少ないだけでなく、最も重要な事として、稼働時のメモリ使用量が予測可能であるということです。
同時リクエスト数が1万リクエストもなかったとしても、Nginxのハイパフォーマンスやメモリ消費量の少なさの恩恵を受ける事はできるでしょう。Nginx は小規模な VPS から大規模なサーバからなるクラスタまで対応する拡張性を備えています。
Nginxは Netflixや Hulu, Pinterest, CloudFlare, Airbnb, WordPress.com, GitHub, SoundCloud, Zynga, Eventbrite, Zappos, Media Temple, Heroku,RightScale, Engine Yard, NetDNA , Aiguarentacar といった知名度の高いサイトを稼働させています。
=====================================================
Ubuntu14.04LTSではnginxがaptでダウンロードできますが、バージョンが1.4.6と古いので最新の安定バージョンをインストールできるようにリポジトリを追加します。なお、python-sofware-properiesなるものを入れると、リポジトリ管理に役立つそうです。なので、
sudo apt-get install python-software-properties sudo add-apt-repository ppa:nginx/stable sudo apt-get update sudo apt-get install nginx
とすると、最新版(現時点で1.6.0)のスタンダードバージョンがインストールできます。sudo synapticでnginxを検索すると、nginx1.6がインストールされていることが分かりますが、lightバージョン、extendバージョンもインストールできるようです。
それで、インストールできますと設定ファイルは/etc/nginx以下にインストールされます。
michiaki@ubuntu01:~$ tree /etc/nginx /etc/nginx ├── conf.d ├── fastcgi_params ├── koi-utf ├── koi-win ├── mime.types ├── naxsi-ui.conf.1.4.1 ├── naxsi.rules ├── naxsi_core.rules ├── nginx.conf ├── proxy_params ├── scgi_params ├── sites-available │ ├── default │ ├── default~ │ └── original │ └── default ├── sites-enabled │ └── default -> /etc/nginx/sites-available/default ├── uwsgi_params └── win-utf
このうち、/etc/nginx/nginx.confがメインの設定ファイル。/etc/nginx/sites-available/defaultがバーチャルホストを設定するためのファイルとなります。server { }で、ひとつのバーチャルホストの設定ができます。そして、いくつかのバーチャルホストの設定をdefaultに記述、保存した後、基本的には、Apacheと同じようにそのシンボリックファイルを/etc/nginx/sites-enableに作って、sudo service nginx restartとすると、設定が反映されます。
デフォルトのdefault設定ファイルは、
# You may add here your # server { # ... # } # statements for each of your virtual hosts to this file ## # You should look at the following URL's in order to grasp a solid understanding # of Nginx configuration files in order to fully unleash the power of Nginx. # http://wiki.nginx.org/Pitfalls # http://wiki.nginx.org/QuickStart # http://wiki.nginx.org/Configuration # # Generally, you will want to move this file somewhere, and start with a clean # file but keep this around for reference. Or just disable in sites-enabled. # # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. ## server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; # root /usr/share/nginx/html; root /var/www/html; index index.html index.htm; # Make site accessible from http://localhost/ server_name localhost; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules } # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests #location /RequestDenied { # proxy_pass http://127.0.0.1:8080; #} #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 /usr/share/nginx/html; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include /etc/nginx/fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # root html; # index index.html index.htm; # # location / { # try_files $uri $uri/ =404; # } #} # HTTPS server # #server { # listen 443; # server_name localhost; # # root html; # index index.html index.htm; # # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # # ssl_session_timeout 5m; # # ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; # ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES"; # ssl_prefer_server_ciphers on; # # location / { # try_files $uri $uri/ =404; # } #}
となっていますので、80番ポートでクライアントからのリクエストを受け付けます。ということで、Apacheが動いていると恐らく起動しません。/etc/apache2/ports.confでポート番号を10000ぐらいに変更して再起動しておく必要があります。とやっても余り意味がないので、aptでインストールできるデーモン起動設定システムのsysv-rc-confで、sudo sysv-rc-confを使ってApacheを起動しない設定にしておくとか。
これで、例えばApacheのindex.htmlを少し加工すると、次のようにHTTPサーバーとして動いてくれます。
Apacheをインストールしていなければ、Nginx用の/usr/share/nginx/html/index.htmlがブラウザに表示されるはずです(下図)。defaultを見れば、大体の設定の仕方が分かりますが、Nginxは残念ながら.htaccess(アクセスコントロールファイル)をサポートしていません。ただし、defaultファイルでif文、正規表現をサポートしていますので、こちらを使って同等の機能をサポートしています。
NginxはFastGGI(Webアプリケーションとアプリケーションサーバーの間のインターフェース)を使って静的なWebサーバーをアプリケーションサーバー化しますので、PHPを動作させるためにはPHP-FPM (FastCGI Process Manager)をインストールする必要があります。また、Pythonを使ったWebアプリケーションを動作させるためにはWSGI(Pythonで書かれたWebアプリケーションとアプリケーションサーバーの間のインターフェースを規定した仕様)の拡張仕様であるuWSGIをインストールしておけば、開発サーバーで作ったWebアプリケーションを楽々デプロイできます。
次回はPHP-FPMをインストールして、defaultを設定して、LNMPを構築。試しにWordpressをインストールしてみます。その次に、uWSGIをインストールしてdefaultを設定、Djangoの本家サイトにある例題の投票システムをNginxにデプロイする方法を記してみます。それから、Nginxのリバースプロキシ機能を使った負荷分散システムのさわりをかじって見たいと思います。