วิธีทำให้เข้าสู่ระบบ WordPress ใน Domain และ SubDomain ในครั้งเดียว

เกริ่นปัญหา

ปัญหาของเรื่องนี้มาจากโพสนี้ครับ สรุปคือเค้าอยากได้ WordPress 2 ตัวที่ใช้ฐานข้อมูลผู้ใช้อันเดียวกัน และเข้าสู่ระบบที่นึง อีกที่จะเข้าสู่ระบบด้วย โดยหลังจากผมลองค้นหาดู พบว่าสามารถทำได้ แต่ทำได้ในระดับแค่ Sub Domain หรือ Sub Directory เท่านั้นนะครับ และ Database ต้องใช้ Database เดียวกัน (ผมเข้าใจว่าสามารถทำได้ถึงระดับที่อยู่คนละ Database แต่ต้องเป็นที่เดียวกันและใช้ Username/Password เหมือนกัน)

วิธีทำ

  1. ก่อนอื่นให้ลง WordPress ทั้ง 2 ที่แบบปกติให้เรียบร้อยก่อน (ถ้ามีแล้ว ข้ามไปครับ)
  2. ลง Plugins “WP-Orphanage Extended” ให้ WordPress ทั้ง 2 ตัว แล้วไปตั้งค่าใส่ prefix ให้เรียบร้อยครับ
  3. ทำการแก้ไข wp-config.php ของ WordPress ทุกตัวดังนี้ครับ
    <?php
    // แทน xxx ด้วยค่าเดิมนะครับ แต่ทุกไฟล์ที่เป็น wp-config.php ต้องเหมือนกันหมด
    define('AUTH_KEY', 'xxx');
    define('SECURE_AUTH_KEY', 'xxx');
    define('LOGGED_IN_KEY', 'xxx');
    define('NONCE_KEY', 'xxx');
    define('AUTH_SALT', 'xxx');
    define('SECURE_AUTH_SALT', 'xxx');
    define('LOGGED_IN_SALT', 'xxx');
    define('NONCE_SALT', 'xxx');
    
    // ตั้งค่า Cookie ให้ Login แล้วใช้ได้ทุก sub domain 
    // อย่าลิมแก้ .example.com เป็น domain ตัวเอง (ไม่ต้อง www)
    // อย่าลืมจุดหน้า domain มันสำคัญมาก ผมไม่ได้พิมพ์ผิด 
    define('COOKIE_DOMAIN', '.example.com'); 
    define('COOKIEPATH', '/');
    define('SITECOOKIEPATH', '/');
    define('PLUGINS_COOKIE_PATH', '/');
    define('ADMIN_COOKIE_PATH', '/');
    
    // ตั้งชื่อ Cookie ที่ใช้เวลา Login 
    define('AUTH_COOKIE','wordpress_auth_cookie');
    define('SECURE_AUTH_COOKIE','wordpress_auth_cookie');
    
    // บอกว่าจะใช้ User จากตารางไหน 
    define('CUSTOM_USER_TABLE','wp1_users');
    define('CUSTOM_USER_META_TABLE','wp1_usermeta');
  4. ทดสอบได้เลยครับ

ความเห็นส่วนตัว

จริงๆคิดว่าถ้าจะทำแบบนี้น่าจะทำเว็บเดียวแล้วแยก Category ของบทความน่าจะดีกว่า แล้วปรับ Theme เอา โดยใช้ Template Hierarchy หรือ Condition Tags ช่วยก็จะได้ 2 ส่วนที่หน้าตาไม่เหมือนกัน แต่ข้อมูลเหมือนกันแล้ว (ช่วยได้ระดับนึงนะ) หรือไม่ก็แยก Post Type ไเลยก็ได้ครับ

ติดตั้ง/ปรับแต่ง DirectAdmin เพื่อให้รองรับจำนวนคนจำนวนมาก

