LevelUp! Studio » Server https://blog.levelup.in.th Experience the new world. Fri, 26 May 2017 10:06:07 +0000 th hourly 1 http://wordpress.org/?v=3.8.1 Vultr Cloud Hosting มีดีอย่างไร? https://blog.levelup.in.th/2015/09/30/vultr-cloud-hosting-%e0%b8%a1%e0%b8%b5%e0%b8%94%e0%b8%b5%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b9%84%e0%b8%a3/ https://blog.levelup.in.th/2015/09/30/vultr-cloud-hosting-%e0%b8%a1%e0%b8%b5%e0%b8%94%e0%b8%b5%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b9%84%e0%b8%a3/#comments Wed, 30 Sep 2015 15:06:45 +0000 http://blog.levelup.in.th/?p=4820 ก่อนอื่นขอ Review เทียบ DigitalOcean vs Linode vs Vultr ที่เป็น SSD Cloud Hosting เหมือนกันนะครับ (หาข้อมูลจากในเน็ตมาเทียบๆ กันดูได้สรุปดังนี้)

Vultr - Performance ดีสุด Support ดีมาก Feature ครบครัน แต่ไม่ค่อยเปิดเผยข้อมูลว่า Hardware ที่รองรับด้านล่างเป็นอะไรบ้าง ราคาน่าจะถูกสุดเพราะมี 20% Discount อยู่ตอนนี้ เป็นน้องใหม่จากบรรดา 3 เจ้า Feature ใหม่ๆ ถูกพัฒนาอย่างต่อเนื่องรวดเร็วมาก ผ่านไปไม่กี่เดือน Feature ใหม่งอกตรึม ที่สำคัญ มี Private Network ที่ลูกค้าคนอื่นเข้าถึงไม่ได้ด้วยนะ! API ให้ยิงน้อยที่สุดใน 3 เจ้า เนื่องจากยังเป็นน้องใหม่อยู่ รอดูอนาคตยาวๆ อ้อ มี Location ให้เลือกมากสุดในสามเจ้าด้วย

Linode – Feature เยอะสุดเนื่องจากเก่าแก่ที่สุด (บุญเก่ามีเยอะ) ลูกค้าสามารถทำอะไรเองโดยไม่พึ่ง support ได้หลายอย่าง มี Feature ใกล้เคียง Dedicate Host มากที่สุด แต่ Support กากสุดๆ ตอบไม่ตรงคำถาม โบ้ยความผิด นั่นนี่ รู้สึกว่าคนดูแล support จะน้อยด้วย ส่วน Performance ดีเป็นอันดับสอง (แพ้แค่ 10%) ว่ากันตามจริงคน Review เชียร์ Linode เยอะมากๆ เรื่อง Stability และ Feature ที่เยอะกว่าคู่แข่ง สงสัยบุญเก่าเยอะจริง ข้อดีอีกอย่างคือสามารถ Scale up และ Scale down ผ่านหน้าเว็บโดยไม่ต้องกดสร้างจาก snapshot ได้ทำให้สะดวกกว่าเจ้าอื่นๆ

DigitalOcean – Performance กากสุด (ต่ำกว่าชาวบ้าน 2 เท่า) Feature น้อยสุด Support ดีเลิศที่สุด ถ้าทำอะไรพลาดหรือทำเราเสียเวลาจะคืนเป็น Credits ให้ น่าจะดังที่สุดในตอนนี้เพราะน่าจะออกสื่อบ่อยสุดละ รวมไปถึง community และ Document จะมากที่สุด

โอเค พอรู้จักกันแล้วมาเข้าสู่เนื้อหาว่า Vultr ทำอะไรได้บ้าง ข้อดีก็ตามนี้เลย

  • ราคาถูกกว่าชาวบ้าน performance ดีกว่าชาวบ้านตามที่ได้กล่าวไปแล้ว
  • มี Reserved IP เอาไปผูกติดกับ instance ไหนก็ได้ คล้าย Elastic IP ของ amazon ย้ายกลางทางก็ได้ (ต้อง restart เครื่อง กินเวลาประมาณ 3-5 นาที) ส่งผลให้ไม่ต้องสร้าง load balance มาคั่นกลางให้เปลืองค่า bandwidth และ spec เครื่องที่มีแต่ load balance เท่านั้น แถมในทางทฤษฎี ถ้า bandwidth ใกล้เต็มก็สามารถลบทิ้งสร้างใหม่เพื่อ Refill bandwidth ได้ด้วย (ยังไม่เคยทำหรอก แต่คิดว่าน่าจะได้ ถ้าไม่โดน ban 555)
  • มี location ให้เลือกมากกว่าคู่แข่งมาก
  • มี local storage หรือก็คือ instance ที่เป็น hdd จานหมุนธรรมดาให้เลือกใช้ใน network เดียวกันด้วย เอาไว้เก็บ backup ได้ง่ายๆ โดยดีกว่า ssd เรื่องความจุที่มากกว่า (แค่เรื่องเดียวน่ะแหละ) ตอนนี้มีแค่ 4 location ให้เลือกคือ New Jersey, Los Angeles, Amsterdam, Tokyo
  • Snapshot ฟรี! กี่อัน ขนาดเท่าไหร่ก็ได้ เนื่องจากยังเป็น beta (อนาคตอาจเก็บตัง)
  • Snapshot นี้จะ Restore กันข้าม Location ก็ได้นะ!
  • มี internal private network ที่ access จาก account ลูกค้าคนอื่นไม่ได้ ไม่เหมือนกัน digitalocean
  • มี kvm เข้าไปดูหน้าจอเครื่องได้เวลาเซ็ตค่า network อะไรผิดก็สามารถเข้าไปแก้ไขได้
  • ลง OS อะไรก็ได้จากเครื่องเรา ไม่จำเป็นต้องเป็น OS ที่ vultr เตรียมให้
  • มี IPv6
  • มี DDos Protection.
  • มี credit ให้ใช้ฟรีครั้งแรก $50 ผ่าน link นี้ !!

