Lỗi nội bộ 500 Apache, nhưng không có gì trong nhật ký?


122

Tôi gặp phải 500 lỗi Máy chủ nội bộ khi cố gắng thực hiện ĐĂNG HTTP đến một địa chỉ cụ thể trong ứng dụng của mình. Tôi đã xem xét nhật ký máy chủ trong thư mục nhật ký tùy chỉnh được chỉ định trong tệp máy chủ ảo, nhưng lỗi không hiển thị ở đó nên việc gỡ lỗi này thực sự rất khó khăn.

Làm cách nào để Apache ghi lỗi Internal 500 vào nhật ký lỗi?


1
Tôi đã gặp vấn đề tương tự khi sử dụng PHP với máy chủ ảo .... không có lỗi (Apache2, Ubuntu). Kết thúc là thiếu mô-đun PHP (mysql, json, v.v.)

1
Về phía chúng tôi, nó đang gửi chúng đến nhật ký truy cập (có lẽ vì theo quan điểm của Apache, nó đang hoạt động chính xác và chỉ chuyển chúng đi từ một lớp sâu hơn - trong trường hợp của chúng tôi là Hành khách / Đường ray). Chỉ đặt ghi chú này ở đây trong trường hợp ai đó đang gãi đầu.
Tom Hundt

Câu trả lời:


-4

Xin lưu ý: Người đăng ban đầu không hỏi cụ thể về PHP. Tất cả các câu trả lời trọng tâm php tạo ra các giả định lớn không liên quan đến câu hỏi thực tế.

Nhật ký lỗi mặc định trái ngược với nhật ký lỗi tập lệnh thường có (nhiều hơn) lỗi cụ thể. thường thì nó sẽ bị từ chối quyền hoặc thậm chí không thể tìm thấy thông dịch viên.

Điều này có nghĩa là lỗi hầu như luôn nằm ở kịch bản của bạn. Ví dụ: bạn đã tải lên một tập lệnh perl nhưng không cấp cho nó quyền thực thi? hoặc có lẽ nó đã bị hỏng trong môi trường linux nếu bạn viết script trong windows và sau đó tải nó lên máy chủ mà không có phần cuối dòng được chuyển đổi, bạn sẽ gặp lỗi này.

trong perl nếu bạn quên

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

bạn sẽ gặp lỗi này

Có rất nhiều lý do cho nó. vì vậy trước tiên vui lòng kiểm tra nhật ký lỗi của bạn và sau đó cung cấp thêm một số thông tin.

Nhật ký lỗi mặc định thường ở /var/log/httpd/error_loghoặc /var/log/apache2/error.log.

Lý do bạn nhìn vào nhật ký lỗi mặc định (như đã chỉ ra ở trên) là vì lỗi không phải lúc nào cũng được đăng vào nhật ký lỗi tùy chỉnh như được xác định trong máy chủ ảo.

Giả sử linux và không nhất thiết phải perl


6
Tôi đã kiểm tra ErrorLog của máy chủ và không tìm thấy gì ở đó.
wcolbert

1
Bạn nói đúng, hóa ra là có vấn đề với tập lệnh php. Thư viện PEAR chưa được cài đặt. Tôi đã cài đặt nó trên VPS của mình và tất cả đều tốt. Cảm ơn tất cả!
wcolbert

260
Làm thế nào "vui lòng kiểm tra nhật ký" có thể là câu trả lời được chấp nhận cho "tại sao nhật ký của tôi trống"?
Álvaro González

4
Tôi đã chỉ người dùng đến nhật ký lỗi mặc định chứ không phải nhật ký lỗi tùy chỉnh. Thông thường, khi một tập lệnh không thành công vì một lý do nào đó, lỗi sẽ được chuyển đến các bản ghi lỗi mặc định
DeveloperChris

1
Với PHP, tôi không có gì trong nhật ký lỗi apache đã định cấu hình, nhưng đã tìm thấy lỗi với grep PHP /var/log/syslog. Có lẽ vì tôi đã error_log = syslogvào /etc/php5/apache2/php.ini.
mivk

145

Tại sao 500 lỗi máy chủ nội bộ không được đăng nhập vào nhật ký lỗi apache của bạn?

Các lỗi gây ra Lỗi máy chủ nội bộ 500 của bạn đến từ một mô-đun PHP. Theo mặc định, PHP KHÔNG ghi các lỗi này. Lý do là bạn muốn các yêu cầu web đi nhanh nhất có thể và đó là một mối nguy hiểm về bảo mật khi ghi lỗi để sàng lọc nơi những kẻ tấn công có thể quan sát chúng.

