架構總覽
| 元件 | 版本/路徑 | 說明 |
| PowerDNS Authoritative Server | 3.3.1 | DNS 解析核心,支援 MySQL/MariaDB/PostgreSQL 後端 |
| Poweradmin | 2.1.6 | PHP Web 管理介面,管理域名、記錄、用戶權限 |
| 資料庫 | MariaDB 5.5+ | 儲存區域資料、記錄、超級主機設定 |
| Web 伺服器 | Nginx + PHP-FPM | lnmp 架構,/apps/dat/web/pdns |
編譯安裝關鍵參數 (spec 檔片段)
%configure \
--enable-pdns_server \
--enable-tools \
--with-lua \
--with-boost=/usr \
--with-dynmodules="gmysql" \
--with-mysql=/apps/svr/mysql
# 關鍵:修正 libtool rpath 問題
sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
目錄佈局 (/apps 架構)
/apps/
├── svr/
│ ├── pdns-3.3.1/ # PowerDNS 程式碼
│ │ ├── bin/
│ │ ├── sbin/pdns_server
│ │ └── lib/
│ └── mysql/ # MariaDB 安裝目錄
├── lib/
│ └── pdns-3.3.1/ # 庫檔、配置
├── dat/
│ └── web/
│ └── pdns/ # Poweradmin 程式碼
├── conf/
│ └── pdns/
│ ├── pdns.conf # 主配置
│ └── pdns.sql # 資料庫結構
├── sh/
│ └── pdns # 啟動腳本 (SysV init)
└── run/
└── pdns/ # Unix socket 目錄
核心配置 /apps/conf/pdns/pdns.conf
launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=pdns
gmysql-password=strong_password
gmysql-dbname=pdns
gmysql-socket=/apps/run/mysql/mysql.sock
local-address=0.0.0.0
local-port=53
query-logging=yes
loglevel=4
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
api-key=changeme_strong_api_key
資料庫初始化
# 1. 建立資料庫與用戶
mysql -u root -p <
Poweradmin 部署 (Nginx + PHP-FPM)
# 1. 解壓至 Web 根目錄
cd /apps/dat/web
tar xf poweradmin-2.1.6.tgz
mv poweradmin-2.1.6 pdns
# 2. Nginx 虛擬主機片段
server {
listen 80;
server_name pdnsadmin.example.com;
root /apps/dat/web/pdns;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/apps/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 3. 瀏覽器訪問安裝嚮導,填入資料庫資訊、建立管理員帳號
Systemd 服務檔 (/etc/systemd/system/pdns.service)
[Unit]
Description=PowerDNS Authoritative Server
After=network.target mariadb.service
[Service]
Type=forking
ExecStart=/apps/svr/pdns-3.3.1/sbin/pdns_server --daemon --guardian=yes --config-dir=/apps/conf/pdns
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/apps/run/pdns/pdns.pid
Restart=on-failure
[Install]
WantedBy=multi-user.target
RPM 打包自動化 (pdns-3.3.1.spec 關鍵段)
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
# 佈署額外檔案
mkdir -p %{buildroot}/apps/dat/web/pdns
mkdir -p %{buildroot}/apps/sh
mkdir -p %{buildroot}/apps/conf/pdns
cp -rp $RPM_BUILD_DIR/pdns-3.3.1/padmin/* %{buildroot}/apps/dat/web/pdns/
cp -rp $RPM_BUILD_DIR/pdns-3.3.1/conf/pdns.conf %{buildroot}/apps/conf/pdns/
cp -rp $RPM_BUILD_DIR/pdns-3.3.1/sh/pdns %{buildroot}/apps/sh/pdns
cp -rp $RPM_BUILD_DIR/pdns-3.3.1/conf/pdns.sql %{buildroot}/apps/conf/pdns/
%files
%config /apps/conf/pdns/pdns.conf
%config /apps/sh/pdns
%config /apps/conf/pdns/pdns.sql
%{_sbindir}/pdns_server
%{_bindir}/pdns_control
%{_libdir}/pdns/*
驗證與測試
# 1. 檢查服務狀態
systemctl status pdns
# 2. 測試解析
dig @127.0.0.1 example.com A
dig @127.0.0.1 -x 192.168.1.100
# 3. Poweradmin Web 介面
# https://pdnsadmin.example.com
# 4. API 測試 (需 api-key)
curl -H "X-API-Key: changeme_strong_api_key" https://127.0.0.1:8081/api/v1/servers/localhost/zones
常見問題
- gmysql 模組載入失敗:確認
libgmysqlbackend.so 存在於 /apps/lib/pdns-3.3.1/,且 ldconfig 已更新
- 資料庫連線失敗:檢查
pdns.conf socket 路徑、用戶權限、防火牆
- Web 介面 500 錯誤:查看 Nginx/PHP-FPM 錯誤日誌,常見
session.save_path 權限、open_basedir 限制
- 區域不生效:Poweradmin 修改後需
pdns_control reload 或等待自動輪詢