nginxの動的コンテンツに対して


nginxについて質問させてください。

nginxは静的ページには強いが、以下のページを見ると動的ページは作成できない、.htmlファイルしか実行できないと書かれています。
https://www.saintsouth.net/blog/install-nginx-on
http://blog.jicoman.info/2014/05/nginx_php-fpm/
他に、静的ページはnginx、動的ページは別のサーバとあります。
http://inoshiro.hatenablog.com/entry/20110806/13


自分にはあまり良くメリットが分からないのですが、今の世の中動的ページのないサイトは少ないと思います。
「静的ページはnginx、動的ページは別のサーバ」というのが自分の知識では複雑怪奇な気がします。
動的ページだけを別のサーバに、と言うのはどのようにすれば実現できるのでしょうか?
フレームワークなどを利用する時はnginxは利用できるのかな?と思ったのですが。
Apacheのように1つで全部出来るわけではないのでしょうか?


PHPの場合はPHP-FPMというのを利用しないといけないようです。
自分はPythonを使用していますが、uWSGIを使用すればnginxを使えると考えて良いのでしょうか?
また、その場合でも動的ページは作成できないのでしょうか?

アドバイスいただけたらありがたいです。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2016/01/27 13:38:23
  • 終了:2016/02/01 14:34:06

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4412ベストアンサー獲得回数18032016/01/27 16:00:16

「静的ページはnginx、動的ページは別のサーバ」というのが自分の知識では複雑怪奇な気がします。

「複雑怪奇」というほどでもないです。
Apache では、java を使うときが同じような構成になります。

client
 ↓80 port
Apache
 ↓8080 port
Tomcat

「別のサーバ」というよりは、Nginx が「別のプロセス(別のホストにあっても良い)」と通信をする、という構成です。


動的なページ生成は、CGI という仕組みが最初です。
Apache(に限りません)が、別のプロセスを起動して、その標準出力を取り込んで http のレスポンスとして返します。

ただ、別プロセスを起動する、というのは、割りと処理コストがかかるので Apache と同じプロセス内で処理をしてしまおう、という動きが出てきました。
今どきは、perl とか php なんかは、外部プロセスとして起動するのが珍しいくらいです。

ただ、動的な処理を自プロセス内で動かすと、そちらにリソース(CPU やメモリ)を食われてしまうので、軽いはずの静的なコンテンツを返す方がひっぱられて遅くなってしまう、ということにもつながります。

java の場合は、Apache とは別のプロセスで処理をする、という戦略を取りました。
Apache:java を n:m に組み合わることで、さばかなければいけない処理の性格に応じて、使えるリソースを有効に使える、というメリットがあります。
例えば、静的なコンテンツをほとんど使わなくて、動的なコンテンツの生成が重たい場合には、Apache:java を 1:2 や 1:3 にしたりします。

Apacheのように1つで全部出来るわけではないのでしょうか?

Apache の CGI も mod_cgi というモジュールが処理しています。
本体に同梱はされていますが、「本体とは別のモジュールが処理している」という体裁です。
Apache 本体と mod_cgi が別に配布されていたことがあるかは知らないんですけど、mod_perl や php*_module なんかは最初は(今も?)別配布です。
だからこそ、それらを同梱した XAMPP なんてものがあるわけです。


自分はPythonを使用していますが、uWSGIを使用すればnginxを使えると考えて良いのでしょうか?

uWSGI が Nginx で CGI を使えるようにする仕組みなので、動的なページを作ることができるようになります。

Python なんかは、uWSGI プロセス内のスレッドとして動作させることもできるみたいです。

Example 10: optimizing CGIs (advanced)

You can avoid the overhead of re-running interpreters at each request, loading the interpreter(s) on startup and calling a function in them instead of execve() ing the interpreter itself.

The contrib/cgi_python.c file in the source distribution is a tiny example on how to optimize Python CGI scripts.

Running CGI scripts on uWSGI — uWSGI 2.0 documentation
id:valilian

