Nginx는 오래된 소켓을 남깁니다.

Nginx는 오래된 소켓을 남깁니다.

저는 Nginx 1.6.2(PPA 패키지)를 실행하고 nginx-full있습니다 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.1 LTS를 실행하는 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.

답변1

Nginx 문서에 따르면,신호 출구"정상적인 종료"가 수행됩니다.신호 용어"빠른 종료"가 수행됩니다. 최소 버전 1.8.0부터 Nginx는 중단되면 오래된 UNIX 도메인 소켓을 남겨둡니다.신호 출구신호. 그러나 다음 명령을 사용하면 UNIX 도메인 소켓이 올바르게 삭제됩니다.신호 용어신호.

/etc/init.d/nginxPPA에서 제공하는 Nginx 서비스 스크립트 nginx/stable가 전송됩니다.신호 출구sudo service nginx stopNginx가 사용 중이거나 중지되었을 때 Nginx로 전송됩니다 restart. 스크립트를 패치하려면 다음 줄을 수정하세요.

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

도착하다:

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

그러나 Ubuntu 저장소의 Nginx 서비스 스크립트는 이미신호 용어바꾸다신호 출구수정이 필요하지 않습니다.

답변2

나는 이것이 내가 사용해온 우아하거나 빠른 종료와 관련이 없다고 생각합니다.우아한 정지나는 또한이 문제에 직면했습니다.

제 경우에는 nginx오랫동안 존재하지 않는 소켓에 대한 연결 시도가 소켓 및 이에 대한 모든 호출이 삭제된 후에도 계속(적어도 지금까지는) 계속되는 관련/추가 문제를 발견했습니다. 의도적으로 만들거나 변경했습니다.

소켓을 넣는 것이 /tmp이 문제를 피하기 위한 해결 방법인 것 같은데, 이전에 다른 곳에서 생성한 고스트 소켓을 여전히 제거할 수 없습니다.

그래서 문제가 어디에 있는지 이해하지 못합니다. 언제 nginx결정할 거야?기억하다항상 소켓인데 재설정할 수 있는 방법이 있나요?

답변3

16.04 Xenial에 대한 빠른 수정으로 문제가 되는 소켓을 삭제했습니다.

sudo systemctl stop nginx
sudo rm /var/run/serve-files.socket
sudo systemctl start nginx

관련 정보