Internal Error 500 Apache แต่ไม่มีอะไรในบันทึก?


122

ฉันได้รับข้อผิดพลาด 500 Internal Server เมื่อฉันพยายามสร้าง HTTP POST ไปยังที่อยู่เฉพาะในแอปของฉัน ฉันได้ตรวจสอบบันทึกของเซิร์ฟเวอร์ในไดเร็กทอรีบันทึกแบบกำหนดเองที่ระบุในไฟล์โฮสต์เสมือน แต่ข้อผิดพลาดไม่ปรากฏขึ้นที่นั่นดังนั้นการดีบักสิ่งนี้จึงเป็นความเจ็บปวด

ฉันจะทำให้ Apache บันทึกข้อผิดพลาด Internal 500 ลงในบันทึกข้อผิดพลาดได้อย่างไร


1
ฉันมีปัญหาเดียวกันกับการใช้ PHP กับโฮสต์เสมือน .... ไม่มีข้อผิดพลาด (Apache2, Ubuntu) จบลงด้วยการขาดโมดูล PHP (mysql, json ฯลฯ )

1
สำหรับเรามันกำลังส่งพวกเขาไปยังบันทึกการเข้าถึง (น่าจะเป็นเพราะจากมุมมองของ Apache มันทำงานได้อย่างถูกต้องและเป็นเพียงการส่งผ่านจากเลเยอร์ที่ลึกกว่า - ในกรณีของเราคือ Passenger / Rails) เพียงแค่ใส่ข้อความนี้ไว้ในกรณีที่มีคนเกาหัว
Tom Hundt

คำตอบ:


-4

โปรดทราบ:ผู้โพสต์ต้นฉบับไม่ได้ถามเกี่ยวกับ PHP โดยเฉพาะ คำตอบ php เป็นศูนย์กลางทั้งหมดทำให้สมมติฐานจำนวนมากไม่เกี่ยวข้องกับคำถามจริง

บันทึกข้อผิดพลาดเริ่มต้นซึ่งตรงข้ามกับบันทึกข้อผิดพลาดของสคริปต์มักจะมีข้อผิดพลาดเฉพาะ (เพิ่มเติม) บ่อยครั้งจะถูกปฏิเสธสิทธิ์หรือแม้แต่ล่ามที่หาไม่พบ

ซึ่งหมายความว่าความผิดมักจะอยู่ที่สคริปต์ของคุณ เช่นคุณอัปโหลดสคริปต์ perl แต่ไม่ได้ให้สิทธิ์ดำเนินการ? หรือบางทีอาจเสียหายในสภาพแวดล้อม linux หากคุณเขียนสคริปต์ใน windows แล้วอัปโหลดไปยังเซิร์ฟเวอร์โดยไม่มีการแปลงส่วนท้ายบรรทัดคุณจะได้รับข้อผิดพลาดนี้

ใน perl ถ้าคุณลืม

print "content-type: text/html\r\n\r\n";

คุณจะได้รับข้อผิดพลาดนี้

มันมีหลายสาเหตุ ดังนั้นโปรดตรวจสอบบันทึกข้อผิดพลาดของคุณก่อนจากนั้นให้ข้อมูลเพิ่มเติม

ล็อกข้อผิดพลาดเริ่มต้นมักจะเป็นในหรือ/var/log/httpd/error_log/var/log/apache2/error.log

เหตุผลที่คุณดูบันทึกข้อผิดพลาดเริ่มต้น (ตามที่ระบุไว้ด้านบน) เนื่องจากข้อผิดพลาดมักไม่ได้รับการโพสต์ลงในบันทึกข้อผิดพลาดที่กำหนดเองตามที่กำหนดไว้ในโฮสต์เสมือน

ถือว่า linux และไม่จำเป็นต้อง perl


6
ฉันตรวจสอบ ErrorLog ของเซิร์ฟเวอร์แล้วและไม่พบสิ่งใด
wcolbert

2
คุณถูกต้องมันกลายเป็นปัญหากับสคริปต์ php ไม่ได้ติดตั้งไลบรารี PEAR ฉันติดตั้งบน VPS ของฉันและทุกอย่างเรียบร้อยดี ขอบคุณทุกคน!
wcolbert

262
"โปรดตรวจสอบบันทึก" จะเป็นคำตอบที่ยอมรับได้สำหรับ "เหตุใดบันทึกของฉันจึงว่างเปล่า"
ÁlvaroGonzález

5
ฉันชี้ให้ผู้ใช้ไปที่บันทึกข้อผิดพลาดเริ่มต้นไม่ใช่บันทึกข้อผิดพลาดที่กำหนดเอง บ่อยครั้งเมื่อสคริปต์ล้มเหลวด้วยเหตุผลบางประการข้อผิดพลาดจะถูกส่งไปยังบันทึกข้อผิดพลาดเริ่มต้น
DeveloperChris

