一次很奇葩的 Nginx 500 Internal Server Error

2021-02-20 草根博客站長有話說

今天明月碰到了一次 Nginx 的「500 Internal Server Error」故障,依慣例必須發文水一篇,算是一次記錄吧!最後排查出來的故障原因雖然很奇葩但也算是一次經驗積累了,所以也可以當做一次經驗分享給大家。

今天下午抽時間研究了一下 Nginx 的 Lua 模塊 ngx_lua_waf 防火牆的規則文件,想著看看在不使用 CSP 規則的情況下完全依賴 ngx_lua_waf 提升一下屏蔽效能,理論上這些操作是不會影響到 Nginx 的正常運行的,並且每次需要重啟 Nginx 服務的時候都要通過nginx -t命令來檢查驗證配置無誤的(有關 ngx_lua_waf 可參考『LNMP 1.5 測試版體驗之 ngx_lua_waf 初體驗!』一文)。沒有想到就是這個驗證配置無誤的疏忽造成了伺服器長達半個小時的「500 Internal Server Error」錯誤狀態。

剛開始明月都還沒有發覺出現 500 錯誤了,還在 QQ 群好友的提醒下才知道的,這時候發現這個伺服器上所有的站點都是「500 Internal Server Error」錯誤狀態了,無論是重啟 Nginx、重啟 LNMP 甚至重啟伺服器後重新編譯 Nginx 都無濟於事,所有的站點都是「500 Internal Server Error」錯誤狀態,無論是 WordPress、Typecho 還是 Hexo 博客都是這樣,很明顯問題出在 Nginx 上,可以是 Nginx 的配置以及站點配置文件都排查了沒有任何問題,Nginx 的 error.log 裡也是沒有任何有價值的提示線索。理論上來說「500 Internal Server Error」錯誤狀態就是指 Web 伺服器內部錯誤,所以 Nginx 這個鍋必須背了,但就是不知道問題出在哪裡了?

說實話,隨著時間的推移明月有點兒「急」了,眼看快下班了都,故障原因竟然都找不到,鬱悶呀!強迫自己回憶了一下自己在控制臺終端的最後一次修改配置的文件應該是編輯保存了一下/usr/local/nginx/conf/waf/waf.lua 文件,雖然記得是沒有動過任何字符,但最後用 Vim 打開這個文件的時候是使用:wq退出的 Vim 的,難道問題出在這裡?Nginx 的 nginx.conf 文件裡倒是確實有引用到這個文件,還是通配符式的引用,在『LNMP 1.5 測試版體驗之 ngx_lua_waf 初體驗!』一文裡可以知道這是為了給 Nginx 部署 ngx_lua_waf 防火牆的,於是打開/usr/local/nginx/conf/waf/waf.lua 文件仔細的查看下發現是Vim 操作的時候不小心碰到回車鍵讓首行的"local ……」弄成「ocal ……」了,修復這個誤操作保存退出,Nginx 的「500 Internal Server Error」消失了,所有的站點都恢復正常了。

問題解決了,事後分析竟然是 Nginx 並不支持 Lua 模塊.lua 文件的語法錯誤的輸出提示,nginx -t檢查更是不會涉及到引用的.lua 文件,自然也就不會提示配置文件有問題了,可以說這個「坑」要不是明月回憶起最後的操作還真的不易發現,唉!真是一次小小的失誤就會造成一個不小的「坑」呀!

謝謝支持!

