web-dev-qa-db-ja.com

Varnishの使用時に匿名ユーザーが投票に投票できるようにする

フロントページにユーザーが投票できるようにしたいのですが、匿名ユーザーは常に結果を表示するだけで投票できません。私はこれを修正するために私が考えることができるほとんどすべてを試してみましたが、何も機能しません。

まず、代替ポートを介してWebサーバーに直接アクセスできることを説明します。これを行うと、ログインしていないときに投票が表示されます。匿名ユーザーが投票できることを知っています。

私はESIとDrupal 7 ESIモジュールを使用しました。 ESIタグを介してポーリングブロックが読み込まれています(ブラウザが解析しないため、これを行うと、代替ポートを介して直接アクセスすることは明らかに機能しなくなりましたESIタグ)サイコロはありません。

AJAX Blocksモジュールを使用して、ブロックのロードに遅延を設定しました。ブロックがAJAX経由でロードされていることを確認できるようにしたので、結果が表示されていました。

代替ポートを使用して同じIPアドレスから投票を試みましたが、サーバーが許可しない前に誰かがVarnishを通過して投票したため、代替ポートを介して同じIPアドレスから2回投票することができると思いました。

Sshを介してサーバーにログインし、リンクを使用してサイトを表示しようとしましたが、おそらく他の理由でWebサーバーが結果ページを提供しているのはローカルIPアドレスだと思いましたが、リンクを使用すると投票フォームが表示されます。

DrupalがVarnishがページをリクエストしたときにフォームの代わりに結果を提供する原因となっていることは明らかですが、それは何ですか?!?

5
Jason

https://drupal.org/project/pollanon これにより、匿名ユーザーが投票に複数回投票できるようになります。ここにESIを使用して、ページはキャッシュされたままで、他の部分は動的なままです。

Accepting votes from anonymous users on Drupal polls is complicated when you use caching. By using Edge Side Includes (ESI), you can dynamically load some parts of a Drupal page while caching the rest of it. The addition of the Poll Enhancements module allows multiple anonymous users to vote on polls by using cookies to track who has voted.

Edge Side Includes integration
The ESI module includes two Varnish VCL files (located in the docs directory of the module:

docs/esi_blocks.vcl - custom sub-routines to handle ESI-block integration.
Copy this file to the Varnish config directory, /usr/local/etc/varnish/
docs/default.vcl - example code showing how to include the ESI blocks VCL in your Varnish config. Portions of this should be added to appropriate places your Varnish config file. We'll do it by creating a copy, /usr/local/etc/varnish/default-esi.vcl, that has the portions we want:
include "/usr/local/etc/varnish/esi_blocks.vcl";
sub vcl_recv {
  call esi_block__recv;
}

sub vcl_hash {
  call esi_block__hash;
}

sub vcl_fetch {
  # don't ESI anything with a 3/4 letter extension
  # (e.g. don't try to ESI images, css, etc).
  if (! req.url ~ "\..{3,4}$") {
    esi;
  }

  call esi_block__fetch;
}

Then, edit /usr/local/etc/varnish/drupal.vcl and add a line near the beginning:

include "/usr/local/etc/varnish/default-esi.vcl";
Restart the Varnishcache:

svc -t /service/varnish
With the module enabled in your Drupal site, block configuration pages now have an ESI Settings section with two options: Enable ESI, and a TTL value.

Poll Enhancements
Installing this module allows anonymous users to vote on polls. By using cookies to track who has voted, multiple users who are behind a firewall will be able vote on polls. There's a threshold setting for how many votes from a single IP in a time period. The module also provides a Use AJAH option - I needed to enable this to have the ESI-enabled Poll block work properly.

Configure Varnish to ignore the poll cookie ( pa-[nid] ) by editing the vcl_recv section of /usr/local/etc/varnish/drupal.vcl and inserting a line to remove the cookie:

// Remove pollanon cookies.
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(pa(.*))=[^;]*", "");
Restart Varnish:

svc -t /service/varnish

ソース: http://www.productionmonkeys.net/guides/drupal/performance/pressflow/varnish/varnishing-polls

1
Daniel Waters

この問題の検索に対して、私の新しい(古くからのサンドボックスプロジェクトである)貢献モジュールがどの程度ランク付けされているかを確認したかったので、この質問を見つけました。これが一番上の結果なので、ここにモジュールにリンクします: http://drupal.org/project/cached_poll 。この問題に正確に対処します。

Christianのソリューションに対するモジュールの利点には、投票のあるページが引き続きキャッシュされることが含まれます(投票を正確に表示する場所によっては、これは重要な考慮事項になる場合があります。投票を表示するという理由だけで、フロントページをキャッシュから除外したくない場合があります。 )。このモジュールは、結果を示す投票のバージョンがキャッシュされるのを防ぎますが、投票されていないバージョン(投票フォーム)をキャッシュに入れることを許可します。

ESIはずっと前に研究したものです。少なくとも当時は、それはうまくいきませんでしたし、Drupalでセットアップして信頼性の高い方法で動作させるには複雑すぎました。また、このモジュールの開発にも直接つながりました。

0
Eelke Blok

私はこれが古いことを知っていますが、それはグーグルでよくランク付けされるので、他の人はまだこれにつまずくかもしれません。

ブロックを使用したくない場合(私の場合は数百のポーリングがあり、それぞれのブロックにはオーバーヘッドがあります)、ポーリングが行われているページをキャッシュすることはできません。

/**
 * Implements hook_node_view().
 */
function your_module_node_view($node, $view_mode, $langcode) {
  // Don't cache pages with polls. This needs to be changed to an ESI solution.
  if ($node->type == 'poll') {
    if (in_array($view_mode, array('full', 'default', 'embedded'))) {
      drupal_page_is_cacheable(FALSE);
    }
  }
}

これはページキャッシュを回避するだけです。本番サーバーでのパフォーマンスは依然として良好であり、ポーリングはコンテンツのごく一部を占めているため、他のページはVarnishで引き続きキャッシュされます。

ESI-段落またはフィールドグループでESIを使用しているため、これを使用しています。

0
Christian