바니쉬 + nginx SSL + woocmerce - wc-ajax가 작동하지 않음
그래서 좀 이상한 게 생겼어요.저는 Nginx, Varnish, php-fpm 및 wordpress/woocommerce와 함께 작동하는 데비안 9 머신을 가지고 있습니다.사이트는 기본적으로 작동하지만 카트에 추가하는 데 이상한 문제가 있습니다.
테스트 환경은 https://awstesting.amr.com.au 에서 확인할 수 있습니다.
특히 홈 페이지에는 "수레에 추가" 버튼이 있습니다.페이지 로드 시 두 가지 다른 제품을 추가할 수 있지만 세 번째 제품을 시도하면 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
이제 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);
}
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;
}
}
이 구성에는 백엔드 http 서버와 요청을 vanish로 전달하는 프론트엔드 프록시 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/"
바니쉬 로그:
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"
편집 2:
범인은 바니쉬로 밝혀졌습니다바니쉬를 우회했고 예상대로 사이트가 작동했습니다.vanish에는 헤더 크기에 대한 규칙이 엄격하여 연결이 끊겼다고 가정합니다.
나중에 문제가 해결되면 이 게시물을 업데이트하겠습니다.
이 사이트에서 설명하는 바와 같이
https://www.scalescale.com/tips/nginx/502-bad-gateway-error-using-nginx/
- PHP-FPM이 포함된 Nginx: Apache 예와 마찬가지로 php 데몬이 작동을 멈추거나 요청에 의해 오버로드되었다고 가정해 보겠습니다. 제대로 작동하지 않고 nginx의 모든 php 요청이 제공되지 않으므로 502 Bad Gateway 오류가 나타납니다.어떻게 고치죠?php-fpm 데몬을 다시 시작하고 로그를 확인합니다.
이 의견과 당신의 소멸 구성을 이해하면서 나는 다음과 같은 시나리오를 상상할 수 있었습니다.
Visen Proxy는 Ajax Request를 에 전달합니다.
Nginx 웹 서버는 그 자체가 그것을 물려주고 싶어합니다.
PHP는 그러나 WordPress에서 처리하기 전의 Requests로 여전히 바쁜 상태입니다.
웹서 Nginx합니다.502 Bad Gateway
바니쉬 캐시 를 비활성화하고 이를 사용하지 않고 워드프레스 사이트를 운영하여 오류 가 이슈 워드프레스 어플리케이션 인지 바니쉬 캐시 인지 확인하는 것이 좋습니다
또한 로그에 요청 처리 시간을 표시합니다.
또한 Nginx 로그가 Varnish 로그와 타임스탬프가 일치하지 않는 것을 확인할 수 있습니다.
Nginx Activity 로그를 보고 어떤 요청이 실제로 전달되었는지, 웹 서버에서 어떤 응답이 있는지 확인하는 것은 매우 흥미로운 일입니다.
설명서에서 설명한 바와 같이:
://
언급URL : https://stackoverflow.com/questions/50981810/varnish-nginx-ssl-woocommerce-wc-ajax-not-behaving
'IT' 카테고리의 다른 글
MySQL: ALTER 무시 테이블 고유 추가, 무엇이 잘릴까요? (0) | 2023.10.10 |
---|---|
XSD: 강력한 형식의 "단순한" 요소에 속성 추가 (0) | 2023.10.10 |
HTTP 요청에서 각도 상대 경로 (0) | 2023.10.10 |
Spring Boot + Springbox swagger error (0) | 2023.10.10 |
null >= 0 & & null <= 0>인데 null == 0이 아닌 이유는 무엇입니까? (0) | 2023.10.10 |