相關焦點

  • k8s Ingress nginx錯誤頁面的深度定製
    引文參考:https://www.netinbag.com/cn/internet/what-are-error-pages.html1、錯誤頁面狀態碼網站運行過程中難免出現問題,為用戶拋出一個錯誤頁面,常見的錯誤頁面包含403、404、500、502、503、504狀態碼,這些常見的錯誤頁面狀態碼的含義如下500 Internal
  • 後端服務(nginx部署)的一次排查經歷
    本文介紹狼廠同事一次解決服務端接口報 http status 500錯誤的過程。
  • .htaccess導致頁面500錯誤,Internal Server Error錯誤的解決辦法
    Required   403 Forbidden   404 Not Found   405 Method Not Allowed   408 Request Timed Out   411 Content Length Required   412 Precondition Failed   413 Request Entity Too Long
  • nginx的簡單使用
    設置主機域名root設置主機站點根目錄地址index設置默認索引文件error_page自定義錯誤頁面設置用戶和組通過ps來查看主進程和工作進程的用戶權限ps aux | grep nginx設置用戶和組
  • 【Nginx】Nginx部署實戰——靜態文件+反向代理+均衡負載+Https+Websocket
    言歸正常,來看一下nginx的相關配置如何滿足我們的日常需求吧。這裡有兩點需要注意通過choco安裝nginx,會配套安裝NSSM,這是個好東西,可以把nginx註冊成windows服務,相當於linux下的Supervisor和PM2通過choco安裝nginx,在最後一次需要您同意選擇y[Yes]之前,注意回寫的內容是,他將會執行C:\ProgramData\chocolatey
  • Nginx 這個功能厲害了!
    還可以這樣停止nginx初始配置文件長這樣:user  nginx;worker_processes  1;error_log  /var/log/nginx/error.log warn;pid        /var/run/nginx.pid;events {    worker_connections  1024;
  • 從「簡書」平臺的伺服器故障,談Nginx An error occurred異常~
    If you are the system administrator of this resource then you should check theerror log for details.Faithfully yours, nginx.
  • 十分鐘 - Nginx 入門到上線
    "  nginx pid file: "/usr/local/nginx/logs/nginx.pid"  nginx error log file: "/usr/local/nginx/logs/error.log"  nginx http access log file: "/usr/local/nginx/logs/access.log"  nginx http
  • Linux乾貨 | nginx常見典型故障
    server {    listen 80;    server_name xuliangwei.com;    location / {        proxy_pass http://node;        proxy_next_upstream error timeout http_500 http_502 http_503 http
  • Nginx七層的負載均衡
    X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 500 502 503 504 /50x.html;
  • 使用 Docker 和 Nginx NJS 實現 API 聚合服務(前篇)
    接著我們聲明一份可以讓 Nginx 調用 NJS 的配置文件:load_module modules/ngx_http_js_module.so;user nginx;worker_processes auto;error_log /var/log/nginx/error.log warn;
  • Nginx code 狀態碼說明
    如果nginx有如下配置:upstream app_backup {    server 127.0.0.1:8500 max_fails=3 fail_timeout=5s;    server 127.0.0.1:88 backup;}max_fails=3 說明嘗試3次後,會認為「 server 127.0.0.1:8500」
  • Ansible 實戰與配置Nginx
    @w5 templates]# cat nginx.conf user  nginx;worker_processes  {{ ansible_processor_vcpus }};#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log
  • nginx access_log日誌簡介
    access_log 可以在全局設置,但往往是定義在虛擬主機(server)中的location中。 {server_name ~^(www\.)?錯誤的訪問:cat access.log | awk -F 『^A』 『{if($5 == 500) print $0}』查找當前日誌文件 500 錯誤的數量:cat access.log | awk -F 『^A』 『{if($5 == 500) print $0}』 | wc -l查找某一分鐘內 500 錯誤訪問的數量
  • keepalived+nginx+nfs 實現web集群高可用
    auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;# Load dynamic modules.   include /etc/nginx/conf.d/*.conf;   server {       listen       80 default_server;       listen       [::]:80 default_server;       server_name _;       root
  • Nginx的這些妙用,你肯定有不知道的!
    } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; }}在/mydata/nginx/conf/conf.d文件夾中添加配置文件mall.conf對mall
  • [Q&A] #01: Siteground 網站打開 500 internal Server Error 錯誤問題修復
    昨天有朋友問我了下面的問題:老周,最近一個月網站經常 500internal Server Error,你知道是什麼原因嗎?最終告知的結果是:網站使用的 Siteground 主機企業郵箱,但在 foxmail 配置時定時收取時間太短,導致生成了很多 IDLE 進程,導致網站出現 500 錯誤。
  • Nginx入門必知
    /sbin/nginx /conf/nginx.conf /logs/access.log /logs/error.log        proxy_busy_buffers_size 128k;        location / {             proxy_pass       http://nginx.org/;             proxy_send_timeout 60;             proxy_read_timeout 60;        }        error_page
  • Nginx 反向代理簡單使用
    /configure: error: the HTTP cache module requires md5 functionsfrom OpenSSL library. You can either disable the module by using
  • 基於FFmpeg + nginx + flv.js 實現的網頁 (播放) 攝像頭
    安裝帶有rtmp的nginx 地址: nginx-rtmp-module打開conf 下的nginx.conf 進行配置 這裡是我的配置文件內容#usernobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { worker_connections 1024