如何配置nginx从RAM提供静态内容?


11

我想将Nginx设置为我的Web服务器。我想将图像文件缓存在内存(RAM)中而不是磁盘中。我正在提供一个小页面,并且希望始终从RAM提供一些图像。我不希望为此使用Varnish(或任何其他此类工具),因为我相信Nginx可以将内容缓存到RAM中。我不确定如何为此配置Nginx?我确实尝试了几种组合,但没有用。Nginx一直使用磁盘来获取图像。

例如,当我尝试使用以下命令测试Apache基准测试时:

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

我收到以下错误:

socket: Too many open files (24)

我猜这意味着Nginx试图同时从磁盘打开太多文件,而OS不允许此操作。谁能建议我正确的配置?


您几乎可以肯定猜错了。另外,您从哪里得到错误?
womble

@womble当我在下面评论时,问题可能是并发。在内存中的内容可用之前,有许多线程会同时尝试。您能解释一下为什么我认为我猜错了吗?
Vijayendra 2012年

Answers:


9

如果它是静态内容,则默认情况下它将被缓存在内存中(除非没有剩余的内存),而不是nginx,而是操作系统-剩下的所有磁盘端将是stat()。

如果您想要100%内存解决方案,则只需配置ramdisk并从那里提供数据。


是的,我知道操作系统会在内存中缓存内容。但是假设是文件已经在内存中可用。问题可能是并发。在从内存中获取内容之前,有许多线程正在同时尝试。你怎么看?
Vijayendra 2012年

1
如果请求的数量在瞬间从0到500,这只是一个问题-读取文件后,它将存储在此处直到需要内存为止(如果内存已满并且需要新文件,则从缓存中删除最近使用过的文件)进行缓存)。在现实生活中发生这种情况的可能性微乎其微。如果您确定确实存在风险,请改用ramdisk解决方案,只需确保在每次重新启动后在ramdisk上还原数据-ramdisk并不是定义上的永久存储。
c2h5oh 2012年

好的,我将尝试ramdisk,看看它是如何工作的。感谢您的反馈。
Vijayendra 2012年

9

服务器从磁盘读取文件后,它将被缓存到ram(如果您不在ram中,则将被其他文件替换),问题出在您的帐户限制上,您无法打开太多文件(运行'ulimit -a'),

如果要更改此限制,请阅读/etc/security/limits.conf。


1
没错,打开文件的限制是个问题,因为我的系统上的限制是256。但是我仍然需要弄清楚如何配置Nginx从内存而不是磁盘读取文件。我不想更改我的打开文件限制,而是希望实现后续请求的缓存使用率。
Vijayendra 2012年

4
“我不想更改我的打开文件限制” –您做错了。哦,非常非常错误。
womble

3
@womble我知道要解决此问题,最简单的解决方案是更改限制。我不想更改此限制的原因是要了解在不更改限制的情况下我能做些什么。我可以通过更改缓存和配置的其他方面来改善自己。顺便说一句,您能否在声明某人错误原因的同时给您理由/建议。即使在您的第一个评论中,您也没有给出任何理由就这样做了。这是一个提供专业建议的地方,请停止将其视为您的Facebook墙。
Vijayendra 2012年

7

因此,我知道这确实很老,但是,继续。

  1. Nginx并没有开箱即用的内存缓存,您需要查看内存缓存,我为此推荐openresty包:http://openresty.org/。开箱即用(上面的回答是页面缓存)
  2. 我几乎可以肯定,该错误消息是从ab而不是nginx发出的,文件限制的nginx错误看起来像是“失败(24:打开的文件太多)”。请记住,在Unix套接字中也有文件,因此对于正在运行ab as的用户,需要调整其ulimit以使该会话运行ab。由于您说的限制是256个,因此您要求Ab使用500个连接,这使限制达到最大。

Ben Whitaker是对的,问题出在ab,它试图创建500个套接字<=>文件(在linux os中)。
bachden 2015年

2

RAM中缓存的文件仍然是文件!

尝试改用Nginx的Memcached缓存模块。但是,仍然有1000个并发连接是巨大的,您是否认为情况如此?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.