สำหรับ Reserved IP ต้องส่ง Ticket ไปขอเปิดใช้งานก่อนนะครับถึงจะใช้ได้ (ยัง Beta แต่ก็ไม่พบปัญหาอะไรเท่าที่ใช้มา) มี Trick เล็กน้อยคืออย่ากด convert ip ที่มีอยู่แล้วและผูกกับเครื่องอยู่ไปเป็น reserve ip เพราะคุณจะไม่สามารถถอด ip นั้นออกจาก Instance ตัวนั้นได้อีกต่อไปตลอดกาล จนกว่าจะลบ instance นั้นทิ้ง เพราะ Instance ตัวหนึ่งๆ จะต้องมี ip ผูกไว้อย่างน้อยหนึ่ง ip เป็นข้อกำหนดขั้นต่ำ เช่นเดียวกับการสร้าง Instance ใหม่ ห้ามสร้างโดยระบุ ip จาก reserved ip ไม่งั้นจะย้าย ip ไม่ได้นอกจากลบ instance ก่อนอีกเช่นกัน วิธีที่ถูกต้องคือให้ไปเพิ่ม reserve ip สำหรับเครื่องนั้นๆ โดยตรงแล้วค่อยกด detach และกด attach เข้าเครื่องใหม่ จึงจะสามารถย้าย ip ไปผูกกับเครื่องใหม่ได้อิสระโดยไม่ต้องทำลายเครื่องเก่าทันที ทำให้หากมีข้อผิดพลาดอะไรต้อง copy จากเครื่องเก่ามาก็ยังสามารถทำได้

ใช้มาเดือนนึงมีปัญหาติดขัดหน่อยนึงคือจู่ๆ Instance ก็ restart ตัวเอง! (เครื่อง database ด้วย แหม่… ดีที่ไม่พัง ข้อมูลยังไม่เยอะ) แต่เมื่อ restart vultr ก็รีบ email มาแจ้งทันทีว่าต้อง restart เนื่องจากเกิดเหตุ critical issue บางอย่างบน physical server ก็เลยจำเป็นต้องทำอย่างเร่งด่วน ก็รอดูต่อไปว่าจะมีปัญหาอย่างอื่นอีกไหม รวมๆ ก็ยังถือว่าดีอยู่ครับ ขอให้โชคดีนะครับทุกท่าน :)

 

]]>
https://blog.levelup.in.th/2015/09/30/vultr-cloud-hosting-%e0%b8%a1%e0%b8%b5%e0%b8%94%e0%b8%b5%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b9%84%e0%b8%a3/feed/ 0
setup awstats อย่างไร? https://blog.levelup.in.th/2013/09/28/how-to-setup-awstatssetup-awstats-%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b9%84%e0%b8%a3/ https://blog.levelup.in.th/2013/09/28/how-to-setup-awstatssetup-awstats-%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b9%84%e0%b8%a3/#comments Sat, 28 Sep 2013 07:08:26 +0000 http://blog.levelup.in.th/?p=2932 Awstats คือเครื่องมือช่วยวิเคราะห์ stat ที่เข้าถึงของเว็บเราครับ จริงๆ Google Analytic ก็ช่วยส่วนนี้ไปเยอะแล้ว แต่ส่วนที่ Google Analytic ช่วยไมได้คือพวก Bandwidth ต่อวัน และพวก status page แปลกๆ เช่น 404, 500, 502 ครับ ซึ่งหน้านี้ของ Awstats ก็คือการนำเอา Access log ของเว็บมา “ย่อยให้อ่านง่าย” นั่นเอง

12call