2
ด้วย PHP ฉันไม่มีอะไรเลยในบันทึกข้อผิดพลาด apache ที่กำหนดค่าไว้ แต่พบข้อผิดพลาดกับgrep PHP /var/log/syslogไฟล์. อาจจะเป็นเพราะผมมีในerror_log = syslog /etc/php5/apache2/php.ini
mivk

145

เหตุใดข้อผิดพลาดภายในเซิร์ฟเวอร์ 500 รายการจึงไม่ถูกบันทึกลงในบันทึกข้อผิดพลาด apache ของคุณ

ข้อผิดพลาดที่ทำให้เกิดข้อผิดพลาด 500 Internal Server ของคุณมาจากโมดูล PHP โดยค่าเริ่มต้น PHP จะไม่บันทึกข้อผิดพลาดเหล่านี้ เหตุผลที่คุณต้องการให้คำขอเว็บเร็วที่สุดเท่าที่จะเป็นไปได้และเป็นอันตรายต่อความปลอดภัยในการบันทึกข้อผิดพลาดไปยังหน้าจอซึ่งผู้โจมตีสามารถสังเกตได้

คำแนะนำเหล่านี้เพื่อเปิดใช้งานเซิร์ฟเวอร์ภายในข้อผิดพลาดในการบันทึกข้อมูลมีการUbuntu 12.10มีและPHP 5.3.10Apache/2.2.22

ตรวจสอบให้แน่ใจว่าการบันทึก PHP เปิดอยู่:

  1. ค้นหาไฟล์ php.ini ของคุณ:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. แก้ไขไฟล์นั้นเป็นรูท:

    sudo vi /etc/php5/apache2/php.ini
    
  3. ค้นหาบรรทัดนี้ใน php.ini:

    display_errors = Off
    
  4. เปลี่ยนบรรทัดด้านบนเป็นสิ่งนี้:

    display_errors = On
    
  5. ด้านล่างในไฟล์คุณจะเห็นสิ่งนี้:

    ;display_startup_errors
    ;   Default Value: Off
    ;   Development Value: On
    ;   Production Value: Off
    
    ;error_reporting
    ;   Default Value: E_ALL & ~E_NOTICE
    ;   Development Value: E_ALL | E_STRICT
    ;   Production Value: E_ALL & ~E_DEPRECATED
    
  6. อัฒภาคคือความคิดเห็นซึ่งหมายความว่าบรรทัดจะไม่มีผล เปลี่ยนเส้นเหล่านั้นให้มีลักษณะดังนี้:

    display_startup_errors = On
    ;   Default Value: Off
    ;   Development Value: On
    ;   Production Value: Off
    
    error_reporting = E_ALL
    ;   Default Value: E_ALL & ~E_NOTICE
    ;   Development Value: E_ALL | E_STRICT
    ;   Production Value: E_ALL & ~E_DEPRECATED
    

    สิ่งนี้สื่อสารกับ PHP คือเราต้องการบันทึกข้อผิดพลาดเหล่านี้ทั้งหมด คำเตือนจะได้รับผลกระทบด้านประสิทธิภาพจำนวนมากดังนั้นคุณจึงไม่ต้องการเปิดใช้งานสิ่งนี้ในการใช้งานจริงเนื่องจากการบันทึกใช้เวลาทำงานและทำงานต้องใช้เวลาและเสียเวลา

  7. การรีสตาร์ท PHP และ Apache ควรใช้การเปลี่ยนแปลง

  8. ทำสิ่งที่คุณทำเพื่อทำให้เกิดข้อผิดพลาด 500 Internal Server อีกครั้งและตรวจสอบบันทึก:

    tail -f /var/log/apache2/error.log
    
  9. คุณควรเห็นข้อผิดพลาด 500 ในตอนท้ายดังนี้:

    [Wed Dec 11 01:00:40 2013] [error] [client 192.168.11.11] PHP Fatal error:  
    Call to undefined function Foobar\\byob\\penguin\\alert() in /yourproject/
    your_src/symfony/Controller/MessedUpController.php on line 249, referer: 
    https://nuclearreactor.com/abouttoblowup
    

46
display_errorsพิมพ์ข้อผิดพลาดบนหน้าจอ log_errorsเขียนข้อผิดพลาดในแฟ้มบันทึก
daVe

11
นี่ควรเป็นคำตอบที่ยอมรับได้สำหรับคำถามนี้
เดวิด

