AFRA APACHE ยกระดับความปลอดภัย และประสิทธิภาพ VPS บน AlmaLinux9 | rampagesoft รับทำเว็บไซค์ รับออกแบบเว็บไซต์

บทความ : AFRA APACHE ยกระดับความปลอดภัย และประสิทธิภาพ VPS บน AlmaLinux9

AFRA APACHE ยกระดับความปลอดภัย และประสิทธิภาพ VPS บน AlmaLinux9 บทความ ข่าวสาร rampagesoft

AFRA APACHE ยกระดับความปลอดภัย และประสิทธิภาพ VPS บน AlmaLinux9

แนวทางแก้ไขปัญหา phpMyAdmin ไม่สามารถเชื่อมต่อ MySQL บน AlmaLinux 9 พร้อมปรับปรุง Performance และความปลอดภัย การติดตั้ง MySQL และ phpMyAdmin บน AlmaLinux 9 ให้ทำงานได้อย่างมีประสิทธิภาพ และปลอดภัย อาจพบปัญหาหลายอย่าง เช่น ไฟล์ปลั๊กอินหาย (mysql_native_password.so หรือ component_reference_cache.so) การตั้งค่า SELinux ไม่ถูกต้อง หรือการกำหนดสิทธิ์โฟลเดอร์ และไฟร์วอลล์ไม่ครบถ้วน


ตรวจสอบ MySQL และการติดตั้ง 

ก่อนอื่นควรตรวจสอบว่ามี 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 เวอร์ชันใหม่รองรับแล้ว

 

การตั้งค่า 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 ยังคงอยู่เหมือนเดิม

 

การปรับปรุงประสิทธิภาพ (Performance Tuning)

• นอกจากแก้ปัญหาไฟล์ปลั๊กอิน และ 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 ซับซ้อนเท่าที่เป็นไปได้


 

การปรับปรุงความปลอดภัย (Security Hardening)

• 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 บน AlmaLinux ให้รองรับงานหนัก

• เลือกสเปก 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 ที่อาจเข้ามาคุกคามข้อมูลของคุณ

เสริมสร้างความปลอดภัย ระดับองค์กรด้วย AlmaLinux9 ตั้งแต่ระดับพื้นฐานจนถึงระดับสูง บริการดูแลความปลอดภัยเซิร์ฟเวอร์ โซลูชันจาก AFRA APACHE 
 

 


: 173 | Date : January 24 , 2025 | rampagesoft |
เพิ่มเพื่อน