มาดูวิธีการติดตั้งกัน (Solaris Joyent ครับ)

  1. pkgin install awstats หรือ apt-get install awstats
  2. copy /opt/local/etc/awstats/awstats.model.conf มาเป็น /opt/local/etc/awstats/awstats.www.example.com.conf (ใน debian คือ /etc/awstats/awstats.conf)
  3. แก้ไข awstats.www.example.com.conf ดังนี้
    LogFile /var/log/nginx/access.log (สำหรับ nginx)
    LogFormat=1
    SiteDomain=”www.example.com”
    DNSLookup=0
    DirData=”/var/awstats” (ใชเก็บฐานข้อมูลที่ crawl จาก access_log มาแล้ว)
    HostAliases=”example.com”
  4. สร้าง dir ตามที่ DirData ระบุในข้อที่แล้ว
  5. สร้าง shell script ไว้รันโดยข้างในระบุคำสั่งดังนี้/opt/local/awstats/cgi-bin/awstats.pl  -config=www.example.com -update -output > /path/to/awstats.html (หน้าดูสถิติ) (/usr/lib/cgi-bin/awstats.pl ใน debian)
    /opt/local/awstats/bin/awstats_buildstaticpages.pl -config=www.example.com -update -dir=/path/to/awstats_dir/ -awstatsprog=/opt/local/awstats/cgi-bin/awstats.pl  > /dev/null (หน้ารายละเอียดปลีกย่อยที่ต้องสร้างเป็น dir ไว้เก็บหลายๆ ไฟล์) (/usr/share/awstats/tools/awstats_buildstaticpages.pl ใน debian)
  6. chmod g+x shell_script ที่สร้าง
  7. ตั้ง cron รัน shell script ที่สร้างตามสะดวก
  8. แก้ไข /opt/local/etc/nginx/nginx.conf โดยเพิ่มดังนี้location ~ ^/icon/ {
    root /opt/local/awstats; #/usr/share/awstats for debian
    index index.html;
    access_log off;
    error_log off;
    charset utf-8;
    }
  9. เข้า /path/to/awstats.html ก็จะดู awstats ได้แล้วเย้
]]>
https://blog.levelup.in.th/2013/09/28/how-to-setup-awstatssetup-awstats-%e0%b8%ad%e0%b8%a2%e0%b9%88%e0%b8%b2%e0%b8%87%e0%b9%84%e0%b8%a3/feed/ 0
Newrelic – Cloud Server Monitoring https://blog.levelup.in.th/2013/08/31/newrelic-server-monitoringnewrelic-cloud-server-monitoring/ https://blog.levelup.in.th/2013/08/31/newrelic-server-monitoringnewrelic-cloud-server-monitoring/#comments Sat, 31 Aug 2013 10:00:00 +0000 http://blog.levelup.in.th/?p=2889 ผมได้เคยเขียนบทความเกี่ยวกับตัว Newrelic เครื่องมือสำหรับ monitor server บน Cloud ขั้นเทพ ไปเมื่อ 2 ปีที่แล้ว ซึ่งส่วนนั้นจะเน้นการ monitor ที่ตัว application level แต่ครั้งนี้เราจะมาดูที่ส่วนของ server ด้านหลังกันบ้างเช่น CPU, RAM, Disk I/O ต่างๆ ซึ่งเดี๋ยวนี้ Newrelic ก็ได้พัฒนาขึ้นไปมากกว่าเก่ามากแล้ว และผมเองก็ยังคงใช้งานมาอย่างต่อเนื่อง มาลองดู Feature ด้าน server กันบ้างซึ่งส่วนนี้เหมาะสำหรับ System Engineer ที่ปกตินั่งดูแต่ shell ดำๆ ซึ่งดูได้แค่ข้อมูลปัจจุบัน หากเกิดอะไรขึ้นขณะที่นอนอยู่ จะมาดูย้อนหลัง บางคนอาจเลือกที่จะติดตั้ง Cacti, MRTG, Zabbix แต่ก็จะยุ่งยากเพราะต้องมี server เอาไว้เก็บข้อมูล stat ย้อนหลังต่างๆ เอง ขั้นตอนการติดตั้งก็ต่างๆ กันไป วันนี้ลองมาดู Newrelic บ้าง อาจจะเปลี่ยนใจทำให้คุณชอบขึ้นมาบ้างก็ได้ :)

Newrelic ตอนนี้ขยายบริการใหญ่โตมาก แบ่งการ Monitor หลักๆ ได้ออกเป็น

  1. Web App Monitoring – ซึ่งมันคือบริการแรกเริ่มของ New Relic ที่ผม Review ไปเมื่อ 2 ปีที่แล้ว
  2. Mobile App Monitoring – ตรงนี้ผมยังไม่เคยใช้บริการ แต่เข้าใจว่าเน้นการ monitor ด้านข้อมูล Network ที่ส่งเข้าออกจากตัวมือถือ
  3. Server Monitoring – ตัวนี้คือที่ผมจะพูดถึงวันนี้

