찾다

Node.js 기술의 지속적인 개발과 적용으로 인해 웹 서버 구축 애플리케이션이 점점 더 널리 보급되고 있습니다. 개발 과정에서 서버를 종료해야 하는 요구 사항이 자주 발생합니다. 그렇다면 Node.js 애플리케이션에서 서버를 정확하고 우아하게 종료하려면 어떻게 해야 할까요? 이 기사에서는 Node.js를 사용하여 서버를 정상적으로 종료할 수 있는 애플리케이션을 구축하는 방법을 자세히 설명합니다.

1. Node.js 서버 시작 및 종료
Node.js에서 서버 시작은 매우 간단합니다. 내장된 http 모듈만 사용하면 완료됩니다. 예:

const http = require('http');
const server = http.createServer((req, res) => {
    res.end('Hello World!');
});
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

위 코드는 HTTP 서버를 생성하고 이를 포트 3000에 바인딩합니다. 물론 Express와 같은 프레임워크를 사용하여 웹 서버를 만들 수도 있습니다. 하지만 어떤 프레임워크를 사용하든 서버를 종료하는 방법은 기본적으로 동일합니다.

서버를 종료해야 할 경우 다음 두 가지 방법 중 하나를 사용할 수 있습니다.

1. Ctrl + C를 사용하여 프로세스 강제 종료
명령줄을 사용하여 Node.js 애플리케이션을 시작할 때 Ctrl + C 키 조합을 눌러 프로세스를 종료할 수 있습니다. 이 방법은 간단하고 빠르지만 우아하지 않고 필요한 정리 작업을 수행하지 않아 일부 문제가 발생할 수 있습니다.

2. SIGINT 신호를 수신하여 서버를 종료합니다.
Node.js에서는 신호 이벤트를 수신하고 이벤트가 발생하면 일부 작업을 수행할 수 있습니다. SIGINT 신호 이벤트를 수신하여 서버를 정상적으로 종료하고 리소스 해제, 상태 저장 등과 같은 필요한 작업을 수행할 수 있습니다. 다음은 샘플 코드입니다.

const http = require('http');
const server = http.createServer((req, res) => {
    res.end('Hello World!');
});
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

process.on('SIGINT', () => {
    console.log('Received SIGINT signal, shutting down server...');
    server.close(() => {
        console.log('Server has been shut down.');
        process.exit();
    });
});

위 코드에서는 프로세스 객체를 통해 SIGINT 신호를 수신합니다. 신호가 트리거되면 로그 정보가 출력되고 웹 서버가 정상적으로 종료됩니다. 코드의 server.close() 메소드는 모든 연결이 끊어진 후 서버를 중지하고 콜백 함수를 실행할 수 있습니다. 콜백 함수에서는 서버 종료에 대한 정보를 출력하고 process.exit() 메서드를 사용하여 프로세스를 종료합니다.

실제 사용에서는 상태를 데이터베이스에 저장하거나 알림 이메일을 보내는 등 몇 가지 추가 작업을 수행해야 할 수도 있습니다. 이러한 작업은 서버가 종료될 때 실행되도록 콜백 함수에 배치할 수 있습니다.

2. Node.js 서버의 정상 종료
위의 예에서는 서버 종료의 기본 프로세스가 완료되었습니다. 그러나 실제 애플리케이션에서는 서버를 보다 정상적으로 종료하려면 일부 최적화가 필요할 수 있습니다.

1. 요청 처리 시간 초과
웹 서버가 요청을 처리하는 동안 요청이 너무 오래 걸리면 서버가 제대로 종료되지 않을 수 있습니다. 따라서 서버를 종료하기 전에 모든 요청 처리를 중지하거나 해당 요청에 대해 시간 초과를 설정하여 시간 초과 내에 처리가 완료되도록 해야 합니다.

const http = require('http');
const server = http.createServer((req, res) => {
    res.end('Hello World!');
});
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

let connections = [];

server.on('connection', (connection) => {
    connections.push(connection);
    connection.on('close', () => {
        const index = connections.indexOf(connection);
        if (index !== -1) {
            connections.splice(index, 1);
        }
    });
});

function closeConnections() {
    console.log('Closing all connections...');
    connections.forEach((connection) => {
        connection.end();
    });
    setTimeout(() => {
        connections.forEach((connection) => {
            connection.destroy();
        });
        server.close(() => {
            console.log('Server has been shut down.');
            process.exit();
        });
    }, 10000);
}

process.on('SIGINT', () => {
    console.log('Received SIGINT signal, shutting down server...');
    closeConnections();
});

2. 처리되지 않은 요청 처리
웹 서버가 요청을 처리할 때 파일 읽기, 데이터베이스 쿼리 등 여러 작업이 포함될 수 있습니다. 서버가 종료되기 전에 이러한 작업이 완료되지 않으면 데이터 손실, 연결 중단 및 기타 문제가 발생할 수 있습니다. 따라서 서버를 종료하기 전에 모든 작업이 완료되었는지 확인해야 합니다. 예를 들어 Promise를 사용하여 파일 읽기를 처리합니다.

const http = require('http');
const fs = require('fs').promises;
const server = http.createServer((req, res) => {
    fs.readFile('./index.html')
        .then((data) => {
            res.end(data);
        })
        .catch((err) => {
            console.error(err);
            res.statusCode = 500;
            res.end('Internal server error');
        });
});
server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

let connections = [];

server.on('connection', (connection) => {
    connections.push(connection);
    connection.on('close', () => {
        const index = connections.indexOf(connection);
        if (index !== -1) {
            connections.splice(index, 1);
        }
    });
});

