Nginx hanging on restart

Sp4cecat asked:

I’m having to run the nginx startup script in the background, or it does not return to the shell when run – it does this through either

service nginx start

.. or simply running ..


.. directly. I’ve having to run it in the background then disown it ..

Running on Ubuntu 14.04.2, Nginx v 1.4.6

nginx -V gives us:

nginx version: nginx/1.4.6 (Ubuntu)
built by gcc 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro' --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/ --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_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_spdy_module --with-http_sub_module --with-http_xslt_module --with-mail --with-mail_ssl_module

.. and “bash -x nginx restart” returns ..

+ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+ DAEMON=/usr/sbin/nginx
+ NAME=nginx
+ DESC=nginx
+ '[' -f /etc/default/nginx ']'
+ . /etc/default/nginx
+ test -x /usr/sbin/nginx
+ set -e
+ . /lib/lsb/init-functions
+++ run-parts --lsbsysinit --list /lib/lsb/init-functions.d
++ for hook in '$(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null)'
++ '[' -r /lib/lsb/init-functions.d/20-left-info-blocks ']'
++ . /lib/lsb/init-functions.d/20-left-info-blocks
++ for hook in '$(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null)'
++ '[' -r /lib/lsb/init-functions.d/50-ubuntu-logging ']'
++ . /lib/lsb/init-functions.d/50-ubuntu-logging
++ '[' -e /etc/ ']'
++ true
+ case "$1" in
+ echo -n 'Restarting nginx: '
Restarting nginx: + start-stop-daemon --stop --quiet --pidfile /var/run/ --exec /usr/sbin/nginx
+ sleep 1
+ test_nginx_config
+ /usr/sbin/nginx -t
+ return 0
+ start-stop-daemon --start --quiet --pidfile /var/run/ --exec /usr/sbin/nginx --

.. and then nothing.



# Generic startup file.
user www-data developers;

#ususally equal to number of CPU's you have. run command "grep processor /proc/cpuinfo | wc -l" to find it
worker_processes auto;

error_log  /var/log/nginx/error.log;
pid        /var/run/;

# Keeps the logs free of messages about not being able to bind().
daemon     off;

events {
    worker_connections  1024;

http {
#   rewrite_log on;

    include mime.types;
    default_type       application/octet-stream;
    access_log         /var/log/nginx/access.log;
    sendfile           on;
#   tcp_nopush         on;
    keepalive_timeout  3;
#   tcp_nodelay        on;
#   gzip               on;
        #php max upload limit cannot be larger than this
    client_max_body_size 13m;

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;

    index              index.php index.html index.htm;

    # Upstream to abstract backend connection(s) for PHP.
    upstream php {
                #this should match value of "listen" directive in php-fpm pool
        server unix:/var/run/php5-fpm.sock;

    include sites-enabled/*;

Any insights would be much appreciated.

My answer:

The init script, and specifically the helper start-stop-daemon, expects the program it starts to put itself in the background by default. However, someone has mistakenly altered your nginx configuration to prevent it from doing this:

# Keeps the logs free of messages about not being able to bind().
daemon     off;

This section should be removed entirely. First, nginx should be daemonizing. Second, if such messages about being unable to bind() appear, it is not because nginx was running as a daemon, it’s because nginx was already running when someone tried to start a second copy.

View the full question and answer on Server Fault.

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.