วิธีการอัพเกรด php 5.5.9 เป็น php 5.6 (หรือ 7.0) บน Ubuntu 14.04 และวิธีการสลับการทำงานระหว่างเวอร์ชั่น

บันทึกนี้สืบเนื่องจากต้องการอัพเกรดเวอร์ชั่น php เพื่อให้เครื่องเซิร์ฟเวอร์สามารถรองรับสคริปท์ WebApp php เวอร์ชั่นใหม่ที่สูงขึ้น คำเตือน! ควรทดลองทำในเครื่อง dev ดูก่อนอย่าทำบนเครื่องเซิร์ฟเวอร์จริงทันทีเดี๋ยวจะน้ำตาตก ควรทดสอบสคริปท์บนเครื่องทดสอบดูว่าสามารถทำงานได้ไม่มีปัญหาจะได้ไม่ต้องเสียเวลาแก้ไข เพราะตัวผมมั่วจนได้เรื่องบนเครื่องเซิร์ฟเวอร์จริงจนเกือบแก้ไม่ได้ T_T … มาเริ่มกันเลย

Read More »

ตั้งค่า iproute2 ให้ ubuntu server ที่มี 2 interfaces

ผมมี server สำหรับห้องบริการคอมพิวเตอร์ ที่ทำหน้าที่จ่าย dhcp IP และ cloning Windows และใช้ pGina for Windows ในการ Login ก่อนเข้าใช้เครื่อง เริ่มแรก server ก็มีการ์ดแลนเพียง 1 ใบ สำหรับห้องบริการคอมพิวเตอร์ห้องที่ 1 (eth0) ต่อมามีความต้องการให้ห้องบริการคอมพิวเตอร์ห้องที่ 2 ซึ่งจะเป็นอีก network ใช้ server ตัวเดียวกันนี้ด้วย จึงเพิ่มการ์ดแลนอีก 1 ใบ (eth1) ทำให้ตอนนี้มี eth0 และ eth1 ปัญหาคือ เมื่อ Windows ในห้องคอมฯ ห้องที่ 2 ตั้งค่า pGina RADIUS plugin ชี้ไปยัง IP ของ eth0 (192.168.99.20) ก็ทำงานไม่ได้ แต่ถ้าตั้งค่าชี้ไปยัง IP ของ eth1 (192.168.99.251) อย่างนี้ใช้งานได้ หรือใช้คำสั่ง ping 192.168.99.20 อย่างนี้ก็ไม่ได้ เช่นกัน จึงค้นหาคำตอบ google search อยู่หลายวัน มีบทความที่ให้คำตอบใกล้เคียงที่สุด แต่ผมก็ต้องมาแต่ง config ใหม่ จนสำเร็จ โดยหลักใหญ่ ๆ คือ เครื่อง server ที่มีการ์ดแลน 2 การ์ดนี้จะเรียกว่า multi-homed server จำเป็นจะต้องตั้งค่าเพิ่มโดยใช้ iproute2 ซึ่งมีให้แล้วบน ubuntu server ที่ผมทดสอบนี้คือ ubuntu server 16.04 ครับ คือ ปรกติแล้วเครื่อง 1 เครื่อง จะมี default gateway เพียง 1 เท่านั้น เราจะใช้ iproute2 เพื่อแยกให้มี gateway สำหรับ IP ของ eth0 และ eth1 เพิ่มขึ้น เรามาดูตัวอย่างกันครับ เครื่องที่ทดสอบ มี 2 subnets (อันนี้ที่ต้องใช้ /25 เพราะผมไม่มี net class C ถึง 2 net จึงไปขอความช่วยเหลือทีมเครือข่ายให้ช่วยแบ่งครึ่ง net class C ให้ครับ) 1. net 192.168.99.0/25 IP 192.168.99.1 – 192.168.99.126 broadcast 192.168.99.127 gateway 192.168.99.1 2. net 192.168.99.128/25 IP 192.168.99.129 – 192.168.99.254 broadcast 192.168.99.255 gateway 192.168.99.129   1. ตรวจสอบ network interfaces ได้ผลลัพธ์ดังนี้ root@ubuntu:~# ifconfig eth0 Link encap:Ethernet HWaddr 00:4d:60:1e:fb:ab inet addr:192.168.99.20 Bcast:192.168.99.127 Mask:255.255.255.128 eth1 Link encap:Ethernet HWaddr 00:04:a5:fd:a4:9c inet addr:192.168.99.251 Bcast:192.168.99.255 Mask:255.255.255.128 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0   2. เพิ่ม 2 บรรทัดนี้ต่อท้ายในไฟล์ /etc/iproute2/rt_tables (ผมตั้งชื่อ routing table 1

Read More »

การตั้งค่า MaxRequestWorkers บน Apache ให้เหมาะสมกับจำนวนผู้ใช้

ปัญหาของ PSU Webmail ในช่วง 9-15 สิงหาคม 2559 ที่ผ่านมา คือ เมื่อเริ่มเข้าสู่เวลาราชการ ในวันทำการ พบว่า มีการตอบสนองที่ช้า บางครั้งต้องรอถึง 15-20 วินาที หรือ ผู้ใช้บางท่านแจ้งว่า Timeout ไปเลย หรือไม่ก็ใช้งานไปสักพัก ถูกดีดกลับมาหน้า Login ใหม่ แต่เมื่อพ้นเวลาราชการ พบว่าการตอบสนองก็เร็วขึ้นดังเดิม รวมถึงในช่วงวันหยุดก็เร็วอย่างที่ควรเป็น ขอบคุณทาง NetAdmin ที่ทำระบบตรวจสอบไว้ที่หน้า Data Center เพื่อตรวจจับความเร็วในการตอบสนองบริการ PSU Webmail ด้วย SmokePing ผลที่ได้เป็นดังภาพ จะเห็นว่า มีความหน่วงในการตอบสนอง เฉพาะในวันเวลาราชการเท่านั้น … ทำไม ??? ทำการตรวจสอบด้วยคำสั่ง ps aux |grep apache| wc -l เพื่อดูว่า มีจำนวน Apache อยู่กี่ Process พบว่า ในช่วงเวลาที่ระบบหน่วง มี Process เกือบคงที่ที่ 150 แต่ในช่วงที่ระบบทำงานได้เร็ว มีจำนวนประมาณ 50 process จากการศึกษา พบว่า Apache2 ที่ใช้ MPM Prefork นั้น จะจำกัดค่า MaxRequestWorkers ไว้ โดยหากไม่กำหนดค่าใดๆจะตั้งไว้ที่ 256 แต่เมื่อตรวจสอบในไฟล์ /etc/apache2/mods-enabled/mpm_prefork.conf พบว่า <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 150 MaxConnectionsPerChild 0 </IfModule> ทำให้เพดานของจำนวน Process ไปจำกัดที่ 150 ดังที่ตรวจสอบเบื้องต้น เมื่อมีผู้ใช้มากขึ้นกว่าเดิม จึงทำให้ Process ไม่เพียงพอต่อความต้องการ เป็นผลให้เกิดการหน่วงขึ้น จึงทำการแก้ไข MaxRequestWorkers เป็น 256 แล้ว Restart Apache ผลทำให้ จำนวน Apache Process ขึ้นไปถึง 200 Process และการตอบสนองเร็วขึ้นตามที่ควรเป็นดังภาพ (หลังเวลา 14:45) ทั้งนี้ การกำหนดจำนวน MaxRequestWorkers นั้น ต้องสัมพันธ์กับ RAM ของ Server ด้วย โดยมีสูตรคร่าวๆ คือ จำนวน RAM ในหน่วย MB หารด้วยขนาดของ Apache Process โดยเฉลี่ย เช่น มี RAM 4GB = 4 x 1024 = 4096 ขนาดเฉลี่ย Apache Process = 20 ดังนั้น MaxRequestWorkers = 4096/20 = 204 แต่จริงๆแล้ว ควรเผื่อ Memory ไว้ให้ OS และอื่นๆด้วย (อาจจะไม่เต็ม 4096) หากขยับค่า MaxRequestWorkers แล้วยังพบว่า จำนวน Process ยังขึ้นไปเต็มเพดานอยู่ ควรพิจารณาเพิ่ม Memory ด้วย ประมาณนี้ครับ UPDATE: ผลการปรับแก้ไข ทำให้ เวลาในการตอบสนอง จากที่หน่วง 10 วินาที เหลือ เพียง 50 มิลลิวินาที ดังภาพ  

