배경: 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로 전환하면 문제가 해결됩니다.