9
@WanLiqun เป็นข้อมูลที่ค่อนข้างดี แต่ใช้ได้กับ PHP เท่านั้นซึ่งไม่ได้กล่าวถึงในคำถาม
ÁlvaroGonzález

1
"ข้อผิดพลาดที่ทำให้เกิดข้อผิดพลาด 500 เซิร์ฟเวอร์ภายในของคุณมาจากโมดูล PHP โดยค่าเริ่มต้น PHP จะไม่บันทึกข้อผิดพลาดเหล่านี้" ใครพูดถึง PHP? Server 500 Logging ถูกปิดใช้งานใน PHP เป็นข้อสันนิษฐานและส่วนใหญ่มักเป็นข้อสันนิษฐานที่ผิด Apache จะบันทึกข้อผิดพลาดของเซิร์ฟเวอร์ 500 จากโมดูล faulting (ในกรณีนี้คือ php) แต่ส่วนใหญ่มักจะไปที่ /var/log/apache2/error.log (สมมติว่าเป็นเดเบียนหรือคล้ายกัน)
DeveloperChris

4
คำตอบนี้เริ่มต้นด้วยคำแนะนำที่ไม่ดีในการถ่ายโอนข้อผิดพลาดไปที่หน้าจอ
luqo33

11

ตรวจสอบบันทึกข้อผิดพลาด php ซึ่งอาจเป็นไฟล์แยกต่างหากจากบันทึกข้อผิดพลาด apache ของคุณ

ค้นหาได้โดยไปที่phpinfo()และตรวจสอบแอตทริบิวต์ error_log หากยังไม่ได้ตั้งค่า ตั้งค่า: https://stackoverflow.com/a/12835262/445131

บางที post_max_size ของคุณอาจเล็กเกินไปสำหรับสิ่งที่คุณพยายามโพสต์หรือการตั้งค่าหน่วยความจำสูงสุดอื่น ๆ ต่ำเกินไป


1
คำถามคือ"ฉันจะทำให้ Apache บันทึกข้อผิดพลาด Internal 500 ลงในบันทึกข้อผิดพลาดได้อย่างไร" นี่น่าจะเป็นความคิดเห็น
jww

11

ฉันเพิ่งพบสิ่งนี้และเกิดจากการกำหนดค่า mod_authnz_ldap ผิดในไฟล์. htaccess ของฉัน ไม่มีการบันทึกอะไรเลย แต่ฉันยังคงได้รับข้อผิดพลาด 500

หากคุณพบปัญหานี้คุณสามารถเปลี่ยนระดับบันทึกของ mod_authnz_ldap ได้ดังนี้:

LogLevel warn authnz_ldap_module:debug

ซึ่งจะใช้ระดับบันทึกของการดีบักสำหรับ mod_authnz_ldap แต่จะเตือนสำหรับสิ่งอื่น ๆ ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel )


1
คำถามคือ"ฉันจะทำให้ Apache บันทึกข้อผิดพลาด Internal 500 ลงในบันทึกข้อผิดพลาดได้อย่างไร" นี่น่าจะเป็นความคิดเห็น
jww

สังเกตดีๆ. ฉันได้เพิ่มคำแนะนำในการบันทึกข้อผิดพลาดเหล่านั้นแล้ว
bmaupin

7

หากข้อมูลข้อผิดพลาดเซิร์ฟเวอร์ภายในของคุณไม่ปรากฏในไฟล์บันทึกคุณอาจต้องเริ่มบริการ Apacheใหม่

ฉันพบว่า Apache 2.4 (อย่างน้อยก็บนแพลตฟอร์ม Windows) มีแนวโน้มที่จะปฏิเสธที่จะล้างไฟล์บันทึกอย่างดื้อรั้น แต่ข้อมูลที่บันทึกไว้จะยังคงอยู่ในหน่วยความจำชั่วขณะ เป็นความคิดที่ดีจากมุมมองด้านประสิทธิภาพ แต่อาจสร้างความสับสนเมื่อพัฒนา


นี่เป็นคำตอบที่ถูกต้องสำหรับฉันบน Linux แม้ว่าจะลบ error.log เดิม (ซึ่งเป็นไฟล์อุปกรณ์อักขระ) และแทนที่ด้วย touch 777 error.log แล้ว Apache จะไม่เขียนถึงมันจนกว่าจะรีสตาร์ท
Adelmar

2

คำตอบของ @ eric-leschinski ถูกต้อง

แต่มีอีกกรณีหนึ่งถ้า Server API ของคุณคือ FPM / FastCGI (ค่าเริ่มต้นใน Centos 8 หรือคุณสามารถตรวจสอบการใช้ฟังก์ชัน phpinfo ())