Read More »

Script สำหรับ หาวันที่ของไฟล์ล่าสุดใน directory

Q: ถ้าจะเขียน คำสั่ง หรือ script บน linux เพื่อหา วันที่ของ file ล่าสุดใน folder ของ user จะเขียนยังไงดี มีไอเดียไหมครับ A: สมมติ folder ของ user คือ /home/user/Documents $ ls -t /home/user/Documents จะได้ไฟล์เรียงตามลำดับวันที่/เวลาของไฟล์ โดยไฟล์ล่าสุดจะโผล่มาเป็นไฟล์แรก ถ้าเราต้องการไฟล์ล่าสุดแค่ไฟล์เดียว ก็สามารถใช้คำสั่ง head -1 เพื่อตัดให้เหลือไฟล์เดียวได้ ก็จะได้คำสั่งเป็น $ ls -t /home/user/Documents | head -1 ทีนี้ จากชื่อไฟล์ที่ได้ ถ้าต้องการวันที่ เราก็สามารถใช้คำสั่ง date โดยใช้ option -r สำหรับให้มันแสดงวันที่ของไฟล์ใดๆ ตย. เช่น ต้องการรู้วันที่ ของไฟล์ /etc/passwd ก็ใช้คำสั่ง $ date -r /etc/passwd เอาสองอย่างนี้มาใช้งานร่วมกันได้ตามนี้ครับ $ date -r `ls -t /home/user/Documents | head -1` ทีนี้ ถ้าต้องการให้ format ของวันที่ออกมาตามที่เราต้องการ อย่างเช่น ให้ format เป็น yyyy-mm-dd HH:MM:SS ก็เพิ่ม option ให้กับคำสั่ง date ประมาณนี้ “+%Y-%m-%d %H:%M:%S” รวมกันทั้งหมดเป็น $ date -r `ls -t /home/user/Documents | head -1` “+%Y-%m-%d %H:%M:%S” Q: ถ้าจะลงลึกไปหลาย level ต้องทำอะไรเพิ่มครับ A: หมายถึงต้องการไฟล์ล่าสุด ไฟล์เดียว จากใน directory นั้นและ sub directory ย่อยทั้งหมดใช่ใหมครับ? Q: ใช่ครับ A: งั้น คงต้องพึ่งพาคำสั่ง find ครับ เพื่อที่ list เอาเฉพาะไฟล์ทั้งหมดออกมาก่อน เพราะคำสั่ง ls ธรรมดามันจะไล่ไปตาม directory ทีละ directory เริ่มจาก $ find /home/user/Documents มันจะ list ทุกอย่างทั้งไฟล์ และ ไดเรคตอรี่และในไดเรคตอรี่ย่อยออกมา เราต้องการเฉพาะไฟล์ ระบุ option -type f เราต้องการให้มันแสดงวันที่ของไฟล์ออกมาด้วย อันนี้ต้องพึ่งคำสั่ง ls โดยใช้ option ของ ls เป็น –full-time $ find /home/user/Documents -type f -exec ls –full-time {} \; โดย {} เป็นการระบุว่าให้ find ใช้คำสั่ง ls –full-time กับ output ของ find ส่วน \; เป็นตัวระบุว่า จบ option ของ คำสั่ง find แค่นี้ output ที่ได้ จะเป็นไฟล์ “ทั้งหมด” โดยที่ในแต่ละบรรทัดจะมี ข้อมูลอย่างอื่นของไฟล์นั้นออกมาด้วย เช่น permission, owner, group, size ซึ่งเราไม่สนใจ เราตัดเอาข้อมูลที่อยู่ข้างหน้าเหล่านั้นออกไปได้ โดยใช้คำสั่ง cut โดยในกรณีนี้ใช้ space ‘

