web-dev-qa-db-ja.com

Nginxは古いソケットを残します

Nginx 1.6.2(nginx-fullPPAのnginx/stableパッケージ)を実行しています。変更されていない構成を使用しています/etc/nginx/nginx.conf

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

次のサイト構成を作成し、それをsites-enabledにリンクすると:

# /etc/nginx/sites-available/serve-files
server {
    listen unix:/run/serve-files.socket;
    root /var/www/files;
    location / {
        try_files $uri =404;
    }
}

そして、nginxを(Sudo service nginx restartを使用して)再起動すると、ソケット/run/serve-files.socketが次の権限で作成されます。

srw-rw-rw- 1 root root 0 Oct 29 14:35 serve-files.socket

その後、nginxを(Sudo service nginx stopを使用して)停止すると、ソケットが予期せず残ります。また、nginxのバックアップを開始すると(Sudo service nginx startを使用)、次のエラーが/var/log/nginx/error.logに報告されます。

2014/10/29 14:36:32 [emerg] 21680#0: bind() to unix:/run/serve-files.socket failed (98: Address already in use)
2014/10/29 14:36:32 [emerg] 21680#0: bind() to unix:/run/serve-files.socket failed (98: Address already in use)
2014/10/29 14:36:32 [emerg] 21680#0: bind() to unix:/run/serve-files.socket failed (98: Address already in use)
2014/10/29 14:36:32 [emerg] 21680#0: bind() to unix:/run/serve-files.socket failed (98: Address already in use)
2014/10/29 14:36:32 [emerg] 21680#0: bind() to unix:/run/serve-files.socket failed (98: Address already in use)
2014/10/29 14:36:32 [emerg] 21680#0: still could not bind()

Nginxは、前回のシャットダウンで残ったソケットを上書きしないようです。どうしてこれなの?何かを誤って構成しましたか?これを回避する方法はありますか?

注:nginxで実行されている他のサイトはありません。nginxを停止すると、長引くプロセスはありません。これを、14.04.1LTSを実行しているUbuntuサーバーとデスクトップで再現しました。

更新:nginxが実行されている場合、netstat -lx | grep serve-filesはソケットが使用されていることを示します。

unix  2      [ ACC ]     STREAM     LISTENING     6543310  /run/serve-files.socket

Nginxが停止すると、netstat -lx | grep serve-filesは(予想どおり)ソケットが使用されていないことを示しますが、ソケットファイルは/run/serve-files.socketのままです。

3
user369450

Nginxのドキュメントによると、[〜#〜] sigquit [〜#〜]は「正常なシャットダウン」を実行し、[〜#〜] sigterm [〜#〜]は「高速シャットダウン」を実行します"。少なくともバージョン1.8.0の時点では、Nginxは[〜#〜] sigquit [〜#〜]信号を使用して停止すると、古いUNIXドメインソケットを残します。ただし、[〜#〜] sigterm [〜#〜]シグナルを使用すると、UNIXドメインソケットは適切に削除されます。

_/etc/init.d/nginx_ PPAから提供されるNginxサービススクリプト_nginx/stable_は、_Sudo service nginx stop_またはrestart。スクリプトにパッチを適用するには、次の行を変更します。

_STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/5/KILL/5}"
_

に:

_STOP_SCHEDULE="${STOP_SCHEDULE:-TERM/5/KILL/5}"
_

ただし、UbuntuリポジトリのNginxサービススクリプトはすでに[〜#〜] sigquit [〜#〜]の代わりに[〜#〜] sigterm [〜#〜]を使用しており、変更されました。

3
user369450