Varnish + nginx ssl + woocommerce - wc-ajax表现不佳

Mik*_*ike 6 wordpress nginx varnish varnish-vcl woocommerce

所以我有点奇怪.我有一台运行Nginx,Varnish,php-fpm和wordpress/woocommerce的debian 9机器.该网站基本上有效,但我有一些奇怪的问题,添加到购物车.

测试环境在https://awstesting.amr.com.au上

具体来说,在主页上有"添加到购物车"按钮.在页面加载时,您可以添加2个不同的产品,但是如果您尝试使用第3个产品,它将使用502的ajax调用失败.

这是点击添加到购物车时的常规标题部分:

Request URL: https://awstesting.amr.com.au/?wc-ajax=add_to_cart
Request Method: POST
Status Code: 502 
Remote Address: 13.236.17.191:443
Referrer Policy: no-referrer-when-downgrade
Run Code Online (Sandbox Code Playgroud)

我现在将添加我的Varnish配置:(我正在使用Varnish 5.2)

vcl 4.0;

backend default {
        .host = "127.0.0.1";
        .port = "8080";
        .connect_timeout = 600s;
        .first_byte_timeout = 600s;
        .between_bytes_timeout = 600s;
        .max_connections = 800;
}

acl purger {
        "localhost";
        "127.0.0.1";
}

sub vcl_recv {

    # pipe on weird http methods
    if (req.method !~ "^GET|HEAD|PUT|POST|TRACE|OPTIONS|DELETE$") {
        return(pipe);
    }

    if (req.method != "GET" && req.method != "HEAD") {
        return(pass);
    }

    if (req.http.X-Requested-With == "XMLHttpRequest"){
      return (pass);
    }

    if (client.ip != "127.0.0.1" && req.http.host ~ "awstesting.amr.com.au") {
            set req.http.x-redir = "https://awstesting.amr.com.au" + req.url;
            return(synth(850, ""));
    }

    if (req.method == "PURGE") {
            if (!client.ip ~ purger) {
                   return(synth(405, "This IP is not allowed to send PURGE requests."));
            }
            return (purge);
    }

    set req.http.cookie = regsuball(req.http.cookie, "wp-settings-\d+=[^;]+(; )?", "");
    set req.http.cookie = regsuball(req.http.cookie, "wp-settings-time-\d+=[^;]+(; )?", "");

    # Unset Cookies except for WordPress admin and WooCommerce pages
    if (!(req.url ~ "(wp-login|wp-admin|cart|my-account/*|wc-api*|checkout|addons|logout|lost-password|product/*)")) {
        unset req.http.cookie;
    }

    # Pass through the WooCommerce dynamic pages
    if (req.url ~ "^/(cart|my-account/*|checkout|wc-api/*|addons|logout|lost-password|product/*)") {
        return (pass);
    }

    # Pass through the WooCommerce add to cart
    if (req.url ~ "\?add-to-cart=" ) {
        return (pass);
    }

    # Pass through the WooCommerce API
    if (req.url ~ "\?wc-api=" ) {
        return (pass);
    }

    if (req.http.cookie == "") {
           unset req.http.cookie;
    }

}

sub vcl_synth {
        if (resp.status == 850) {
                set resp.http.Location = req.http.x-redir;
                set resp.status = 302;
                return (deliver);
        }
}

sub vcl_purge {
        set req.method = "GET";
        set req.http.X-Purger = "Purged";
        return (restart);
}



sub vcl_backend_response {

    if (beresp.status >= 300) {
        if (beresp.status == 500) {
            return (retry);
        }
        set beresp.uncacheable = true;
        set beresp.ttl = 2s;
    }
    else
{
        set beresp.ttl = 24h;
        set beresp.grace = 1h;
    }

    if (bereq.url !~ "wp-admin|wp-login|product|cart|checkout|my-account|/?remove_item=|/?wc-ajax=") {
        unset beresp.http.set-cookie;
    }

}

sub vcl_deliver {
        if (req.http.X-Purger) {
                set resp.http.X-Purger = req.http.X-Purger;
        }
}

sub vcl_pipe {
        return (pipe);
}

sub vcl_pass {
        return (fetch);
}
Run Code Online (Sandbox Code Playgroud)

这是我的nginx配置:

server {
   listen  443 ssl spdy http2;
   listen  [::]:443 ssl spdy http2;
   server_name  awstesting.amr.com.au;
   port_in_redirect off;
   server_tokens off;
   more_clear_headers Server;

   ssl on;
   ssl_certificate_key /etc/letsencrypt/keys/0000_key-certbot.pem;
   ssl_certificate /etc/letsencrypt/live/awstesting.amr.com.au/fullchain.pem;

   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECD$
   ssl_prefer_server_ciphers   on;

   ssl_session_cache   shared:SSL:20m;
   ssl_session_timeout 60m;
   ssl_session_tickets off;

   # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
   ssl_dhparam /etc/nginx/ssl/dhparam.pem;

   add_header Strict-Transport-Security "max-age=31536000";
   add_header X-Content-Type-Options nosniff;
   add_header X-Frame-Options "SAMEORIGIN";
   add_header X-XSS-Protection "1; mode=block";

  # enable ocsp stapling (mechanism by which a site can convey certificate revocation information to visitors in a privacy-preserving, scalable manner)
  # http://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/
  resolver 8.8.8.8 8.8.4.4;
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_trusted_certificate /etc/letsencrypt/live/awstesting.amr.com.au/fullchain.pem;

   location / {
     proxy_pass http://127.0.0.1:80;
     proxy_http_version 1.1;
     proxy_read_timeout     300;
     proxy_connect_timeout  300;
     proxy_set_header Connection "";

     proxy_set_header Host $http_host;
     proxy_set_header X-Forwarded-Host $http_host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header X-Forwarded-Proto https;
     proxy_set_header HTTPS "on";

     access_log /var/www/logs/ssl-access.log;
     error_log  /var/www/logs/ssl-error.log notice;

     }
}

server {
   listen 8080;
   listen [::]:8080;
   server_name  awstesting.amr.com.au;
   root /var/www/wordpress;
   index index.php;
   port_in_redirect off;

   location / {
      try_files $uri $uri/ /index.php?$args;
   }

   location ~ \.php$ {
       try_files $uri $document_root$fastcgi_script_name =404;
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       include fastcgi_params;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param HTTPS on;
       fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;


       }
}
Run Code Online (Sandbox Code Playgroud)

此配置具有后端http服务器和将请求传递给varnish的前端代理https.

香港专业教育学院尝试了一些不同的清漆配置,但无济于事.所以我有点迷失了什么.我可以清楚地看到服务器正在返回502,我怀疑这意味着http nginx服务器无法确定将产品添加到购物车的意图.

非常感激任何的帮助.

提前致谢,

麦克风

编辑:

nginx错误日志:

