본문으로 건너뛰기
50% 할인 모든 플랜, 기간 한정. 시작 가격 $2.48/mo
10 min left
데이터베이스 및 분석

Linux VPS에 Adminer 설치하는 방법 (Nginx와 올바른 보안 설정)

H 작성자 Haze 10 분 분량
Adminer login screen served by Nginx on a Linux VPS

열린 주소에서 실행 중인 Adminer 인스턴스는 데이터베이스를 잃는 가장 조용한 방법 중 하나입니다. 누군가 테이블을 확인하기 위해 단일 PHP 파일을 배포하고, URL이 작동하며, 오래된 복사본이 공격 표면이 될 때까지 파일이 몇 달 동안 그대로 남아 있습니다. 이 가이드가 Linux VPS에 Adminer를 설치하는 방법에 대해 도구 잠금에 실행만큼 많은 공간을 할애하는 이유가 바로 이 실패 모드입니다.

Adminer는 MySQL, MariaDB, PostgreSQL, SQLite 및 여러 다른 데이터베이스를 지원하는 단일 PHP 파일(전체 빌드에서 약 503 KB)입니다. 배포가 매우 간단하기 때문에 부주의하게 배포되는 경우가 많습니다.

Nginx와 PHP-FPM이 설치된 최신 Ubuntu 또는 Debian VPS에 설치하고, HTTP 인증, IP 허용 목록, Let's Encrypt를 사용한 HTTPS를 추가한 다음, 공개 설정을 완전히 건너뛰고 SSH 터널을 통해 Adminer에 접근해야 할 때를 위한 명확한 규칙으로 마무리합니다.

요약

  • Adminer는 wget 으로 webroot에 다운로드하는 단일 PHP 파일입니다. Nginx와 PHP-FPM이 이를 제공합니다.
  • 공개 Adminer 인스턴스에는 세 가지 모두 필요합니다: HTTP 인증 레이어, IP 허용 목록, HTTPS. 이 중 하나만으로는 충분하지 않습니다.
  • 가장 민감한 데이터베이스의 경우 Adminer를 아예 노출하지 마세요. localhost 그리고 SSH 터널을 통해 접근하세요.
  • 업데이트는 명령 하나입니다: 다시 실행하세요 wget 다운로드 명령을. 최근 보안 릴리스로 인해 최신 상태 유지가 선택이 아닌 실제 운영 작업이 되었습니다.

전제 조건: 설치 전에 필요한 것

이 가이드는 Ubuntu 26.04 및 24.04와 Debian 13을 대상으로 하며 Ubuntu 22.04 및 Debian 12에 대한 호환성 메모가 포함되어 있습니다. 기본 PHP-FPM 버전은 Ubuntu 26.04에서 8.5, Ubuntu 24.04에서 8.3, Debian 13에서 8.4, Debian 12에서 8.2, Ubuntu 22.04에서 8.1입니다.

  • Ubuntu 22.04, Ubuntu 24.04, Ubuntu 26.04, Debian 12 또는 Debian 13이 실행되는 Linux VPS로, sudo 액세스
  • 이 VPS 또는 Adminer가 네트워크를 통해 접근할 수 있는 서버에서 이미 실행 중인 데이터베이스 서버(MySQL, MariaDB 또는 PostgreSQL). 이 가이드는 데이터베이스를 설치하지 않습니다. 데이터베이스를 관리하는 데 사용하는 도구를 설치합니다.
  • 운영 체제의 지원 저장소에서 PHP-FPM을 설치하세요. Adminer의 컴파일된 파일이 PHP 5.3+를 지원하더라도 오래된 PHP 버전을 설치하는 대신 위에 나열된 배포판에서 제공하는 현재 버전을 사용하세요.
  • 공개 HTTPS 설정을 위해 VPS를 가리키는 호스트 이름과 인바운드 TCP 포트 80 및 443이 필요합니다. Certbot Nginx 워크플로 포트 80에서 HTTP-01 유효성 검사를 사용합니다. Let's Encrypt는 이제 지원합니다 단기 IP 주소 인증서, 하지만 Certbot은 Nginx 워크플로를 통해 자동으로 설치하지 않으므로 이 가이드에서는 호스트 이름을 사용합니다.

참고: 이 가이드는 의도적으로 Nginx를 사용합니다. Apache를 사용하는 경우 다운로드 및 강화 논리는 여전히 적용되지만 아래 서버 블록 구성은 적용되지 않습니다.

Nginx 및 PHP-FPM 설치

패키지 인덱스를 새로 고치고 서버에 필요한 PHP 데이터베이스 확장과 함께 Nginx 및 PHP-FPM을 설치하는 것으로 시작합니다:

