I use nginx as a reverse proxy. Whenever I update the config for it using
sudo "cp -r #{nginx_config_path}* /etc/nginx/sites-enabled/"
sudo "kill -s HUP `cat /var/run/nginx.pid`"
I face a brief downtime. How can I avoid that?
Server Fault is a question and answer site for system and network administrators. It only takes a minute to sign up.
Sign up to join this communityRun service nginx reload
or /etc/init.d/nginx reload
It will do a hot reload of the configuration without downtime. If you have pending requests, then there will be lingering nginx processes that will handle those connections before it dies, so it's an extremely graceful way to reload configs.
Sometimes you may want to prepend with sudo
SIGHUP
to the nginx master process. There should not be a difference. nginx.org/en/docs/control.html
cat $PIDFILE
|| echo -n " can't reload"
service nginx reload
and nginx -s reload
? If I run the former, I get this output: Reloading nginx configuration: nginx.
, but my changes aren't updated. If I run the latter, I get no output, but my changes are reflected.
Apr 21, 2017 at 3:46
log_not_found
directive but found that I had to actually do a restart to get it to work. I guess reloading does not work for all directives?
Jun 22, 2017 at 12:24
Run /usr/sbin/nginx -s reload
See http://wiki.nginx.org/CommandLine for more command line options.
The kill
approach you used (kill -s HUP $(cat /var/run/nginx.pid
) is correct. Init scripts for RH or Debian distributions are in the end also implemented using kill
command. You can check Init example from nginx website or contents of Ubuntu Nginx package.
There are multiple signals, that nginx can listen to (mentioned in wiki):
TERM
, INT
- Quick shutdown.QUIT
- Graceful shutdown.KILL
- Halts a stubborn process.HUP
- Configuration reload. Start the new worker processes with a new configuration. Gracefully shutdown the old worker processes.USR1
- Reopen the log files.USR2
- Upgrade Executable on the fly.WINCH
- Gracefully shutdown the worker processes.Nginx reload (HUP
signal) is more specifically implemented as several steps [1,2]:
Only one issue I can think of why you had downtime (based on the reload process) is that you were using only one worker process (worker_processes
directive), which by design was serving old clients, but had closed listen socket, therefore you couldn't open new connection.
I can also recommend you to always use /usr/sbin/nginx -t
to validate configuration files before applying new config.
Reconfigure signal is handled in file ngx_process_cycle.c
and we can see it starts new worker processes in function ngx_start_worker_processes(...)
and at the end it stops old worker processes in function ngx_signal_worker_processes(...)
, which iterates over them with NGX_SHUTDOWN_SIGNAL
signal.
Resources:
nginx.conf
file. I've added a few location
blocks to test and indeed hitting localhost/test didn't exist even after sending the nanny process a HUP (and verifying new worker process pids). Is there any insight available into the steps you outlined here (ie, applies new config, rolls back, etc)? Interested in debugging this.
No, you are incorrect, you aren't supposed to be facing any downtime with the procedure you describe. (Nginx can do not only configuration reload on the fly without any downtime, but even the upgrade of the executable on the fly, still without any downtime.)
As per http://nginx.org/docs/control.html#reconfiguration, sending the HUP
signal to nginx makes sure that it performs a graceful restart, and, if the configuration files are incorrect, the whole procedure is abandoned, and you're left with the nginx as before sending the HUP
signal. At no point should any downtime be possible.
In order for nginx to re-read the configuration file, a HUP signal should be sent to the master process. The master process first checks the syntax validity, then tries to apply new configuration, that is, to open log files and new listen sockets. If this fails, it rolls back changes and continues to work with old configuration.
Usually, reloading configuration file of a service should not affect the running service. However, this depends on how the SIGHUP
signal is processed.
If a specific service is experiencing a downtime during reload, this can be circumvented by running the same service on multiple servers preferably using a load balancer. In this case, you can take out one server at a time and reload/restart it. Then, it can be re-added after confirming it is OK.
sites-enabled
, not copy it. Not related to your particular issue, but you may want to look into that.kill HUP
is the way to do a graceful reload in nginx.