기존 디렉터리에서 ENOENT 오류가 발생했습니다.

기존 디렉터리에서 ENOENT 오류가 발생했습니다.

배경: Redmine 서버를 실행하고 있습니다.redmine DMSF 플러그인, xapian을 사용하여 전체 텍스트 검색을 제공합니다. Redmine은 Passenger에서 실행되며 Nginx에서 호스팅됩니다. Passenger 프로세스는 사용자 "redmine" 및 그룹 "nginx"로 실행됩니다. 승객용 의류 및 Nginx가 비활성화되었습니다.

Redmine 로그는 xapian 인덱스를 찾을 수 없다는 메시지를 표시합니다.

REDMAIN_XAPIAN ERROR: Xapian database is not properly set, initiated or it's corrupted.
DatabaseOpeningError: Couldn't stat '/var/tmp/dmsf-index/english'

Running Passenger 프로세스의 추적은 다음을 보여줍니다.

[pid  1013] stat("/var/tmp/dmsf-index/english", 0x7fa3bd112f00) = -1 ENOENT (No such file or directory)
[pid  1013] write(8, "REDMAIN_XAPIAN ERROR: Xapian dat"..., 88) = 88
[pid  1013] write(8, "DatabaseOpeningError: Couldn't s"..., 66) = 66

루트로 나열된 파일:

775# ls -ahl /var/tmp/dmsf-index/english/
total 340K
drwxr-x--- 2 redmine nginx 4.0K Sep  5 13:04 .
drwxr-x--- 3 redmine nginx 4.0K Sep  5 13:04 ..
-rw-r----- 1 redmine nginx    0 Sep  5 14:00 flintlock
-rw-r----- 1 redmine nginx   28 Sep  5 13:04 iamchert
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 position.baseA
-rw-r----- 1 redmine nginx   16 Sep  5 13:04 position.baseB
-rw-r----- 1 redmine nginx  80K Sep  5 13:04 position.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 postlist.baseA
-rw-r----- 1 redmine nginx   17 Sep  5 13:04 postlist.baseB
-rw-r----- 1 redmine nginx 176K Sep  5 13:04 postlist.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 record.baseA
-rw-r----- 1 redmine nginx   14 Sep  5 13:04 record.baseB
-rw-r----- 1 redmine nginx 8.0K Sep  5 13:04 record.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 termlist.baseA
-rw-r----- 1 redmine nginx   14 Sep  5 13:04 termlist.baseB
-rw-r----- 1 redmine nginx  32K Sep  5 13:04 termlist.DB

그리고 sudo -i를 통해 사용자 "redmine" 및 그룹 "nginx"로 여러 명령을 실행합니다.

redmine@redmine:/var/tmp/dmsf-index/english$ pwd
/var/tmp/dmsf-index/english
redmine@redmine:/var/tmp/dmsf-index/english$ file .
.: directory
redmine@redmine:/var/tmp/dmsf-index/english$ ls
flintlock  iamchert  position.baseA  position.baseB  position.DB  postlist.baseA  postlist.baseB  postlist.DB  record.baseA  record.baseB  record.DB  termlist.baseA  termlist.baseB  termlist.DB
redmine@redmine:/var/tmp/dmsf-index/english$ file record.DB 
record.DB: data
redmine@redmine:/var/tmp/dmsf-index/english$ whoami
redmine
redmine@redmine:/var/tmp/dmsf-index/english$

내가 아는 한 권한 오류(일반적으로 EACCES로 표시됨)는 없습니다. NFS 또는 CIFS가 모호한 경우 ENOENT를 반환할 수 있다는 내용을 읽었지만 이는 /에 마운트된 로컬 ext4 파티션입니다.

dmsf-index의 권한을 재귀적으로 777로 설정하려고 시도했지만 동일한 오류가 발생했습니다.

그래서 내 질문은 Passenger/Redmine이 디렉토리를 찾을 수 없지만 동일한 사용자로 실행되는 쉘은 왜 찾을 수 있는가입니다.

답변1

Kusalananda가 chroot와 함께 올바른 길을 가고 있음이 밝혀졌습니다.

이 시스템의 nginx systemd 단위 파일 설정 PrivateTmp=true에 따르면문서다음을 수행하십시오.

부울 매개변수를 사용합니다. true인 경우 실행 프로세스에 대한 새 파일 시스템 네임스페이스를 설정하고 그 안에 프라이빗 /tmp 및 /var/tmp 디렉터리를 마운트합니다. 이 디렉터리는 네임스페이스 외부의 프로세스와 공유되지 않습니다. 이는 프로세스의 임시 파일에 안전하게 액세스하는 데 유용하지만 /tmp 또는 /var/tmp를 통한 프로세스 간 공유가 불가능합니다.

이 옵션을 false로 전환하면 문제가 해결됩니다.

관련 정보