У меня есть сервер nginx php-fpm для моего сайта. Я хотел бы использовать микрокэш для 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, и если сначала войдите в систему с помощью браузера с учетной записью администратора, у всех будет администратор, вошедший в кеш: D Мне нужны соединения, которые phpsessid должны быть защищены.
Это похоже на то, что nginx должен сначала очистить файл cookie phpsessid и отправить php в fastcgi. и возврат этого php с сервера fastcgi nginx должен присоединить тот же phpsessid, который был очищен вначале. Или это похоже на кеш php или все без phpsessid cookie, и при передаче содержимого из кеша nginx должен прикреплять к ним нетронутый официальный phpsessid.
Таким образом, каждый посетитель будет иметь уникальный phpsessid и кэшированный контент, что решит мои проблемы со входом в систему.
Я, наверное, смогу очистить и установить phpsessid. Но сейчас я не знаю, как сохранить этот уникальный / конкретный phpsessid и снова установить его. А может быть, это даже невозможно. Придумал теорию и понятия не имею, как это сделать: D
Возможно, вам стоит пойти по легкому пути и просто определить блокировку для URL-адреса входа и вручную отключить кеширование. Вот как я это делаю для Wordpress.
У меня есть этот блок ограничения скорости за пределами определения сервера (у меня есть веб-сайт журнала трафика, поэтому 1 вход в секунду более чем достаточно).
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, которую вы, вероятно, можете взять как есть или скопировать и вставить части.