Hi,大家好:
在邮件中这个问题已咨询过春哥,目前还未彻底解决,具体尝试过的解决方法这里在简述下。
1) 每天会执行下lua脚本,然后reload下nginx,reload后有的机器nginx无法重启了。
查看linux系统日志如下错误:
Last value: Jan 8 01:00:08 localhost kernel: [9280018.932631] nginx[31026]: segfault at 4e49 ip 00000000004257a0 sp 00007ffd2c231080 error 4 in nginx[400000+115000]
Jan 8 01:00:08 localhost kernel: [9280018.933265] nginx[15771]: segfault at 4e49 ip 000000000042574c sp 00007ffd2c230ec0 error 6 in nginx[400000+115000]
Jan 8 01:00:08 localhost kernel: [9280018.935409] nginx[31023]: segfault at 4e49 ip 00000000004257a0 sp 00007ffd2c231080 error 4 in nginx[400000+115000]
Jan 8 01:00:08 localhost kernel: [9280019.116727] nginx[31010]: segfault at 4e49 ip 00000000004257a0 sp 00007ffd2c231000 error 4 in nginx[400000+115000]
Jan 8 01:00:08 localhost kernel: [9280019.116787] nginx[31006]: segfault at 4e49 ip 00000000004257a0 sp 00007ffd2c231000 error 4 in nginx[400000+115000]
reportlevel:Average
lua程序代码如下:
---------------------------------------------code start ---------------------------------
local util = require "lib.util"
local json = require "cjson"
local http = require("socket.http")
function getcontent()
local content = http.request("http://xxx:9310/downloadip.action")
if not content then return nil end
return content
end
function putcontent(content)
local file = '/data/www/iplib/iptable.csv'
local filebak = '/data/www/iplib/bak/iptable.csv.'..os.date("%Y.%m.%d_%H")
local cmd = "mv "..file.." "..filebak
os.execute(cmd)
local fd = io.open(file, 'w')
fd:write(content)
io.close()
end
function reloadnginx()
local cmd = "/usr/local/nginx/sbin/nginx -s reload"
os.execute(cmd)
end
local content = getcontent()
putcontent(content)
reloadnginx()
local retdata = {}
retdata["code"] = 200
retdata["data"] = '更新成功'
util.o(json.encode(retdata))
-------------------------------------------code end-------------------------------------------
-- 以上这个lua程序是nginx内部运行,可能没什么参考价值,也贴上来了。
通过addr2line能定位到那块代码问题,看不太懂哈。
# addr2line -e /usr/local/nginx/sbin/nginx 00000000004257a0
/data/apps/ngx_openresty-1.9.3.1/build/nginx-1.9.3/src/core/ngx_shmtx.c:78
2) 输出nginx -V
# /usr/local/nginx/sbin/nginx -V
nginx version: openresty/1.9.3.1
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/servers/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.2.19 --add-module=../echo-nginx-module-0.58 --add-module=../xss-nginx-module-0.05 --add-module=../ngx_coolkit-0.2rc3 --add-module=../set-misc-nginx-module-0.29 --add-module=../form-input-nginx-module-0.11 --add-module=../encrypted-session-nginx-module-0.04 --add-module=../srcache-nginx-module-0.30 --add-module=../ngx_lua-0.9.16 --add-module=../ngx_lua_upstream-0.03 --add-module=../headers-more-nginx-module-0.26 --add-module=../array-var-nginx-module-0.04 --add-module=../memc-nginx-module-0.16 --add-module=../redis2-nginx-module-0.12 --add-module=../redis-nginx-module-0.3.7 --add-module=../rds-json-nginx-module-0.14 --add-module=../rds-csv-nginx-module-0.06 --with-ld-opt=-Wl,-rpath,/usr/servers/luajit/lib --with-http_realip_module --with-pcre --with-http_stub_status_module --add-module=/data/apps_install/geturlsoftV3/ngx_openresty-1.9.3.1/bundle/ngx_cache_purge-2.3 --add-module=/data/apps_install/geturlsoftV3/ngx_openresty-1.9.3.1/bundle/nginx_upstream_check_module-0.3.0 --with-http_ssl_module
春哥的建议:
建议1. 请让你的 nginx 生成 core dump 文件,然后通过 gdb 命令 bt full 获取崩溃位置上完整的调用栈轨迹:
https://www.nginx.com/resources/wiki/start/topics/tutorials/debugging/#core-dump
这个问下大家以及春哥,今天早上又复现了,打开了core dump,但是没有生成文件,是什么原因呢?
已开启core dump
# ulimit -c
unlimited
# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 1031328
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 600000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 65536
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
使用了core_pattern模式
# cat /proc/sys/kernel/core_pattern
/data/corefile/core-%e-%p-%t
同时,通过一个c小程序也测试过,可以生产core dump文件,为什么nginx这个错误重现后不能生成了?
建议2. 我记得 ngx_upstream_check (的某个版本?)有一处内存问题,在 nginx HUP reload
时会有内存泄漏,直至出错。你去掉这些非 OpenResty 维护的第三方模块,看看能否复现问题。或者你换用
lua-resty-upstream-healthcheck 库来做健康检查。
这个去掉了,同时还是能复现问题,说明不是这个模块的问题,再就是去掉ngx_cache_purge-2.3看能否复现,但是还是建议直接开启core dump定位问题最直接。 所以还是回到建议1的问题上。
需要得到的帮助:
1)大伙有没有遇到过以上错误,nginx挂掉的问题,如何解决的?
2)开启了core dump,为什么没有生成文件呢?生成后可以通过gdb分析定位下。
以上,多谢大伙!
Regards!
-- David