파일이 수정되면 Apache는 로드된 모듈로 무엇을 합니까?

파일이 수정되면 Apache는 로드된 모듈로 무엇을 합니까?

나는 현재 2.2.22에서 실행되는 Apache 모듈에 대해 글을 쓰고 있습니다. 모듈은 새로운 프로그래밍 언어로 작성된 스크립트를 실행하고 최적화를 위해 연속 사용을 위해 구문 분석 결과를 캐시합니다.

캐시된 구문 분석은 파일이 수정되면 삭제되어야 하므로 수정 시간을 저장하고 실행할 때마다 파일 시스템과 비교하여 확인합니다.

다음은 디버그 메시지가 포함된 코드 중 일부입니다.

 if (file->is_modified (mtime)) {
     ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
          "P* removing cached file");
     files.erase(it);
 }

이것을 테스트(페이지 가져오기, 파일 수정, 다시 가져오기)하면서 발견한 것은 이 블록에 도달하지 못한다는 것입니다. 파일은 변경된 후 다시 구문 분석되지만 이 검사로 인해 발생하는 것은 아닙니다. Apache 자체가 수정 시간을 확인하고 모듈의 모든 메모리를 해제하는 것처럼 보입니다.

구문 분석된 파일은 수정되지 않은 상태로 두면 올바르게 재사용됩니다.

이것이 Apache 서버의 의도된 동작입니까? 그렇다면 이를 무엇이라고 하며 어디에 문서화되어 있습니까?

캐시된 프로그램을 확인하는 기능에 대한 전체 코드

shared_ptr<pstar_file> pstar_pool::get_file_handle (
            request_rec *r,
            wpl_io &io,
            const char *filename,
            int mtime
            )
{
    pstar_map_t::iterator it;

    apr_proc_mutex_lock (mutex);

    // Check if a cached program exists
    it = files.find(filename);
    if (it != files.end()) {
            if (it->second->is_modified (mtime)) {
                    files.erase(it);
            }
            else {
                    apr_proc_mutex_unlock (mutex);
                    return it->second;
            }
    }

    apr_proc_mutex_unlock (mutex);

    shared_ptr<pstar_file> file_ptr(new pstar_file(io, filename, mtime));

    apr_proc_mutex_lock (mutex);
    files.insert(std::pair<string,shared_ptr<pstar_file>>(filename, file_ptr));
    apr_proc_mutex_unlock (mutex);

    return file_ptr;
}

Github의 전체 모듈에 대한 전체 코드(여러 파일):https://github.com/atlesn/P-star/blob/master/src/apache2/pstar_pool.cpp

답변1

여기에는 약간의 맥락이 누락되어 있습니다. 하지만 내 생각에 대답은 아주 간단할 수도 있다.

작업자 프로세스가 인스턴스화되면 모듈이 로드됩니다. 모듈이 로드되면 일반적으로 메모리의 프로세스 이미지에 복사되며 디스크의 변경 사항은 모듈에 영향을 주지 않습니다. 이것이 관련되는지 여부는 사용자 정의 모듈에서 수행하는 작업에 따라 다릅니다.

확실히, 모듈에서 액세스하는 파일이 사용되고 변경될 때 Apache는 이상하거나 정의되지 않은 동작을 나타내지 않습니다. 모듈이 파일을 열면 나중에 해당 파일을 수정하여 말한 대로 실행되는 것이 매우 이상할 것입니다. 하지만 그것이 명확하지 않은 이유가 있다는 느낌이 듭니다.

또한 기본 파일 시스템이 실제로 예상한 방식으로 mtime을 저장하고 업데이트하는지 확인하세요. 항상 그런 것은 아닙니다. 포함하지 않은 mtime 확인도 잘못되었을 수 있습니다.

파일이 알 수 없는 수단에 의해 다시 로드되고 있다고 말했기 때문에 각 요청에 대해 새 작업자 프로세스가 인스턴스화되거나 시도할 때마다 다른 작업자가 생성될 가능성이 높습니다.

이를 격리하는 데 도움이 되도록 mtime 검사에서 디버그 인쇄를 고려하십시오.

관련 정보