Статьи

Кэшируйте Java Webapps с помощью обратного прокси Squid

Эта статья шаг за шагом покажет, как кэшировать все ваше веб-приложение tomcat с помощью обратного прокси-сервера Squid без написания кода Java.

Что такое кальмар

Squid — это бесплатный прокси-сервер для HTTP, HTTPS и FTP, который экономит пропускную способность и увеличивает время отклика за счет кэширования часто запрашиваемых веб-страниц. Хотя squid может использоваться в качестве прокси-сервера, когда пользователи пытаются загружать страницы из Интернета, он также может использоваться в качестве обратного прокси-сервера, помещая squid между пользователем и вашим веб-приложением. Все пользовательские запросы сначала попадают в Squid. Если запрашиваемая страница уже существует в кеше Squid, она подается напрямую из кеша, не затрагивая ваше веб-приложение. Если страница не существует в кэше Squid, она извлекается из вашего веб-приложения и сохраняется в кэше для будущих запросов.

Squid уменьшает попадания на ваш сервер, кэшируя страницы ответов. Вам не нужно беспокоиться о построении кэширования на уровне страниц в каждом приложении, которое вы пишете, Squid позаботится об этой части.

Когда я должен использовать Squid

В идеале вы должны использовать Squid для страниц с высоким отношением чтения к записи. Другими словами, страница, которая меняется реже, но к ней обращаются очень часто. Вот несколько сценариев:

  • Динамическая веб-страница, которая отображает новости и обновляется один раз в час, а также получает сотни обращений в течение часа
  • Доступ к статической веб-странице осуществляется часто. Squid может повысить производительность за счет кэширования часто используемых статических веб-страниц в памяти

Когда я не должен использовать Squid

В большинстве случаев, если URL-адрес запроса является единственным фактором, который определяет ответ, вы можете безопасно использовать Squid. Смотрите более конкретные примеры ниже:

  • Если все приложения очень динамичны по своей природе, и действительность страниц изменяется немедленно.
  • Squid не подходит для приложений, требующих входа в систему. Это, к сожалению, большое количество приложений. Такие приложения должны прибегать к внутреннему кэшированию, например, использовать другие инфраструктуры кэширования, такие как Ehcache, для кэширования повторно используемых фрагментов страниц и / или кэширования запросов базы данных и / или других узких мест производительности.
  • Приложения, которые активно используют файлы cookie браузера. Squid использует URL для кэширования страниц. Если обслуживаемая страница рассчитывается на основе URL-адресов + файлов cookie, то вам не следует кэшировать эти страницы в Squid.

Как работает общая настройка

Архитектура Apache Squid Tomcat

Архитектура Apache Squid Tomcat

Apache получает запросы через порт 80. Apache вызывает Squid с запросом. Squid проверяет свой кеш, чтобы узнать, был ли у него кеширован ответ ранее. Если да и если срок ответа не истек, он возвращает кэшированный ответ. В этом случае:

Squid напишет следующий заголовок в ответ

X-Cache: HIT from www.vineetmanohar.com  

Если ответ не найден в кэше Squid, squid выполнит вызов Tomcat через порт 8082. Прокси-соединитель Tomcat прослушивает этот порт. Он обрабатывает запрос и отправляет ответ обратно в Squid. Squid сохраняет ответ в своем кеше, если только кеширование не отключено для этого URL. Squid возвращает окончательный ответ Apache, который отправляет ответ обратно пользователю.

Что делать, если я не хочу использовать Apache

Использование Apache не обязательно для использования Squid. Вы можете запустить Squid на порту 80 и направить своих пользователей непосредственно на Squid. Если это так, пропустите первый раздел и сразу перейдите к разделу 2 ниже.

Шаг 1/3: Конфигурация Apache Httpd

Если вы используете Apache в качестве внешнего интерфейса, вам нужно указать Apache направлять запросы в Squid на порт 3128. См. Следующий фрагмент кода. Измените имя сервера и пути, чтобы отразить ваши реальные значения.

Конфигурационный файл Apache:   /etc/httpd/conf/httpd.conf  

<VirtualHost x.x.x.x>
ServerName www.vineetmanohar.com
DocumentRoot /home/webadmin/www.vineetmanohar.com/html
# forward requests to squid running on port 3128
ProxyPass / http://localhost:3128/
ProxyPassReverse / http://localhost:3128/
</VirtualHost>

В дополнение к вышесказанному, вам также нужно установить mod_proxy . Если вы видите следующее в вашем httpd.conf, вы, вероятно, уже установили mod_proxy. Если вам сначала нужно установить mod_proxy

LoadModule  proxy_module         modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
 

Шаг 2/3: Конфигурация Squid

Сначала убедитесь, что Squid установлен на вашем сервере. Вы можете скачать Squid здесь .

Конфигурационный файл squid в Linux / Unix находится по этому адресу

/etc/squid/squid.conf  

Файл конфигурации довольно длинный. Следуйте этим инструкциям и установите значения соответствующим образом.

   1. # leave the port to 3128  
2. http_port 3128
3.
4. # how much memory cache do you want? depends on how much memory you have on the machine
5. cache_mem 200 MB
6.
7. # what's the biggest page that you want stored in memory. If you home page is 100 KB and
8. # you want it stored in memory, you may set it to a number bigger than that.
9. maximum_object_size_in_memory 100 KB
10.
11. # how much disk cache do you want. It is 6400 MB in the following example, change it as per
12. # your needs. Make sure you have that much disk space free.
13. cache_dir ufs /var/spool/squid 6400 16 256
14.
15. # this is probably the most important config section. Here you can configure the cache life for
16. # each URL pattern.
17.
18. # Time is in minutes
19. # 1 day = 1440, 2 days = 2880, 7 days = 10080, 28 days = 40320
20.
21. # do not cache url1
22. refresh_pattern ^http://127.0.0.1:8082/url1/ 0 20% 0
23.
24. # cache url2 for 1 day
25. refresh_pattern ^http://127.0.0.1:8082/url2/ 1440 20% 1440 override-expire override-lastmod reload-into-ims ignore-reload
26.
27. # cache css for 7 days
28. refresh_pattern ^http://127.0.0.1:8082/css 10080 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload
29.
30. # by default cache the whole website for 1 minute
31. refresh_pattern ^http://127.0.0.1:8082/ 0 20% 0 override-expire override-lastmod reload-into-ims ignore-reload
32.
33. # how long should the errors should be cached for. For example 404s, HTTP 500 errors
34. negative_ttl 0 seconds
35.
36. # On which host does tomcat run. Set 127.0.0.1 for localhost
37. httpd_accel_host 127.0.0.1
38.
39. # this is the proxy port as defined in Tomcat server.xml. By default it is "8082"
40. httpd_accel_port 8082
41.
42. # set this to "on". Read more documentation if you want to change this.
43. httpd_accel_single_host on
44.
45. # To access Squid stats via the manager interface, you need to enter a password here
46. cachemgr_passwd your_clear_text_password all
47.
48. # Say "off" if you want the query string to appear in the squid logs.
49. strip_query_terms off

# leave the port to 3128
http_port 3128

# how much memory cache do you want? depends on how much memory you have on the machine
cache_mem 200 MB

# what's the biggest page that you want stored in memory. If you home page is 100 KB and
# you want it stored in memory, you may set it to a number bigger than that.
maximum_object_size_in_memory 100 KB

# how much disk cache do you want. It is 6400 MB in the following example, change it as per
# your needs. Make sure you have that much disk space free.
cache_dir ufs /var/spool/squid 6400 16 256

# this is probably the most important config section. Here you can configure the cache life for
# each URL pattern.

# Time is in minutes
# 1 day = 1440, 2 days = 2880, 7 days = 10080, 28 days = 40320

# do not cache url1
refresh_pattern ^http://127.0.0.1:8082/url1/ 0 20% 0

# cache url2 for 1 day
refresh_pattern ^http://127.0.0.1:8082/url2/ 1440 20% 1440 override-expire override-lastmod reload-into-ims ignore-reload

# cache css for 7 days
refresh_pattern ^http://127.0.0.1:8082/css 10080 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload

# by default cache the whole website for 1 minute
refresh_pattern ^http://127.0.0.1:8082/ 0 20% 0 override-expire override-lastmod reload-into-ims ignore-reload

# how long should the errors should be cached for. For example 404s, HTTP 500 errors
negative_ttl 0 seconds

# On which host does tomcat run. Set 127.0.0.1 for localhost
httpd_accel_host 127.0.0.1

# this is the proxy port as defined in Tomcat server.xml. By default it is "8082"
httpd_accel_port 8082

# set this to "on". Read more documentation if you want to change this.
httpd_accel_single_host on

# To access Squid stats via the manager interface, you need to enter a password here
cachemgr_passwd your_clear_text_password all

# Say "off" if you want the query string to appear in the squid logs.
strip_query_terms off
 

Шаг 3/3: Конфигурация Tomcat

Убедитесь, что HTTP Proxy Connector определен в TOMCAT_HOME / conf / server.xml .

 <Service name="Catalina">  
<Connector port="8082"
maxThreads="50" minSpareThreads="5" maxSpareThreads="10"
enableLookups="false" acceptCount="100" connectionTimeout="20000"
proxyName="www.vineetmanohar.com"
compressableMimeType="text/html,text/xml,text/css,text/javascript,text/plain" compression="on"
proxyPort="80" disableUploadTimeout="true" />

 При необходимости см. Дополнительную документацию по соединителю прокси-сервера Tomcat .

Интерфейс Squid Manager

Вы можете получить доступ к конфигурации и статистике Squid через HTTP-интерфейс Squid Manger. Убедитесь, что файл «cachemgr.cgi», который поставляется вместе с установкой squid, находится в вашем каталоге cgi-bin. Больше документации по настройке здесь .

Как только вы настроите его, вы сможете получить доступ к менеджеру кеша по этому URL:

Для продолжения введите следующие значения:

Cache host: localhost  
Cache port: 3128
Manager name: manager
Password: <the value you entered for "cachemgr_passwd" in squid.conf>
  • Статистика каталога магазина показывает, сколько дискового пространства используется дисковым кешем.
  • Cache Client List показывает соотношение HIT / MISS кеша в%. Вы должны следить за этим часто и настраивать кэш, чтобы получить более высокий процент попаданий.

Перезагрузите Squid Config без перезапуска

Отредактируйте конфигурацию squid, используя «vi» или ваш любимый редактор

vi /etc/squid/squid.conf  

Как только вы закончите редактирование, перезагрузите новый конфиг, не перезапуская Squid
/ usr / sbin / squid -kconfigure  

Очистка Squid Cache

Чтобы очистить кеш Squid:

1) Установите кэш памяти 4 МБ (или меньшее число)

cache_mem 8 MB

2) Установите кеш диска на 8 МБ (или меньшее число). Кеш диска должен быть выше кеша памяти.

cache_dir ufs /var/spool/squid 20 16 256

3) Перезагрузите конфигурацию squid без перезапуска, как описано в предыдущем разделе.

4) Возможно, вам придется подождать несколько часов, чтобы очистить кеш. Как только кеш очистится, вы можете восстановить прежние размеры кеша и снова загрузить новую конфигурацию. Вы можете контролировать размер кэша через HTTP-интерфейс Squid Manager.

В обход кальмаров

Если по какой-то причине вам нужно обойти Squid, перенастройте Apache для прямой отправки запросов в Tomcat. Отредактируйте файл конфигурации Apache /etc/httpd/conf/httpd.conf

# forward requests directly to Tomcat's proxy connector running on port 8082  
ProxyPass / http://localhost:8082/
ProxyPassReverse / http://localhost:8082/

Вам нужно будет перезапустить Apache после внесения этого изменения.

/etc/init.d/httpd restart

Вывод

Squid — очень мощный инструмент для кеширования. Это не для всех приложений. Пожалуйста, проверьте необходимость вашего приложения и используйте squid соответствующим образом. Я использовал squid в течение нескольких лет для кэширования выходных данных Java-приложения для сбора данных и очень доволен простотой использования и преимуществами. Надеюсь, вы нашли этот урок полезным. Не стесняйтесь оставлять комментарии или делиться своим опытом с squid.

Рекомендации

Squid официальный сайт

С http://www.vineetmanohar.com