แนวทางแก้ไขปัญหา phpMyAdmin ไม่สามารถเชื่อมต่อ MySQL บน AlmaLinux 9 พร้อมปรับปรุง Performance และความปลอดภัย การติดตั้ง MySQL และ phpMyAdmin บน AlmaLinux 9 ให้ทำงานได้อย่างมีประสิทธิภาพ และปลอดภัย อาจพบปัญหาหลายอย่าง เช่น ไฟล์ปลั๊กอินหาย (mysql_native_password.so หรือ component_reference_cache.so) การตั้งค่า SELinux ไม่ถูกต้อง หรือการกำหนดสิทธิ์โฟลเดอร์ และไฟร์วอลล์ไม่ครบถ้วน
ก่อนอื่นควรตรวจสอบว่ามี MySQL ติดตั้งบนระบบของเราหรือไม่ และสามารถทำงานได้หรือเปล่า
• ตรวจสอบแพ็กเกจ (ถ้าติดตั้งผ่าน DNF หรือ YUM):
rpm -qa | grep mysql-server
หากมีแพ็กเกจแสดงผล เช่น mysql-server-8.x.x.x86_64 แสดงว่ามีการติดตั้งผ่าน Repository
• ตรวจสอบสถานะ MySQL :
systemctl status mysqld
• หากยังไม่ทำงาน (inactive/failed) ต้องเริ่มต้นด้วย :
systemctl start mysqld
systemctl enable mysqld
• ตรวจสอบการติดตั้งแบบ Manual (ถ้าเคยติดตั้งเอง) :
ใช้คำสั่ง which mysql หรือ mysql --version เพื่อตรวจสอบว่าอยู่ใน PATH ใด
เช็คว่าไฟล์ไบนารีถูกเก็บอยู่ที่ /usr/local/mysql/ หรือ /usr/bin/mysql หรือไม่
หากตรวจสอบแล้วพบการติดตั้งชนกันทั้งแบบ Manual และผ่าน Repository (DNF) ควรเลือกรูปแบบเดียวเพื่อป้องกันความขัดแย้ง
การแก้ไขปัญหาไฟล์ปลั๊กอินหาย mysql_native_password.so หรือ component_reference_cache.so
• MySQL 8.x เริ่มหันไปใช้ caching_sha2_password เป็นค่าเริ่มต้น แทน mysql_native_password
ไฟล์ปลั๊กอินอย่าง mysql_native_password.so หรือ component_reference_cache.so อาจไม่ได้ถูกติดตั้ง (หรือสูญหายจากการติดตั้งไม่สมบูรณ์) ทำให้ MySQL แจ้งว่า “Plugin 'mysql_native_password' is not loaded” หรือ “Can't open shared library component_reference_cache.so
• แนวทางแก้ไข ตรวจสอบ Plugin Directory (plugin_dir) เปิดไฟล์ /etc/my.cnf หรือ /etc/my.cnf.d/mysql.cnf แล้วดูส่วน [mysqld]
ตัวอย่าง :
[mysqld]
plugin_dir = /usr/lib64/mysql/plugin
หรือหากติดตั้งไว้ที่ /usr/local/mysql/ อาจตั้งค่า :
plugin_dir = /usr/local/mysql/lib/plugin
• จากนั้น รีสตาร์ต MySQL :
sudo systemctl restart mysqld
• ค้นหาไฟล์ปลั๊กอิน
find / -name "mysql_native_password.so" 2>/dev/null
find / -name "component_reference_cache.so" 2>/dev/null
หากพบไฟล์ ให้คัดลอกมาใส่ไว้ใน Directory ที่กำหนด plugin_dir ข้างต้น
หากไม่พบ ให้ทำการติดตั้ง MySQL ซ้ำ หรือดาวน์โหลด Binary ของ MySQL 8.x มาดึงไฟล์ปลั๊กอิน
ติดตั้งปลั๊กอิน (ถ้าจำเป็น)
• หากไฟล์วางถูกที่แล้ว แต่ยังใช้งานไม่ได้ ให้ล็อกอินเข้า MySQL :
mysql -u root -p
• แล้วติดตั้ง :
INSTALL PLUGIN mysql_native_password SONAME 'mysql_native_password.so';
หรือถ้าเป็นปลั๊กอินอื่น เช่น component_reference_cache.so ก็ใช้ชื่อไฟล์ปลั๊กอินตามต้องการ
• เปลี่ยนแปลงผู้ใช้ให้ใช้ปลั๊กอินที่ถูกต้อง
หากบางผู้ใช้ยังเรียก mysql_native_password อยู่ ให้แก้เป็น :
ALTER USER 'exoroot'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'รหัสผ่านของคุณ';
หรือเปลี่ยนไปใช้ caching_sha2_password (ค่าเริ่มต้นใน MySQL 8.x) กรณี phpMyAdmin เวอร์ชันใหม่รองรับแล้ว
• ปัญหา Plugin mysql_native_password is not loaded เมื่อเข้า phpMyAdmin
หาก phpMyAdmin เป็นเวอร์ชันเก่า (ต่ำกว่า 4.7) อาจยังไม่รองรับ caching_sha2_password
หาก MySQL หาปลั๊กอิน mysql_native_password.so ไม่เจอ จะทำให้ล็อกอินผ่านผู้ใช้ที่ใช้ปลั๊กอินนั้นไม่ได้
• ติดตั้ง phpMyAdmin เวอร์ชันใหม่ (เช่น 5.x)
ติดตั้งปลั๊กอิน mysql_native_password ใน MySQL หรือเปลี่ยนผู้ใช้ไปใช้ caching_sha2_password
แก้ไฟล์ config.inc.php ของ phpMyAdmin เพื่อชี้ Host, User, Password ให้ถูกต้อง
• ตัวอย่างไฟล์ config.inc.php :
<?php
$cfg['blowfish_secret'] = 'someRandomBlowfishKey32chars';// กำหนด Server
$i = 0;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql.sock';
$cfg['Servers'][$i]['user'] = 'username_root'; // (กรณีต้องการล็อกอินแบบ config)
$cfg['Servers'][$i]['password'] = 'password_root';
$cfg['TempDir'] = '/usr/share/phpMyAdmin/tmp';
• สิทธิ์โฟลเดอร์ tmp ใน phpMyAdmin บางครั้ง phpMyAdmin ต้องการโฟลเดอร์ tmp ในการทำงาน (โดยเฉพาะการอัปโหลดไฟล์หรือส่งออกไฟล์)
sudo mkdir -p /usr/share/phpMyAdmin/tmp
sudo chown -R apache:apache /usr/share/phpMyAdmin/tmp
sudo chmod -R 775 /usr/share/phpMyAdmin/tmp
รีสตาร์ต Apache/Nginx และ PHP-FPM เพื่อให้การตั้งค่าใหม่มีผล
• การลบ/ติดตั้งใหม่ phpMyAdmin กระทบฐานข้อมูล หรือไม่?
ไม่กระทบ เพราะข้อมูลจริงอยู่ใน /var/lib/mysql หรือ datadir อื่น ๆ
phpMyAdmin เป็นเพียง Web Interface หากเราลบติดตั้งใหม่ ข้อมูลใน DB ยังคงอยู่เหมือนเดิม
• นอกจากแก้ปัญหาไฟล์ปลั๊กอิน และ phpMyAdmin แล้ว ควรปรับระบบให้เร็วขึ้นเพื่อลดภาระของเซิร์ฟเวอร์
• การแบ่งหน้า (Pagination) ใน Query
ใช้ LIMIT และ OFFSET เพื่อดึงเฉพาะส่วนข้อมูลที่จำเป็นต่อการแสดงผล
หลีกเลี่ยง SELECT * แต่ให้ระบุฟิลด์เฉพาะที่ใช้
• Caching
ติดตั้ง Memcached หรือ Redis และใช้ PHP Extension (เช่น php-pecl-redis)
ก่อน Query DB ตรวจสอบใน Cache หากมี ให้ส่งข้อมูลจาก Cache ทันที
หลัง Query สำเร็จ ให้บันทึกลง Cache พร้อมกำหนด TTL
• Lazy Load รูปภาพ
ใช้ loading="lazy" หรือเทคนิค JavaScript เพื่อลดเวลาโหลดหน้า
• Indexing และการออกแบบตาราง
ตรวจสอบให้คอลัมน์ที่ใช้ใน WHERE หรือ ORDER BY มี Index เหมาะสม
ลดจำนวน JOIN ซับซ้อนเท่าที่เป็นไปได้
• SELinux หากบล็อกการเชื่อมต่อจาก Apache/PHP ไปยัง MySQL ให้ตั้งค่า :
sudo setsebool -P httpd_can_network_connect_db on
หากมีไฟล์/โฟลเดอร์โดนบล็อก ให้ใช้ restorecon -Rv /path/to/dir เพื่อคืนค่าป้ายกำกับ
• Firewall เปิดพอร์ต HTTP/HTTPS และ MySQL (หากต้องการเข้าจากนอกเครื่อง) :
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=mysql
sudo firewall-cmd --reload
• Content Security Policy (CSP) ป้องกัน Cross-Site Scripting (XSS) ด้วยการกำหนด Policy ว่าจะโหลด Script, Style, รูปภาพ จากไหนได้บ้าง
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://www.googletagmanager.com;");
• Structured Data (JSON-LD)
เพิ่มความน่าเชื่อถือ SEO และผลการค้นหา โดยฝัง <script type="application/ld+json"> ตามมาตรฐาน schema.org
• สิทธิ์ผู้ใช้ MySQL
ควรใช้ผู้ใช้ที่ระบุเฉพาะสิทธิ์เท่าที่จำเป็น
ใช้ Prepared Statement ในการ Query เพื่อลด SQL Injection
• ตัวอย่างคอนฟิก phpMyAdmin (สั้น ๆ)
<?php
$cfg['blowfish_secret'] = '671916291bd73db43692368111b64a1e';
$i = 0;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql.sock';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['TempDir'] = '/usr/share/phpMyAdmin/tmp';
6.2 ตัวอย่าง Pagination + ตัดคำ
php
Copy
$perPage = 30;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
if ($page < 1) $page = 1;
$startIndex = ($page - 1) * $perPage;$sql = "SELECT Home_ID, Home_Sub, Home_Short
FROM home
WHERE StatusHome_ID=1
LIMIT $startIndex, $perPage";$result = $mysqli->query($sql);
while($row = $result->fetch_assoc()) {
// ตัดคำให้อ่านง่าย
$check_HomeShort2 = mb_strimwidth($row['Home_Short'], 0, 200, "...");
echo $check_HomeShort2;
}
• การใช้ Memcached/Redis Cache (ตัวอย่าง Memcached สั้น ๆ)
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);$countKey = 'count_articles';
$cachedCount = $mem->get($countKey);if($cachedCount === false) {
$stmt = $mysqli->prepare("SELECT COUNT(*) AS total FROM home");
$stmt->execute();
$res = $stmt->get_result();
$row = $res->fetch_assoc();
$total = $row['total'];
$mem->set($countKey, $total, 300); // Cache 5 นาที
} else {
$total = $cachedCount;
}
• เลือกสเปก VPS : ให้มี RAM เพียงพอ (4GB ขึ้นไป) และ SSD/NVMe เพื่อความเร็ว I/O
• ปรับแต่ง MySQL (ในไฟล์ my.cnf) :
เพิ่ม innodb_buffer_pool_size ให้สอดคล้องกับ RAM
ปิด Query Cache เก่าที่ไม่จำเป็นในเวอร์ชัน 8 (หากไม่ใช้)
• เปิด PHP-FPM แบบ PM (Process Manager) :
ตั้งค่า pm.max_children และ pm.start_servers ให้เหมาะสม
• ใช้ Nginx + PHP-FPM หรือ Apache + PHP-FPM :
กำหนด Worker/Server Limit ให้เหมาะสม
หมั่นอัปเดต AlmaLinux, MySQL, PHP, phpMyAdmin ให้เป็นเวอร์ชันล่าสุด เพื่อประสิทธิภาพและความปลอดภัย
• ไฟล์ปลั๊กอิน MySQL หาย แก้โดยค้นหา และติดตั้งปลั๊กอิน mysql_native_password.so หรือไฟล์ที่ขาดหาย และกำหนด plugin_dir ให้ถูกต้อง
• ใช้ปลั๊กอิน authentication ไม่ตรงกัน MySQL 8 ค่าเริ่มต้นคือ caching_sha2_password ควรอัปเดต phpMyAdmin ให้รองรับ หรือบังคับใช้ mysql_native_password กรณีระบบเก่า
• SELinux และ Firewall ตั้งค่าให้อนุญาตเชื่อมต่อเครือข่าย และเปิดพอร์ต (Port) ที่จำเป็น
• ไฟล์คอนฟิก phpMyAdmin ตรวจสอบ config.inc.php ใส่ Host, User, Password ให้ตรง และสร้างโฟลเดอร์ tmp พร้อมปรับสิทธิ์
• การลบ ติดตั้งใหม่ phpMyAdmin ไม่ทำให้ข้อมูลฐานข้อมูลหาย เพราะ Database file เก็บอยู่ใน /var/lib/mysql
• Performance Tuning ใช้ Pagination, Caching, Prepared Statement, Lazy Loading, และปรับค่า MySQL ให้เหมาะสมกับ VPS
• Security Hardening เปิดใช้ SELinux อย่างถูกต้อง, เพิ่ม CSP ป้องกัน XSS, บริหารสิทธิ์ผู้ใช้ฐานข้อมูลอย่างรัดกุม
AFRA APACHE ยกระดับความปลอดภัย และประสิทธิภาพ VPS (Virtual Private Server) มักเผชิญกับภัยคุกคามหลากหลาย อย่าง Malware, Phishing, Ransomware, และการโจมตีแบบ Brute Force
AlmaLinux 9 ระบบปฏิบัติการโอเพ่นซอร์ส (Open Source) ที่มุ่งเน้นความเสถียร และความปลอดภัย จึงเป็นตัวเลือกที่เหมาะสมสำหรับองค์กรที่ต้องการสร้างระบบเซิร์ฟเวอร์ที่ปลอดภัย พร้อมเพิ่มประสิทธิภาพการทำงาน และรองรับความต้องการของธุรกิจในยุคดิจิทัล มีความปลอดภัยที่ออกแบบมาเพื่อป้องกัน VPS จากภัยคุกคามที่หลากหลาย ไม่ว่าจะเป็น Bad Bots, การโจมตีแบบ Brute Force, Malware, Phishing ที่อาจเข้ามาคุกคามข้อมูลของคุณ