lvp1

สิ่งแรกที่ต้องมี แน่นอนคือ CPU และ Memory ที่ใช้งานไปของเครื่อง (ในรูปปรับให้แสดง 24 ชม. ซึ่งจริงๆ สามารถปรับเป็น 30 นาทีแล้วดูผลได้เกือบ Real time)

lvp2

อันนี้ Disk I/O และ Network I/O ซึ่งจะแยก disk เป็นลูกๆ ให้เห็นอย่างชัดเจน

lvp3

เกิด Event อะไรอันตรายไหมในช่วงเวลาที่ผ่านมา เช่น Mem เต็ม CPU ทะลัก disk ระเบิด บลาๆ

lvp4

รูปนี้แสดงให้เห็นว่า process อะไรกิน Memory กิน CPU มากที่สุด ในช่วงเวลาต่างๆ เห็นกันชัดๆ ไปเลยว่าใครเป็นตัวปัญหาของ server เช่นในรูปผมสั่ง backup database ช่วงตี 4 จะเห็นว่า process lbzip2 (บีบอัดไฟล์ backup) ทำงานหนักที่สุด (นอกนั้น node กินเรียบ 55+)

lvp5

ตัวนี้แสดงกราฟเป็นราย process อย่างในรูปคือ php-fpm process ที่ใช้รับ Frontend หน้าเว็บ ซึ่งมี Running instance count หรือก็คือมีจำนวน process นี้กี่ตัวให้ดูด้วย ตรงนี้เอาไว้ Monitor การ spawn children ของ php-fpm ได้เป็นอย่างดี

lvp6

รูปนี้เป็น Disk I/O ที่ละเอียดขั้นว่าในช่วงเวลาต่างๆ มีอัตราการอ่านเขียนที่กี่ MB/S และยังดูค่า IOPS ได้อีกด้วย!! (ใครใช้ AWS จะเอามาคำนวณดูสถิติย้อนหลังเพื่อช่วยสร้างเครื่องที่เหมาะสมได้ดีมาก!)

lvp7

รายชื่อ server หลายๆ เครื่องเท่าที่มีทั้งหมด ดูภาพรวมอาณาจักรของเราได้ตรงนี้ :P

lvp8

และนี่เป็นหนึ่งใน Feature ที่ผมชอบมากที่สุดครับ อีเมล์แจ้งเตือนเราเมื่อ CPU, Mem, Disk I/O เกินกี่ % ซึ่งเราตั้งค่าที่ต้องการให้เตือนได้เองอย่างอิสระ :D เมื่อเราได้รับการแจ้งเตือนถึงปัญหาที่กำลังจะเกิดแต่เนิ่นๆ เราก็จะสามารถเตรียมรับมือและรีบตรวจหาสิ่งผิดปกติในเวลานั้นได้ทันท่วงทีก่อนที่เครื่องจะระเบิดได้ :P

lvp9

เอ๋? ยังไม่พอใจอีกเหรอ? เค้ามี Plugin ให้ install ใช้ฟรีตามแต่ application ที่ใช้เลยนะเออ! พวกนี้จะเป็นบริษัทอื่น Third Party ที่มาร่วมแจมพัฒนาตัวส่งข้อมูลมายิงเข้า Newrelic แล้วทาง Newrelic จะช่วยเก็บข้อมูลสถิติกราฟย้อนหลังให้ นั่นหมายความว่าอนาคต เราอาจจะ Monitor ได้ทุกโปรแกรมบนโลกใบนี้ด้วยพลังของ Third Party Plugin! และน่าจะฟรีทั้งหมดด้วย!

lvp10

ตัวอย่างในรูปผม Install Plugin Monitor Memcached ครับ ทำให้ผมทราบสถิติการใช้งานคำสั่งภายใน Memcached ดังรูปเลย (set, get,delete มากี่รอบต่อนาที)

lvp11

และสุดท้ายก็คือการดูข้อมูลย้อนหลังครับ ตรงนี้จะเป็นจุดแตกต่างที่สำคัญที่สุดระหว่างการใช้ฟรีและจ่ายเงิน เพราะใช้ฟรีจะดูย้อนหลังได้แค่ 1 วัน หากเสียเงินจะดูได้ 7 วัน หรือ 3 เดือนตามแต่ package ซึ่ง Feature ที่ว่ามาตั้งแต่ต้นทั้งหมดสามารถใช้ได้ฟรี! แค่จะดูได้แค่ 1 วัน ซึ่งเอาเข้าจริงก็เพียงพอต่อการแก้ปัญหาเฉพาะหน้าได้มากแล้ว

hero_phones