sudo apt update
sudo apt install -y nginx php-fpm php-mysql

PostgreSQL 백엔드의 경우 설치하세요 php-pgsql 대신 또는 함께 php-mysql:

sudo apt install -y php-pgsql

PHP-FPM 소켓이 존재하는지 확인합니다:

ls /run/php/

소켓 파일 이름을 위에 나열된 버전과 일치시킵니다. 예를 들어 php8.5-fpm.sock Ubuntu 26.04의 경우, php8.3-fpm.sock Ubuntu 24.04의 경우 또는 php8.4-fpm.sock Debian 13의 경우. 예상 소켓이 없으면 다음으로 매칭 서비스를 확인하세요 systemctl status php8.5-fpm,로 바꾸면서 8.5 운영 체제에 설치된 버전으로.

프로 팁: 소켓 불일치는 502 Bad Gateway. 일치시키세요 fastcgi_pass 아래 파일 이름과 /run/php/, 해당 PHP-FPM 서비스가 실행 중인지 확인하고 다음을 확인하세요 /var/log/nginx/error.log 오류가 계속되면.

Adminer 다운로드

Adminer를 제공할 디렉토리를 만들고 단일 파일을 다운로드합니다. latest.php URL은 항상 현재 안정 릴리스로 확인됩니다:

sudo mkdir -p /var/www/adminer
sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php

MySQL 또는 MariaDB만 사용하는 경우 MySQL 전용 빌드가 더 작습니다(약 406 KB). 같은 방식으로 다운로드됩니다:

sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest-mysql.php

PHP-FPM에 읽기 액세스를 부여하면서 Adminer 디렉토리를 루트 소유로 유지합니다:

sudo chown -R root:root /var/www/adminer
sudo chmod 755 /var/www/adminer
sudo chmod 644 /var/www/adminer/adminer.php

You do not need to track the version number: the latest.php URL은 다운로드를 다시 실행하는 것이 업데이트 경로이기도 하다는 것을 의미하며, 유지 관리 섹션에서 다시 설명합니다.

Nginx 서버 블록 구성

Adminer 디렉토리를 서빙하고 .php 이전에 확인한 PHP-FPM 소켓으로 요청을 전달하는 서버 블록을 만듭니다. 새 사이트 파일을 엽니다:

sudo nano /etc/nginx/sites-available/adminer

다음 내용을 붙여넣고 db.example.com 이미 VPS를 가리키는 호스트 이름으로 바꾸고 fastcgi_pass 소켓이 PHP 버전과 일치하는지 확인합니다:

# /etc/nginx/sites-available/adminer
server {
    listen 80;
    server_name db.example.com;
    root /var/www/adminer;

    location = / {
        return 302 /adminer.php;
    }

    location = /adminer.php {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location / {
        return 404;
    }
}

심볼릭 링크를 통해 사이트를 활성화합니다 sites-enabled, 그런 다음 Nginx를 아직 다시 로드하지 않고 구성을 테스트합니다:

sudo ln -s /etc/nginx/sites-available/adminer /etc/nginx/sites-enabled/
sudo nginx -t

nginx -t 구문이 유효하고 테스트가 성공적임을 보고해야 합니다. 사이트에 인증 또는 IP 제한이 없으므로 Nginx를 아직 다시 로드하지 마세요. 두 가지 강화 단계를 계속 진행하세요. IP 제한 단계는 두 보호가 모두 적용된 후 첫 번째 다시 로드를 수행합니다.

액세스 잠금: 인증, IP 제한 및 HTTPS

공개 Adminer 인스턴스는 데이터베이스 자격 증명 바로 앞에 있으므로 단일 잠금 대신 계층적 방어가 필요합니다. 아래 세 가지 레이어는 각각 다른 역할을 합니다: HTTP 인증은 웹 서버에서 비밀번호 없는 모든 사람을 차단하고, IP 허용 목록은 승인되지 않은 주소의 연결을 차단하며, HTTPS는 입력한 자격 증명이 네트워크를 평문으로 통과하지 못하게 합니다. 세 가지 모두 추가하세요. 하나도 다른 것을 대체할 수 없습니다.

HTTP Basic 인증 추가

설치합니다 htpasswd 유틸리티를 설치합니다. 이는 apache2-utils 패키지에 포함되어 있습니다(Ubuntu 및 Debian):

sudo apt install -y apache2-utils

암호 파일과 사용자를 만듭니다(암호를 입력하라는 메시지가 표시됩니다):

sudo htpasswd -B -C 10 -c /etc/nginx/.htpasswd adminuser
sudo chown root:www-data /etc/nginx/.htpasswd
sudo chmod 640 /etc/nginx/.htpasswd

PHP 요청 자체가 보호되도록 정확한 Adminer PHP 위치에 지시문을 추가합니다:

location = /adminer.php {
    auth_basic           "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

두 지시문은 모두 Nginx HTTP auth_basic 모듈 참조. 실행 sudo nginx -t 구성을 유효성 검사하려면 실행하되, 아직 Nginx를 다시 로드하지 마세요. IP 허용 목록은 다음에 추가됩니다. Basic Auth 자격 증명을 일반 HTTP로 제출하지 마세요. 아래에서 HTTPS가 활성화될 때까지 기다리세요.

IP 주소로 액세스 제한

기본 인증은 인증되지 않은 사용자를 차단하지만 Nginx는 여전히 모든 소스의 요청을 수신합니다. 기존 Adminer PHP 위치를 다음 결합 블록으로 교체하여 IP 규칙과 Basic Auth 지시문이 한 곳에 유지되도록 합니다:

location = /adminer.php {
    satisfy all;

    allow                203.0.113.10;
    allow                203.0.113.0/28;
    deny                 all;

    auth_basic           "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

예시 주소를 실제 공개 IP 주소 또는 신뢰할 수 있는 네트워크 범위로 교체합니다. 다음 항목만 유지하세요: allow 항목만 유지하고 사용하지 않는 예시는 삭제합니다. 첫 번째 항목은 단일 주소를 보여주고 두 번째는 CIDR 범위를 보여줍니다. Nginx는 403 Forbidden 규칙과 일치하지 않는 주소에게 allow allow 규칙. Nginx 액세스 모듈 참조 지시문 구문을 문서화합니다. Nginx를 테스트하고 다시 로드합니다:

sudo nginx -t && sudo systemctl reload nginx

Let's Encrypt로 HTTPS 활성화

VPS를 가리키는 도메인을 사용하여 Certbot과 Nginx 플러그인을 설치한 다음 인증서를 요청합니다:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d db.example.com

Certbot은 포트 443에서 HTTPS를 제공하도록 서버 블록을 편집하고 HTTP를 HTTPS로 리디렉션하도록 제안합니다. 리디렉션을 수락하세요. 또한 갱신 타이머를 설치하여 만료 전에 인증서가 자동으로 갱신됩니다. 갱신 경로를 다음으로 확인할 수 있습니다: sudo certbot renew --dry-run, 오류 없이 완료되어야 합니다.

이제 방문하세요 https://db.example.com/adminer.php 허용된 주소에서 방문하여 Adminer가 로드되기 전에 Nginx가 Basic Auth 자격 증명을 요청하는지 확인합니다.

Adminer login screen after first successful load, showing the database system dropdown and server and username fields

접근 모델 선택: 공개 HTTPS 대 SSH 터널

위의 설정은 여러 컴퓨터에서 데이터베이스에 브라우저 액세스가 필요하거나 SSH 세션을 열기가 어려울 때 적합합니다. 이것이 유일한 모델은 아니며, 민감한 데이터베이스의 경우 가장 방어적인 모델이 아닙니다.

민감한 설정에서는 Adminer를 공개적으로 노출하지 마세요. Adminer 공식 보안 가이드 가능하면 공개 인터넷에서 접근할 수 없도록 만들 것을 권장합니다. 터널 전용 접근을 선택하는 경우 공개 Nginx 서버 블록을 이 루프백 전용 구성으로 교체하고 공개 HTTPS 설정을 건너뛰세요:

# /etc/nginx/sites-available/adminer
server {
    listen 127.0.0.1:8080 default_server;
    server_name _;
    root /var/www/adminer;

    location = / {
        return 302 /adminer.php;
    }

    location = /adminer.php {
        auth_basic           "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location / {
        return 404;
    }
}

교체 구성을 테스트하고 다시 로드합니다:

sudo nginx -t && sudo systemctl reload nginx

그런 다음 자신의 기계에서 터널을 엽니다:

ssh -N -L 127.0.0.1:8080:127.0.0.1:8080 user@your-server-ip

터널이 실행 중인 상태에서 엽니다 http://127.0.0.1:8080/adminer.php. Nginx는 VPS 루프백 인터페이스를 통해서만 Adminer 연결을 수락하고 SSH는 암호화된 연결을 통해 트래픽을 전달합니다. 이는 OpenSSH 로컬 포워딩 문서.

여러 기계에서 직접 브라우저 액세스가 필요한 경우 공개 HTTPS, Basic Auth 및 IP 허용 목록 설정을 사용하세요. 공개 액세스가 불필요한 경우 루프백 전용 SSH 설정을 선호하세요.

핵심 요점: 가장 안전한 Adminer는 공개 인터넷에서 절대 접근할 수 없는 것입니다.

Adminer 업데이트 유지

잊혀진 인스턴스가 여기서 진짜 위험이며, 나중에 생각하기보다 예약된 작업으로 처리할 가치가 있습니다. Adminer 업데이트는 동일한 wget 설치에 사용한 명령이 있습니다. 왜냐하면 latest.php 항상 현재 릴리스를 가져옵니다:

sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php

이것은 이론적인 우려가 아닙니다. Adminer 5.4.3, 2026년 7월 9일 출시된, 단일 릴리스에서 7개의 GitHub 보안 권고 사항을 해결했습니다. 이전 권고 사항인 CVE-2026-25892 Adminer의 버전 확인 엔드포인트조차도 인증되지 않은 서비스 거부 벡터로 전환될 수 있음을 보여주었습니다. 이 문제는 버전 5.4.2에서 수정되었습니다. 오래된 복사본은 공개적으로 문서화된 취약점을 축적하므로 업데이트가 정기 유지 관리가 되어야 합니다.

참고: 현재 공식 Adminer 릴리스를 유지하세요. AdminerEvo 저장소는 2025년 1월에 아카이브됨 이며 활발히 유지 관리되는 대안이 아닙니다.

VPS에 배포

수동 단계를 건너뛰고 싶다면 Adminer를 원클릭 배포로 이용할 수 있습니다. Cloudzy 마켓플레이스 에서 Cloudzy Linux VPS. 마켓플레이스 이미지는 Apache, Basic Auth 및 자체 서명 인증서를 사용하므로 위의 Nginx, IP 허용 목록 및 Let's Encrypt 스택과 다릅니다. 프로덕션 데이터베이스 자격 증명을 입력하기 전에 해당 보안 차이를 검토하세요.

Adminer 자체의 리소스 사용량은 미미합니다. 데이터베이스가 크기를 결정합니다. CPU, 메모리 및 스토리지는 Adminer가 아닌 데이터베이스의 데이터 및 인덱스 크기, 쿼리 로드, 연결 수, 백업 및 예상 성장에 따라 선택하세요.

자주 묻는 질문

VPS에서 Adminer를 공개적으로 노출하는 것이 안전합니까?

혼자서는 안됩니다. Adminer를 공개적으로 노출해야 한다면 HTTP Basic Authentication, IP 허용 목록 및 HTTPS를 함께 뒤에 배치하세요. 이러한 제어는 위험을 줄이지만 공개 노출을 위험 없이 만들지는 않습니다. 민감한 데이터베이스의 경우 Adminer를 localhost 에 바인딩하고 SSH 터널을 통해 접근하세요.

인터넷에 노출시키지 않고 Adminer에 어떻게 액세스합니까?

Adminer가 다음에서 수신 대기하도록 위에 표시된 루프백 전용 Nginx 서버 블록을 구성하세요: 127.0.0.1:8080으로 그것을 가리키는 docker context를 만든 뒤, ssh -N -L 127.0.0.1:8080:127.0.0.1:8080 user@your-server-ip 자신의 기계에서. 열기 http://127.0.0.1:8080/adminer.php 터널이 실행되는 동안.

Adminer는 MySQL뿐만 아니라 PostgreSQL에도 연결할 수 있나요?

예. Adminer는 MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle을 기본 지원하며 플러그인을 통해 더 많은 데이터베이스를 사용할 수 있습니다. 데이터베이스에 맞는 PHP 확장을 설치하세요. 예를 들어 php-pgsql PostgreSQL용으로 PHP가 통신할 수 있도록 합니다.

Adminer를 어떻게 최신 상태로 유지합니까?

다운로드 명령을 다시 실행하세요: sudo wget -O /var/www/adminer/adminer.php https://www.adminer.org/latest.php. 그 latest.php URL은 항상 현재 안정 릴리스를 반환하므로 최신 버전으로 복사본을 덮어씁니다. 최근 보안 릴리스로 인해 기억할 때만이 아니라 일정에 따라 이를 수행할 가치가 있습니다.

Adminer를 apt 패키지로 설치해야 합니까, 아니면 직접 다운로드해야 합니까?

단일 파일을 직접 다운로드하세요. 즉시 현재 버전을 제공하고 업데이트를 한 줄 명령으로 만들며, 배포 패키지는 공식 릴리스보다 뒤처질 수 있습니다. 직접 파일은 최신 보안 수정에 더 짧은 경로를 가진 동일한 도구입니다.

공유

블로그 더 보기

계속 읽기.

배포할 준비가 되셨나요? 월 $2.48부터.

2008년부터 독립 클라우드. AMD EPYC, NVMe, 40 Gbps. 14일 환불 보장.