Nginx 前端和 wp-admin/admin-ajax.php:调试 500 错误

Nginx 前端和 wp-admin/admin-ajax.php:调试 500 错误

大约每小时我都会在 wp-admin 和 wp-admin/admin-ajax.php 上收到 500 个错误。我运行 DSO + APC + Nginx (admin) + Apache。Apache 在端口 8080 上运行,Nginx 在 80 上运行。

我目前所做的:

  1. 我开始研究 debug.log 并处理时不时发生的一些致命崩溃
  2. 我添加了,0 */1 * * * /usr/sbin/tmpwatch -am 1 /tmp/nginx_client因为我的日志表明 tmp inode 已全部用完并导致 nginx 崩溃
  3. 检查了其他问题,并将 PHP memory_limit 提高到 128M
  4. 由于某种原因,我的 wp-admin 文件夹被分配给用户 1001,我将其改回 nobody:nobody (nginx 当前以 nobody 身份运行)

我对 Nginx 前端使用了以下 vhosts 配置:

# BEGIN W3TC Page Cache cache
location ~ /wp-content/cache/page_enhanced.*html$ {
    add_header Vary "Accept-Encoding, Cookie";
    add_header Pragma "no-cache";
    add_header Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate";
}
location ~ /wp-content/cache/page_enhanced.*gzip$ {
    gzip off;
    types {}
    default_type text/html;
    add_header Vary "Accept-Encoding, Cookie";
    add_header Pragma "no-cache";
    add_header Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate";
    add_header Content-Encoding gzip;
}
# END W3TC Page Cache cache
# BEGIN W3TC Page Cache core
#set $w3tc_rewrite 1;
set $w3tc_rewrite "";
if ($request_method = POST) {
    set $w3tc_rewrite 0;
}
if ($query_string != "") {
    set $w3tc_rewrite 0;
}
if ($http_cookie ~* "(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle)") {
    set $w3tc_rewrite 0;
}
if ($http_user_agent ~* "(W3\ Total\ Cache/0\.9\.4)") {
    set $w3tc_rewrite 0;
}
if ($http_cookie ~* "(w3tc_preview)") {
    set $w3tc_rewrite _preview;
}
set $w3tc_enc "";
if ($http_accept_encoding ~ gzip) {
    set $w3tc_enc _gzip;
}
set $w3tc_ext "";
if (-f "$document_root/wp-content/cache/page_enhanced/$http_host/$request_uri/_index$w3tc_rewrite.html$w3tc_enc") {
    set $w3tc_ext .html;
}
if (-f "$document_root/wp-content/cache/page_enhanced/$http_host/$request_uri/_index$w3tc_rewrite.xml$w3tc_enc") {
    set $w3tc_ext .xml;
}
if ($w3tc_ext = "") {
  set $w3tc_rewrite 0;
}
#if ($w3tc_rewrite = 1) {
if ($w3tc_rewrite != 0) {
    rewrite .* "/wp-content/cache/page_enhanced/$http_host/$request_uri/_index$w3tc_rewrite$w3tc_ext$w3tc_enc" last;
}
# END W3TC Page Cache core

我排除了 wp-admin-这里可能是罪魁祸首?

 # Don't cache uris containing the following segments
    if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-location$
        set $cache_uri 'null cache';
    }


 location / {
          error_page 405 = @backend;
          add_header X-Cache "HIT from Backend";
          proxy_pass http://backend:8080;
          include proxy.inc;
          include microcache.inc;
          }

临时解决方法是重新启动 nginx。我正在使用一个简单的 nginx.conf。

答案1

尽管我未能精确地缩小范围,但我想在这里做出有根据的猜测。

最有可能帮助我解决这个问题的事情如下:

  • 1) 将 PHP 配置和 wp-config.php 中的 memory_limit 提高到 256。您甚至可以尝试 512,尽管这可能会导致其他问题。我在这里的假设是,我的一个 MySQL 查询非常耗费资源,我尚未对其进行优化,并且它可能导致了这个问题,这从查看 /mysql/slow.log 中可以看出(您可能需要先在 /etc/my.cnf 中打开慢速 SQL 日志记录
  • 2)打开 debug.log 并调试任何严重错误是理所当然的
  • 3)解决 Nginx IP 冲突,检查你的虚拟主机
  • 4) 在 mod_security 中将 admin-ajax.php 列入白名单(删除一些规则)你可以谷歌搜索可能导致问题的各种规则,但我发现它不太可能抛出 502。如果是 modsec,它会抛出 403 或 40x

如果我在接下来的几天再次遇到此问题或者找到根本原因,我将再次更新

相关内容