root@ip-172-31-1-180:/var/log/nginx# tail error.log
2018/06/24 23:19:24 [error] 532#532: *4694 FastCGI sent in stderr: "PHP message: product_type was called incorrectly. Product properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::do_wc_ajax, do_action('wc_ajax_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::add_to_cart, apply_filters('woocommerce_add_to_cart_validation'), WP_Hook->apply_filters, WC_Min_Max_Quantities->add_to_cart, WC_Min_Max_Quantities_Addons->is_composite_product, WC_Abstract_Legacy_Product->__get, wc_doing_it_wrong. This message was added in version 3.0.
PHP message: product_type was called incorrectly. Product properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::do_wc_ajax, do_action('wc_ajax_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::add_to_cart, WC_Cart->add_to_cart, do_action('woocommerce_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Cart->calculate_totals, do_action('woocommerce_before_calculate_totals'), WP_Hook->do_action, WP_Hook->apply_filters, check_for_starter_pack, WC_Abstract_Legacy_Product->__get, wc_doing_it_wrong. This message was added in version 3.0.
PHP message: The WC_Cart::get_checkout_url function is deprecated since version 2.5. Replace with wc_get_checkout_url" while reading response header from upstream, client: 127.0.0.1, server: awstesting.amr.com.au, request: "POST /?wc-ajax=add_to_cart HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.1-fpm.sock:", host: "awstesting.amr.com.au", referrer: "https://awstesting.amr.com.au/"
2018/06/24 23:19:26 [error] 532#532: *4694 FastCGI sent in stderr: "PHP message: product_type was called incorrectly. Product properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::do_wc_ajax, do_action('wc_ajax_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::add_to_cart, apply_filters('woocommerce_add_to_cart_validation'), WP_Hook->apply_filters, WC_Min_Max_Quantities->add_to_cart, WC_Min_Max_Quantities_Addons->is_composite_product, WC_Abstract_Legacy_Product->__get, wc_doing_it_wrong. This message was added in version 3.0.
PHP message: product_type was called incorrectly. Product properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::do_wc_ajax, do_action('wc_ajax_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::add_to_cart, WC_Cart->add_to_cart, do_action('woocommerce_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Cart->calculate_totals, do_action('woocommerce_before_calculate_totals'), WP_Hook->do_action, WP_Hook->apply_filters, check_for_starter_pack, WC_Abstract_Legacy_Product->__get, wc_doing_it_wrong. This message was added in version 3.0.
PHP message: product_type was called incorrectly. Product properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::do_wc_ajax, do_action('wc_ajax_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::add_to_cart, WC_Cart->add_to_cart, do_action('woocommerce_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Cart->calculate_totals, do_action('woocommerce_before_calculate_totals'), WP_Hook->do_action, WP_Hook-
2018/06/24 23:19:27 [error] 532#532: *4694 FastCGI sent in stderr: "PHP message: product_type was called incorrectly. Product properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::do_wc_ajax, do_action('wc_ajax_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::add_to_cart, apply_filters('woocommerce_add_to_cart_validation'), WP_Hook->apply_filters, WC_Min_Max_Quantities->add_to_cart, WC_Min_Max_Quantities_Addons->is_composite_product, WC_Abstract_Legacy_Product->__get, wc_doing_it_wrong. This message was added in version 3.0.
PHP message: product_type was called incorrectly. Product properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::do_wc_ajax, do_action('wc_ajax_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::add_to_cart, WC_Cart->add_to_cart, do_action('woocommerce_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Cart->calculate_totals, do_action('woocommerce_before_calculate_totals'), WP_Hook->do_action, WP_Hook->apply_filters, check_for_starter_pack, WC_Abstract_Legacy_Product->__get, wc_doing_it_wrong. This message was added in version 3.0.
PHP message: product_type was called incorrectly. Product properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::do_wc_ajax, do_action('wc_ajax_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::add_to_cart, WC_Cart->add_to_cart, do_action('woocommerce_add_to_cart'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Cart->calculate_totals, do_action('woocommerce_before_calculate_totals'), WP_Hook->do_action, WP_Hook-
2018/06/24 23:19:27 [error] 532#532: *4694 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: awstesting.amr.com.au, request: "POST /?wc-ajax=add_to_cart HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.1-fpm.sock:", host: "awstesting.amr.com.au", referrer: "https://awstesting.amr.com.au/"
Run Code Online (Sandbox Code Playgroud)

清漆日志:

127.0.0.1 - - [27/Jun/2018:01:38:56 +0000] "POST http://awstesting.amr.com.au/wp-admin/admin-ajax.php HTTP/1.1" 502 575 "https://awstesting.amr.com.au/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
127.0.0.1 - - [27/Jun/2018:01:38:58 +0000] "POST http://awstesting.amr.com.au/?wc-ajax=add_to_cart HTTP/1.1" 200 24759 "https://awstesting.amr.com.au/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
127.0.0.1 - - [27/Jun/2018:01:39:01 +0000] "POST http://awstesting.amr.com.au/?wc-ajax=add_to_cart HTTP/1.1" 200 29339 "https://awstesting.amr.com.au/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
127.0.0.1 - - [27/Jun/2018:01:39:08 +0000] "POST http://awstesting.amr.com.au/?wc-ajax=add_to_cart HTTP/1.1" 200 33927 "https://awstesting.amr.com.au/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
127.0.0.1 - - [27/Jun/2018:01:39:10 +0000] "POST http://awstesting.amr.com.au/?wc-ajax=add_to_cart HTTP/1.1" 200 33927 "https://awstesting.amr.com.au/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
127.0.0.1 - - [27/Jun/2018:01:39:12 +0000] "POST http://awstesting.amr.com.au/?wc-ajax=add_to_cart HTTP/1.1" 200 33927 "https://awstesting.amr.com.au/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
127.0.0.1 - - [27/Jun/2018:01:39:13 +0000] "POST http://awstesting.amr.com.au/?wc-ajax=add_to_cart HTTP/1.1" 200 33927 "https://awstesting.amr.com.au/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
127.0.0.1 - - [27/Jun/2018:01:39:18 +0000] "POST http://awstesting.amr.com.au/?wc-ajax=add_to_cart HTTP/1.1" 200 38439 "https://awstesting.amr.com.au/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
127.0.0.1 - - [27/Jun/2018:01:39:19 +0000] "POST http://awstesting.amr.com.au/?wc-ajax=add_to_cart HTTP/1.1" 502 575 "https://awstesting.amr.com.au/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
Run Code Online (Sandbox Code Playgroud)

编辑2:

所以罪魁祸首竟然是清漆.我绕过了清漆,网站表现得如预期的那样.我假设清漆对标题大小有更严格的规则,因此连接断开.

如果我最终解决了这个问题,我将更新这篇文章.

Bod*_*ich 1

正如这些网站所解释的
\n https://www.scalescale.com/tips/nginx/502-bad-gateway-error-using-nginx/

\n\n
\n
    \n
  1. Nginx with PHP-FPM:与 Apache 示例相同,让\xe2\x80\x99s 想象你的 php 守护进程停止工作,或者 get\xe2\x80\x99s 被请求超载,它将无法正常工作\n 并且所有 php 请求来自 nginx 的服务将不会被提供,\n 因此,将会出现 502 Bad Gateway 错误。如何修复它?重新启动\n php-fpm 守护进程并检查日志。
  2. \n
\n
\n\n

了解此评论和您的 Vanish 配置我可以想象一个场景,其中
Vanish 代理将 Ajax 请求传递到
Nginx Web 服务器,Nginx Web 服务器本身希望将其传递给
PHP,但最终仍然忙于处理处理之前的请求他们在 WordPress 中。
\n因此 Nginx Web Server 会报告错误502 Bad Gateway

\n\n

我建议您禁用 Varnish 缓存,并尝试在没有它的情况下操作 WordPress 网站,看看错误是否是 WordPress 应用程序或 Varnish 缓存的问题。
\n还在日志中显示请求的处理时间。

\n\n

我还观察到 Nginx 日志与 Varnish 日志与时间戳不匹配。

\n\n

查看 Nginx 活动日志以了解哪些请求实际被转发以及它们在 Web 服务器中具有哪些响应将是非常有趣的。
\n如文档中所述:
\n https://docs.nginx.com/nginx/admin-guide/monitoring/logging/

\n