อันนี้เป็นประสบการณ์กากๆของผมที่ทำต้องจัดการให้เซิฟเวอร์ที่ใช้ DirectAdmin อยู่ สามารถรองรับจำนวนคนได้เยอะๆครับ วิธีการง่ายๆดังนี้ครับ

  1. ปรับ Web Server ให้ใช้ Nginx เป็น Reverse Proxy (อ้างอิงวิธีการจาก ลิงค์นี้)
    1. ก่อนอื่นสำหรับ คนที่ติดตั้ง DirectAdmin ไปแล้วต้องมั่นใจว่า CustomBuild ต้องมากกว่าเวอร์ชั่น 2 สามารถตรวจสอบได้โดย SSH เข้าไป แล้วใช้คำสั่งดังนี้
      cd /usr/local/directadmin/custombuild
      ./build version

      ดูว่าเลขหน้าสุดเป็นเลข 2 ไหมครับ ถ้าไม่ ให้ทำการปรับ CustomBuild เป็นเวอร์ชั่น 2 ครับ โดยสามารถทำได้ตามลิงค์นี้ครับ หรือสั่งคำสั่งด้านล่างนี้ครับ (คำเตือน Backup ทุกอย่างก่อน Update ทุกครั้ง)
      cd /usr/local/directadmin
      mv custombuild custombuild_1.x
      wget -O custombuild.tar.gz http://files.directadmin.com/services/custombuild/2.0/custombuild.tar.gz
      tar xvzf custombuild.tar.gz
      cd custombuild
      ./build
      ./build all d
      ./build rewrite_confs
    2. ติดตั้ง Nginx เป็น Reversed Proxy ซึ่งตรงนี้ทาง DirectAdmin เริ่ม Support การติดตั้งอัตโนมัติแล้ว สามารถทำได้ตามคำสั่งด้านล่างนี้ครับ
      cd /usr/local/directamin/custombuild
      ./build update
      ./build update_da
      ./build set webserver nginx_apache
      ./build nginx_apache
      ./build rewrite_confs
    3. เมื่อติดตั้งเสร็จแล้ว มันยังมีปัญหานิดหน่อยครับ คือตัว Apache ทีให้บริการ Web App นั้นมอง IP ของเซิฟเวอร์เองเป็น Client เนื่องจากวิ่งผ่าน Nginx จึงต้องลง mod เพิ่ม ดังนี้ครับ
      cd /usr/local/src
      wget https://github.com/y-ken/mod_rpaf/archive/master.zip
      unzip master.zip
      cd mod_rpaf-master
      /bin/sed -i "s/remote_/client_/g" mod_rpaf-2.0.c
      make && make install

      จากนั้นไปที่ /etc/httpd/conf/extra/httpd-includes.conf  แล้วเพิ่มข้อความต่อไปนี้ลงล่างสุดครับ
      LoadModule rpaf_module      /usr/lib/apache/mod_rpaf-2.0.so
      <IfModule mod_rpaf-2.0.c>
          RPAFenable On
          RPAFproxy_ips 127.0.0.1
          RPAFsethostname On
          RPAFheader X-Client-IP
      </IfModule>
  2. ปรับแต่งเซิฟเวอร์เพื่อให้รองรับคนจำนวนมากได้ (จำเป็นค่อนข้างมาก ไม่งั้นอาจจะเจอ Bad Gateway หรือ Gateway Timeout บ่อย)
    1. ปรับแต่ง Kernel Queue เพื่อให้รับการเชื่อมต่อจำนวนมากๆได้ โดยใช้คำสั่งต่อไปนี้
      sysctl -w net.core.somaxconn=100000

      และเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/sysctl.conf
      net.core.somaxconn=100000
    2. ปรับแต่ง Port ที่ระบบใช้ได้ให้มากกว่าเดิม โดยใช้คำสั่งต่อไปนี้
      sysctl -w net.ipv4.ip_local_port_range="10000 65535"

      และเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/sysctl.conf
      net.ipv4.ip_local_port_range=10000 65535
    3. ปรับแต่งให้ปิดการเชื่อมต่อได้เร็วขึ้น เพื่อเอาไปใช้รับการเชื่อมต่อใหม่ โดยใช้คำสั่งต่อไปนี้
      sysctl -w net.ipv4.tcp_tw_reuse=1

      และเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/sysctl.conf
      net.ipv4.tcp_tw_reuse=1
    4. อันนี้ผมจำไม่ได้ว่ามันทำอะไรครับ แต่เห็นเซิฟเวอร์ปัจจุบันมี และคิดว่าค่อนข้างสำคัญ
      sysctl -w net.ipv4.ip_nonlocal_bind=1

      และเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/sysctl.conf
      net.ipv4.ip_nonlocal_bind=1
    5. ปรับแต่งเพิ่มจำนวนไฟล์สูงสุดที่ 1 โปรเซสเปิดได้ให้มากที่สุด โดยใช้คำสั่งต่อไปนี้
      ulimit -n 999999

      และเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ /etc/security/limits.conf
      * soft nofile 999999
      * hard nofile 999999
  3. ปรับแต่งให้ Nginx ให้บริการ Static File (ไฟล์ที่ไม่ประมวลผลเช่นภาพเป็นต้น) โดยไม่ผ่าน Apache เพราะ Nginx สามารถทำงานด้านนี้ได้ดีกว่า Apache มาก (คำเตือน วิธีนี้จะทำให้ส่วนที่ถูกซ่อนไว้ โดย Password Protected Directories ของ DirectAdmin อาจจะทำให้ข้อมูลที่ถูกซ่อนบางส่วนหลุดไปได้โดยไม่ถามรหัสผ่าน แต่ผมว่าในเคสทั่วไปไม่ค่อยมีคนใช้) โดยสั่งคำสั่งดังต่อไปนี้
    cd /usr/local/directadmin/data/templates/custom
    wget "https://www.ishare.in.th/wp-content/uploads/2015/02/conf.zip"
    unzip conf.zip
    rm -f conf.zip
    cd /usr/local/directadmin/custombuild
    ./build rewrite_confs
    service nginx reload

    เพียงเท่านี้ Nginx ก็จะให้บริการ Static File ส่วนมากให้ทันที (ผมอาจจะ list ไม่หมดเพราะผมก็ไปคัดลอกจากที่อื่นมาครับ)

