Lỗi 500 Internal Server Error: cách sửa (nginx, Apache)
Điểm chính
Lỗi HTTP 500 (Internal Server Error) nghĩa là máy chủ "gặp một tình huống bất ngờ khiến nó không thể xử lý yêu cầu" (RFC 9110): có thứ gì đó hỏng ở phía máy chủ và máy chủ không nói là gì. Nếu bạn là người truy cập, hãy tải lại trang một lần sau một phút và kiểm tra xem web có sập với mọi người không; người sửa là chủ web. Nếu bạn là chủ web, hãy đọc nhật ký lỗi trước. Trên nginx, lỗi 500 thường đến từ ứng dụng phía sau (PHP, Node, Python); trên Apache, hãy kiểm tra .htaccess, giới hạn PHP và plugin.
Kiểm tra ngay

Bắt đầu đọc
- Lỗi HTTP 500 là gì?
- Lỗi 500 trông như thế nào
- Lỗi 500 Internal Server Error trên nginx
- Nguyên nhân phổ biến của lỗi HTTP 500
- Cách khắc phục lỗi 500 (dành cho người truy cập)
- Cách 1: kiểm tra nhật ký lỗi máy chủ
- Cách 2: kiểm tra và sửa .htaccess
- Cách 3: sửa quyền truy cập tệp
- Cách 4: tăng giới hạn bộ nhớ và thời gian thực thi PHP
- Cách 5: tắt plugin và theme (CMS)
- Cách 6: kiểm tra kết nối và sửa chữa cơ sở dữ liệu
- Cách 7: kiểm tra tính tương thích phiên bản PHP
- Cách 8: kiểm tra dung lượng ổ đĩa
- So sánh 500 với 502, 503 và 504: sự khác biệt là gì?
- Lỗi 500 ảnh hưởng đến SEO như thế nào
- Cách phòng ngừa lỗi 500
- Câu hỏi thường gặp
Lỗi HTTP 500 là gì?
Lỗi HTTP 500 (Internal Server Error) nghĩa là có thứ gì đó hỏng trên máy chủ web khi nó xử lý yêu cầu của bạn, và máy chủ không nói là gì. Đây là lỗi máy chủ chung chung nhất.
Chuẩn HTTP định nghĩa nó trong một câu: "The 500 (Internal Server Error) status code indicates that the server encountered an unexpected condition that prevented it from fulfilling the request" (RFC 9110 §15.6.1), tức là máy chủ gặp một tình huống bất ngờ khiến nó không thể xử lý yêu cầu. Khác với 503, nó không nói gì về việc sự cố có tạm thời hay không.
Hầu như luôn là lỗi trong mã phía máy chủ, cấu hình sai hoặc sự cố treo, chứ không phải do người truy cập. Việc sửa phải đến từ chủ web hoặc quản trị viên của trang.
Xem mã trạng thái mà một trang trả về
Lỗi 500 trông như thế nào
Nội dung hiển thị tùy thuộc vào máy chủ và ứng dụng:
- 500 Internal Server Error — dòng trạng thái chuẩn
- 500 Internal Server Error kèm chữ "nginx" bên dưới — trang lỗi riêng của nginx
- The server encountered an internal error or misconfiguration and was unable to complete your request. — trang mặc định của Apache
- Đã có một lỗi nghiêm trọng trên trang web của bạn. — trang lỗi nghiêm trọng của WordPress ở bản tiếng Việt (tiếng Anh: "There has been a critical error on this website.")
- HTTP Error 500.19 - Internal Server Error — IIS, trong đó số sau dấu chấm là lý do (500.19: dữ liệu cấu hình không hợp lệ)
- Trang này hiện không hoạt động · example.com hiện không thể xử lý yêu cầu này. · HTTP ERROR 500 — Chrome, khi phản hồi 500 không có trang riêng
- Request failed with status code 500 — Axios và các đoạn mã JavaScript khác gọi API
- 500. That's an error. — trang lỗi riêng của Google
Lỗi 500 Internal Server Error trên nginx
Phần lớn thời gian nginx chỉ chuyển tiếp lỗi 500 do ứng dụng phía sau nó trả về (PHP-FPM, Node.js, Python); với PHP-FPM, thông báo lỗi của chính PHP rơi vào nhật ký của nginx. nginx cũng tự tạo lỗi 500 trong một vài trường hợp. Những dòng cần tìm trong nhật ký lỗi:
| Dòng trong nhật ký lỗi nginx | Ý nghĩa |
|---|---|
| FastCGI sent in stderr: "PHP message: PHP Fatal error: …" | PHP bị sập; thông báo nêu tệp và dòng lỗi (lỗi của PHP-FPM rơi vào nhật ký của nginx) |
| rewrite or internal redirection cycle while internally redirecting to … | Các quy tắc try_files hoặc rewrite quay vòng về chính chúng bên trong nginx, thường do một đường dẫn dự phòng như /index.html không tồn tại (vòng lặp mà trình duyệt đi theo sẽ hiện ERR_TOO_MANY_REDIRECTS) |
| open() "/etc/nginx/.htpasswd" failed (13: Permission denied) | nginx không đọc được tệp mật khẩu auth_basic (tệp bị thiếu thì trả về 403) |
| pwritev() "/var/lib/nginx/body/…" failed (28: No space left on device) | nginx không thể đệm một bản tải lên hay một yêu cầu POST lớn xuống đĩa: đĩa đầy hoặc thư mục tạm mà nó không ghi được |
| (không có gì cho yêu cầu đó) | Một ứng dụng Node.js hoặc Python đã trả về lỗi 500 và nginx chuyển tiếp nó: hãy đọc nhật ký của chính ứng dụng đó |
# What did nginx log?
sudo tail -n 50 /var/log/nginx/error.log
# Look for loops in the loaded config
sudo nginx -T | grep -nE 'try_files|rewrite'(Nguồn: mã nguồn của nginx; backend bị sập hoặc quá tải cho ra 502 hoặc 504, không phải 500.)
Nguyên nhân phổ biến của lỗi HTTP 500
Lỗi 500 có thể đến từ hàng chục vấn đề phía máy chủ. Những nguyên nhân phổ biến:
- Tệp .htaccess bị hỏng — một chỉ thị không hợp lệ hoặc một RewriteRule sai khiến Apache trả về 500 cho thư mục đó và mọi thứ bên dưới.
- Lỗi nghiêm trọng của PHP — lỗi cú pháp, ngoại lệ không được bắt hoặc lời gọi hàm chưa định nghĩa làm dừng script.
- Giới hạn bộ nhớ hoặc thời gian của PHP — script vượt quá
memory_limit(mặc định 128M) hoặcmax_execution_time(30 giây) sẽ bị dừng. - Dòng
php_valuetrên máy chủ dùng PHP-FPM — chúng chỉ hoạt động với mod_php của Apache; dưới PHP-FPM, Apache từ chối chúng bằng lỗi 500. - Quyền truy cập tệp sai — PHP không đọc được tệp mà nó include, hoặc một host dùng suPHP/suEXEC từ chối tệp mà ai cũng ghi được (777). (Tệp mà chính máy chủ web không đọc được thì cho ra 403.)
- Plugin hoặc theme — một tiện ích mở rộng WordPress, Joomla hay Drupal mới cài hoặc vừa cập nhật làm sập cả trang.
- Lỗi kết nối cơ sở dữ liệu — sai thông tin đăng nhập, máy chủ cơ sở dữ liệu đã dừng hoặc có quá nhiều kết nối.
- Tệp lõi bị hỏng — sau một lần cập nhật thất bại hoặc tải lên bị gián đoạn.
- Đĩa đầy — máy chủ không ghi được nhật ký, phiên làm việc hay tệp tạm.
- Nguyên nhân riêng của nginx — vòng lặp rewrite, tệp mật khẩu không đọc được, hoặc việc ghi tệp tạm thất bại (thường do đĩa đầy); xem phần nginx ở trên.
Cách khắc phục lỗi 500 (dành cho người truy cập)
Nếu bạn thấy lỗi 500 trên trang web của người khác, vấn đề nằm ở phía máy chủ — không phải của bạn. Tuy nhiên, có một vài điều bạn có thể thử trước khi bỏ cuộc.
- Tải lại một lần sau một phút (F5, hoặc Cmd+R trên Mac). Nhiều lỗi 500 chỉ kéo dài trong lúc triển khai hoặc khởi động lại.
- Kiểm tra xem web có sập với mọi người không — Kiểm tra web sập mở trang từ 11 nơi, còn Kiểm tra HTTP Header cho thấy chính xác mã trạng thái mà máy chủ của chúng tôi nhận được.
- Xóa cookie của trang, hoặc thử cửa sổ riêng tư. Một cookie phiên bị hỏng có thể khiến một số ứng dụng lỗi ở mọi trang, chỉ với riêng bạn.
- Thử lại sau — việc sửa nằm ở phía máy chủ, nên hãy cho chủ web thời gian.
- Báo cho chủ web nếu lỗi kéo dài hàng giờ, kèm địa chỉ trang và thời điểm xảy ra.
Cách 1: kiểm tra nhật ký lỗi máy chủ
Nhật ký lỗi là công cụ debug quan trọng nhất cho lỗi 500. Chúng cho bạn biết chính xác điều gì đã xảy ra sai, bao gồm đường dẫn tệp, số dòng và thông báo lỗi. Luôn kiểm tra nhật ký trước khi thử bất kỳ điều gì khác.
# Apache (PHP errors appear here too, as "AH01071: Got error 'PHP message: …'")
sudo tail -n 100 /var/log/apache2/error.log # Debian/Ubuntu
sudo tail -n 100 /var/log/httpd/error_log # RHEL/Alma/Rocky
# nginx (PHP errors appear here as "FastCGI sent in stderr")
sudo tail -n 100 /var/log/nginx/error.log
# PHP errors on RHEL-family PHP-FPM
sudo tail -n 100 /var/log/php-fpm/www-error.log
# PHP-FPM process log (pool restarts, pm.max_children)
sudo tail -n 100 /var/log/php8.3-fpm.log # Debian/Ubuntu
# WordPress debug log (with WP_DEBUG_LOG on)
tail -n 100 /path/to/wordpress/wp-content/debug.logCách 2: kiểm tra và sửa .htaccess
Tệp .htaccess bị hỏng là nguyên nhân kinh điển của lỗi 500 trên Apache: một lỗi gõ sai, một chỉ thị mà máy chủ không hỗ trợ hoặc một RewriteRule sai có thể làm sập cả thư mục. Nhật ký lỗi của Apache nêu tên tệp .htaccess và chỉ thị sai, ví dụ Invalid command 'php_value', perhaps misspelled or defined by a module not included in the server configuration.
Cách thử nhanh nhất là tạm đổi tên tệp. Nếu sau khi đổi tên mà trang tải được, thủ phạm chính là .htaccess.
# Rename to disable .htaccess
mv .htaccess .htaccess_backup
# If site loads, regenerate a clean .htaccess
# For WordPress, go to Settings > Permalinks and click SaveCách 3: sửa quyền truy cập tệp
Quyền truy cập gây ra lỗi 500 khi PHP không đọc được tệp mà nó include, hoặc trên các host suPHP/suEXEC từ chối tệp mà ai cũng ghi được. Thiết lập thông thường là 644 cho tệp và 755 cho thư mục. Đừng bao giờ dùng 777: đó là rủi ro bảo mật, và trên host suEXEC/suPHP, riêng nó đã gây ra lỗi 500.
# Set correct directory permissions
find /path/to/webroot -type d -exec chmod 755 {} \;
# Set correct file permissions
find /path/to/webroot -type f -exec chmod 644 {} \;
# WordPress wp-config.php (extra security; 440 only if the PHP user owns the file or is in its group)
chmod 440 wp-config.phpCách 4: tăng giới hạn bộ nhớ và thời gian thực thi PHP
PHP dừng các script vượt quá giới hạn bộ nhớ hoặc thời gian thực thi tối đa, và khách truy cập nhận lỗi 500. Giá trị mặc định, 128M bộ nhớ và 30 giây, thường quá thấp với các trang nặng.
Hãy tăng chúng ở nơi máy chủ của bạn đọc cấu hình. Với PHP-FPM, sửa php.ini của FPM (ví dụ /etc/php/8.3/fpm/php.ini) rồi reload php-fpm; thay đổi trong .user.ini có thể mất tới 5 phút mới có hiệu lực.
# Option 1: php.ini (best)
memory_limit = 256M
max_execution_time = 300
# Option 2: .htaccess (Apache with mod_php only; under PHP-FPM these lines cause a 500)
php_value memory_limit 256M
php_value max_execution_time 300
# Option 3: .user.ini (PHP-FPM and other FastCGI setups)
memory_limit = 256M
# Option 4: wp-config.php (WordPress)
define( 'WP_MEMORY_LIMIT', '256M' );Cách 5: tắt plugin và theme (CMS)
Nếu bạn đang chạy WordPress, Joomla hoặc CMS khác, plugin hoặc theme bị lỗi là một trong những nguyên nhân phổ biến nhất gây lỗi 500. Cách kiểm tra nhanh nhất là tắt tất cả plugin cùng lúc, sau đó bật lại từng cái một.
# Disable all WordPress plugins (via the file system)
cd /path/to/wordpress/wp-content
mv plugins plugins_disabled
# Or with WP-CLI, without loading the plugin that crashes the site
wp plugin deactivate --all --skip-plugins --skip-themes
# Switch to a default theme (installs it if it was deleted)
wp theme install twentytwentyfive --activate --skip-plugins --skip-themes
# Check WordPress's own files, and reinstall them without touching wp-content
wp core verify-checksums
wp core download --skip-content --forceCách 6: kiểm tra kết nối và sửa chữa cơ sở dữ liệu
Lỗi 500 có thể xảy ra khi ứng dụng không thể kết nối đến cơ sở dữ liệu. Điều này xảy ra khi thông tin đăng nhập sai, máy chủ cơ sở dữ liệu bị sập hoặc các bảng bị hỏng.
Trước tiên hãy xác minh thông tin đăng nhập cơ sở dữ liệu trong tệp cấu hình (wp-config.php cho WordPress, .env cho Laravel). Sau đó kiểm tra kết nối và sửa chữa các bảng bị hỏng nếu cần.
# Test the MySQL connection
mysql -u username -p -h localhost database_name -e "SELECT 1;"
# Check tables (REPAIR only fixes MyISAM/Aria tables; for InnoDB, restore from a backup)
mysqlcheck -u username -p --check --auto-repair database_name
# WordPress: add to wp-config.php, then visit /wp-admin/maint/repair.php
# Remove this line when you're done: the repair page needs no login.
define( 'WP_ALLOW_REPAIR', true );Cách 7: kiểm tra tính tương thích phiên bản PHP
Mã viết cho một phiên bản PHP cũ hơn có thể gặp lỗi nghiêm trọng trên phiên bản mới hơn (hoặc ngược lại). Sau khi nâng cấp PHP, thủ phạm thường là các hàm đã bị gỡ bỏ và hành vi đã thay đổi; hàm bị đánh dấu lỗi thời (deprecated) chỉ gây ra thông báo.
Hãy kiểm tra trang của bạn thực sự chạy phiên bản PHP nào. Lệnh php -v trên dòng lệnh có thể hiện một PHP khác với PHP mà trang dùng, nên hãy xem cả trong bảng điều khiển hosting hoặc một trang phpinfo() tạm thời:
# Command-line PHP (may differ from the site's PHP-FPM)
php -v
# PHP-FPM versions installed (Debian/Ubuntu)
ls /etc/php/
# Modules loaded in the command-line PHP
php -mCách 8: kiểm tra dung lượng ổ đĩa
Khi máy chủ hết dung lượng đĩa (hoặc hết inode), nó không thể ghi nhật ký, tệp tạm hay dữ liệu phiên, và các yêu cầu bắt đầu thất bại với lỗi 500.
# Check disk space, and inodes (they can run out too)
df -h
df -i
# What's using the space?
sudo du -sh /var/log /tmp
# Free space without deleting the log you're reading
sudo find /var/log -name "*.gz" -mtime +14 -delete
sudo journalctl --vacuum-size=200MSo sánh 500 với 502, 503 và 504: sự khác biệt là gì?
Điểm khác biệt chính: 500 = máy chủ tự hỏng bên trong. 502 = proxy nhận về dữ liệu vô nghĩa từ backend. 503 = máy chủ còn sống nhưng đang bận. 504 = proxy ngừng chờ. Bạn có thể kiểm tra chính xác mã trạng thái mà máy chủ trả về bằng công cụ Kiểm tra HTTP Header của DNS Robot.
Khi lỗi là 502, ứng dụng có thể vẫn ổn và sự cố nằm giữa proxy và ứng dụng. Hướng dẫn về 502 Bad Gateway của chúng tôi nói về trường hợp đó.
| Mã lỗi | Tên | Ý nghĩa | Nguyên nhân phổ biến |
|---|---|---|---|
| 500 | Internal Server Error | Máy chủ hoặc ứng dụng gặp lỗi bất ngờ, chẳng hạn một ngoại lệ không được xử lý hoặc cấu hình sai | Lỗi PHP nghiêm trọng, .htaccess hỏng, hết bộ nhớ |
| 502 | Bad Gateway | Proxy nhận phản hồi không hợp lệ từ backend | PHP-FPM crash, backend không chạy, socket bị đóng |
| 503 | Service Unavailable | Máy chủ tạm thời bị quá tải hoặc đang bảo trì | Đột biến lưu lượng, bảo trì có kế hoạch, giới hạn tài nguyên |
| 504 | Gateway Timeout | Proxy hết thời gian chờ đợi backend phản hồi | Truy vấn cơ sở dữ liệu chậm, script chạy lâu, upstream không phản hồi |
Lỗi 500 ảnh hưởng đến SEO như thế nào
Chính tài liệu của Google mô tả điều gì xảy ra (tài liệu về trình thu thập dữ liệu của Google):
- Việc thu thập dữ liệu chậm lại. Khi gặp lỗi 5xx, Google giảm tốc độ thu thập dữ liệu của trang, tương ứng với số URL trả về lỗi.
- Ban đầu các trang đã lập chỉ mục vẫn còn. Những URL đã được lập chỉ mục được giữ lại một thời gian, nhưng URL liên tục trả về lỗi máy chủ sẽ bị loại bỏ.
- Phục hồi diễn ra dần dần. Khi máy chủ trả lời lại bằng 2xx, Google tăng dần việc thu thập dữ liệu.
- Dùng 503 cho thời gian ngừng hoạt động có kế hoạch kéo dài một hai ngày, kèm header Retry-After (Google), để việc ngừng hoạt động được hiểu là tạm thời (hướng dẫn về 503).
Cách phòng ngừa lỗi 500
Phòng bệnh hơn chữa bệnh. Hãy làm theo các phương pháp tốt nhất dưới đây để giảm thiểu rủi ro lỗi 500 trên website của bạn.
- Thiết lập giám sát uptime — Sử dụng các công cụ như UptimeRobot hoặc Pingdom để kiểm tra trang web mỗi 1-5 phút. Nhận cảnh báo ngay khi lỗi 500 xảy ra.
- Luôn kiểm tra thay đổi trên staging — Không bao giờ triển khai trực tiếp lên production. Kiểm tra cập nhật plugin, nâng cấp PHP và thay đổi cấu hình trên môi trường staging trước.
- Sử dụng kiểm soát phiên bản (Git) — Commit mọi thay đổi để bạn có thể hoàn tác triển khai lỗi ngay lập tức chỉ với một lệnh.
- Xử lý lỗi đúng cách — Bọc các truy vấn cơ sở dữ liệu và lời gọi API trong khối try-catch. Ghi lại đầy đủ stack trace phía máy chủ cho mọi lỗi.
- Giám sát dung lượng ổ đĩa và tài nguyên máy chủ — Thiết lập cảnh báo khi dung lượng ổ đĩa vượt 80%, CPU cao và áp lực bộ nhớ.
- Cập nhật phần mềm thường xuyên — Phiên bản CMS, plugin và phần mềm máy chủ lỗi thời chứa các bug đã biết gây crash.
- Duy trì sao lưu tự động — Kiểm tra quy trình khôi phục thường xuyên. Bản sao lưu chưa bao giờ kiểm tra thì không phải là bản sao lưu.
- Đặt giới hạn PHP phù hợp — Cấu hình memory_limit và max_execution_time dựa trên khối lượng công việc thực tế, không phải giá trị mặc định.
- Sử dụng CI/CD pipeline — Tự động hóa kiểm tra trước khi triển khai. Nếu kiểm tra lỗi, triển khai sẽ không được thực hiện.
Xem mã trạng thái mà một trang trả về
Công cụ Kiểm tra HTTP Header miễn phí của DNS Robot gửi yêu cầu tới bất kỳ URL nào từ máy chủ của chúng tôi và hiển thị chính xác mã trạng thái cùng các header phản hồi, để bạn xác nhận lỗi 500 và biết máy chủ nào đã gửi nó.
Nguồn
Câu hỏi thường gặp
Lỗi HTTP 500 có nghĩa là gì?
RFC 9110 định nghĩa lỗi 500 Internal Server Error như thế nào?
Làm sao để sửa lỗi 500 internal server error?
Lỗi 500 có phải lỗi của người truy cập không?
Lỗi 500 Internal Server Error trên nginx nghĩa là gì?
Sự khác biệt giữa lỗi 500 và 503 là gì?
Lỗi 500 có thể ảnh hưởng đến thứ hạng Google không?
Nguyên nhân gây lỗi 500 trên WordPress là gì?
"Request failed with status code 500" nghĩa là gì?
Tại sao tôi chỉ gặp lỗi 500 trên một số trang?
Bài viết liên quan
Công cụ liên quan
Kiểm tra HTTP Header
Phân tích header phản hồi HTTP và chấm điểm header bảo mật
Kiểm Tra Website Sập
Web sập với mọi người hay chỉ mình bạn? Kiểm tra bất kỳ website nào từ 11 địa điểm và từ kết nối của bạn, kèm ảnh chụp màn hình trực tiếp
Kiểm tra Redirect
Kiểm tra chuyển hướng URL, chuỗi chuyển hướng và mã trạng thái HTTP cho SEO
Tra Cứu DNS
Mọi bản ghi DNS từ máy chủ của chính tên miền, cạnh bộ nhớ đệm của Google và Cloudflare