function closeConnections() {
    console.log('Closing all connections...');
    connections.forEach((connection) => {
        connection.end();
    });
    setTimeout(() => {
        connections.forEach((connection) => {
            connection.destroy();
        });
        server.close(() => {
            console.log('Server has been shut down.');
            process.exit();
        });
    }, 10000);
}

process.on('SIGINT', () => {
    console.log('Received SIGINT signal, shutting down server...');

    // 进行必要的清理工作
    console.log('Cleaning up...');
    fs.unlink('./index.html')
        .then(() => {
            console.log('File has been deleted.');
        })
        .catch((err) => {
            console.error(err);
        });

    // 关闭所有连接
    closeConnections();
});

위 코드에서는 서버를 닫기 전에 파일이 올바르게 삭제되었는지 확인하기 위해 Promise를 사용하여 파일을 읽었습니다. 서버를 종료하기 전 연결도 모두 닫았고, 10초 후에는 모든 연결과 서버를 강제 종료했습니다. 실제 사용에서는 필요에 따라 다른 시간 제한을 설정할 수 있습니다.

3. 요약
Node.js 애플리케이션에서는 웹 서버를 종료하는 것이 일반적인 요구 사항입니다. 이 문서에서는 내장 http 모듈을 사용하여 웹 서버를 생성하고 SIGINT 신호를 수신하여 서버를 정상적으로 종료하는 방법을 설명합니다. 동시에 다양한 상황에서 서버가 정상적으로 종료될 수 있도록 서버 종료 프로세스를 최적화하는 방법도 소개했습니다. 실제 애플리케이션에서는 다양한 요구 사항을 충족하기 위해 필요에 따라 적절하게 확장하고 최적화할 수 있습니다.

위 내용은 nodejs 닫기 서버 기능의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
usestate () 이해 : 국가 관리에 대한 포괄적 인 안내서usestate () 이해 : 국가 관리에 대한 포괄적 인 안내서Apr 25, 2025 am 12:21 AM

usestate () isareacthookusedtomanagestatefunctionalcomponents.1) itinitializesandupdatesstate, 2) workaledtthetThetThepleFcomponents, 3) canleadto'Stalestate'ifnotusedCorrecrally 및 4) performancanoptimizedUsecandusecaldates.

React 사용의 장점은 무엇입니까?React 사용의 장점은 무엇입니까?Apr 25, 2025 am 12:16 AM

Reactispopularduetoitscomponent 기반 아카데입, 가상, Richcosystem 및 declarativenature.1) 구성 요소 기반 ectureallowsforeusableuipieces, Modularityandmainability 개선 가능성.

React의 디버깅 : 일반적인 문제를 식별하고 해결합니다React의 디버깅 : 일반적인 문제를 식별하고 해결합니다Apr 25, 2025 am 12:09 AM

TodebugreactApplicationseffective, UsetheseStradegies : 1) 주소 propdrillingwithContapiorredux.2) handleaSnchronousOperationswithUsestAndUseefect, abortControllerTopReceConditions.3) 최적화 formanceSeMoAnduseCalbackTooid

React의 usestate () 란 무엇입니까?React의 usestate () 란 무엇입니까?Apr 25, 2025 am 12:08 AM

usestate () inreactAllowsStateManagementInfunctionalComponents.1) itsimplifiessTatemanagement, 2) usethepRevCountFunctionToupDatesTestateSpreviousValue, PropeingStaleScallanceBackferperperperperperperperperperperperperpertoptiMizatio

usestate () vs. usereducer () : 주 요구에 맞는 올바른 후크 선택usestate () vs. usereducer () : 주 요구에 맞는 올바른 후크 선택Apr 24, 2025 pm 05:13 PM

chelectionSimple, IndependentStateVaribles; useUserEducer () useuserEducer () forcomplexStateLogicor () whenStatedSonpreviousState.1) usestate () isidealforsimpleupdatesliketogglingabooleorupdatingacounter.2) usbetterformanagingmentiplesub-vvalusorac

usestate ()로 상태 관리 : 실용적인 자습서usestate ()로 상태 관리 : 실용적인 자습서Apr 24, 2025 pm 05:05 PM

Usestate는 클래스 구성 요소 및 기타 상태 관리 솔루션보다 우수합니다. 국가 관리를 단순화하고 코드를 더 명확하게하고 읽기 쉽고 React의 선언적 특성과 일치하기 때문입니다. 1) Usestate는 함수 구성 요소에서 상태 변수를 직접 선포 할 수있게합니다. 2) 후크 메커니즘을 통해 다시 렌더링하는 동안 상태를 기억합니다.

usestate ()를 사용하고 대체 상태 관리 솔루션을 고려할 때usestate ()를 사용하고 대체 상태 관리 솔루션을 고려할 때Apr 24, 2025 pm 04:49 PM

useUsestate () forlocalcomponentStateManagement; 고려 사항 forglobalstate, complexlogic, orperformanceissues.1) usestate () isidealforsimple, localstate.2) useglobalstatesolutionslikereduxorcontextforsharedstate.3) optforredooxtoolkitormobxcomcoccomcoccomcoccomcoccomcoccomcoccomcoccomcoccomporccomcoccomporccomcoccomport

React의 재사용 가능한 구성 요소 : 코드 유지 관리 및 효율성 향상React의 재사용 가능한 구성 요소 : 코드 유지 관리 및 효율성 향상Apr 24, 2025 pm 04:45 PM

reusablecomponentsinreacececodemainabenabilityandefficiency는 hallowingesamecomponentacrossdifferentpartsofanapplicationorprojects.1) 그들을 retuduceredundancyandsimplifyupdates.2) theyseconsistencyinuserexperience.3) theyquireoptim

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구