แถมอีกนิด เค้ามี app มือถือให้โหลดมาใช้ฟรีด้วยเช่นกัน หากอยู่นอกสถานที่ก็ยังดูข้อมูล Server ได้ตลอดเวลา :D ที่สำคัญเวลามีอะไรพังขึ้นมาก็มี Push Notification แจ้งเตือนอีกต่างหาก พระเจ้าจอร์จ มันยอดมาก!

ใครน้ำลายไหล อยากจะได้ก็จิ้มเลยครับ http://www.newrelic.com สมัครวันนี้แม้จะ package ฟรีจะแถมเสื้อฟรีและคอปเตอร์วิทยุบังคับฟรี! ส่งไปรษณีข้ามโลกมาเลยทีเดียว (ทำไมต้องคอปเตอร์ฟะ) เอ๊ะ! ผมเป็น Sale ให้ Newrelic ตั้งแต่เมื่อไหร่ 55+

]]>
https://blog.levelup.in.th/2013/08/31/newrelic-server-monitoringnewrelic-cloud-server-monitoring/feed/ 1
วิธี config และใช้ nginx + php-fpm + fast-cgi เบื้องต้นให้ใช้งานกับ Codeigniter https://blog.levelup.in.th/2011/12/31/basic-configuring-nginx-php-fpm-fast-cgi-for-codeigniter%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5-config-%e0%b9%81%e0%b8%a5%e0%b8%b0%e0%b9%83%e0%b8%8a%e0%b9%89-nginx-php-fpm-fast-cgi-%e0%b9%80/ https://blog.levelup.in.th/2011/12/31/basic-configuring-nginx-php-fpm-fast-cgi-for-codeigniter%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5-config-%e0%b9%81%e0%b8%a5%e0%b8%b0%e0%b9%83%e0%b8%8a%e0%b9%89-nginx-php-fpm-fast-cgi-%e0%b9%80/#comments Sat, 31 Dec 2011 15:46:23 +0000 http://blog.levelup.in.th/?p=1324 เนื่องด้วยทั่วๆ ไปแล้ว web server มาตรฐานทั่วๆ ไปที่ใช้งานกันคือ Apache แต่ว่า Apache นั้นบริโภค Memory อย่างไม่ไยดี และถ้าเว็บเรามีการใช้งาน static file จำพวกรูปภาพหรือ css, js มากๆ ก็จะกิน Memory หนักขึ้นไปอีก หลักการของ nginx จึงเปรียบเสมือนการเป็นป้ายบอกทางว่าถ้าเป็น static file ให้เรียกไฟล์นั้นๆ ขึ้นมาตรงๆ เลยไม่ต้องผ่าน apache หรือตัวกลางอื่นๆ แต่ถ้าเป็น Dynamic file เช่น PHP ก็ให้ส่งไปยัง Fast-cgi แทน ซึ่ง Fast-cgi จะทำหน้าที่อ่าน PHP เพียงอย่างเดียว ไม่ต้องเผื่อรองรับ static file จึงกิน Memory น้อยกว่านั่นเอง สุดท้ายจึงทำให้สามารถรองรับการใช้งานเว็บไซต์ที่มี traffic หนักๆ ได้อย่างสบายๆ กว่า apache มากหลายเท่าตัว

อันที่จริงแล้ว Apache ก็ไม่ได้มีแต่ข้อเสียขนาดนั้น ข้อดีของ Apache คือเหมือนเป็น All-in-one machine ติดตั้งตัวเดียว ทำงานได้ทุกอย่าง ถ้ามีคนใช้งานไม่มาก เราจะแทบไม่ต้องไปยุ่งกับการปรับ config เลยด้วยซ้ำไป เพียงแต่ว่าเมื่อเราต้องการให้รองรับการใช้งานหนักๆ ได้ เราจึงจำเป็นต้องใช้ “ผู้เชี่ยวชาญเฉพาะด้าน” ซึ่งในที่นี้คือ fast-cgi นั่นเอง และจะมี php-fpm คอยควบคุมสั่งการอีกทอดหนึ่งซึ่งแน่นอนว่าการ config เพื่อใช้งานจึงยุ่งยากกว่า แต่ก็แลกมากับประสิทธิภาพที่น่าพอใจ

ตัวอย่าง file config ของ nginx จาก server เกมของผม (ก่อนอื่นออกตัวก่อนครับว่าผมเองก็พึ่งหัดใช้ nginx เหมือนกัน อาจยังไม่ใช่ config ที่ดีที่สุดในตอนนี้ แต่เป็นเพียง config เบื้องต้นให้ใช้งานได้ครับ) ซึ่งอยู่ที่ /opt/local/etc/nginx/nginx.conf (เครื่องอื่นอาจเก็บอยู่ที่อื่นนะครับ ลองหาดู)

user www www;
worker_processes 1;

events {
# After increasing this value You probably should increase limit
# of file descriptors (for example in start_precmd in startup script)
worker_connections 1024;
}

