Perl CGI 스크립트를 콘솔에서 실행할 때 MySQL에 연결하지 못하는 이유는 무엇입니까?

Perl CGI 스크립트를 콘솔에서 실행할 때 MySQL에 연결하지 못하는 이유는 무엇입니까?

저는 새로운 서버 하드웨어로 마이그레이션할 예정입니다. 이는 새로운 Linux 배포판(Debian Buster)의 기능을 배우는 것을 의미하기도 합니다.

콘솔에서 실행할 때 실행되지만 MySQL에 연결하지 못하는 Perl CGI 스크립트가 있습니다.

AH01215: DBI 연결('my_db','my_db_user',...) 실패: '/tmp/mysql.sock' 소켓을 통해 로컬 MySQL 서버에 연결할 수 없습니다.

동일한 하드웨어에서 실행되고 있다는 점을 고려하면 동일한 Perl 설치 등이 될 것입니다. 왜 작동하지 않는지 모르겠습니다. Centos에서는 SELinux가 방해가 될 수 있다는 것을 알고 있지만 데비안에 기본적으로 이 기능이 있다고는 생각하지 않습니다. 하지만 하위 프로세스가 연결을 설정하도록 허용하려면 비슷한 작업을 수행해야 합니까?

mysqladmin은 이것이 올바른 장소라고 제안했습니다(예: 클릭하지 않았습니다).이 문제):

# mysqladmin 버전 -p
암호를 입력:
i686 기반 Linux용 mysqladmin Ver 8.0.17(소스 코드 배포)
Copyright (c) 2000, 2019, Oracle 및/또는 그 계열사. 판권 소유.

Oracle은 Oracle Corporation 및/또는 그 회사의 등록 상표입니다.
자회사. 다른 이름은 해당 회사의 상표일 수 있습니다.
소유자.

서버 버전 8.0.17
프로토콜 버전 10
UNIX 소켓을 통해 localhost에 연결
UNIX 소켓 /tmp/mysql.sock
가동 시간: 3일 26분 34초

스레드: 2 문제: 74254 느린 쿼리: 0 열기: 1042 테이블 새로 고침: 3 열린 테이블: 962 초당 쿼리 평균: 0.284

그리고 소켓은 분명히 존재합니다(콘솔에서 실행하면 작동하기 때문입니다).

$ ls -lF /tmp/mysql.sock
srwxrwxrwx 1 mysql mysql 0 9월 6일, 22:33 /tmp/mysql.sock=

답변1

Debian 9 및 10의 Apache2는 systemd에서 시작됩니다. 그것은 가지고있다

PrivateTmp=true

그 정의에서. 따라서 서버에서 시작된 프로세스는 일반 /tmp 및 /var/tmp 디렉토리에 액세스할 수 없습니다. 대신, 그들은 자신의 디렉토리를 가지고 있습니다.

소켓을 /tmp 밖으로 이동하거나 apache2를 시작할 수 있습니다.

PrivateTmp=false

관련 정보