RAMから静的コンテンツを提供するようにnginxを構成する方法


11

NginxをWebサーバーとして設定したい。画像ファイルをディスクではなくメモリ(RAM)にキャッシュしたい。私は小さなページを提供しており、常にRAMから提供されるいくつかの画像が必要です。NginxにはコンテンツをRAMにキャッシュする機能があると思うので、これにはVarnish(または他のツール)を使用したくありません。このためにNginxをどのように構成できるかわかりません。いくつかの組み合わせを試しましたが、うまくいきませんでした。Nginxは常にディスクを使用して画像を取得します。

たとえば、次のコマンドでApacheベンチマークをテストしてみました。

ab -c 500 -n 1000 http://localhost/banner.jpg

次のエラーが発生します。

socket: Too many open files (24)

これは、Nginxがディスクから同時に多くのファイルを開こうとしているため、OSがこの操作を許可していないことを意味します。誰でも私に正しい設定を提案できますか?


あなたはほぼ間違いなく間違っていると思っています。また、どこからエラーを取得していますか?
ウォンブル

@womble以下でコメントしているように、問題は並行性である可能性があります。コンテンツがメモリで使用可能になる前に、同時に試行するスレッドが多数あります。なぜ私が間違っていると思いますか?
Vijayendra

回答:


9

静的コンテンツの場合、nginxではなくOSによってデフォルトでメモリにキャッシュされます(メモリが残っていない場合を除く)。ディスク側に残されるのはstat()だけです。

100%のメモリソリューションが必要な場合は、ramdiskを構成してそこからデータを提供できます。


はい、コンテンツがOSによってメモリにキャッシュされることを理解しています。ただし、ファイルはメモリ内ですでに使用可能であることが前提です。問題は並行性である可能性があります。コンテンツがメモリから利用可能になる前に、同時に試行するスレッドが多数あります。どう思いますか?
Vijayendra

1
これは、リクエストの数が瞬時に0から500になる場合にのみ問題になります。ファイルが読み込まれると、メモリが必要になるまでそこに保存されます(メモリがいっぱいで新しいファイルが必要な場合は、最後に使用されたファイルがキャッシュから削除されます)キャッシュされます)。実生活でそのようなことが起こる確率は誰にもほんのわずかです。それが本当のリスクであると確信している場合は、代わりにramdiskソリューションを使用してください。再起動するたびにramdiskのデータを必ず復元してください。ramdiskは、定義上、永続的なストレージではありません。
c2h5oh

わかりました、私はramdiskを試してみて、それがどのように機能するかを見ていきます。フィードバックをお寄せいただきありがとうございます。
Vijayendra

9

サーバーがディスクからファイルを読み取ると、そのファイルはRAMにキャッシュされます(RAMがなくなった場合は別のファイルに置き換えられます)。問題はアカウントの制限にあり、あまり多くのファイルを開くことができません( 'ulimit -a'を実行)、

この制限を変更したい場合-/etc/security/limits.confをお読みください


1
私のシステムでは256の制限があるため、ファイルのオープン制限は問題でした。しかし、ディスクではなくメモリからファイルを読み取るようにNginxを構成する方法を理解する必要があります。オープンファイルの制限を変更したくなく、後続のリクエストでキャッシュの使用を実現したい。
Vijayendra

4
「開いているファイルの制限を変更したくない」-あなたはそれを間違っています。ああ、とても、とても間違っています。
ウォンブル

3
@womble問題を解決するために理解している最も簡単な解決策は、制限を変更することです。この制限を変更したくない理由は、制限を変更せずに構成で実行できる最善の方法を確認するためです。キャッシングと構成の他のいくつかの側面を変更することで、物事を改善できると思います。ところで、誰かが間違っている理由を主張しながら、理由/提案を教えてください。あなたの最初のコメントでさえ、あなたは何の理由もなくこれをしました。ここは専門的な提案をする場所です。Facebookの壁として扱うのをやめてください。
Vijayendra

7

これが本当に古いのはわかっていますが、ここにいきます。

  1. Nginxはそのままではメモリキャッシュを実行しません。これについてはmemcacheを確認する必要があります。これにはopenrestyパックをお勧めします:http://openresty.org/。あなたが箱から出して何をするか(上記で答えられたようにページキャッシュです)
  2. そのエラーメッセージは、ほぼ間違いなく、nginxからではなくabからのものです。ファイル制限のnginxエラーは、「失敗(24:開いているファイルが多すぎます)」のようになります。UNIXではソケットもファイルであることを忘れないでください。そのため、abを実行しているユーザーの場合、abを実行するには、そのセッションのulimitを調整する必要があります。あなたの制限は256であると言ったので、500接続を使用するようabに要求しています。これはあなたの制限を使い果たしています。

Ben Whitakerは正しかった、問題はabから来た、それは(linux osで)500ソケット<=>ファイルを作成しようとする。
バッハデン

2

RAMにキャッシュされたファイルはまだファイルです!

代わりにNginxのMemcachedキャッシュモジュールを使用してみてください。しかし、それでも1000の同時接続は巨大です、あなたはあなたのケースだと思いますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.