http {
include /opt/local/etc/nginx/mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name kdq-web;

#charset koi8-r;

#access_log /var/log/nginx/host.access.log main;

location / {
root /home/jill/web/public;
index index.php index.html index.htm;
# file doesn't exist, let CI handle it
if (!-f $request_filename) {
rewrite ^(.*)/maingame/(.*)$ /maingame/index.php?/$2 last;
}
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root share/examples/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /home/jill/web/public;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/jill/web/public$fastcgi_script_name;
include /opt/local/etc/nginx/fastcgi_params;
}
}

server {
listen 443;
server_name kdq-web;

ssl on;
ssl_certificate /opt/local/etc/openssl/levelup/self.crt;
ssl_certificate_key /opt/local/etc/openssl/levelup/self.key;

ssl_session_timeout 5m;

ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;

location / {
root /home/jill/web/public;
index index.php index.html index.htm;
# file doesn't exist, let CI handle it
if (!-f $request_filename) {
rewrite ^(.*)/maingame/(.*)$ /maingame/index.php?/$2 last;
}
}

location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/jill/web/public$fastcgi_script_name;
fastcgi_param HTTPS on;
include /opt/local/etc/nginx/fastcgi_params;
}
}
}

จุดที่น่าสนใจคือตรงนี้ครับ ขออธิบายเป็นจุดๆ นะครับ

1. listen ใช้บอกว่าจะให้ดัก port อะไร ถ้าเว็บทั่วไป (http) ก็ 80 ถ้า secure (https) ก็ 443 ครับ

location / {
root /home/jill/web/public;
index index.php index.html index.htm;
# file doesn't exist, let CI handle it
if (!-f $request_filename) {
rewrite ^(.*)/maingame/(.*)$ /maingame/index.php?/$2 last;
}
}

2. ตรงนี้คือ directory root ตั้งต้นของเว็บผมอยู่ที่ /home/jill/web/public และมีการใช้งานระบบ URI Routing ของ Codeigniter ดังนั้น ผมต้องเซ็ต if ไว้ด้วยว่าถ้าหาไฟล์ไม่เจอให้ rewrite ใหม่ไปยัง maingame/index.php แทน (นับจาก root ที่ตั้งเมื่อกี้) ซึ่งเป็นไฟล์เริ่มต้อนของ Codeigniter และย้าย parameter ที่อยู่ต่อท้าย /maingame/ ไปอยู่ด้านหลัง index.php?/ แทน (ต้องมี ? ไม่อย่างนั้น nginx ก็จะยังหา file ไปเจออยู่อย่างนั้น และ rewrite ใหม่เรื่อยๆ จนเจอ infinite loop) ซึ่งตรงนี้ใช้ syntax แบบ regular expression ครับ

location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/jill/web/public$fastcgi_script_name;
fastcgi_param HTTPS on;
include /opt/local/etc/nginx/fastcgi_params;
}

3. ตรงนี้คือ config สำหรับส่งค่าไปยัง fast-cgi ครับ (port มาตรฐานคือ 9000 อาจแก้ได้ตามต้องการ) ที่น่าสนใจคือ fastcgi_param ใช้ส่งค่าเข้า $_SERVER ครับ ตามชื่อที่ต้องการเลย ถ้าเป็น https ผมบังคับส่ง $_SERVER['HTTPS'] ด้วยเพราะ Apache เคยมีตัวแปรนี้ที่ผมใช้งานอยู่ แต่ใน nginx ต้องกำหนดเพิ่มเองครับ และสุดท้ายคือ include parameter สำคัญอื่นๆ เข้ามาจากไฟล์ fastcgi_params ครับ ในไฟล์ก็มีเนื้อหาด้านล่าง (copy ไปใช้ได้เลย ถ้าเครื่องของคุณยังไม่มี)

fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

4. จะมี ssl on ให้เปิดใช้ https และ ssl_certificate, ssl_certificate_key เอาไว้กำหนด path ไปยัง cer และ key ตามลำดับครับ

เป็นอันเสร็จสิ้นสำหรับ nginx ส่วน php-fpm ซึ่งเอาไว้ใช้สร้าง process ของ fast-cgi ขึ้นโดยอัตโนมัติและสามารถปรับเพิ่ม-ลดได้ตามปริมาณคนเข้าจริงๆ ของ server (ดีกว่า spawn-fcgi มากครับ ทั้งเรื่องความเสถียร และการ config ให้ใช้งานได้ ซึ่งตัว spawn-fcgi จะไม่สามารถเพิ่ม-ลดจำนวน process ที่ใช้งานตามปริมาณคนเข้าจริงได้) ถ้าไม่มี php-fpm แล้วละก็ หาก process fast-cgi(ที่เราสร้างเองจากการรันใน shell) ตายลงไปละก็ ก็จะไม่มี process มาคอยรับงานจาก nginx ไปประมวลผล php จริงๆ ทำให้ server พังนั่นเองครับ php-fpm นั้นจะติดมากับ php5.3 อยู่แล้ว (หรือถ้าไม่มีก็สามารถ install ตามทีหลังได้ง่าย) หากเป็น php5.2 ก็ยังใช้ php-fpm ได้อยู่เพียงแต่ว่าต้อง build, compile จาก source รวมกับ source php ตัวหลักเอาเองครับ ใครอยากอ่านรายละเอียดข้อดี php-fpm เพิ่มตามอ่านได้ที่ php-fpm.org

config ของ php-fpm จะอยู่ที่ /opt/local/etc/php-fpm.conf (เฉพาะของเครื่องผมอีกเช่นกัน เครื่องคุณอาจอยู่ที่อื่น) config ที่น่าสนใจมีดังนี้

  1. listen = 127.0.0.1:9000 อันนี้คือใส่ให้เหมือน nginx นั่นแหละครับ
  2. pm – ให้เลือกว่าเป็น static หรือ dynamic ซึ่ง static คือตายตัว dynamic คือปรับตาม idle process ที่มี (ควรเลือก dynamic ครับ)
  3. pm.max_children – ให้แตก child ได้สูงสุดไม่เกินกี่ตัวในเวลาเดียวกัน
  4. pm.start_servers – เริ่มต้นมามี child กี่ตัว
  5. pm.min_spare_servers – จำนวน child ที่อยู่ใน idle state ขั้นต่ำ
  6. pm.max_spare_servers – จำนวน child ที่อยู่ใน idle state ไม่เกินกี่ตัว (ถ้าเกินจะ auto kill ทิ้ง)
  7. pm.max_requests – ใช้จำกัดไม่ให้ process นึงกิน memory เกินเท่าไหร่ ใช้กรณีเกิดปัญหา memory leak จากตัว php แต่ยังหาสาเหตุไม่เจอ ให้ auto kill ถ้า request เยอะเกินไปก่อน

สุดท้ายคือ code ที่ต้องแก้ไขใน config.php ของ codeigniter เพื่อให้สามารถอ่าน URI ที่ส่งต่อมาจาก nginx ได้ครับ ดังนี้

$config['uri_protocol'] = "REQUEST_URI";
$index_page = $config['index_page'];
if (!empty($index_page) && strpos($_SERVER['QUERY_STRING'], $index_page) === FALSE)
$script_filename = str_replace($index_page, '', $_SERVER['SCRIPT_NAME']);
else
$script_filename = $_SERVER['SCRIPT_NAME'];
$request_uri = $_SERVER['QUERY_STRING'];
if ($request_uri[strlen($request_uri)-1] != '/')
$request_uri .= '/';

$request_uri = str_replace($script_filename, '', $request_uri);
list($_SERVER['REQUEST_URI']) = explode("&",$request_uri,2);

เรียบร้อยครับสำหรับการ config nginx + php-fpm สำหรับ Codeigniter วันนี้เท่านี้ละครับ :)

]]>
https://blog.levelup.in.th/2011/12/31/basic-configuring-nginx-php-fpm-fast-cgi-for-codeigniter%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5-config-%e0%b9%81%e0%b8%a5%e0%b8%b0%e0%b9%83%e0%b8%8a%e0%b9%89-nginx-php-fpm-fast-cgi-%e0%b9%80/feed/ 2
รู้จักกับ config ที่น่าสนใจของ php ในไฟล์ php.ini https://blog.levelup.in.th/2011/11/26/study-configuration-for-php-in-phpini%e0%b8%a3%e0%b8%b9%e0%b9%89%e0%b8%88%e0%b8%b1%e0%b8%81%e0%b8%81%e0%b8%b1%e0%b8%9a-config-%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99/ https://blog.levelup.in.th/2011/11/26/study-configuration-for-php-in-phpini%e0%b8%a3%e0%b8%b9%e0%b9%89%e0%b8%88%e0%b8%b1%e0%b8%81%e0%b8%81%e0%b8%b1%e0%b8%9a-config-%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99/#comments Sat, 26 Nov 2011 08:36:32 +0000 http://blog.levelup.in.th/?p=1292 PHP มี config ต่างๆ มากมาย หากอยากรู้ว่า server ของเราเซ็ต config อะไรไว้อยู่บ้างให้ทดสอบด้วยการสั่ง phpinfo(); ในไฟล์ php ไฟล์ใดก็ได้ ระบบจะแสดง config ออกมาให้เห็นทั้งหมด รวมไปถึงหากต้องการทราบว่าไฟล์ php.ini อยู่ที่ไหนก็ดูได้จาก phpinfo(); เช่นกัน

ตัวอย่าง phpinfo()

ตัวอย่าง phpinfo()

