За последние 24 часа нас посетили 17394 программиста и 1218 роботов. Сейчас ищут 1338 программистов ...

Вопросы по кэшированию

Тема в разделе "Прочие вопросы по PHP", создана пользователем zkv, 7 ноя 2016.

  1. zkv

    zkv Новичок

    С нами с:
    19 сен 2016
    Сообщения:
    10
    Симпатии:
    0
    Добрый вечер. Проверили PageSpeed Insights сайт, оказалось что не кэшируются картинки. Сайт работает под управление nginx, apache. Кэширование организовано с помощью задания headers. Правильно ли я понимаю, что кэшировать изображения можно только через настройки nginx?
    Есть еще вопрос по поводу связки apache и nginx. Все-таки кто за что отвечает и что передает?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    это когда одна машина везёт другую машину, сейчас это больше для совместимости с .htaccess использую, так apache через него можно настроить под себя, по вопросу кто за что отвечает, то это как ты настроил, обычно в таком случаи nginx отвечает за статический контент, картинки и другие файла, а все динамические запросы как proxy пропускает через себя и отдаёт apache и как apache ему вернул, то отдаёт пользователю, очень давно, apache плохо работал с медленными клиентами, по этому nginx ставили до apache.

    заголовки можно отдать очень быстро, вместо основной информации, просто сообщить что вот файл был изменён в 5 утра или E-Tag и если у браузера в кэше совпадает e-tag запроса или время последнего изменения, то вместо повторного получения запроса, он использует данные из кэша своего (браузер), можно заголовками настроить так что вообще запрос не пойдёт например 20 дней, и все 20 дней упорно брать данные с кэша, но тогда ты не сможешь отдать новую информацию.
     
  3. rishard

    rishard Новичок

    С нами с:
    20 сен 2016
    Сообщения:
    228
    Симпатии:
    27
    For example; в качестве иллюстрации можно вот так, отлично пашет, в том числе и картинки:



    Код (Text):
    1. # BEGIN WEBSITE SPEED BOOST
    2. # Time cheat sheet in seconds
    3. # A86400 = 1 day
    4. # A172800 = 2 days
    5. # A2419200 = 1 month
    6. # A4838400 = 2 months
    7. # A29030400 = 1 year
    8.  
    9. # Test which ETag setting works best on your Host/Server/Website
    10. # with Firefox Firebug, Firephp and Yslow benchmark tests.
    11.  
    12. # Create the ETag (entity tag) response header field
    13. #FileETag MTime Size
    14.  
    15. # Remove the ETag (entity tag) response header field
    16. Header unset ETag
    17. FileETag none
    18.  
    19. <IfModule mod_expires.c>
    20. ExpiresActive on
    21. ExpiresByType image/jpg A4838400
    22. ExpiresByType image/gif A4838400
    23. ExpiresByType image/jpeg A4838400
    24. ExpiresByType image/png A4838400
    25. ExpiresByType video/webm A4838400
    26. ExpiresByType application/x-shockwave-flash A4838400
    27. ExpiresByType application/x-javascript A4838400
    28. ExpiresByType application/javascript A4838400
    29. ExpiresByType text/javascript A4838400
    30. ExpiresByType text/css A4838400
    31. #ExpiresByType text/html A86400
    32. # Default is 2 days below so the line above is not needed / commented out
    33. ExpiresDefault A172800
    34. </IfModule>
    35.  
    36. <IfModule mod_headers.c>
    37. <FilesMatch "\.(js|css|flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav|gif|jpg|jpeg|png|swf|webm)$">
    38. Header append Cache-Control "public"
    39. </FilesMatch>
    40. <FilesMatch "\.(txt|html)$">
    41. Header append Cache-Control "proxy-revalidate"
    42. </FilesMatch>
    43. <FilesMatch "\.(php|cgi|pl|htm|xml)$">
    44. Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
    45. Header set Pragma "no-cache"
    46. </FilesMatch>
    47. </IfModule>
    48.  
    49. <IfModule mod_deflate.c>
    50. # Insert filters
    51. AddOutputFilterByType DEFLATE text/plain
    52. AddOutputFilterByType DEFLATE text/html
    53. AddOutputFilterByType DEFLATE text/xml
    54. AddOutputFilterByType DEFLATE text/css
    55. AddOutputFilterByType DEFLATE application/xml
    56. AddOutputFilterByType DEFLATE application/xhtml+xml
    57. AddOutputFilterByType DEFLATE application/rss+xml
    58. AddOutputFilterByType DEFLATE application/javascript
    59. AddOutputFilterByType DEFLATE application/x-javascript
    60. AddOutputFilterByType DEFLATE application/x-httpd-php
    61. AddOutputFilterByType DEFLATE application/x-httpd-fastphp
    62. AddOutputFilterByType DEFLATE image/svg+xml
    63.  
    64. # Drop problematic browsers
    65. BrowserMatch ^Mozilla/4 gzip-only-text/html
    66. BrowserMatch ^Mozilla/4\.0[678] no-gzip
    67. BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
    68.  
    69. # Make sure proxies don't deliver the wrong content
    70. Header append Vary User-Agent env=!dont-vary
    71. </IfModule>
    72. # END WEBSITE SPEED BOOST
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Это можно.
    Во-первых:
    Это не совсем правильный ответ.

    Смотри. Начнем с того, что nginx сам по себе не умеет в PHP. Нельзя в него встроить пых как в apache через модуль. По этому nginx всегда работает в связке с внешней PHP-машиной. Часто ею является PHPfpm, не менее часто ею является apache. Дело в том, что процессы nginx "стоят очень дешево". Они легко поднимаются, почти не едят ресурсов, их может быть очень много. А еще nginx лучше всех серверов умеет отдавать статику. То бишь - брать готовые данные и сбрасывать их клиенту в поток, не вешаясь при этом.

    apache же наоборот, "очень дорого стоит". Его процессы стартуют не так быстро, как хотелось бы, благо, что апач умный и всегда держит префоркнутые процессы для мгновенной работы, еще его процессы много весят. Это связано с тем, что apache немного монстр. При каждом вызове он поднимает все модули, лопатит все .htaccess-ы, все это инициализирует, обрабатывает внутренние вызовы, делает кучу работы. Но делает ее чертовски хорошо. Апач молодец.

    А теперь представим загрузку сайта:
    1) Просим апач обработать php_файлик.
    2) Апач отжирает оперативы бросается в бой, крайне быстро отрабатывает скрипт и отдает клиенту результат. Отлично!
    3) А в результате отданом у нас есть всякие теги с CSS, IMG и прочая шелуха.
    4) Запросы с этой шелухой тоже приходят апачу.
    5) Апач снова расчехляет свои дорогие процессы и...и отдает ими эти вот css-ки, картиночки всякие, просто используется как кричалка в поток. Это..это все равно что танком грядку пахать. В полторы сотки площадью.
    6) А теперь представим, что у клиента 5килобит на канале. Ну зашел он с мобыльного тырнета в глубинке. А ему надо мегабайт статики отдать. И апач, своими дорогими процессами отдает их ему. Долго, муторно. Он на это не рассчитан. Это избыточный расход ресурсов. Он бы в это время мог уже сотню скриптов прогнать через себя, но нет. Работа апача быстро отрабатывать задачу и сразу переключаться на новую, а не жевать картинку 10 минут.
    7) А теперь представим, что у нас посещаемость более 1 человека.

    Все плохо.

    И тут на помощь приходит nginx. Его мы ставим "мордой в интернеты". Он принимает все входящие. И "сортирует" их. Если он принимает запрос на CSS-ку или картинку, он самостоятельно берет нужный файлик и отдает его. Он на это рассчитан, это вся его суть - отдавать статику. О делает это крайне легко и беззаботно, не тратя на это лишних ресурсов. Не вешаясь на канале. Если он принимает запрос на, скажем, обработку php-скрипта, он, будучи не в состоянии обработать этот запрос, передает ее в PHP-машину. В вашем случае ею является apache с php_mod. Apache отжирает оперативы, бросается в бой, крайне быстро отрабатывает скрипт и отдает клиенту результат так быстро как может. И тут же о нем забывает. Теперь нам вообще плевать, какая скорость у клиента. Apache ли phpfpm ли, не важно, будет всегда работать максимально эффективно, так как его клиентом является не конечный пользователь, а nginx, стоящий с ним в одной локальной сети c околонулевым пингом.

    Теперь у нас все работает как надо. Танк на поле боя, а мотоплуг на грядке. Каждый хорош в своем деле, каждый на своем месте.

    Часто можно услышать вопли, мол apache не нужен! Nginx рулит! Nginx быстрый! Apache медленный! Это бред. Nginx по определению работает с PHP не быстрее, чем apache. Это физически невозможно, работать быстрее, потому что как минимум Nginx всегда проксирует вызов PHP к внешним машинам, что уже порождает оверхед. Apache или PHPfpm или еще какая-нибудь связка или вариант старта PHP всегда априори быстрее, чем Nginx+связка. И отдача контента пользователю будет идти примерно с одинаковой скоростью. Сервер не начинает работать быстрее, наоборот. Но, грубо говоря, потеряв 1% времени сервера на оверхеды мы в сотни раз, без преувеличения, повышаем отказоустойчивость оного. Nginx не ускоряет сервер, nginx позволяет серверу правильно распределять ресурсы и держать нагрузку максимально эффективно.
     
    Mitai, Anhk и denis01 нравится это.