Read More »

IEEE Explore Services and IPv6

หลายวันก่อน (2016-06-28) คุณวันชัย พบปัญหาการเข้าใช้งาน web ieeexplore.ieee.org ซึ่งปัญหาที่ว่าก็คือ ปกติแล้วการเข้าไปพยายามดาวน์โหลดไฟล์จากเว็บดังกล่าว ถ้าเข้าใช้งานจากเครือข่ายของ มหาวิทยาลัยสงขลานครินทร์เอง ผู้ให้บริการ (IEEE Explore) ก็จะสามารถตรวจสอบได้ว่า เข้ามาจากเครือข่ายของมหา’ลัย ซึ่งอนุญาตให้ผู้ใช้งานจากเครือข่ายของมหา’ลัย สามารถดาวน์โหลดไฟล์ได้ แต่ครั้งนั้น อาจารย์ของภาควิชาวิศวกรรมไฟฟ้า ไม่สามารถดาวน์โหลดได้ จากภายในเครือข่ายของภาคฯเอง และ ที่แปลกไปกว่านั้นก็คือ ถ้าเปลี่ยนไปใช้งานเครื่องคอมพิวเตอร์ซึ่งอยู่ในเครือข่ายของภาคฯเช่นเดียวกัน แต่ใช้ระบบปฏิบัติการ Windows XP กลับใช้งานได้ หลังจากผ่านการตรวจสอบ 2-3 ขั้นตอนก็ได้ข้อสรุปว่า ปัญหาที่เกิดขึ้นก็คือ จากเดิมทีที่เครือข่ายของมหา’ลัย ใช้งาน IPv4 ในการเข้าถึงเครือข่ายของ IEEE (สำหรับในกรณีนี้ก็คือ ieeexplore.ieee.org) ตอนนี้ เมื่อเครือข่ายของ มหาวิทยาลัยสงขลานครินทร์ พร้อมที่จะให้บริการ IPv6 เครื่องคอมพิวเตอร์ ซึ่งส่วนใหญ่พร้อมที่จะใช้ IPv6 อยู่แล้ว ก็จะเปลี่ยนไปใช้ IPv6 สำหรับการติดต่อกับเครือข่ายปลายทาง สิ่งเหล่านี้ควรจะเกิดขึ้นโดยอัตโนมัติ และผู้ใช้งานก็ควรที่จะใช้งานได้โดยไม่จำเป็นจะต้องรู้ว่าเครื่องคอมพิวเตอร์ที่ตนเองใช้งานอยู่ ติดต่อกับเครื่องปลายทางโดยใช้โปรโตคอลใด อย่างไรก็ตาม สำหรับกรณีนี้ บริการของ IEEExplore และ Academic Journals อีกจำนวนมากซึ่งมหาวิทยาลัยสงขลานครินทร์เป็นสมาชิกอยู่ (ซึ่งอาจจะเป็นสมาชิกโดยตรง หรือโดยอ้อมผ่านทาง UniNet/สกอ.) ไม่ได้เป็นบริการที่เปิดแบบ public ให้ใครๆก็สามารถเข้าถึงข้อมูลได้ทุกอย่าง ข้อมูลบางอย่าง เช่น ไฟล์ของบทความ จะดาวน์โหลดได้เฉพาะสมาชิกเท่านั้น ถ้าเป็นสมาชิกแบบบุคคล วิธีการที่ใช้ในการยืนยันตัวตน ก็คือการ login โดยใช้ username และ password แบบเดียวกับที่ใช้กับบริการบนเว็บอื่นๆทั่วไป แต่สำหรับสมาชิกแบบ “สถาบัน” แบบที่มาหวิทยาลัยสงขลานครินทร์เป็นอยู่ แทนที่จะต้องให้ นักศึกษาและบุคคลากร แต่ละคนจะต้องมีแอคเคาท์ เป็นของตัวเอง วิธีการที่ง่ายกว่าก็คือ ใช้หมายเลข IP เป็นตัวระบุ โดยสถาบันที่เป็นสมาชิก ก็จะต้องแจ้งไปทางผู้ให้บริการว่า หมายเลข IP ใด หรือ ช่วงใดบ้างที่เป็นของสถาบันนั้นๆ แน่นอนว่าก่อนหน้านี้ หมายเลข IP ที่มหาวิทยาลัยสงขลานครินทร์แจ้งไปจะมีเฉพาะ IPv4 และแน่นอนว่าก่อนหน้านี้ไม่มีใครแจ้งปัญหาว่าสามารถดาวน์โหลดไฟล์จาก IEEExplore ไม่ได้ … เพราะเครือข่ายส่วนใหญ่ใน มหา’ลัย ใช้งานได้เฉพาะ IPv4 [[ ซึ่ง … อาจจะทำให้ผมตั้งข้อสงสัยขึ้นมาได้ว่า แล้วหน่วยงานบางหน่วยซึ่งใช้งาน IPv6 มาได้นานก่อนหน้านี้ ไม่เคยมีใครมีปัญหาบ้างเลยหรือ หรือจะเป็นเพราะว่าสมาชิกหน่วยงานเหล่านั้นไม่เคยใช้ IEEExplore เลย … แต่เนื่องจากว่า มีคำโบราณกล่าวไว้ … อะไรบางอย่าง…เกี่ยวกับการขว้างงู…และอวัยวะอะไรบางอย่างที่เป็นส่วนเชื่อมต่อระหว่างหัวและลำตัว… ผมก็เลยไม่ได้ตั้งข้อสงสัยใดๆทั้งสิ้นเกี่ยวกับเรื่องดังกล่าว เพราะไม่อยากให้คอของผมมีรู … และผมก็ไม่ชอบงูด้วย! ย้ำ, ผมไม่ได้ตั้งข้อสงสัยใดๆทั้งสิ้นจริงๆ EDIT (2016-07-08): ข้อมูลจาก ที่นี่ ทำให้พอเชื่อได้ว่า IEEE เริ่มใช้งาน IPv6 เมื่อประมาณ 2016-06-06 นั่นคือประมาณ 1 เดือนที่แล้ว ดังนั้นปัญหาในการเข้าถึงบริการของ IEEE Explore จากเครือข่ายของ มหาวิทยาลัยสงขลานครินทร์ โดยใช้งาน IPv6 แล้วใช้งานไม่ได้ จึงไม่ได้นานมากอย่างที่ผมคิดตอนแรก ]] กลับมาที่เรื่องของการใช้งาน IEEExplore ต่อ ปัญหาที่เกิดขึ้นครั้งนี้ เทียบเคียงได้กับการที่ทาง มหาวิทยาลัยแจ้ง IP address ที่มีใช้งานอยู่ให้กับทางผู้ให้บริการไม่ครบ เมื่อเครื่องคอมพิวเตอร์เริ่มใช้งาน IPv6 ได้และพยายามใช้งาน IPv6 ในการติดต่อกับเครื่องที่ให้บริการปลายทาง เครื่องที่ให้บริการปลายทาง ตรวจสอบแล้วไม่พบว่า หมายเลข IP address นี้อยู่ในรายการของหมายเลข IP ที่อนุญาตให้เข้าถึงข้อมูลได้ ก็เลยปฏิเสธการเข้าถึงข้อมูล วิธีการแก้ปัญหา ก็คือแจ้งหมายเลข IPv6 address ที่มหา’ลัยใช้อยู่ไป เพื่อให้ทางผู้ให้บริการอนุญาตให้เครื่องคอมพิวเตอร์ซึ่งใช้หมายเลขเหล่านี้เข้าถึงข้อมูลได้ วันนี้ (2016-07-07) คุณสงกรานต์ และ หอสมุดคุณหญิงหลงประกาศผ่านกลุ่มของ facebook ว่าสามารถใช้งานบริการของ IEEE ได้แล้วทั้ง IPv4 และ IPv6 ซึ่งในแง่ของผู้ใช้งานทั่วๆไป ควรที่จะใช้งานได้

Read More »