Opened 4 years ago

Closed 4 years ago

#1047 closed defect (duplicate)

listening unix sockets not removed on graceful shutdown

Reported by: drawks@… Owned by:
Priority: minor Milestone:
Component: other Version: 1.10.x
Keywords: Cc:
uname -a: Linux kiryu 4.6.0-1-amd64 #1 SMP Debian 4.6.4-1 (2016-07-18) x86_64 GNU/Linux
nginx -V: nginx version: nginx/1.10.1
built with OpenSSL 1.0.2h 3 May 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-1.10.1/debian/modules/nginx-auth-pam --add-module=/build/nginx-1.10.1/debian/modules/nginx-dav-ext-module --add-module=/build/nginx-1.10.1/debian/modules/nginx-echo --add-module=/build/nginx-1.10.1/debian/modules/nginx-upstream-fair --add-module=/build/nginx-1.10.1/debian/modules/ngx_http_substitutions_filter_module

Description

When running nginx with a listener on a unix socket:

listen unix:/var/run/nginx.sock;

The socket is correctly created when nginx starts, but is not removed when a graceful shutdown is requested via SIGQUIT signal. This results in subsequent attempts to start nginx to result in the following error:

bind() to unix:/var/run/nginx.sock failed (98: Address already in use)

Oddly enough, when nginx is stopped with a SIGTERM signal ("shut down quickly" according to the manpage) the socket is removed.

The result of this is that additional effort must be made to cleanup the socket outside of the nginx process when using "graceful shutdown." As a side-effect init scripts provided by downstream distributions may fail to correctly handle restarts in some configurations.

It would seem, to me at least, that the "graceful" shutdown method should make a best attempt to cleanup all ephemeral resources used by the master and children processes; the "shutdown quickly" method perhaps not so much.

Change History (3)

comment:1 by drawks@…, 4 years ago

I found this downstream Debian bug:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=821111

Which seems to indicate that graceful shutdown is not the intended method to shutdown nginx per, some unnamed, nginx maintainer. I suppose if that is true then this is a documentation bug and not a behavior bug.

Is perhaps the solution to fully document what the expected behavior is of the various signal handlers. I don't know that the current shorthand of "quickly" vs. "gracefully" accurately matches the expectations of an average user.

comment:2 by drawks@…, 4 years ago

It seems this is a duplicate of #753 which has been accepted already. Please merge/close this issue.

comment:3 by Maxim Dounin, 4 years ago

Resolution: duplicate
Status: newclosed
Note: See TracTickets for help on using tickets.