我在 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
错误?
我有类似的问题,但我添加了另一个参数用于缓存
proxy_cache_path /Users/xx/nginx/cache keys_zone=mycache:1000m;
但是我使用的是 t2 micro,所以它没有那么多内存,所以它导致了错误,我将其更改为 5m 并再次启动 nginx 服务器,它工作了