Como configurar o nginx para servir conteúdo estático da RAM?

11

Quero configurar o Nginx como meu servidor da web. Quero ter arquivos de imagem armazenados em cache na memória (RAM), em vez de no disco. Estou servindo uma página pequena e quero algumas imagens sempre veiculadas na RAM. Não desejo usar o Varnish (ou quaisquer outras ferramentas) para isso, pois acredito que o Nginx tem a capacidade de armazenar em cache o conteúdo na RAM. Não tenho certeza de como posso configurar o Nginx para isso? Eu tentei algumas combinações, mas elas não funcionaram. O Nginx usa disco o tempo todo para obter as imagens.

Por exemplo, quando tentei o benchmark do Apache para testar com o seguinte comando:

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

Eu obtenho o seguinte erro:

socket: Too many open files (24)

Acho que isso significa que o Nginx está tentando abrir muitos arquivos simultaneamente do disco e o sistema operacional não está permitindo essa operação. Alguém pode me sugerir uma configuração correta?

Vijayendra
fonte
Você quase certamente está adivinhando errado. Além disso, de onde você está recebendo o erro?
Womble
@ womble Como comento abaixo, o problema pode ser simultâneo. Existem muitos threads tentando simultaneamente antes que o conteúdo esteja disponível na memória. Pode explicar por que acho que estou errado?
Vijayendra

Respostas:

9

Se for um conteúdo estático, ele será armazenado em cache na memória por padrão (a menos que não haja mais memória), apenas não pelo nginx, mas pelo sistema operacional - tudo o que restará no lado do disco será stat ().

Se você deseja uma solução com 100% de memória, basta configurar o ramdisk e fornecer dados a partir daí.

c2h5oh
fonte
Sim, entendo que o conteúdo é armazenado em cache na memória pelo SO. Mas a suposição é que o arquivo já está disponível na memória. O problema pode ser simultâneo. Existem muitos threads tentando simultaneamente antes que o conteúdo esteja disponível na memória. O que você acha?
Vijayendra
1
Isso é apenas um problema se o número de solicitações for de 0 a 500 em um instante - depois que o arquivo for lido, ele será armazenado até a memória ser necessária (o arquivo usado menos recentemente será removido do cache se a memória estiver cheia e o novo arquivo precisar em cache). As probabilidades de isso acontecer na vida real são quase nulas. Se você tiver certeza de que é um risco real, use a solução ramdisk, apenas restaure os dados no ramdisk após cada reinicialização - o ramdisk não é um armazenamento persistente por definição.
C2h5oh 11/06/12
Ok, vou tentar o ramdisk e ver como isso funciona. Obrigado pelo feedback.
21712 Vijayendra
9

Depois que o servidor ler um arquivo do disco, ele será armazenado em cache no RAM (e será substituído por um arquivo diferente se você estiver fora do RAM), o problema está no limite da sua conta, e você não poderá abrir tantos arquivos ( execute 'ulimit -a'),

Se você deseja alterar esse limite - leia sobre /etc/security/limits.conf

Avi Keinan
fonte
1
Você está certo, o limite de arquivo aberto foi um problema, pois o limite é de 256 no meu sistema. Mas ainda preciso descobrir como configurar o Nginx para ler arquivos da memória e não do disco. Não desejo alterar meu limite de arquivo aberto e, em vez disso, desejo obter o uso de cache para solicitações subsequentes.
21712 Vijayendra
4
"Não desejo alterar meu limite de arquivo aberto" - você está fazendo errado. Oh, muito, muito errado.
Womble
3
@ womble Entendo que para resolver o problema, a solução mais fácil é alterar o limite. O motivo de eu não querer alterar esse limite é ver o que posso fazer com a configuração sem alterar o limite. Eu acho que posso melhorar as coisas alterando alguns outros aspectos do cache e da configuração. A propósito, você pode dar-lhe razões / sugestões enquanto afirma por que alguém está errado. Mesmo em seu primeiro comentário, você fez isso sem fornecer nenhum motivo. Este é um lugar para sugestões profissionais. Pare de tratá-lo como seu mural do facebook.
precisa
7

Então eu sei que isso é muito antigo, mas aqui vai.

  1. O Nginx não faz cache de memória pronto para uso, você deve procurar no memcache isso, eu recomendaria o pacote openresty para isso: http://openresty.org/. O que você obtém da caixa (como foi respondido acima é o cache da página)
  2. Essa mensagem de erro, tenho quase certeza, é de ab, não de nginx, os erros de nginx para limites de arquivo são parecidos com "isso falhou (24: Muitos arquivos abertos)". Lembre-se de que nos soquetes unix também existem arquivos; portanto, para o usuário que você está executando o ab as, precisa ter seu ulimit ajustado para que a sessão execute o ab. Como você disse que seu limite era 256, você está pedindo a ab para usar 500 conexões, isso está atingindo o limite máximo.
Ben Whitaker
fonte
Ben Whitaker estava certo, o problema veio de ab, que tenta criar 500 arquivos de soquetes <=> (no linux os).
bachden
2

Um arquivo em cache na RAM ainda é um arquivo!

Tente usar o módulo de cache Memcached do Nginx. Ainda assim, 1000 conexões simultâneas são enormes, você acha que é o seu caso?

Thomas Decaux
fonte