Làm cách nào để định cấu hình nginx để phục vụ nội dung tĩnh từ RAM?


11

Tôi muốn thiết lập Nginx làm máy chủ web của mình. Tôi muốn có các tệp hình ảnh được lưu trong bộ nhớ cache (RAM) chứ không phải đĩa. Tôi đang phục vụ một trang nhỏ và muốn một vài hình ảnh luôn được phục vụ từ RAM. Tôi không muốn sử dụng Varnish (hoặc bất kỳ công cụ nào khác) cho việc này vì tôi tin rằng Nginx có khả năng lưu trữ nội dung vào RAM. Tôi không chắc chắn làm thế nào tôi có thể cấu hình Nginx cho việc này? Tôi đã thử một vài kết hợp nhưng chúng không hoạt động. Nginx sử dụng đĩa mọi lúc để lấy hình ảnh.

Ví dụ, khi tôi đã thử điểm chuẩn Apache để kiểm tra bằng lệnh sau:

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

Tôi nhận được lỗi sau đây:

socket: Too many open files (24)

Tôi đoán điều này có nghĩa là Nginx đang cố gắng mở quá nhiều tệp cùng lúc từ đĩa và HĐH không cho phép thao tác này. Bất cứ ai có thể xin vui lòng đề nghị cho tôi một cấu hình chính xác?


Bạn gần như chắc chắn đoán sai. Ngoài ra, bạn nhận được lỗi từ đâu?
womble

@womble Như tôi nhận xét vấn đề dưới đây có thể là đồng thời. Có nhiều luồng cố gắng đồng thời trước khi nội dung có sẵn trong bộ nhớ. Bạn có thể vui lòng giải thích tại sao tôi nghĩ rằng tôi đoán nó sai?
Vijayendra

Câu trả lời:


9

Nếu đó là nội dung tĩnh thì nó sẽ được lưu trong bộ nhớ theo mặc định (trừ khi không còn bộ nhớ nào), không chỉ bởi nginx, mà là HĐH - tất cả những gì bên trái đĩa sẽ là stat ().

Nếu bạn muốn giải pháp bộ nhớ 100%, bạn chỉ cần cấu hình ramdisk và cung cấp dữ liệu từ đó.


Có, tôi hiểu rằng nội dung được lưu trữ trong bộ nhớ của hệ điều hành. Nhưng giả định là tập tin đã có sẵn trong bộ nhớ. Vấn đề có thể là đồng thời. Có nhiều luồng cố gắng đồng thời trước khi nội dung có sẵn từ bộ nhớ. Bạn nghĩ sao?
Vijayendra

1
Đó chỉ là vấn đề nếu số lượng yêu cầu tăng từ 0 đến 500 ngay lập tức - một khi tệp được đọc, nó sẽ được lưu trữ ở đó cho đến khi cần bộ nhớ (tệp được sử dụng gần đây nhất được xóa khỏi bộ đệm nếu bộ nhớ đầy và nhu cầu tệp mới được lưu trữ). Những điều lạ lùng xảy ra trong cuộc sống thực là không có gì. Thay vào đó, nếu bạn chắc chắn rằng đó là một rủi ro thực sự, hãy sử dụng giải pháp ramdisk, chỉ cần đảm bảo khôi phục dữ liệu trên ramdisk sau mỗi lần khởi động lại - theo định nghĩa ramdisk không lưu trữ liên tục.
c2h5oh

Ok, tôi sẽ thử ramdisk và xem nó hoạt động như thế nào. Cảm ơn vì bạn đã phản hồi.
Vijayendra

9

Khi máy chủ đã đọc một tệp từ đĩa, nó sẽ được lưu vào bộ đệm (và sẽ được thay thế bằng tệp khác nếu bạn hết ram), vấn đề là ở giới hạn tài khoản của bạn, bạn không thể mở quá nhiều tệp ( chạy 'ulimit -a'),

Nếu bạn muốn thay đổi giới hạn này - hãy đọc về /etc/security/limits.conf


1
Bạn nói đúng, giới hạn tệp mở là một vấn đề vì giới hạn là 256 trên hệ thống của tôi. Nhưng tôi vẫn cần tìm ra cách cấu hình Nginx để đọc các tệp từ bộ nhớ thay vì đĩa. Tôi không muốn thay đổi giới hạn tệp mở của mình và muốn đạt được việc sử dụng bộ đệm cho các yêu cầu tiếp theo.
Vijayendra

4
"Tôi không muốn thay đổi giới hạn tệp mở của mình" - bạn đang làm sai. Ồ, rất, rất sai.
womble

3
@womble Tôi hiểu để khắc phục vấn đề giải pháp đơn giản nhất là thay đổi giới hạn. Lý do tôi không muốn thay đổi giới hạn này là để xem những gì tốt nhất tôi có thể làm với cấu hình mà không thay đổi giới hạn. Tôi có thể cải thiện mọi thứ bằng cách thay đổi một số khía cạnh khác của bộ nhớ đệm và cấu hình. Và nhân tiện, bạn có thể vui lòng cho bạn biết lý do / đề xuất trong khi tuyên bố tại sao ai đó sai. Ngay cả trong bình luận đầu tiên của bạn, bạn đã làm điều này mà không đưa ra bất kỳ lý do. Đây là một nơi để đưa ra đề xuất chuyên nghiệp, xin vui lòng ngừng coi nó là tường facebook của bạn.
Vijayendra

7

Vì vậy, tôi biết điều này thực sự cũ nhưng, ở đây đi.

  1. Nginx không thực hiện lưu trữ bộ nhớ trong hộp, bạn sẽ muốn xem memcache cho việc này, tôi muốn giới thiệu gói openresty cho việc này: http://openresty.org/. Những gì bạn làm ra khỏi hộp (như đã được trả lời ở trên là bộ đệm trang)
  2. Thông báo lỗi đó, tôi gần như chắc chắn, là từ ab không phải từ nginx, lỗi nginx cho giới hạn tệp trông như thế này "thất bại (24: Quá nhiều tệp đang mở)". Hãy nhớ trong các ổ cắm unix cũng là các tệp, vì vậy đối với người dùng bạn đang chạy ab, cần phải điều chỉnh ulimit của nó để phiên đó chạy ab. Vì bạn cho biết giới hạn của bạn là 256, nên bạn đang yêu cầu ab sử dụng 500 kết nối, điều này vượt quá giới hạn của bạn.

Ben Whitaker đã đúng, vấn đề xuất phát từ ab, cố gắng tạo ra 500 socket <=> tệp (trong hệ điều hành linux).
bachden 8/2/2015

2

Một tệp được lưu trong bộ nhớ cache trong RAM vẫn là một tệp!

Thay vào đó, hãy thử sử dụng mô-đun bộ nhớ Memcached của Nginx. Tuy nhiên, 1000 kết nối đồng thời là rất lớn, bạn có nghĩ là trường hợp của bạn?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.