ในกรณีนี้:

  1. เรียกใช้phpinfo()ในไฟล์ php
  2. มองหาLoaded Configuration Fileพารามิเตอร์เพื่อดูว่าไฟล์ config สำหรับ PHP ของคุณอยู่ที่ไหน
  3. แก้ไขไฟล์ config เช่นคำตอบของ @ eric-leschinski
  4. ตรวจสอบServer APIพารามิเตอร์ หากเซิร์ฟเวอร์ของคุณใช้เฉพาะ apache handle API -> รีสตาร์ท apache หากเซิร์ฟเวอร์ของคุณใช้ php-fpm คุณต้องเริ่มบริการ php-fpm ใหม่

    systemctl รีสตาร์ท php-fpm

    ตรวจสอบไฟล์บันทึกในโฟลเดอร์บันทึก php-fpm เช่น/var/log/php-fpm/www-error.log


1

ในกรณีของฉันมันเป็นคำสั่ง ErrorLog ใน httpd.conf เพิ่งสังเกตเห็นโดยบังเอิญหลังจากที่ฉันยอมแพ้ ตัดสินใจแบ่งปันการค้นพบ) ตอนนี้ฉันรู้แล้วว่าจะหาข้อผิดพลาด 500 ข้อได้ที่ไหน


โปรดใส่รายละเอียดเพิ่มเติมในคำตอบของคุณได้ไหม
ยะห์ยาฮุสเซน

ฉันใช้ Magento (CMS - ระบบจัดการเนื้อหา) สำหรับ Apache มีข้อผิดพลาด 500 ในหน้าของฉันโดยใช้คลาสหลักของ Magento ฉันไม่พบว่าจะเห็นข้อความแสดงข้อผิดพลาดที่ใด ตามคำตอบบางส่วนที่นี่ฉันพยายามค้นหาในบันทึกของ apache / etc / httpd / logs / error_log แต่ที่นั่นไม่มีอะไรเลย ต่อมาฉันพบว่ามีบรรทัดใน httpd.conf ของฉันสำหรับโฮสต์เว็บนั้นโดยกำหนดเส้นทางบันทึก: <VirtualHost. ... ErrorLog / usr / www / log / error_log ดังนั้นฉันต้องดูบันทึกโฮสต์ที่เฉพาะเจาะจงมากขึ้นไม่ใช่บันทึกของ apache ทั่วไป
Eugene Lycenok

1

เพิ่มHttpProtocolOptions Unsafeลงในไฟล์กำหนดค่า apache ของคุณและรีสตาร์ทเซิร์ฟเวอร์ apache มันแสดงรายละเอียดข้อผิดพลาด


0

ตรวจสอบว่าเวอร์ชันของ php ที่คุณใช้นั้นตรงกับ codebase ของคุณ ตัวอย่างเช่นสภาพแวดล้อมในพื้นที่ของคุณอาจใช้ php 5.4 (และทำงานได้ดี) และบางทีคุณกำลังทดสอบโค้ดของคุณบนเครื่องใหม่ที่ติดตั้ง php 5.3 หากคุณใช้ไวยากรณ์ 5.4 เช่น [] สำหรับอาร์เรย์ () คุณจะได้รับสถานการณ์ตามที่อธิบายไว้ข้างต้น


คำถามคือ"ฉันจะทำให้ Apache บันทึกข้อผิดพลาด Internal 500 ลงในบันทึกข้อผิดพลาดได้อย่างไร" นี่น่าจะเป็นความคิดเห็น
jww

0

ลองเข้าถึงไฟล์แบบคงที่ หากวิธีนี้ใช้ไม่ได้ผลให้ไปที่ไดเรกทอรีทั้งหมดจากรูท "/" หรือ "c: \" ไปยังไดเร็กทอรีของไฟล์ของคุณและตรวจสอบว่ามีไฟล์ ".htaccess" หรือไม่

ครั้งหนึ่งฉันทิ้งไฟล์ไว้ใน "c: \" และได้ผลลัพธ์ที่แปลกประหลาดที่สุด


1
คำถามคือ"ฉันจะทำให้ Apache บันทึกข้อผิดพลาด Internal 500 ลงในบันทึกข้อผิดพลาดได้อย่างไร"
jww

0

โปรดตรวจสอบว่าคุณปิดใช้งานการรายงานข้อผิดพลาดที่ใดที่หนึ่งในโค้ดของคุณหรือไม่

มีสถานที่ในรหัสของฉันที่ฉันได้ปิดใช้งานดังนั้นฉันจึงเพิ่มรหัสดีบักหลังจากนั้น:

require_once("inc/req.php");   <-- Error reporting is disabled here

// overwrite it
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.