Ubuntu 서버에서 환경변수를 /etc/environment 한 곳에만 등록하고, PHP CLI와 PHP-FPM에서 모두 getenv()로 사용하는 방법을 정리합니다. 예시 변수명과 값은 모두 가상 데이터입니다.
/etc/environment에서만 관리합니다. PHP-FPM에는 최초 한 번 파일 연결과 Worker 상속 설정이 필요합니다.SSH로 로그인해 실행하는 PHP CLI는 일반적으로 로그인 세션의 환경변수를 상속받습니다. 반면 PHP-FPM은 systemd 서비스로 실행되므로, 로그인 세션과 관계없이 환경변수를 별도로 전달해야 합니다. 또한 PHP-FPM은 기본적으로 Worker 환경을 비우도록 설정되어 있습니다.
| 구분 | 환경변수를 얻는 경로 | 필요한 작업 |
|---|---|---|
| PHP CLI (SSH) | 로그인 환경 | 파일 수정 후 재로그인 |
| PHP-FPM | systemd → PHP-FPM Worker | EnvironmentFile + clear_env 설정 |
sudo nano /etc/environment
파일의 기존 설정은 유지하고 다음과 같은 예시를 추가합니다.
EXAMPLE_API_KEY="replace-with-your-key"
EXAMPLE_SERVICE_ID="replace-with-your-id"
EXAMPLE_OPTION="enabled"
export를 붙이지 않습니다.$(...) 실행이나 일반적인 셸 변수 확장을 기대하면 안 됩니다.EXAMPLE_* 이름과 값은 실제 서비스와 무관한 예시입니다.SSH 세션을 종료하고 다시 로그인한 다음 확인합니다. 기존 셸에는 변경 내용이 자동 반영되지 않습니다.
printenv EXAMPLE_API_KEY
php -r '$v = getenv("EXAMPLE_API_KEY"); echo ($v !== false && $v !== "") ? "OK\n" : "FAIL\n";'
특정 PHP 버전으로 확인하려면 설치된 명령어를 선택해 실행합니다.
php5.6 -r 'var_dump(getenv("EXAMPLE_API_KEY") !== false);'
php8.4 -r 'var_dump(getenv("EXAMPLE_API_KEY") !== false);'
주의: cron, systemd 타이머, 다른 서비스가 실행하는 CLI는 SSH 로그인 환경을 상속받지 않을 수 있습니다. 이 글의 CLI 절차는 일반적인 SSH 로그인 후 실행을 기준으로 합니다.
먼저 서버에 설치된 PHP-FPM 서비스 이름을 확인합니다.
systemctl list-units --all --type=service 'php*-fpm.service'
예를 들어 PHP 8.4를 사용한다면 다음 명령어로 systemd override를 생성합니다.
sudo systemctl edit php8.4-fpm
편집기에 다음 두 줄을 추가합니다. 기존 서비스 파일을 직접 변경하지 않는 방식입니다.
[Service]
EnvironmentFile=/etc/environment
PHP 5.6도 사용 중이라면 sudo systemctl edit php5.6-fpm으로 같은 설정을 추가합니다. 실제 서비스명은 서버에 따라 다를 수 있습니다.
sudo systemctl cat php8.4-fpm
출력에 EnvironmentFile=/etc/environment가 포함되어 있으면 override 설정을 확인할 수 있습니다.
서비스에 환경변수를 전달해도 PHP-FPM의 clear_env 기본 설정으로 인해 PHP Worker에서 보이지 않을 수 있습니다. 사용할 Pool의 설정 파일을 엽니다.
sudo nano /etc/php/8.4/fpm/pool.d/www.conf
해당 Pool에서 다음 설정을 적용합니다.
clear_env = no
PHP 5.6에서도 /etc/php/5.6/fpm/pool.d/www.conf 등 실제 Pool 파일에서 동일하게 설정합니다. Pool 이름이 www가 아니면 사용 중인 Pool 파일을 확인하세요.
clear_env = no는 해당 Worker에 서비스 환경변수를 폭넓게 전달합니다. 여러 신뢰 수준의 애플리케이션이 한 PHP-FPM 서비스를 공유한다면 권장되지 않습니다. 필요한 변수만 env[EXAMPLE_API_KEY] = $EXAMPLE_API_KEY로 전달하는 방식도 검토하세요. 실제 변수 값을 또 다른 파일에 중복 작성할 필요는 없습니다.PHP-FPM 버전에 맞게 설정 검사를 먼저 진행합니다.
sudo php-fpm8.4 -t
systemd override를 최초 등록하거나 변경했다면 다음 명령어를 실행합니다.
sudo systemctl daemon-reload
서비스를 재시작하여 새 환경변수를 읽습니다.
sudo systemctl restart php8.4-fpm
sudo systemctl status php8.4-fpm --no-pager
PHP 5.6 서비스를 사용한다면 위 명령어의 버전을 5.6으로 바꾸어 실행합니다. /etc/environment의 변수 값만 변경한 경우에는 daemon-reload 없이 PHP-FPM 재시작만 하면 됩니다.
다음 코드는 PHP 5.6과 PHP 8.4 양쪽에서 사용할 수 있습니다. CLI에서는 php로 실행하고, PHP-FPM은 인증된 관리자 경로에서 임시 PHP 검사 파일로 실행하여 결과를 비교합니다.
<?php
header('Content-Type: text/plain; charset=utf-8');
$keys = array(
'EXAMPLE_API_KEY',
'EXAMPLE_SERVICE_ID',
'EXAMPLE_OPTION'
);
foreach ($keys as $key) {
$value = getenv($key);
echo $key . ': ' .
($value !== false && $value !== '' ? 'OK' : 'FAIL') .
PHP_EOL;
}
EXAMPLE_API_KEY: OK
EXAMPLE_SERVICE_ID: OK
EXAMPLE_OPTION: OK
위 결과는 예시입니다. 웹에서 검사할 경우 파일을 외부에 공개하지 말고, 테스트가 끝나면 삭제해야 합니다. 실제 환경변수 값은 브라우저나 로그에 출력하지 않습니다.
최초 설정이 완료되었다면 새로운 변수의 등록 위치는 계속 /etc/environment 하나입니다.
sudo nano /etc/environment
EXAMPLE_NEW_SETTING="replace-with-value"
변경한 값을 PHP-FPM에 반영하려면 해당 PHP-FPM 서비스를 다시 시작하고, SSH CLI에서는 새로 로그인합니다.
sudo systemctl restart php8.4-fpm
| 항목 | 최초 1회 | 변수 추가/수정 |
|---|---|---|
| /etc/environment | 변수 등록 | 이 파일만 수정 |
| systemd override | EnvironmentFile 연결 | 재설정 불필요 |
| PHP-FPM Pool | clear_env 설정 | 재설정 불필요 |
| PHP-FPM | 재시작 | 재시작 |
| SSH CLI | 재로그인 | 재로그인 |
/etc/environment는 시스템 공통 설정으로, 비밀값 격리를 보장하지 않습니다. 모든 사용자에게 접근을 제한해야 하는 자격증명에는 별도 비밀 관리 방식을 고려하세요.600으로 바꾸면 일부 PAM 로그인 환경에서 정상 로드되지 않을 수 있습니다.printenv 명령은 로그 기록·화면 공유 시 노출에 주의하세요.환경변수는 /etc/environment 한 곳에 등록하고, PHP-FPM의 systemd override 및 Worker 상속을 최초 설정하면 됩니다. 이후 값 변경 시에는 PHP-FPM 재시작과 SSH 재로그인만으로 새 설정을 사용할 수 있습니다. 단, 공통 환경변수 방식은 사이트별 비밀정보 접근 격리 수단은 아닙니다.