среда, 16 марта 2011 г.

Ускоряем Joomla с помощью SmartOptimizer

Как известно, joomla не особо шустрый движок, попробуем его слегка ускорить.
Включаем всевозможные кэши, уменьшаем качество "толстых" изображений и отключаем лишние модули - почитать об этом можно например тут, а помочь в тестировании времени загрузки и объёма элементов страницы поможет плагин для Firefox - YSlow.
Теперь качаем SmartOptimizer (на момент написания статьи это была версия 1.8), любым способом загружаем на свой сайт и распаковываем в корень.
Структура директорий получится такая:
/ (корень сайта)
          /smartoptimizer
          /cache
          config.php
          index.php

Теперь редактируем или создаём в корневой директории если его ещё нет, файл .htaccess со следующим содержимым (опции необходимые для работы smartoptimizer выделены жирным шрифтом):
# не сжимать страницы средствами php (zlib)
php_flag zlib.output_compression Off
# Для отключения буферизации вывода данных
php_flag output_buffering Off
php_value output_handler NULL
# запрещаем создание индекса каталогов при отсутствии index.html/php
Options +FollowSymLinks -Indexes
# опции для smartoptimizer
<IfModule mod_expires.c>
   <FilesMatch "\.(gif|jpg|jpeg|png|swf|css|js|html?|xml|txt)$">
      ExpiresActive On
      ExpiresDefault "access plus 10 years"
   </FilesMatch>
</IfModule>
<IfModule mod_rewrite.c>
# включаем mod_rewrite
RewriteEngine On
# снова опции для smartoptimizer

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*\.(js|css))$ smartoptimizer/?$1
   <IfModule mod_expires.c>
      RewriteCond %{REQUEST_FILENAME} -f
      RewriteRule ^(.*\.(js|css|html?|xml|txt))$ smartoptimizer/?$1
   </IfModule>
   <IfModule !mod_expires.c>
   RewriteCond %{REQUEST_FILENAME} -f
   RewriteRule ^(.*\.(gif|jpg|jpeg|png|swf|css|js|html?|xml|txt))$ smartoptimizer/?$1
   </IfModule>
</IfModule>
<FilesMatch "\.(gif|jpg|jpeg|png|swf|css|js|html?|xml|txt)$">
   FileETag none
</FilesMatch>
# прописываем основной домен для правильной индексации в поисковиках
RewriteCond %{HTTP_HOST} ^www.tkani-sklad\.ru$ [NC]
RewriteRule ^(.*)$ http://tkani-sklad.ru/$1 [R=301,L]

На этом настройку можно считать законченной, у меня результаты получились достаточно ощутимые:










Также можно для уменьшения количества запросов к веб серверу склеить несколько файлов стилей или java скриптов в один (идем в менеджер шаблонов -> шаблон -> редактирование HTML и смотрим что у нас интересного есть в <HEAD></HEAD>):
Например если было такое:

<link rel="stylesheet" href="path/to/file/cssfile1.css" />
<link rel="stylesheet" href="path/to/file/cssfile2.css" />
<link rel="stylesheet" href="path/to/file/cssfile3.css" />
<script src="path/to/file/jsfile1.js"></script>
<script src="path/to/file/jsfile2.js"></script>
<script src="path/to/file/jsfile3.js"></script>
Исправляем чтобы стало так:
<link rel="stylesheet" href="path/to/file/cssfile1.css,cssfile2.css,cssfile3.css" />
<script src="path/to/file/jsfile1.js,jsfile2.js,jsfile3.js"></script>

четверг, 10 марта 2011 г.

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

воскресенье, 6 декабря 2009 г.

IPSEC туннель между модемом Asus AM604g и FreeBSD 7.0

Исходные данные:
Сервер живёт на реальном IP=ххх.ххх.ххх.ххх , внутренний интерфейс 10.10.122.4 на котором сеть 10.10.122.0/24, на сервере установлены ipsec-tools-0.7.3.

Модем на динамическом, но также реальном IP, интернет подключен через СТРИМ, внутренняя сеть 10.10.133.0/24, внутренний фейс модема 10.10.133.4 (на модеме 4 Lan порта и WiFi, поднят dhcp, маршрутизация статическая).

Генерим самоподписные сертификаты для сервера и модема приведёнными ниже скриптами.
Серверный сертификат:

server$ cat ./gencrt_bsd.sh
#!/bin/sh
openssl req -new -nodes -newkey rsa:1024 -sha1 -keyform PEM -keyout server.test.ru.private -outform PEM -out server.test.ru.pem

openssl x509 -days 9999 -req -in server.test.ru.pem -signkey server.test.ru.private -out server.test.ru.public

openssl x509 -in server.test.ru.public -text


Сертификат для модема:

server$ cat ./gencrt_adsl.sh
#!/bin/sh
openssl req -new -nodes -newkey rsa:1024 -sha1 -keyform PEM -keyout adsl.test.ru.private -outform PEM -out adsl.test.ru.pem

openssl x509 -days 9999 -req -in adsl.test.ru.pem -signkey adsl.test.ru.private -out adsl.test.ru.public

openssl x509 -in adsl.test.ru.public -text


В настройках модема:
1. Идём в раздел Advanced Setup->Certificate->Trusted CA, жмём Import Certificate и через copy/paste добавляем публичный сертификат сервера (server.test.ru.public).
У меня он называется "server.test.ru".

2. В разделе Advanced Setup->Certificate->Local, говорим Import Certificate и добавляем сертификаты модема (публичный и приватный - adsl.test.ru.public/adsl.test.ru.private), называем "adsl".

3. В разделе Advanced Setup->IPsec, создаём подключение: Add New Connection,
где выставляем
IPSec Connection Name = myconnection,
Remote IPSec Gateway Address (IP or Domain Name) = ххх.ххх.ххх.ххх,
Tunnel access from local IP addresses = subnet,
IP Address for VPN = 10.10.133.4,
IP Subnetmask = 255.255.255.0,
Tunnel access from remote IP addresse = subnet,
IP Address for VPN = 10.10.122.4,
IP Subnetmask = 255.255.255.0,
Key Exchange Method = auto(ike),
Authentication Method = certificate(x.509),
certificates = adsl,
Perfect Forward Secrecy = enable,

Advanced IKE Settings
Phase 1
Mode = aggressive,
Encryption Algorithm = 3des,
Integrity Algorithm = sha1,
Select Diffie-Hellman Group for Key Exchange = 1024bit,
Key Life Time = 3600seconds,
Phase 2
Encryption Algorithm = 3des,
Integrity Algorithm = sha1,
Select Diffie-Hellman Group for Key Exchange = 1024bit,
Key Life Time = 3600seconds
Жмакаем Save/Apply и на свежесозданном подключении ставим галку Enable.

Для тестирования и отладки, разделе Management->System Log можно выставить уровень debug. Логи очень информативны и помогут разобраться в проблемах подключения.


Теперь настройки сервера:
Публичные и приватные сертификаты сервера, а также публичный ключ модема кладём в /usr/local/etc/racoon/cert и выставляем корректные права:

server$ ls -AlFGo /usr/local/etc/racoon
drwx------ 2 root wheel - 512 1 дек 00:53 cert/
-rw------- 1 root wheel - 8523 3 дек 00:05 racoon.conf

server$ ls -AlFGo /usr/local/etc/racoon/cert
-rw------- 1 root wheel - 948 1 дек 00:46 adsl.test.ru.public
-rw------- 1 root wheel - 1034 7 окт 12:46 server.test.ru.public
-rw------- 1 root wheel - 733 29 июл 2008 server.test.ru.pem
-rw------- 1 root wheel - 887 29 июл 2008 server.test.ru.private
-rw------- 1 root wheel - 1013 29 июл 2008 server.test.ru.public


Дальше правим /usr/local/etc/racoon/racoon.conf

server$ cat /usr/local/etc/racoon/racoon.conf

path include "/usr/local/etc/racoon";
path certificate "/usr/local/etc/racoon/cert";

log debug2;
#log info;
padding
{
maximum_length 20; # maximum padding length.
randomize off; # enable randomize length.
strict_check off; # enable strict check.
exclusive_tail off; # extract last one octet.
}

# if no listen directive is specified, racoon will listen on all
# available interface addresses.
listen
{
isakmp xxx.xxx.xxx.xxx [500];
}

# Specify various default timers.
timer
{
# These value can be changed per remote node.
counter 5; # количество повторов отправки 5 = дефолт
interval 20 sec; # интервал между попытками отправки 10 = дефолт
persend 1; # количество отправляемых пакетов 1 = дефолт
phase1 90 sec; # максимальное время отведённое на завершение фазы 1
phase2 90 sec; # то-же для 2й фазы
}

remote anonymous
{
exchange_mode main,aggressive;# режим обмена для фазы 1, когда racoon
# выступает инициатором, также определяет
# допустимые режимы обмена, когда racoon-
# responder.Описываются через запятую,
# первое значение в списке используется
# когда racoon инициатор (main,aggressive,base)
doi ipsec_doi; # использовать расширение по RFC 2407
situation identity_only;# использовать SIT_IDENTITY_ONLY по RFC 2407
passive on; # инициируем соединения или ждём подключений
generate_policy on; # генерим политики ибо IP противоположной стороны неизвестен
nonce_size 16;# default = 16, размер nonce = (8-256), подробности в RFC2409...
lifetime time 60 min;
initial_contact on; # включение отправки сообщения INITIAL-CONTACT при рестарте
# default = on, это сообщение полезно
# если responder оставляет старый SA при реконнекте.
# Если сообщение не послать, то responder будет
# использовать старый SA даже когда уже существует новый.
# можно юзать net.key.preferred_oldsa в sysctl, чтобы
# принудительно оставлять старый SA
proposal_check obey;# obey- при выборе pfs,lifetime и длине ключей,
# использовать значения предлагаемые инициатором
# strict,claim- если наши значения серьёзней, то ок,
# иначе отклоняем... или наоборот при claim
# exact- если не совпадают с нашими то не принимаем ...
my_identifier asn1dn; # идентификатор сервера отправляемый
# удалённому хосту будет взят из поля
# Subject сертификата
peers_identifier asn1dn;
certificate_type x509 "server.test.ru.public" "server.test.ru.private";
peers_certfile x509 "adsl.test.ru.public";

# конфигурация параметров предложения первой фазы
proposal {
encryption_algorithm 3des;# алгоритм шифрования
hash_algorithm sha1; # метод хеширования
authentication_method rsasig; # метод аутентификации- по сертификатам
dh_group 2; # длина ключа Диффи-Хеллмана 1024бит (1-768бит)
}
}

# конфигурация параметров предложения второй фазы
sainfo anonymous
{
pfs_group 2;
lifetime time 60 min; # время жизни ключа 2 фазы
encryption_algorithm 3des; # алгоритм шифрования 2 фазы
authentication_algorithm hmac_sha1,hmac_md5; # алгоритм хэширования 2 фазы
compression_algorithm deflate; # алгоритм сжатия 2 фазы
}



Теперь правим /etc/rc.conf:

server$ echo "ipsec_enable="YES" >> /etc/rc.conf
server$ echo "racoon_enable="YES" >> /etc/rc.conf

Стартуем в консоли сервера racoon -vFdddddd, пингуем любой живой хост с обратной стороны туннеля и смотрим дебаг -всё должно взлететь...
Если нет, то смотрим настройки файерволла на сервере - должен пропускаться udp на 500 порт (isakmp) а также протокол esp.

Я использую pf, правила такие:
pass in on $ext_if proto udp from any to $ext_ip port {isakmp}
pass in on $ext_if proto esp from any to $ext_ip

При описанной схеме подключения, FreeBSD кидает пакеты в туннель без указаний маршрутов и настройки политик в /etc/ipsec.conf. Модем также не нуждается в прописывании дополнительных маршрутов. (Но если вы например планируете использовать для аутентификации на модеме, radius сервер находящийся в сети по ту сторону туннеля, то маршрут прописать всё таки придётся - указывать он должен на внутренний интерфейс модема -10.10.133.4)

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