Nginx Microcache Исключения для входа в систему

У меня для сайта есть nginx php-fpm server. Я хотел бы использовать микрокэш для nginx. Сначала все работает нормально. Я получаю "удар" с помощью команды curl. Проблема начинается, когда я пытаюсь войти в систему. Я пробовал все, но не смог решить проблему входа в систему.

Я установил cookie "logged_in" на 10 секунд, а в "cache config" я установил "no-cache" для этого cookie. Предполагается обойти кеширование, пока есть этот файл cookie. Я установил "без кеширования", что является моим логином. Также на моем веб-сайте есть exmple.org/?i=login, поэтому я не понимаю, что происходит, когда я нажимаю кнопку входа: D.

Главный маг кэшируется, но вход в систему возвращается без входа на главную страницу, и после обновления я вошел в систему. . и для выхода из системы он выходит из системы, но после обновления я все еще вошел в систему. Поэтому я понятия не имею, как исправить / обойти процесс входа в систему.

Пожалуйста, помогите мне.

Конфигурация сервера:

    fastcgi_cache_path /usr/share/nginx/cache/fcgi levels=1:2    keys_zone=microcache:32m max_size=1024m inactive=3h;
    fastcgi_cache_key $scheme$host$request_uri$request_method;
    fastcgi_cache_use_stale updating error timeout invalid_header http_500;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
    add_header X-Cache $upstream_cache_status;

    server {
        listen ip:80;
        server_name example.org;
        return 301 $scheme://www.example.org$request_uri;
    }

    server {
        server_name www.example.org;
        listen ip:80;
        root /home/example/public_html;
        index index.html index.htm index.php;
        access_log /var/log/virtualmin/example.org_access_log;
        error_log /var/log/virtualmin/example.org_error_log;
        fastcgi_buffers 16 16k; 
        fastcgi_buffer_size 32k;
        include /etc/nginx/example.d/cache.conf;

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

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_cache  microcache;
            fastcgi_cache_key $scheme$host$request_uri$request_method;
            fastcgi_cache_valid 200 301 302 30s;
            #fastcgi_pass_header Set-Cookie;
            #fastcgi_pass_header Cookie;
            fastcgi_cache_bypass $no_cache;
            fastcgi_no_cache $no_cache;
            fastcgi_pass unix:/run/php/php5.6-fpm_example.sock;
            fastcgi_index index.php;
            include /etc/nginx/example.d/fastcgi.conf;
        }

        location ~* \.(jpg|jpeg|gif|css|png|js|woff|ttf|svg|ico|eot)$ {
            access_log        off;
            log_not_found     off;
            expires           max;
        }

        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }

        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }

        location ~ /\. {
            access_log off;
            log_not_found off; 
            deny all;
        }

        include /etc/nginx/example.d/redirect.conf;
        include /etc/nginx/example.d/rewrite.conf;
    }

Конфигурация кеша (как указано в конфигурации сервера):

#Cache everything by default
set $no_cache 0;

#Don't cache POST requests
if ($request_method = POST)
{
    set $no_cache 1;
}

#Don't cache if the URL contains a query string
if ($query_string != "")
{
    set $no_cache 1;
}

#Don't cache the following URLs
if ($request_uri ~* "/*login*|/*ajax*|/sistem/modul/login.php")
{
    set $no_cache 1;
}

#Don't cache if there is a cookie called PHPSESSID
if ($http_cookie = "Logged_in")
{
    set $no_cache 1;
}

РЕДАКТИРОВАТЬ: Фактически после некоторых проверок я Я почти уверен, что моя проблема связана только с phpsessid. У каждого соединения есть phpsessid и nginx, которые тоже кешируют или полностью игнорируют их с помощью директив. Если я кэширую phpsesid, и если сначала войдите в систему с помощью браузера с учетной записью администратора, у всех будет администратор, зарегистрированный в кеше: Мне нужны соединения, которые phpsessid должны быть защищены.

Это похоже на то, что nginx должен сначала очистить файл cookie phpsessid и отправить php в fastcgi. и возврат этого php с сервера fastcgi nginx должен присоединить тот же phpsessid, который был очищен вначале. Или это похоже на кеш php или все без phpsessid cookie, и при передаче содержимого из кеша nginx должен прикреплять к ним нетронутый официальный phpsessid.

Таким образом, каждый посетитель будет иметь уникальный phpsessid и кешированный контент, что решит мои проблемы со входом .

Я, вероятно, смогу очистить и установить phpsessid. Но сейчас я не знаю, как сохранить этот уникальный / конкретный phpsessid и снова установить его. А может быть, это даже невозможно. Я придумал теорию и понятия не имею, как это сделать: D

1
задан 21 December 2016 в 11:35
1 ответ

Возможно, вам стоит пойти по легкому пути и просто определить блокировку для URL-адреса входа и отключить кеширование вручную. Вот как я делаю это для Wordpress.

У меня есть этот блок ограничения скорости вне определения сервера (у меня есть веб-сайт журнала трафика, поэтому одного входа в секунду более чем достаточно).

limit_req_zone $binary_remote_addr zone=login:1m rate=1r/s;

Это внутри моего сервера

# Rate limit wp-login.php to prevent brute force attacks
location = /wp-login.php {
  # Next line applies the rate limit defined above
  limit_req zone=login burst=3;       
  fastcgi_keep_conn on;
  fastcgi_intercept_errors on;
  fastcgi_pass   php;
  include        fastcgi_params;
  fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

  # No caching
  more_clear_headers "Cache-Control";
  add_header Cache-Control "private, max-age=0, no-cache, no-store";
  more_clear_headers "Expires";    
}

] У меня есть дополнительная информация о моем руководстве по Wordpress / Nginx, здесь .

Обновление

Это то, что у меня есть в моей конфигурации Nginx для Wordpress

if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wordpress_logged_in") {
set $skip_cache 1;

}

Прочтите руководство Я ссылался на вышеупомянутый, у меня есть довольно эффективная конфигурация Nginx для Wordpress, которую вы, вероятно, можете взять как есть или скопировать и вставить из него.

1
ответ дан 3 December 2019 в 23:36

Теги

Похожие вопросы