Nginx 1.6.2(nginx-full
PPAの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
のままです。
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 [〜#〜]を使用しており、変更されました。