Добрый вечер. Проверили PageSpeed Insights сайт, оказалось что не кэшируются картинки. Сайт работает под управление nginx, apache. Кэширование организовано с помощью задания headers. Правильно ли я понимаю, что кэшировать изображения можно только через настройки nginx? Есть еще вопрос по поводу связки apache и nginx. Все-таки кто за что отвечает и что передает?
это когда одна машина везёт другую машину, сейчас это больше для совместимости с .htaccess использую, так apache через него можно настроить под себя, по вопросу кто за что отвечает, то это как ты настроил, обычно в таком случаи nginx отвечает за статический контент, картинки и другие файла, а все динамические запросы как proxy пропускает через себя и отдаёт apache и как apache ему вернул, то отдаёт пользователю, очень давно, apache плохо работал с медленными клиентами, по этому nginx ставили до apache. заголовки можно отдать очень быстро, вместо основной информации, просто сообщить что вот файл был изменён в 5 утра или E-Tag и если у браузера в кэше совпадает e-tag запроса или время последнего изменения, то вместо повторного получения запроса, он использует данные из кэша своего (браузер), можно заголовками настроить так что вообще запрос не пойдёт например 20 дней, и все 20 дней упорно брать данные с кэша, но тогда ты не сможешь отдать новую информацию.
For example; в качестве иллюстрации можно вот так, отлично пашет, в том числе и картинки: Код (Text): # BEGIN WEBSITE SPEED BOOST # Time cheat sheet in seconds # A86400 = 1 day # A172800 = 2 days # A2419200 = 1 month # A4838400 = 2 months # A29030400 = 1 year # Test which ETag setting works best on your Host/Server/Website # with Firefox Firebug, Firephp and Yslow benchmark tests. # Create the ETag (entity tag) response header field #FileETag MTime Size # Remove the ETag (entity tag) response header field Header unset ETag FileETag none <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/jpg A4838400 ExpiresByType image/gif A4838400 ExpiresByType image/jpeg A4838400 ExpiresByType image/png A4838400 ExpiresByType video/webm A4838400 ExpiresByType application/x-shockwave-flash A4838400 ExpiresByType application/x-javascript A4838400 ExpiresByType application/javascript A4838400 ExpiresByType text/javascript A4838400 ExpiresByType text/css A4838400 #ExpiresByType text/html A86400 # Default is 2 days below so the line above is not needed / commented out ExpiresDefault A172800 </IfModule> <IfModule mod_headers.c> <FilesMatch "\.(js|css|flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav|gif|jpg|jpeg|png|swf|webm)$"> Header append Cache-Control "public" </FilesMatch> <FilesMatch "\.(txt|html)$"> Header append Cache-Control "proxy-revalidate" </FilesMatch> <FilesMatch "\.(php|cgi|pl|htm|xml)$"> Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform" Header set Pragma "no-cache" </FilesMatch> </IfModule> <IfModule mod_deflate.c> # Insert filters AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/x-httpd-php AddOutputFilterByType DEFLATE application/x-httpd-fastphp AddOutputFilterByType DEFLATE image/svg+xml # Drop problematic browsers BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary </IfModule> # END WEBSITE SPEED BOOST
Это можно. Во-первых: Это не совсем правильный ответ. Смотри. Начнем с того, что 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 позволяет серверу правильно распределять ресурсы и держать нагрузку максимально эффективно.