a-kuma3さん、分かりやすいご回答まことにありがとうございました。
自分がなにか難しく考えすぎていたのかもしれません。
あまりサーバーの所を触ったことがないので理解ができないでおりました。
ありがとうございました。

2016/01/29 10:10:25

その他の回答(1件)

id:a-kuma3 No.1

a-kuma3回答回数4412ベストアンサー獲得回数18032016/01/27 16:00:16ここでベストアンサー

「静的ページはnginx、動的ページは別のサーバ」というのが自分の知識では複雑怪奇な気がします。

「複雑怪奇」というほどでもないです。
Apache では、java を使うときが同じような構成になります。

client
 ↓80 port
Apache
 ↓8080 port
Tomcat

「別のサーバ」というよりは、Nginx が「別のプロセス(別のホストにあっても良い)」と通信をする、という構成です。


動的なページ生成は、CGI という仕組みが最初です。
Apache(に限りません)が、別のプロセスを起動して、その標準出力を取り込んで http のレスポンスとして返します。

ただ、別プロセスを起動する、というのは、割りと処理コストがかかるので Apache と同じプロセス内で処理をしてしまおう、という動きが出てきました。
今どきは、perl とか php なんかは、外部プロセスとして起動するのが珍しいくらいです。

ただ、動的な処理を自プロセス内で動かすと、そちらにリソース(CPU やメモリ)を食われてしまうので、軽いはずの静的なコンテンツを返す方がひっぱられて遅くなってしまう、ということにもつながります。

java の場合は、Apache とは別のプロセスで処理をする、という戦略を取りました。
Apache:java を n:m に組み合わることで、さばかなければいけない処理の性格に応じて、使えるリソースを有効に使える、というメリットがあります。
例えば、静的なコンテンツをほとんど使わなくて、動的なコンテンツの生成が重たい場合には、Apache:java を 1:2 や 1:3 にしたりします。

Apacheのように1つで全部出来るわけではないのでしょうか?

Apache の CGI も mod_cgi というモジュールが処理しています。
本体に同梱はされていますが、「本体とは別のモジュールが処理している」という体裁です。
Apache 本体と mod_cgi が別に配布されていたことがあるかは知らないんですけど、mod_perl や php*_module なんかは最初は(今も?)別配布です。
だからこそ、それらを同梱した XAMPP なんてものがあるわけです。


自分はPythonを使用していますが、uWSGIを使用すればnginxを使えると考えて良いのでしょうか?

uWSGI が Nginx で CGI を使えるようにする仕組みなので、動的なページを作ることができるようになります。

Python なんかは、uWSGI プロセス内のスレッドとして動作させることもできるみたいです。

Example 10: optimizing CGIs (advanced)

You can avoid the overhead of re-running interpreters at each request, loading the interpreter(s) on startup and calling a function in them instead of execve() ing the interpreter itself.

The contrib/cgi_python.c file in the source distribution is a tiny example on how to optimize Python CGI scripts.

Running CGI scripts on uWSGI — uWSGI 2.0 documentation
id:valilian

a-kuma3さん、分かりやすいご回答まことにありがとうございました。
自分がなにか難しく考えすぎていたのかもしれません。
あまりサーバーの所を触ったことがないので理解ができないでおりました。
ありがとうございました。

2016/01/29 10:10:25
id:3124069639@twitter No.2

sugimurase回答回数1ベストアンサー獲得回数02016/01/28 15:20:33

Nginxと動的ページの処理エンジンの関係については a-kuma3 さんのおっしゃるとおりです。今回、たまたま私のページを参照いただいたようなので、追加で「Nginx に uWSGI + Django アプリ を組み込む」についての手順を投稿しました。
参考になれば幸いです。

id:valilian

sugimuraseさん、ありがとうございました。
リンク先の情報を元に試させて頂きます。
こういう情報は本当に助かります。
ありがとうございました。

2016/01/29 10:12:34

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません