Web – Peat's blog https://blog.peat-network.xyz Some thought from Ratchanan Srirattanamet Thu, 30 Mar 2017 16:57:00 +0000 en-US hourly 1 https://wordpress.org/?v=7.0 เมื่อ Cluster = เครื่องที่บ้าน + เครื่องบนคลาวด์ https://blog.peat-network.xyz/2017/03/raspberry-pi-meets-the-cloud/ https://blog.peat-network.xyz/2017/03/raspberry-pi-meets-the-cloud/#comments Thu, 30 Mar 2017 16:57:00 +0000 https://blog.peat-network.xyz/?p=47 Continue reading เมื่อ Cluster = เครื่องที่บ้าน + เครื่องบนคลาวด์]]> เรื่องมีอยู่ว่า แต่ไหนแต่ไรผมให้บริการหน้าเว็บต่างๆ ผ่านทางเน็ตบ้านกับ Raspberry Pi มาตลอด และเพราะเป็นเน็ตบ้านและอยู่ที่บ้าน มันก็จะได้รับผลกระทบจากปัญหาจำพวกไฟดับ/เน็ตหลุด/ฯลฯ อยู่เรื่อยๆ ดังนั้น ในเดือนพฤษจิกายนปีที่แล้ว ผมจึงตัดสินใจเช่าเครื่อง VPS จาก DigitalOcean เพื่อช่วยให้บริการหน้าเว็บในเวลาที่เครื่องที่บ้านมีปัญหา แต่ถ้าผมจะย้ายทุกอย่างมาที่ VPS เครื่องนี้ แล้วผมจะมี Raspberry Pi ไปเพื่อ?????

เครื่องที่บ้านต้องมาก่อน

ดังนั้นมันก็เลยมีสูตรอีรุงตุงนังที่ทำให้เครื่อง Raspberry Pi ที่บ้านกับ VPS ที่ DigitalOcean ทำงานร่วมกันได้ โจทย์ก็คือ VPS จะเป็นตัวช่วยในการให้บริการเมื่อที่บ้านมีปัญหา ไม่ใช่แทนที่ Raspberry Pi ผมจึงออกแบบให้ Raspberry Pi เป็นเครื่องหลัก เครื่อง VPS เป็นเครื่องรอง (แม้ว่า VPS จะเร็วกว่ามากก็ตาม….)

เครือข่ายเสมือน

เริ่มจากการสร้างเครือข่ายเสมือนขึ้นมาระหว่างเครื่อง 2 เครื่องนี้ เพื้อให้เสมือนอยู่ในเครือข่ายเดียวกัน และเป็นการเข้ารหัสการคุยกันทั้งหมดระหว่าง 2 เครื่องนี้ด้วย

ซึ่งแน่นอน ให้ Linux คุยกับ Linux ก็ต้องใช้ OpenVPN อยู่แล้ว เราก็ตั้ง OpenVPN Server ที่ Raspberry Pi ขึ้นมา การตั้งค่าก็เหมือนกับเซ็ตอัพทั่วไป ต่างกันแค่ว่าของเรานี่จะบังคับไอพีคงที่สำหรับเครื่อง VPS ให้ไม่เปลี่ยนไปเปลี่ยนมา จะได้ตั้งค่าซอฟต์แวร์อื่นต่อไปได้ง่าย

File synchronization

จากนั้น เนื่องจากเว็บ WordPress จะต้องมีการอัพโหลดไฟล์เกิดขึ้น ดังนั้น จะต้องมีระบบที่ทำให้ไฟล์ทั้ง 2 เครื่องตรงกัน ตอนแรกผมมองไปทาง GlusterFS แต่พบว่าระบบนี้ไม่เหมาะที่จะใช้กับเครื่องที่อยู่ห่างกันและมี Latency สูงๆ ทำให้เวลาอ่านไฟล์จะนานมาก ก็เลยล้มเลิกไป

ผมจึงมองหาทางเลือกอื่น ที่จะทำให้ไฟล์อัพเดทตรงกันได้ โดยที่ไม่กระทบเวลาในการอ่านไฟล์ สุดท้ายก็มาลงเอยกับ Csync2 + lsyncd ซึ่ง Csync2 ทำให้ไฟล์ตรงกัน แต่มันไม่สามารถตรวจจับการเปลี่ยนแปลงได้ lsyncd จึงมารับหน้าที่นี้แทน

Database Replication

เนื่องจาก WordPress เนี่ยใช้ฐานข้อมูลเป็นหลักๆๆๆ เลย ดังนั้นเราก็ต้องตั้งค่า MySQL ด้วย ครั้นจะให้เครื่อง VPS เชื่อมต่อมาที่เครื่อง RPi ทุกครั้งก็เหมือนจะไม่ตอบโจทย์เวลาเครื่อง RPi ต่อไม่ได้ซักเท่าไหร่ ผมก็เลยตั้ง MySQL server ที่เครื่อง VPS ด้วย

ตอนแรก ผมก็ว่าจะทำแบบ Master-Master แต่ผมลองค้นข้อมูล ผมพบว่าต้องใช้ MySQL รุ่นพิเศษ แล้วไอ้รุ่นเนี่ยมันไม่มีไบนารีสำหรับ Raspbian (เป็นระบบที่ผมรันบน RPi) ผมก็เลยว่า เออ ทำแค่ Master-Slave ก็ได้ เอา RPi เป็น Master แล้วเอา VPS เป็น Slave ซะ ถ้า WordPress จะอ่านก็อ่านเอากับเครื่องตัวเอง แต่ถ้าจะเขียน ก็ไปเขียนที่เครื่อง RPi

(แต่ ณ ตอนนี้ ผมเพิ่งรู้นะครับว่าจริงๆ ผมทำ Master-Master กับ MySQL ปกติก็ได้ แต่ผมขี้เกียจจะไปแก้ละ แบบนี้ก็ง่ายดี ไม่มีปัญหาว่าเขียนพร้อมกัน 2 เครื่องแล้วชนกัน เนาะ)

HyperDB

อันที่จริง เรื่องคลัสเตอร์ WordPress ใหญ่ๆ นี่ต้องดูของ https://wordpress.com เค้านะ เค้าให้บริการเว็บ WordPress ให้กับเว็บเป็นล้านๆ ถามว่าระบบเค้าจัดการฐานข้อมูลยังไง เค้าใช้สิ่งที่เรียกว่า HyperDB

HyperDB เป็นปลั๊กอินที่ทำให้ WordPress ใช้ฐานข้อมูลหลายๆ ที่ได้ สั่งให้อ่านจากเครื่องนึง เขียนอีกเครื่องนึงก็ได้ ทำอะไรได้หลากหลายกว่านี่ ก็ยังได้ ทาง Automattic บริษัทเจ้าของ WordPress.com เค้าใจดี ยอมให้เราทุกคนใช้ได้ฟรีๆ ผมก็เลยเอามาใช้ในเว็บผม

แต่มันมีก้างขวางคออยู่ชิ้นนึง ผมมีปลั๊กอิน W3 Total Cache อยู่ด้วย แล้วเค้าก็มี Cache ของ Database ซึ่งมันดันทับซ้อนกับ HyperDB พอดี! งานนี้มันต้องมีผ่าตัดกันบ้างหละ

W3 Total Cache กับระบบที่ออกแบบมาให้ต่อยอดได้

โชคดีที่คนทำ W3 Total Cache น่าจะคิดไว้แล้ว จึงออกแบบโค้ดของระบบแคชฐานข้อมูลให้ทำงานบนฐานของโค้ดของระบบฐานข้อมูลใดๆ ก็ได้ โดยการ Subclass ออกมาจากคลาส wpdb ของ WordPress เอง

ซึ่งก็เข้าทางผมสิครับ ผมจับแก้ให้โค้ดของ W3 Total Cache ไป Subclass ออกมาจากคลาส hyperdb แทน คราวนี้ W3 Total Cache ก็จะเรียก HyperDB เวลาที่ค้นในแคชแล้วไม่เจอ

Cluster ที่ห่างไกล ต้องใช้ Load Balancer ระดับโลก

ส่วนสุดท้ายของสมการคือสิ่งที่กระจายโหลดไปยังหลายๆ เครื่อง ผมใช้ Cloudflare ตลอดเวลาตั้งแต่เปิดไซต์ใหม่ (ก็ถ้าไม่มีนะ ผมคาดว่า Raspberry Pi น่าจะบินตั้งแต่เปิดเว็บแรกๆ แล้วแหละ) เมื่อเร็วๆ นี้ Cloudflare เพิ่งทดลองเปิดให้บริการ Load Balancer ที่ทำให้เราสามารถกระจายการเข้าเว็บจากผู้ใช้ไปที่หลายๆ เครื่องได้ ผมจึงได้เริ่มใช้บริการนี้เพื่อแบ่งโหลดของการเข้าเว็บให้เท่าๆ กัน และเวลาที่ RPi มีการใช้งานมากไป (หรือว่าเน็ตหลุด ไฟดับ) Cloudflare ก็จะไปเข้าที่เครื่อง VPS แทน

อันที่จริง ก็เพราะ Cloudflare เปิดบริการนี้นี่แหละ ทำให้ผมตัดสินใจทำระบบพิศดารนี้ขึ้นมา

การปรับปรุงเบื้องหลังอีกเล็กน้อย

อันที่จริง ที่ Raspberry Pi ผมได้มีการปรับปรุงอะไรอีกเล็กน้อยเกี่ยวกับ Caching ดังนั้น ไม่ว่าจะบังเอิญเข้าที่เครื่องไหน ก็จะรู้สึกเร็วขึ้นอย่างชัดเจนเลยหละ

เรื่องที่ขอ

และนั่นคือทั้งหมดในวันนี้ ขอขอบคุณทุกคนที่อ่านมาถึงตรงนี้ ถ้าใครอุตส่าห์อ่านมาถึงตรงนี้จริงๆ ผมขออีกอย่างนะ ช่วยใส่ Comment ด้านล่างซักนิดนึงนะครับ ตั้งแต่เปิดบล็อกมานี่ ไม่มีใครคอมเมนต์เลย

คือไม่ใช่อะไร ระบบ Comment ที่ผมใช้ มันไปใช้ระบบของเว็บที่ชื่อ Disqus อีกที แล้วผมก็เลยไม่เคยรู้ว่าตกลงระบบมันทำงานถูกมั้ย ยังไง ก็ ขอบคุณล่วงหน้าครับ 😀

]]>
https://blog.peat-network.xyz/2017/03/raspberry-pi-meets-the-cloud/feed/ 2
เร่งความเร็วให้ WordPress บน Raspberry Pi (และบน Server ทุกแบบ) https://blog.peat-network.xyz/2015/12/%e0%b9%80%e0%b8%a3%e0%b9%88%e0%b8%87%e0%b8%84%e0%b8%a7%e0%b8%b2%e0%b8%a1%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b9%83%e0%b8%ab%e0%b9%89-wordpress-%e0%b8%9a%e0%b8%99-raspberry-pi-%e0%b9%81%e0%b8%a5/ https://blog.peat-network.xyz/2015/12/%e0%b9%80%e0%b8%a3%e0%b9%88%e0%b8%87%e0%b8%84%e0%b8%a7%e0%b8%b2%e0%b8%a1%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b9%83%e0%b8%ab%e0%b9%89-wordpress-%e0%b8%9a%e0%b8%99-raspberry-pi-%e0%b9%81%e0%b8%a5/#respond Sat, 19 Dec 2015 12:41:15 +0000 https://blog.peat-network.ga/?p=12 Continue reading เร่งความเร็วให้ WordPress บน Raspberry Pi (และบน Server ทุกแบบ)]]> จากความเดิมตอนที่แล้ว ผมใช้แพกเกจของ Debian ในการติดตั้ง WordPress บน Raspberry Pi ซึ่งถ้าผมไม่ทำการเร่งความเร็วเนี่ย เวลาจะดูบล็อกครั้งนึงจะต้องใช้เวลา 2-3 วินาทีในการโหลดหน้าเว็บ ซึ่งผมเห็นว่ามากเกินไป ผมจึงใช้ปลั๊กอินตัวนึงของ WordPress ที่มีชื่อว่า W3 Total cache

วิธีการเซ็ตก็ไม่ยุ่งยาก เริมจาก:

  1. ไปที่หน้าแอดมินของ WordPress (ล็อกอินก่อนนะครับ) แล้วติดตั้งปลั๊กอิน W3 Total Cache โดย
    • ไปที่ Plugins > Add New
    • ค้นหา W3 Total Cache แล้วคลิก Install Now
    • เมื่อติดตั้งเสร็จ คลิก Activate now
  2. เสร็จแล้ว W3 Total Cache (ต่อไปจะเรียกว่า W3TC) จะพยายามเขียนไฟล์คอนฟิก แต่เนื่องจากเราใช้แพกเกจของ Debian เราจึงต้องแก้ไฟล์ /etc/wordpress/config-$DM.php (ไฟล์จากตอนที่แล้ว) ให้มีบรรทัดนี้เพิ่มขึ้นมา
    define('WP_CACHE', true);
  3. ต่อไปจะเป็นการคอนฟิกส่วนต่างๆ ของ W3TC เนื่องจาก W3TC ประกอบไปด้วยส่วนย่อยๆ หลายส่วน เราก็จะเลือกว่าจะให้ส่วนไหนทำงานบ้าง
    • ไปที่ Performance > General Settings
    • Page Cache
      • Enable: เลือก (นี่เป็นระบบที่เร่งความเร็วของเว็บได้ดีที่สุด)
      • Page cache method: “Disk: Enhanced”
    • Minify
      • Enable: ไม่เลือก (เรามีปัญหากับมันครับ จะเล่าให้ฟังต่อไป)
    • Database Cache
      • Enable: เลือก
      • Database cache method: “Disk”
    • Object Cache
      • Enable: เลือก
      • Object cache method: “Disk”
    • Browser Cache
      • Enable: เลือก
    • อื่นๆ ปล่อยมันไว้อย่างนั้นแหละครับ
    • เสร็จแล้วคลิก Save all settings ครับ (ปุ่มไหนก็ได้ครับ)

ตอนนี้ W3TC จะเริ่มเร่งความเร็วให้กับเว็บแล้วครับ ต่อไปเราจะตั้งค่าแต่ละส่วนของ W3TC กัน แต่คงต้องเป็นตอนหน้า เพราะว่าผมต้องไปกินข้าวก่อนแล้วหละครับ

]]>
https://blog.peat-network.xyz/2015/12/%e0%b9%80%e0%b8%a3%e0%b9%88%e0%b8%87%e0%b8%84%e0%b8%a7%e0%b8%b2%e0%b8%a1%e0%b9%80%e0%b8%a3%e0%b9%87%e0%b8%a7%e0%b9%83%e0%b8%ab%e0%b9%89-wordpress-%e0%b8%9a%e0%b8%99-raspberry-pi-%e0%b9%81%e0%b8%a5/feed/ 0
การติดตั้ง WordPress บน Debian โดยใช้แพกเกจของ Debian (+PHP-FPM บน Apache แบบง่ายที่สุด) https://blog.peat-network.xyz/2015/12/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-wordpress-%e0%b8%9a%e0%b8%99-debian/ https://blog.peat-network.xyz/2015/12/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-wordpress-%e0%b8%9a%e0%b8%99-debian/#respond Mon, 07 Dec 2015 16:00:18 +0000 https://blog.peat-network.ga/?p=8 Continue reading การติดตั้ง WordPress บน Debian โดยใช้แพกเกจของ Debian (+PHP-FPM บน Apache แบบง่ายที่สุด)]]> บล็อกนี้รันอยู่บน Raspberry Pi Model B ซึ่งรัน Raspbian (Debian สำหรับ ARMv6) ตอนติดตั้งผมจึงคิดที่จะใช้แพกเกจของ Debian ในการติดตั้ง ซึ่งก็ต้องทำอะไรหลายอย่างเหมือนกัน เริ่มจาก

  • ติดตั้งไฟล์ของ WordPress และแพกเกจที่จำเป็นอื่นๆ
    sudo apt-get install wordpress apache2 mysql-server mysql-client php5-mysql php5-fpm

    ในระหว่างนี้จะมีการถามรหัสผ่านของบัญชี root ของ MySQL จำไว้ให้ดี เพราะต้องใช้ในขั้นตอนต่อไป

  • ตั้งค่า Apache โดย
    • สร้าง vHost ใหม่หรือแก้ vHost เดิมใน Apache โดยให้มีคอนฟิกต่อไปนี้
      <VirtualHost *:80>
          ....
          DocumentRoot /usr/share/wordpress/
      
          # wp-content in /var/lib/wordpress/wp-content
          Alias /wp-content /var/lib/wordpress/wp-content
      
          <Directory /usr/share/wordpress/>
              Options +FollowSymLinks
              <IfVersion < 2.3>
                  Order allow,deny
                  Allow from all
              </IfVersion>
              <IfVersion >= 2.3>
                  Require all granted
              </IfVersion>
      
              # Allow .htaccess.
              AllowOverride All
          </Directory>
          <Directory /var/lib/wordpress/wp-content/>
              Options +FollowSymLinks
              <IfVersion < 2.3>
                  Order allow,deny
                  Allow from all
              </IfVersion>
              <IfVersion >= 2.3>
                  Require all granted
              </IfVersion>
      
              # Allow .htaccess.
              AllowOverride All
          </Directory>
    • ตั้งค่า PHP โดยสร้างไฟล์ /etc/apache2/conf-available/fastcgi-php.conf ให้มีเนื้อหาดังนี้
      <IfModule proxy_fcgi_module>
          <FilesMatch "^(.*\.php5?)$">
              SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost/"
          </FilesMatch>
      </IfModule>
    • เปิดใช้งานโมดูลและการตั้งค่าที่จำเป็น แล้วจึงเริ่มการทำงานของ Apache ใหม่
      sudo a2enmod rewrite proxy_fcgi
      sudo a2enconf fastcgi-php
      sudo service apache2 restart
  • สร้างไฟล์คอนฟิกของ WordPress ไว้ที่ /etc/wordpress/config-$DM.php โดยที่ $DM เป็นโดเมนของเว็บ เช่น หากเว็บไซต์อยู่ที่ blog.example.com ชื่อไฟล์อาจจะเป็น
    • config-blog.example.com.php (แนะนำให้ใช้อันนี้) หรือ
    • config-example.com.php (ถ้ามีหลายเว็บในโดเมนนี้) หรือ
    • config-default.php (ไฟล์นี้จะถูกใช้ถ้าไม่มีไฟล์อื่นที่เจาะจงกว่านี้)
  • โดยให้มีเนื้อหาดังนี้ (แทนที่ <RandomPassword_A> ด้วยรหัสผ่านสุ่ม)
    <?php
        define('DB_NAME', 'wordpress');
        define('DB_USER', 'wordpress');
        define('DB_PASSWORD', '<RandomPassword_A>');
        define('DB_HOST', 'localhost');
        define('WP_CONTENT_DIR', '/var/lib/wordpress/wp-content');
        define('FS_METHOD', 'direct');
    ?>
  • ตั้งค่าฐานข้อมูล โดย
    • สร้างไฟล์ขึ้นมาไฟล์หนึ่ง (สมมติว่าชื่อ wp.sql) ให้มีเนื้อหาดังนี้ (แทนที่ <RandomPassword_A> ด้วยรหัสผ่านเดียวกันกับข้างบน)
      CREATE DATABASE wordpress;
      GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER
      ON wordpress.*
      TO wordpress@localhost
      IDENTIFIED BY '<RandomPassword_A>';
      FLUSH PRIVILEGES;
    • รันคำสั่งนี้ (ใส่รหัสผ่าน root ของ MySQL เมื่อถูกถาม)
      mysql -uroot -p <wp.sql
  • ตั้งสิทธิ์และเจ้าของไฟล์ที่จำเป็นโดยรันคำสั่งตามนี้
    sudo chown -R www-data:www-data /var/lib/wordpress/wp-content/ /usr/share/wordpress/.htaccess
  • เราพร้อมแล้วที่จะเริ่ม “การติดตั้งภายใน 5 นาทีที่มีชื่อเสียง” (แต่กว่าจะเริ่มได้นี่เอาเหนื่อย) ไปที่ http://blog.example.com/wp-admin/install.php (แน่นอนว่าแทนที่ชื่อเว็บด้วยเว็บของคุณ) แล้วทำตามที่หน้าเว็บบอก

แล้ว WordPress ก็ถูกติดตั้งเรียบร้อย ตอนต่อไปจะมาพูดถึงการเพิ่มความเร็วของเว็บกัน (เพราะว่า Raspberry Pi ช้าครับ เลยต้องเร่งความเร็วกันซะหน่อย) และจะมาพูดเกี่ยวกับ Plugin กับความคาดหวังบางอย่างที่มั่วสุดๆ

]]>
https://blog.peat-network.xyz/2015/12/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%95%e0%b8%b4%e0%b8%94%e0%b8%95%e0%b8%b1%e0%b9%89%e0%b8%87-wordpress-%e0%b8%9a%e0%b8%99-debian/feed/ 0