无法在具有大量重定向的Nginx中分配内存错误

时间:2018-10-09 03:28:54

标签: nginx memory-management

我在nginx中遇到内存分配错误。我在我的nginx上为许多站点配置了反向代理,将其用作两个后端节点之间的简单负载均衡器。站点的典型配置如下所示:

upstream backend  {
  ip_hash;
  server <node-ip>;
  server <another-node-ip>;
}

server {
  server_name domain.subdomain.com;    

  # a HUGE bunch of redirection rules 
  include /etc/nginx/sites-available/root;

  location / {

    proxy_pass  http://backend  ;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

我有12个具有上述配置的站点。如您所见,config包含另一个文件include的{​​{1}}。该文件由许多指向其他文件的sites-available/root伪指令组成:

unclude

每个规则文件都包含许多重定向规则,例如:

include /etc/nginx/sites-available/rules1;
include /etc/nginx/sites-available/rules2;
include /etc/nginx/sites-available/rules3;
...
include /etc/nginx/sites-available/rules16;

if ($request_uri ~* ^/some-url$) {
  return 302 /some-another-url/;
}

重定向规则的总数约为2300。我将location ~ some-url { return 302 "some-another-url"; } 文件包括到所有12个站点的配置中。经过一段时间之后,我在root中收到了信息消息:

  

[info] 23721#23721:在/etc/nginx/nginx.conf:66

中将32768KiB的共享内存用于推送模块

主要问题是有时命令/var/log/nginx/error.log会因日志错误而失败:

  

[警报] 22164#22164:生成“工作进程”时fork()失败(12:无法分配内存)   2018/10/09 03:10:06

     

[警告] 22164#22164:sendmsg()失败(9:错误的文件描述符)

如果我从配置中排除了重定向规则,问题就解决了。 Nginx是使用Ubuntu 16.04在简单的AWS t2.small实例上设置的。它具有1GB的RAM,我发现(使用service nginx reload)至少有一半的内存可用。我有默认的nginx.conf。因此问题是如何避免由于大量重定向规则而导致的free -m错误?

0 个答案:

没有答案