สำหรับการ setup php ตั้งแต่เวอร์ชั่น 5.3 เป็นต้นไป จะมีไฟล์ php.ini-development เอาไว้เป็น sample ให้ copy เป็น php.ini ถ้าต้องการใช้ทดสอบโปรแกรมเฉยๆ และไฟล์ php.ini-production เอาไว้ใช้ใน server ที่ให้บริการกับลูกค้าจริง

โดย config ที่ผมจะแนะนำให้รู้จักมีดังนี้

  • display_errors – On/Off – หากเกิด error ขึ้นให้แสดงภายในหน้าเว็บหรือไม่ ถ้าเป็นเครื่อง development ควร On ไว้เพื่อ debug ถ้าเป็นเครื่อง production ควร Off เพื่อไม่ให้ผู้ใช้เห็น
  • error_reporting – E_ALL/0 – ใช้ปรับระดับ level การแสดง error ว่าจะให้แสดงมากน้อยเพียงใด หากต้องการปิด error ไม่ให้แสดงเลย ให้ใส่เป็น 0 (ศูนย์) ได้
  • short_open_tag – On/Off – ถ้าเปิด On ไว้จะสามารถใช้ <? ?> แทน <?php ?> และ <?=’Hello World’?> แทน <?php echo ‘Hello World’; ?> ได้ (feature นี้เพื่อความสะดวกของตัวโปรแกรมเมอร์นั่นเอง)
  • max_execution_time – int – กำหนดเป็นตัวเลขที่ต้องการให้ script สามารถรันได้นานที่สุด ทั่วไปกำหนดที่ 30 วินาทีซึ่งค่อนข้างเพียงพอต่อการใช้งานทั่วไป หากต้องมีการทำงานที่ใช้การประมวลผลเป็นเวลานานสามารถปรับเพิ่มขึ้นได้ แต่ไม่แนะนำให้ใส่เยอะเกินไป เพราะอาจทำให้ loop infinite ก่อนความเสียหายเป็นระยะเวลานาน โดยที่เราไม่รู้ตัวได้
  • max_input_time – int – ใช้กำหนดเวลามากที่สุดที่อนุญาตให้ php ประมวลผลข้อมูลที่ผู้ใช้ส่งเข้ามาได้เช่นการ submit form post
  • memory_limit – int – กำหนดขนาดของ memory ที่อนุญาตให้ script แต่ละตัวใช้ได้ ถ้ากำหนดสูงไปอาจเกิดปัญหา memory leak ได้
  • post_max_size – int – ขนาดข้อมูลใหญ่ที่สุดที่อนุญาตให้ผู้ใช้ส่งเข้ามาได้ ขนาดตรงนี้รวมทั้ง file ที่ upload และข้อมูลที่ submit ผ่าน form เข้ามา
  • auto_prepend_file – string – path ไฟล์ php ที่ต้องการทำงานก่อนการทำงาน php ทุกๆ ไฟล์ที่รันตามปกติ ตรงนี้มีประโยชน์มากต่อการกำหนดตัวแปร Global ที่ต้องการให้ใช้งานได้ทุกๆ ไฟล์ ซึ่งเราจะเขียนอย่างไรก็ได้ตามใจเราเลย
  • auto_append_file – string – เหมือน  auto_prepend_file  ต่างกันแค่เป็นการทำงานหลังไฟล์ php ทุกๆ ไฟล์
  • file_uploads – On/Off – อนุญาตให้ upload file ขึ้น server ได้หรือไม่
  • upload_max_filesize – int – ขนาดไฟล์สูงสุดที่ให้ upload ได้ (ต้อง <=  post_max_size )
  • max_file_uploads – int – จำนวนไฟล์ที่ upload ได้พร้อมกันทั้งหมด
  • extension – string – กำหนด extension ของ php ที่ต้องการใช้งาน
  • session.gc_maxlifetime – int – อายุของ session ของผู้ใช้แต่ละคนที่จะเก็บไว้สูงสุด หากมีการเรียกใช้ session

Config เหล่านี้นอกจากจะสามารถกำหนดได้ที่ php.ini แล้วเรายังสามารถกำหนดใน run-time ในไฟล์ php ไฟล์ใดก็ได้อีกด้วย เพียงเรียกใช้ function ini_set() ก็สามารถเปลี่ยนแปลงค่า config เหล่านี้ได้ตลอดเวลา วันนี้มีเท่านี้ละครับ :)

]]>
https://blog.levelup.in.th/2011/11/26/study-configuration-for-php-in-phpini%e0%b8%a3%e0%b8%b9%e0%b9%89%e0%b8%88%e0%b8%b1%e0%b8%81%e0%b8%81%e0%b8%b1%e0%b8%9a-config-%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%99%e0%b9%88%e0%b8%b2%e0%b8%aa%e0%b8%99/feed/ 2