Лак / NGINX ограничения по времени - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь ввести ограничения времени и географического местоположения для нашей CMS. Ниже показано, как выглядит текущая настройка

  • Nginx (Порт: 443): Для завершения SSL и манипулирования URL
  • Varnish (Порт: 80): Для кэширования динамического содержимого из бэкэнда
  • Apache, PHP, MySQL: Пользовательская CMS работает в этом стеке

Требование заключается в том, что в течение определенного периода времени трафик из определенной страны не может получить доступ к определенному URL / категории, но трафик из остального мира может получить доступ к тому же URL / категории без каких-либо ограничений.

Часть гео-локации не выглядит устрашающей, но я не смог ничего найти об ограничении трафика в зависимости от времени.

Конечно, я могу настроить две конфигурации лака или nginx, одну с ограничениями, другую без, чтобы задание cron заменяло физические файлы, основываясь на том, когда я хочу что-то сделать, но я надеялся на более чистое решение.

Я понимаю, что все это может быть обработано с помощью PHP, но я не могу удалить Varnish из стека, мне пришлось бы добавить 5-6 серверов, чтобы справиться с нагрузкой, и это увеличит стоимость, которую я не могу оправдать.

Помощь

1 Ответ

0 голосов
/ 26 апреля 2018

вы можете использовать now в лаке, и сделать регулярное выражение для даты в лаке, чтобы получить 403 или что-то еще

- это пример varnishtest примера использования того, как использовать now

varnishtest "Time Gate"

server s1 {
       rxreq
       txresp

} -start

varnish v1 -vcl+backend {
    import std;

    sub vcl_recv {
        //now is in RFC format: Thu, 26 Apr 2018 08:40:22 GMT
        //set it in a "ghost header" to convert it to a STRING otherwise it is a TIME
        // and regex won't work
        set req.http.now_string = now;

        //Check the hour
        if(req.http.now_string ~ "^.* [0-9]{4} 08") {
              // Do stuff when its 08:xx
        } else {
             // Otherwise do something else.
        }


    }

    sub vcl_deliver {
        set resp.http.x-forwarded-for = client.ip;
        set resp.http.now_string = req.http.now_string;
    }
} -start

client c1 {
    txreq  -url "/1"
    rxresp
    expect resp.http.now_string ~  "2018"


} -run

о геозащите вы также можете сделать это лаком с https://github.com/varnish/libvmod-geoip этим vmod.(лично не проверял)

...