我在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
错误?