跳至主要内容
五折优惠 全部方案,限时优惠。起价 $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 是一个单一的 PHP 文件(完整版约 503 KB),支持 MySQL、MariaDB、PostgreSQL、SQLite 及其他多种数据库。部署极其简单,这恰恰是它经常被随意部署的原因。

您将在配有 Nginx 和 PHP-FPM 的现代 Ubuntu 或 Debian VPS 上安装它,添加 HTTP 认证、IP 允许列表和 Let's Encrypt HTTPS,最后给出一条明确规则:何时完全跳过公开设置,转而通过 SSH 隧道访问 Adminer。

TL;DR(太长不看版)

  • Adminer 是您用以下命令下载到 webroot 的单一 PHP 文件: wget 下载到 webroot;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 访问
  • 数据库服务器(MySQL、MariaDB 或 PostgreSQL)已在运行,可在此 VPS 上,也可在 Adminer 能通过网络访问的服务器上。本指南不安装数据库,它安装的是您用来管理数据库的工具。
  • 从操作系统支持的软件仓库安装 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

首先刷新软件包索引,然后安装 Nginx 和 PHP-FPM,以及服务器所需的 PHP 数据库扩展:

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

保持 Adminer 目录归 root 所有,同时授予 PHP-FPM 读取权限:

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 应报告语法有效且测试成功。尚不要重新加载 Nginx,因为站点还没有身份验证或 IP 限制。继续执行这两个强化步骤,IP 限制步骤在两项保护就位后执行首次重载。

锁定访问:身份验证、IP 限制和 HTTPS

公开的 Adminer 实例直接暴露在您的数据库凭据前,因此需要分层防御而非单一锁定。以下三层各司其职:HTTP 认证在 Web 服务器层拦截无密码的访问,IP 允许列表阻止来自未批准地址的连接,HTTPS 防止您输入的凭据以明文在网络上传输。三层全部添加,缺一不可。

添加 HTTP 基本认证

安装 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

将指令添加到 Adminer PHP 的精确位置,以保护 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 允许列表将在下一步添加。不要通过明文 HTTP 提交 Basic Auth 凭据;等到下面启用 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 从允许的地址访问,并确认 Nginx 在 Adminer 加载之前请求 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 服务器块替换为此仅限 loopback 的配置,并跳过公开 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 的 loopback 接口接受 Adminer 连接,而 SSH 通过其加密连接承载流量。这使用了 OpenSSH 本地转发文档.

当您需要从多台机器直接通过浏览器访问时,使用公开 HTTPS、Basic Auth 和 IP 允许列表设置。当不需要公开访问时,优先使用仅限 loopback 的 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 日发布)在一个版本中解决了七个 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 暴露于互联网的情况下访问它?

配置上面显示的仅限 loopback 的 Nginx 服务器块,使 Adminer 监听在 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 能同时连接 PostgreSQL 和 MySQL 吗?

是的。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 始终返回当前稳定版本,因此这会用最新版本覆盖您的副本。最近的安全版本使这值得按计划执行,而不仅仅是在您记得时才执行。

我应该通过 apt 包安装 Adminer 还是直接下载?

直接下载单个文件。它能立即提供当前版本,并使更新变为一行命令,而发行包可能落后于官方版本。直接文件是相同的工具,到最新安全修复的路径更短。

分享

博客更多内容

继续阅读。

准备好部署了吗? 起价 $2.48/月。

独立云厂商,自 2008 年起。AMD EPYC、NVMe、40 Gbps。14 天退款保证。