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

问题描述 投票:0回答:1

我在 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 个站点的配置如上。如您所见,配置包含另一个文件的

include
-
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/;
}

location ~ some-url {
  return 302 "some-another-url";
}

重定向规则的总数约为 2300 个。我将

root
文件包含到所有 12 个站点的配置中。之后,我一次又一次地收到信息消息
/var/log/nginx/error.log
:

[info] 23721#23721:在 /etc/nginx/nginx.conf:66 中使用 32768KiB 共享内存用于推送模块

主要问题是有时命令

service nginx reload
会失败并在日志中显示错误:

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

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

如果我从配置中排除重定向规则,问题就消失了。 Nginx 设置在带有 Ubuntu 16.04 的简单 AWS t2.small 实例上。它有 1GB 的 RAM,我看到(

free -m
)至少有一半的内存是空闲的。我有默认的 nginx.conf。那么问题是如何避免由于大量重定向规则而导致的
cannot allocate memory
错误?

nginx memory-management
1个回答
0
投票

我有类似的问题,但我添加了另一个参数用于缓存

 proxy_cache_path /Users/xx/nginx/cache keys_zone=mycache:1000m;

但是我使用的是 t2 micro,所以它没有那么多内存,所以它导致了错误,我将其更改为 5m 并再次启动 nginx 服务器,它工作了

© www.soinside.com 2019 - 2024. All rights reserved.