Ubuntu 裝 Cacti 的每一步,含時區資料表、PHP 兩個 ini、snmpd 只綁 localhost 這三個一定會卡住的地方。
發布於 2026-09-04・約 6 分鐘
Cacti 是 RRDTool 做的網路流量繪圖與設備監控系統。這篇是 Ubuntu 上的完整安裝流程,手上這台是 26.04 LTS。
套件庫版本:26.04 是 Cacti 1.2.30,24.04 LTS 是 1.2.26,上游最新是 1.2.31(2026-06-15)。除非你需要 1.2.31 才有的東西,用套件版划算得多——跟著發行版拿安全更新,對一台會長期放著跑的監控機來說比版本號重要。
cacti 套件會把 Apache、PHP、RRDTool、SNMP 一整串相依都拉進來,不用自己列套件名。
cacti
sudo apt update sudo apt install -y cacti snmp snmpd rrdtool
安裝過程會跳出 dbconfig-common 的設定畫面問兩件事:
dbconfig-common
apache2
/etc/cacti/debian.php
之後想改連線設定的話在 /etc/dbconfig-common/cacti.conf 跟 /etc/cacti/debian.php,兩個檔要一致。
/etc/dbconfig-common/cacti.conf
打開 http://主機IP/cacti 進安裝精靈,預設帳密 admin / admin,第一次登入強制改密碼。
http://主機IP/cacti
admin
Cacti 需要 MySQL 的時區對照表,這張表預設是空的。
sudo mariadb-tzinfo-to-sql /usr/share/zoneinfo | sudo mariadb mysql sudo mariadb -e "GRANT SELECT ON mysql.time_zone_name TO 'cacti'@'localhost'; FLUSH PRIVILEGES;"
mariadb-tzinfo-to-sql 是現在的名字,mysql_tzinfo_to_sql 還在但只是相容用的舊名。使用者名稱 cacti 要換成 dbconfig 實際建的那個,去 /etc/cacti/debian.php 看 $database_username。
mariadb-tzinfo-to-sql
mysql_tzinfo_to_sql
$database_username
sudo sed -i 's|^;\?date.timezone =.*|date.timezone = Asia/Taipei|' \ /etc/php/8.*/apache2/php.ini /etc/php/8.*/cli/php.ini sudo systemctl reload apache2
只改 apache2 那個是最常見的錯。 改完之後網頁上的安裝檢查會顯示通過,看起來完全正常——但 poller 是 cron 用 CLI 跑的,讀的是另一個檔。結果是圖表的時間戳全部偏掉,而且沒有任何錯誤訊息,只是線畫在錯的位置。
版本號用 php -v 確認,上面的萬用字元 8.* 會把裝在這台機器上的都改到。
php -v
8.*
Cacti 的安裝檢查會列一串建議值,照著加:
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
innodb_buffer_pool_size = 512M join_buffer_size = 128M tmp_table_size = 128M max_allowed_packet = 32M max_heap_table_size = 128M
⚠ 網路上很多 Cacti 教學還會多列一行 innodb_additional_mem_pool_size,不要加。 這個變數在 MariaDB 10.2.2 就跟著 InnoDB 的內部記憶體配置器一起被移除了,現在的 MariaDB 遇到不認識的變數會拒絕啟動。症狀是 systemctl restart mariadb 卡住然後失敗,原因藏在 journalctl -u mariadb 裡,網頁那邊只會看到「資料庫連不上」。
innodb_additional_mem_pool_size
systemctl restart mariadb
journalctl -u mariadb
innodb_buffer_pool_size 給多少看這台機器的記憶體。給到實體記憶體一半以上、又跟別的服務共用同一台,換到的是 OOM 不是效能。
innodb_buffer_pool_size
改完重啟:
sudo systemctl restart mariadb
要抓設備資訊得先讓 snmpd 願意回應。
sudo nano /etc/snmp/snmpd.conf
找到這一行:
agentaddress 127.0.0.1,[::1]
Cacti 跟 snmpd 在同一台的話這樣可以,不用改。但只要監控主機跟被監控的設備分開,這行就得改成 agentaddress udp:161(或指定介面 IP),否則從外面 walk 永遠 timeout——而 systemctl status snmpd 顯示 active (running),看起來一切正常。這是 Ubuntu 特有的預設值,CentOS 的 net-snmp 不是這樣。
agentaddress udp:161
systemctl status snmpd
社群字串也改掉,別留 public:
public
rocommunity 你自己的字串 127.0.0.1
重啟並驗:
sudo systemctl restart snmpd && sudo systemctl enable snmpd snmpwalk -v2c -c 你自己的字串 localhost system
有回東西才算通。
套件已經放好 /etc/cron.d/cacti,預設每分鐘一次,不用自己寫。看 log 確認:
/etc/cron.d/cacti
sudo tail -f /usr/share/cacti/site/log/cacti.log
一直是空的話,先確認 /etc/cron.d/cacti 裡那行沒有被註解掉——某些升級路徑會把它註解起來,等網頁安裝精靈跑完才生效。
sudo ufw allow 80/tcp
ufw status 回 inactive 的話就沒有東西擋你,這步跳過。Ubuntu Server 預設 ufw 是關的,跟 CentOS 預設開 firewalld 剛好相反。
ufw status
inactive
我以前寫過一份 Cacti 1.1.7 + CentOS 7 的筆記,那份現在不能照抄——CentOS 7 於 2024-06-30 結束支援,yum 那套沒有對應的目標系統了。差異整理如下:
yum
create database
grant
cacti.sql
/etc/php.ini
cli
innodb_additional_mem_pool_size=80M
firewall-cmd --add-service=http
ufw allow 80/tcp
setenforce 0
chown apache
標籤:Cacti、Ubuntu、監控、網管、SNMP、RRDTool