เพียงเท่านี้ก็คิดว่าเซิฟเวอร์ปัจจุบันของท่านก็น่าจะรับโหลดเพิ่มขึ้นได้อีกเยอะครับ หากยังไม่สามารถรองรับได้อีก อาจจะต้องปรับ nginx ให้ cache หน้าที่ประมวลผลไว้สักหน้าละ 10 – 60 วิ แล้วแต่กรณีไป แต่พอดีที่ๆผมทำงาน Implement ระบบ Cache ด้านในไว้ เลยไม่มีปัญหามากครับ

XAMPP เข้า phpMyAdmin ไม่ได้ ติด Error 403 Access forbidden!

อันนี้ผมไม่รู้ว่าเป็นเฉพาะ Ubuntu รึเปล่านะครับ แต่ถ้าหากใครประสบปัญหาเข้า phpMyAdmin ของ XAMPP แล้วเจอหน้า Error 403 Access forbidden! เรามีวิธีแก้ดังนี้ครับ

ตกลงกันก่อน

ถ้าผมพูดถึงโฟลเดอร์ config จะหมายถึง

  • ใน linux จะหมายถึง /opt/lampp/etc/
  • ใน windows จะหมายถึง xampp/apache/conf

ตามแบบฉบับทั่วๆไปที่หาเจอ

  1. ให้ใช้โปรแกรม text editor เช่น notepad,notepad++,geany เปิดไฟล์ extra/httpd-xampp.conf ที่อยู่ในโฟลเดอร์ config
    ประมาณว่า /opt/lampp/etc/extra/httpd-xampp.conf
    หรือ C:\XAMPP\apache\conf\extra\httpd-xampp.conf
  2. เลื่อนไปล่างสุดเราจะเจอ
    <LocationMatch "^/(?i:(?:xampp|security|licenses|phpmyadmin|webalizer|server-status|server-info))">
    	Order deny,allow
    	Deny from all
    	Allow from ::1 127.0.0.0/8 \
    		fc00::/7 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 \
    		fe80::/10 169.254.0.0/16
    
    	ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
    </LocationMatch>

    ให้เราแก้เป็น
    #<LocationMatch "^/(?i:(?:xampp|security|licenses|phpmyadmin|webalizer|server-status|server-info))">
    #	Order deny,allow
    #	Deny from all
    #	Allow from ::1 127.0.0.0/8 \
    #		fc00::/7 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 \
    #		fe80::/10 169.254.0.0/16
    #
    #	ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
    #</LocationMatch>

    (ใส่ # ไปข้างหน้าของทุกบรรทัด)
  3. Save แล้ว restart apache ใหม่ แล้วลองเข้าดู

อธิบายเพิ่มเติมที่แก้ httpd-xampp.conf

ส่วนที่ให้แก้คือส่วน ที่บอกว่าหากเข้า folder ที่ชื่อว่า xampp|security|licenses|phpmyadmin|webalizer|server-status|server-info ( | หมายถึงหรือ) ให้ทำการปิดกั้นการเข้าถึงทั้งหมด อนุญาติเฉพาะ IP ที่เป็นเครื่องตัวเอง (127.0.0.1,::1) หรือเครื่องที่เป็นภายในเครือข่ายเดียวกันเท่านั้น (โดยทั่วไปคือน้ำหน้าด้วย 10.0.*,172.16.*,169.254.* และ 192.168.*)

แล้วถ้าไม่ได้ผล ผมแนะนำวิธีนี้แทนครับ

  1. ให้ใช้โปรแกรม text editor เช่น notepad,notepad++,geany เปิดไฟล์ extra/httpd-xampp.conf ที่อยู่ในโฟลเดอร์ config
  2. ให้แก้ส่วนล่างสุดจากวิธีด้านบนกลับให้เป็นเหมือนเดิม(คือเอา # หน้าบรรทัดออก)
  3. ก่อนบรรทัด
    </LocationMatch>

    ให้เพิ่มบรรนี้ลงไปครับ
    Require all granted

    จะได้เป็นแบบนี้ครับ
    <LocationMatch "^/(?i:(?:xampp|security|licenses|phpmyadmin|webalizer|server-status|server-info))">
            Order deny,allow
            Deny from all
            Allow from ::1 127.0.0.0/8 \
                    fc00::/7 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 \
                    fe80::/10 169.254.0.0/16
    
            ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
            Require all granted
    </LocationMatch>
  4. Save Restart Apache แล้วลองเข้าใหม่ดูครับ