RAM에서 정적 컨텐츠를 제공하도록 nginx를 구성하는 방법은 무엇입니까?


11

Nginx를 웹 서버로 설정하고 싶습니다. 이미지 파일을 디스크가 아닌 메모리 (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

@womble 아래에서 언급했듯이 문제는 동시성 일 수 있습니다. 내용이 메모리에서 사용 가능해지기 전에 동시에 많은 스레드가 시도됩니다. 내가 왜 틀렸다고 생각하는지 설명해 주시겠습니까?
Vijayendra

답변:


9

정적 콘텐츠 인 경우 기본적으로 nginx가 아니라 OS에 의해 메모리가 남지 않는 한 기본적으로 메모리에 캐시됩니다. 디스크쪽에 남는 것은 stat ()입니다.

100 % 메모리 솔루션을 원한다면 램 디스크를 구성하고 데이터를 제공 할 수 있습니다.


예, 내용이 OS에 의해 메모리에 캐시된다는 것을 알고 있습니다. 그러나 파일이 이미 메모리에서 사용 가능하다고 가정합니다. 문제는 동시성 일 수 있습니다. 컨텐츠가 메모리에서 사용 가능해지기 전에 동시에 많은 스레드가 시도됩니다. 어떻게 생각해?
Vijayendra

1
요청 수가 즉시 0에서 500으로 갈 경우에만 문제가됩니다. 파일을 읽은 후에는 메모리가 필요할 때까지 저장됩니다 (메모리가 가득 차서 새 파일이 필요한 경우 가장 최근에 사용한 파일이 캐시에서 제거됨) 캐시되어야 함). 실생활에서 일어나는 일의 확률은 누구에게나 슬림합니다. 램 디스크 솔루션을 사용하는 것이 실제 위험이라고 확신하는 경우, 재부팅 할 때마다 램 디스크의 데이터를 복원하십시오. 램 디스크는 정의에 따라 영구 저장 장치가 아닙니다.
c2h5oh

좋아, 나는 램 디스크를 시도하고 그것이 어떻게 작동하는지 볼 것이다. 피드백을 주셔서 감사합니다.
Vijayendra

9

서버가 디스크에서 파일을 읽은 후에는 램에 캐시되고 램이 부족하면 다른 파일로 대체됩니다. 계정 제한에 문제가 있으므로 너무 많은 파일을 열 수 없습니다 ( 'ulimit -a'를 실행)

이 제한을 변경하려면 /etc/security/limits.conf에 대해 읽으십시오.


1
내 시스템에서 제한이 256이므로 열린 파일 제한이 문제였습니다. 그러나 여전히 디스크 대신 메모리에서 파일을 읽도록 Nginx를 구성하는 방법을 알아야합니다. 열린 파일 제한을 변경하고 싶지 않고 차후 요청에 대한 캐시 사용을 원합니다.
Vijayendra

4
"오픈 파일 제한을 변경하고 싶지 않습니다"-잘못하고 있습니다. 아, 아주 아주 틀 렸습니다.
womble

3
@ womble 가장 쉬운 해결책은 한계를 변경하는 것입니다. 이 제한을 변경하지 않으려는 이유는 제한을 변경하지 않고 구성으로 무엇을 할 수 있는지 확인하기위한 것입니다. 캐싱 및 구성의 다른 측면을 변경하여 개선 할 수 있습니다. 그런데 왜 누군가가 틀린지 주장하면서 이유 / 제안을 줄 수 있습니까? 첫 번째 의견에서도 아무런 이유 없이이 작업을 수행했습니다. 전문적인 제안을 할 수있는 곳입니다. 페이스 북 벽으로 취급하지 마십시오.
Vijayendra

7

그래서 나는 이것이 정말로 오래되었다는 것을 알고 있습니다.

  1. Nginx는 기본적으로 메모리 캐싱을 수행하지 않습니다. Memcache를보고 싶을 것입니다. http://openresty.org/. 상자에서 꺼내는 것은 페이지 캐시입니다.
  2. 이 오류 메시지는 거의 확실합니다. nginx가 아닌 ab에서 온 것입니다. 파일 제한에 대한 nginx 오류는 "실패한 파일 (24 : 파일이 너무 많습니다)"과 같습니다. 유닉스 소켓에는 파일도 있다는 것을 기억하십시오. 따라서 ab를 실행하는 사용자의 경우 ab를 실행하려면 해당 세션에 대해 ulimit를 조정해야합니다. 한계가 256이라고 말했기 때문에 ab에 500 개의 연결을 사용하라고 요청하면 한계를 초과합니다.

Ben Whitaker가 옳았습니다.이 문제는 ab에서 비롯되었으며 500 개의 소켓 <=> 파일 (Linux OS에서)을 만들려고했습니다.
bachden

2

RAM에 캐시 된 파일은 여전히 ​​파일입니다!

대신 Nginx의 Memcached 캐시 모듈을 사용하십시오. 그러나 여전히 1000 개의 동시 연결이 방대합니다. 귀하의 경우라고 생각하십니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.