Các hướng dẫn này để bật Ghi nhật ký lỗi máy chủ nội bộ dành cho Ubuntu 12.10với PHP 5.3.10Apache/2.2.22.

Đảm bảo rằng ghi nhật ký PHP được bật:

  1. Định vị tệp php.ini của bạn:

    el@apollo:~$ locate php.ini
    /etc/php5/apache2/php.ini
    
  2. Chỉnh sửa tệp đó dưới dạng thư mục gốc:

    sudo vi /etc/php5/apache2/php.ini
    
  3. Tìm dòng này trong php.ini:

    display_errors = Off
    
  4. Thay đổi dòng trên thành dòng này:

    display_errors = On
    
  5. Xuống dưới tệp bạn sẽ thấy:

    ;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. Dấu chấm phẩy là nhận xét, nghĩa là các dòng không có hiệu lực. Thay đổi những dòng đó để chúng trông như thế này:

    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
    

    Điều này giao tiếp với PHP là chúng tôi muốn ghi lại tất cả các lỗi này. Cảnh báo, sẽ có một lần truy cập hiệu suất lớn, vì vậy bạn không muốn bật tính năng này trên sản xuất vì việc ghi nhật ký mất công và làm việc mất thời gian, thời gian tốn kém tiền bạc.

  7. Khởi động lại PHP và Apache sẽ áp dụng thay đổi.

  8. Làm lại những gì bạn đã làm để gây ra lỗi Máy chủ nội bộ 500 và kiểm tra nhật ký:

    tail -f /var/log/apache2/error.log
    
  9. Bạn sẽ thấy lỗi 500 ở cuối, giống như sau:

    [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_errorsin lỗi trên màn hình . log_errorsghi lỗi trong tệp nhật ký .
daVe

11
Đây phải là câu trả lời kinh điển cho câu hỏi này.
David

9
@WanLiqun Đó là một thông tin khá hay nhưng nó chỉ áp dụng cho PHP, thậm chí không được đề cập trong câu hỏi.
Álvaro González

1
"Các lỗi gây ra Lỗi máy chủ nội bộ 500 của bạn đến từ một mô-đun PHP. Theo mặc định, PHP KHÔNG ghi các lỗi này." Ai đã đề cập đến PHP? Máy chủ 500 Ghi nhật ký bị vô hiệu hóa trong PHP là một giả định và thường là một giả định sai. Apache sẽ đăng nhập máy chủ 500 lỗi từ một module đứt gãy (trong trường hợp này php) nhưng thường xuyên nhất nó sẽ đi đến /var/log/apache2/error.log (giả sử debian hoặc tương tự)
DeveloperChris

4
Câu trả lời này bắt đầu với một lời khuyên tồi là đổ lỗi ra màn hình.
luqo33

11

Kiểm tra nhật ký lỗi php của bạn, đây có thể là một tệp riêng biệt với nhật ký lỗi apache của bạn.

Tìm nó bằng cách truy cập phpinfo()và kiểm tra thuộc tính error_log. Nếu nó không được thiết lập. Đặt nó: https://stackoverflow.com/a/12835262/445131

Có thể post_max_size của bạn quá nhỏ so với những gì bạn đang cố gắng đăng hoặc một trong các cài đặt bộ nhớ tối đa khác quá thấp.


1
Câu hỏi đặt ra là, "Làm cách nào để Apache ghi các lỗi Internal 500 vào nhật ký lỗi?" Đây có lẽ nên là một bình luận.
jww

11

Tôi vừa gặp phải vấn đề này và đó là do cấu hình sai mod_authnz_ldap trong tệp .htaccess của tôi. Hoàn toàn không có gì được ghi lại, nhưng tôi tiếp tục nhận được lỗi 500.

Nếu bạn gặp phải sự cố cụ thể này, bạn có thể thay đổi cấp độ nhật ký của mod_authnz_ldap như sau:

LogLevel warn authnz_ldap_module:debug

Điều đó sẽ sử dụng mức ghi nhật ký gỡ lỗi cho mod_authnz_ldap nhưng cảnh báo cho mọi thứ khác ( https://httpd.apache.org/docs/2.4/en/mod/core.html#loglevel ).


1
Câu hỏi đặt ra là, "Làm cách nào để Apache ghi các lỗi Internal 500 vào nhật ký lỗi?" Đây có lẽ nên là một bình luận.
jww

Quan sát tốt. Tôi đã thêm hướng dẫn để ghi lại những lỗi đó.
bmaupin

7

Nếu thông tin Lỗi máy chủ nội bộ của bạn không hiển thị trong tệp nhật ký, bạn có thể cần khởi động lại dịch vụ Apache .

Tôi nhận thấy rằng Apache 2.4 (ít nhất là trên nền tảng Windows) có xu hướng kiên quyết từ chối xóa các tệp nhật ký — thay vào đó, dữ liệu đã ghi vẫn còn trong bộ nhớ khá lâu. Đó là một ý tưởng tốt từ quan điểm hiệu suất nhưng nó có thể gây nhầm lẫn khi phát triển.


Đây là câu trả lời chính xác cho tôi trên Linux. Ngay cả sau khi xóa lỗi gốc .log ban đầu (là một tệp thiết bị ký tự) và thay thế nó bằng lỗi 777 touchlog, Apache sẽ không ghi vào nó cho đến khi được khởi động lại.
Adelmar

2

Câu trả lời của @ eric-leschinski là đúng.

Nhưng có một trường hợp khác nếu API máy chủ của bạn là FPM / FastCGI (Mặc định trên Centos 8 hoặc bạn có thể kiểm tra sử dụng hàm phpinfo ())

Trong trường hợp này:

  1. Chạy phpinfo()trong một tệp php;
  2. Tìm kiếm thông số Loaded Configuration Fileđể xem đâu là tệp cấu hình cho PHP của bạn.
  3. Chỉnh sửa tệp cấu hình như câu trả lời của @ eric-leschinski.
  4. Kiểm tra thông số Server API. Nếu máy chủ của bạn chỉ sử dụng API xử lý apache -> khởi động lại apache. Nếu máy chủ của bạn sử dụng php-fpm, bạn phải khởi động lại dịch vụ php-fpm

    systemctl khởi động lại php-fpm

    Kiểm tra tệp nhật ký trong thư mục nhật ký php-fpm. ví dụ/var/log/php-fpm/www-error.log


1

Trong trường hợp của tôi, đó là lệnh ErrorLog trong httpd.conf. Chỉ tình cờ nhận ra nó sau khi tôi từ bỏ. Quyết định chia sẻ khám phá) Bây giờ tôi biết tìm 500 lỗi ở đâu.


Bạn có thể vui lòng đưa thêm chi tiết vào câu trả lời của mình
Yahya Hussein

Tôi đang sử dụng Magento (CMS - Hệ thống quản lý nội dung) cho Apache. Đã xảy ra lỗi 500 trên trang của tôi khi sử dụng các lớp lõi Magento. Tôi không thể tìm thấy nơi tôi có thể thấy thông báo lỗi. Theo một số câu trả lời ở đây, tôi đã cố gắng tìm kiếm trong nhật ký apache / etc / httpd / logs / error_log. Nhưng không có gì ở đó. Sau đó, tôi phát hiện ra rằng có một dòng trong httpd.conf của tôi cho máy chủ web cụ thể đó, xác định đường dẫn nhật ký: <VirtualHost. ... ErrorLog / usr / www / log / error_log Vì vậy, tôi cần xem một nhật ký máy chủ lưu trữ cụ thể hơn chứ không phải nhật ký apache thông thường.
Eugene Lycenok

1

Thêm vào HttpProtocolOptions Unsafetệp cấu hình apache của bạn và khởi động lại máy chủ apache. Nó hiển thị chi tiết lỗi.


0

Kiểm tra xem phiên bản php bạn đang chạy có khớp với cơ sở mã của bạn không. Ví dụ: môi trường cục bộ của bạn có thể đang chạy php 5.4 (và mọi thứ chạy tốt) và có thể bạn đang kiểm tra mã của mình trên một máy mới đã cài đặt php 5.3. Nếu bạn đang sử dụng cú pháp 5.4 chẳng hạn như [] cho mảng () thì bạn sẽ gặp phải tình huống như mô tả ở trên.


Câu hỏi đặt ra là, "Làm cách nào để Apache ghi các lỗi Internal 500 vào nhật ký lỗi?" Đây có lẽ nên là một bình luận.
jww

0

Thử truy cập một tệp tĩnh. Nếu cách này cũng không hoạt động thì hãy chuyển đến tất cả các thư mục từ thư mục gốc "/" hoặc "c: \" đến thư mục tệp của bạn và kiểm tra xem chúng có chứa tệp ".htaccess" hay không.

Tôi đã từng để lại một tệp trong "c: \" và nó có kết quả kỳ lạ nhất.


1
Câu hỏi đặt ra là, "Làm cách nào để Apache ghi các lỗi Internal 500 vào nhật ký lỗi?"
jww 21/12/17

0

Vui lòng kiểm tra xem bạn có đang tắt báo cáo lỗi ở đâu đó trong mã của mình không.

Có một chỗ trong mã của tôi mà tôi đã tắt nó, vì vậy tôi đã thêm mã gỡ lỗi sau nó:

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.