ข้อความแสดงข้อผิดพลาดว่า 'Error 500' หรือ 'internal server error' มีสาเหตุ
มาจากปัญหาหลายๆอย่าง มากจนไม่อาจจะคาดเดาได้ง่ายๆ ซึ่งปัญหาที่มักจะเจอกันบ่อยๆ
ก็จะมีดังต่อไปนี้ ให้ตรวจสอบดูให้ดีว่ามีจุดไหนที่เราทำผิดพลาดหรือไม่
กำหนดสิทธิในการรันโปรแกรมไม่ถูกต้อง (Execute permission)
ในระบบ Unix ถ้าจะให้ script ไหนเรียกใช้งาน (execute) ได้ จะต้องมีการ
กำหนด permission (จะไม่กล่าวเรื่องของ permission ในบทความนี้มากนักนะครับ
หาความรู้เพิ่มเติมเกี่ยวกับเรื่อง permission ได้จากหนังสือ หรือบทความ
เกี่ยวกับการใช้งาน unix นะครับ) ให้สามารถเรียกใช้งานได้ โดยใช้คำสั่ง
chmod ในระบบ Unix เพื่อกำหนด permission ให้ script
นั้นๆสามารถใช้งานได้โดยใครก็ได้ โดยใช้คำสั่งว่า
chmod 755 myprog.pl
จะเป็นการกำหนด permission มีค่าเท่ากับ 755 ให้กับแฟ้มข้อมูล script
ชื่อว่า myprog.pl ซึ่งเลข 755 นี้จะมีความหมายถึงให้ใครก็ได้เรียกใช้
script ของเราได้ ซึ่งก็จะใช้ได้กับ web server โดยทั่วๆไป
ระบุที่อยู่ของตัวแปรภาษาผิด (Bad interpreter line)
ในระบบ Unix โปรแกรมภาษาที่เป็นลักษณะใช้ตัวแปรภาษา (เช่น Perl หรือ Shell script)
บรรทัดแรกของ script นั้นๆจะต้องมีการระบุ ที่อยู่ของโปรแกรมตัวแปรภาษา
เช่น
#!/usr/local/bin/perl
ถ้าหากว่าไม่ได้กำหนด หรือกำหนดผิด หรือที่ๆเรากำหนดไปนั้นมันไม่มีอยู่
ก็อาจจะเป็นสาเหตุให้โปรแกรม CGI Script เราทำงานผิดพลาดได้ครับผม
โดยปกติในระบบ unix คุณสามารถหาที่อยู่ของโปรแกรมตัวแปรภาษา เช่น
perl ได้โดยการใช้คำสั่งดังนี้
which perl
หรือ
whereis perl
ที่อยู่ของโปรแกรมตัวแปรภาษาจะต้องอยู่ที่บรรทัดแรก และเริ่มต้นด้วย #!
ซึ่งการกำหนดนี้จะเหมือนกันทั้ง perl script, shell script ต่างๆ
เขียนโปรแกรมใน script ผิดพลาด (Syntax error)
การเขียนโปรแกรมที่ผิดข้อกำหนด ผิดรูปแบบ หรือทำงานผิด จะส่งผลให้
เกิดข้อผิดพลาดแบบ 'Error 500' ได้เช่นกัน สำหรับภาษา perl คุณสามารถ
จะตรวจสอบ script ได้โดยใช้คำสั่ง
perl -c myprog.pl
จะเป็นการสั่งให้ perl นั้นตรวจสอบ โปรแกรม script ที่ชื่อว่า myprog.pl
ซึ่งจะต้องไปสั่งที่ shell นะครับผม อีกคำสั่งนึงที่มีประโยชน์ก็คือ
perl -w myprog.pl
ซึ่งจะมีผลให้ตัวแปรภาษาแจ้งเตือน ข้อผิดพลาดที่อาจจะเกิดขึ้นได้เมื่อมีการ
เรียกใช้งานโปรแกรม (จะไม่เหมือนกับข้อผิดพลาดที่เกิดจากการเขียนรูปแบบ
โปรแกรมผิด พวกนั้นสามารถตรวจสอบได้ง่ายกว่า แต่ข้อผิดพลาดที่อาจจะเกิด
ขึ้นเมื่อมีการเรียกใช้งานโปรแกรมนี้ อาจจะไม่เกิดก็ได้ และอาจจะเกิดเมื่อไหร่
ก็ได้ที่มีการเรียกใช้งานโปรแกรม นอกจากที่จะใช้ perl ทำการ debug
โปรแกรม script แล้ว อีกวิธีนึงที่จะตรวจสอบข้อผิดพลาดได้ (แต่ไม่ค่อยจะดีนัก
เพราะไม่ค่อยบอกอะไรเท่าไหร่เหมือนกัน) สามารถตรวจสอบได้จาก error log ของ
server ของคุณเอง
แฟ้มข้อมูลที่ต้องการไม่ครบถ้วน (Missing required file)
โดยมากปัญหานี้จะเจอกับ script ที่มีการเรียกใช้ library อื่นๆอีกที โดยใช้คำสั่ง
'require' หรือ 'use' แล้วถ้าหากว่าแฟ้มข้อมูลที่จะเรียกใช้นั้นไม่มีอยู่ ก็จะเกิด
'Error 500' ขึ้น.. ที่มักจะพบปัญหานี้ก็คือ การนำเอา script ที่เขาเขียนแจกๆกัน
มาใช้งาน ซึ่งบาง script จะใช้ library ที่ไม่มีในระบบที่เราเอามาใช้ ทางแก้ก็คือ
หา library ต่างๆเหล่านั้นมาติดตั้งครับผม ไม่งั้นก็ต้องแก้ไขโปรแกรมให้ใช้
ทางอื่นเลี่ยงแทน และอันดับสุดท้าย ถ้าทำอะไรไม่ได้แล้วก็คือ...ทำใจครับผม
ข้อผิดพลาดที่เกิดขึ้นเมื่อมีการเรียกใช้โปรแกรม (Runtime error)
ถ้าหากว่าโปรแกรม script ที่เราเรียกใช้มีปัญหาขณะที่โปรแกรมทำงาน หรือที่เรียกว่า
Runtime ก็มีผลให้เกิด 'Error 500' เช่นกัน ซึ่งปัญหานี้เองก็ค่อนข้างจะมีต้นเหตุ
อยู่หลายอย่าง เช่นมีการเรียกเปิดแฟ้มข้อมูลที่ไม่มีอยู่ในระบบ หรือมีการเขียนข้อมูล
ลงในที่ๆไม่สามารถเขียนได้ และไม่ได้มีการเขียนโปรแกรมรองรับ ไว้เมื่อมีข้อผิดพลาด
เกิดขึ้น.. ก็จะทำให้เกิดข้อผิดพลาดขึ้นมาได้
ส่ง HTTP Header ผิดพลาด
สิ่งแรกสุดของผลลัพธ์จาก script ที่จะต้องส่งไปยัง CGI ก็คือ HTTP header
ซึ่งมีรูปแบบคล้ายๆอย่างนี้
Content-type: text/html
หลังจาก HTTP header แล้วจะต้องตามด้วยบรรทัดว่าง 1 บรรทัดด้วยนะครับ
เพราะฉนั้นเวลาเขาใช้คำสั่ง print เพื่อพิมพ์ header จึงมักจะเห็นเขาใส่ \n\n
ไว้ด้วย นั่นคือให้มีบรรทัดว่าง 1 บรรทัดเกิดขึ้น ให้ตรวจสอบในโปรแกรมให้ดีว่า
มีการพิมพ์ header ที่ว่านี้ออกมาถูกต้องหรือไม่ บางคนมักจะหลงลืม พิมพ์ผลลัพธ์
ออกไปเป็น <HTML> เลย ไม่ได้เริ่มด้วย HTTP header ก่อน ซึ่งก็จะทำให้
โปรแกรมเกิด error ขึ้น
ใช้ตัวแปรภาษา Perl ผิด version
ปัญหานี้ไม่ค่อยพบกันบ่อย แต่ก็อาจจะเป็นไปได้ เพราะคำสั่งบางอย่างของ version
ต่างๆของ Perl อาจจะใช้งานไม่เหมือนกัน