繁体   English   中英

清漆未发送PHPSESSID cookie

[英]Varnish not sending PHPSESSID cookie

我在的Apache2 + PHP 5.3服务器之前运行光油3.0。 我的问题是Varnish抛出了许多503 Service Unavailable错误,因此我添加了一种变通方法,例如:

if http_code = 503 and cookie(REDIRECTED) = false
  set-cookie REDIRECTED=true
  header 307 redirect to same page // try again, maybe this time it doesn't fail
else if http_code = 503 and cookie(REDIRECTED) = true
  header 503 // we tried, but the server doesn't want to

这是我所做的主要思想的伪代码草图。 但是,当进行307重定向时,不会发送apache在Set-Cookie标头中发送Set-Cookie 我的主要担心是未发送PHPSESSID cookie。 如果我没有收到503错误并且Varnish不必进行重定向,则一切正常。 有任何想法吗?

希望我能正确理解您的问题。 我真的看不到PHPSESSID与处理503错误有什么关系,但是您根本不需要使用cookie来重试请求。

您可以在Varnish中使用重新启动来完成您想做的事情。 例如,尝试两次该请求,您可以执行以下操作:

sub vcl_error {
    if (obj.status == 503 && req.restarts < 2) {
        return (restart);
    }
}

这应该提供您要寻找的功能,而无需触摸cookie。

这是显而易见的,但无论如何我都会说:您真正应该做的是找出导致503错误的原因。 如果它们不是来自后端,则是由于超时或Varnish配置问题引起的。 密切注意您的Varnish日志中的“ TxStatus c 503”行,并查看请求的情况。

有关503错误的可能原因的更新:

显然,您在POST请求中收到503错误(即,当用户尝试登录时)。 如果在慢速链接上完成发布,或者在完全传递POST主体之前,客户端由于其他原因终止了连接,则可能会发生这种情况。 但是,这不会显示为varnishlog中no error recorded 在任何情况下,您都可能想尝试一下以下方法,看看它是否可以解决您的问题。

对于POST请求,Varnish默认为返回(通过),但这在所有情况下均无法正常工作(有关更多信息,请参见Varnish票证#849 )。

我们选择通过管道传递所有POST请求,并将X-Forwarded-For附加到请求中。 这是相关的VCL:

# PIPE all POST requests

sub vcl_recv {
 if (req.request == "POST") {
   return (pipe);
 }
}

# Set XFF for piped requests

sub vcl_pipe {
  set bereq.http.Connection = "close";
  set bereq.http.X-Forwarded-For = req.http.X-Forwarded-For;
  if (bereq.http.x-forwarded-for) {
    set bereq.http.X-Forwarded-For = bereq.http.X-Forwarded-For + ", " + client.ip;
  } else {
    set bereq.http.X-Forwarded-For = client.ip;
  }
  return (pipe);
}

解决此问题的唯一方法是安装一个名为vmod-headers的清漆模块,该模块允许您将标头附加到其他标头。

之后,我们只是将要设置的cookie附加到来自后端的现有cookie。

默认的vcl不应删除任何cookie,也不应缓存没有缓存头的任何页面。

您从清漆中获得503的原因是因为您的Apache没有及时响应。 如果您希望它更宽容,可以为后端更改以下设置(下面的数值很高):

backend www {
    .host = "www.example.com";
    .port = "http";
    .connect_timeout = 500s;    
    .first_byte_timeout = 500s;
    .between_bytes_timeout =500s;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM