velo9
velo9

Reputation: 2335

How do you properly watch and reload Nginx conf?

I have two questions:

Upvotes: 4

Views: 6337

Answers (2)

Devonte
Devonte

Reputation: 3475

#!/bin/bash

# NGINX WATCH DAEMON
#
# Author: Devonte
#
# Place file in root of nginx folder: /etc/nginx
# This will test your nginx config on any change and
# if there are no problems it will reload your configuration
# USAGE: sh nginx-watch.sh

# Set NGINX directory
# tar command already has the leading /
dir='etc/nginx'

# Get initial checksum values
checksum_initial=$(tar --strip-components=2 -C / -cf - $dir | md5sum | awk '{print $1}')
checksum_now=$checksum_initial

# Start nginx
nginx

# Daemon that checks the md5 sum of the directory
# ff the sums are different ( a file changed / added / deleted)
# the nginx configuration is tested and reloaded on success
while true
do
    checksum_now=$(tar --strip-components=2 -C / -cf - $dir | md5sum | awk '{print $1}')

    if [ $checksum_initial != $checksum_now ]; then
        echo '[ NGINX ] A configuration file changed. Reloading...'
        nginx -t && nginx -s reload;
    fi

    checksum_initial=$checksum_now

    sleep 2
done

Upvotes: 5

Déjà vu
Déjà vu

Reputation: 28850

At least on Unix, both "reload" action and HUP signal are treated as one thanks to the declaration code

ngx_signal_t  signals[] = {
    { ngx_signal_value(NGX_RECONFIGURE_SIGNAL),
      "SIG" ngx_value(NGX_RECONFIGURE_SIGNAL),
      "reload",
      ngx_signal_handler },

in src/os/unix/ngx_process.c. In ngx_signal_handler() the same comnmon code

    case ngx_signal_value(NGX_RECONFIGURE_SIGNAL):
        ngx_reconfigure = 1;
        action = ", reconfiguring";
        break;

is executed, that prepares for a common reconfiguration.

To trigger an action when a file is modified, you could either make a crontab and decide of a check-periodicity, or use inotifywait.

To determine if nginx -t is in error, check the return code in a bash file, $?

nginx -t
if [ $? -eq 0 ] then;
    nginx -s reload
fi

Note: you may also use service nginx reload

(See return code check examples here)

Upvotes: 3

Related Questions