Оптимизация web-сервера: eAccelerator

продолжаю облегчать жизнь серверу.
eAccelerator – все мы знаем что при обращении к файлу пхп вэб сервер компилирует пхп файл в некую программу, которая в дальнейшем, что-то делает и выдаёт нам результат в виде html, ну и кто-то задумался(может отбукился 🙂 ): “а зачем постоянно делать одну и туже работу – компилировать при каждом обращении один и тот же файл”, и вот eAccelerator берёт откомпилированный php файл и складывает во временную папку и когда пользователь обращается к очередному пхп файлу в дело вступает eAccelerator, который проверяет есть ли уже “готовый” запрашиваемый файл, если находит готовый то сразу запускает его, тем самым облегчает жизнь серверу (значительно снижает нагрузку на процессор) например у меня нагрузка в часы пик с 70% упала до 7-25%

ставим php5-dev

apt-get install php5-dev

берём свежий дистрибутив с http://eaccelerator.net/
распаковываем, заходим в извлечённый каталог

phpize

./configure –enable-eaccelerator=shared

make

make install

cd /etc/php5/conf.d

Создаём конфигурационный файл для акселератора

touch eacclerator.ini

вставляем в него содержимое

zend_extension = “/usr/lib/php5/20060613+lfs/eaccelerator.so”
eaccelerator.shm_size = “0”
eaccelerator.cache_dir = “/var/cache/eaccelerator”
eaccelerator.enable = “1”
eaccelerator.optimizer = “1”
eaccelerator.check_mtime = “1”
eaccelerator.debug = “0”
eaccelerator.filter = “”
eaccelerator.shm_max = “0”
eaccelerator.shm_ttl = “0”
eaccelerator.shm_prune_period = “0”
eaccelerator.shm_only = “0”
eaccelerator.compress = “1”
eaccelerator.compress_level = “7”
eaccelerator.allowed_admin_path = “/var/www/”

создаю каталог для кэша

mkdir /var/cache/eaccelerator

chmod 777 /var/cache/eaccelerator

теперь можно перезапустить apache

для контроля над тех процессом есть файл control.php
в нём находим логин пароль и перекидываем в нужную нам папку на территории вэб сервера ну и заходим 🙂

Iptables SNAT

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 1.2.3.4

eth1 – внешний интерфейс сервера
1.2.3.4 – внешний ИП сервера

iptables nat + torrent

iptables -A INPUT -p tcp --destination-port 6881:6999 -j ACCEPT
iptables -A OUTPUT -p tcp --source-port 6881:6999 -j ACCEPT

iptables пробросить порт

есть ubuntu шлюз надо чтоб с инета был доступен нейкий сервис на внутренней машине

iptables -t nat -A PREROUTING -p tcp -d 91.195.101.20 --dport 7888 -j DNAT --to-destination 192.168.100.251:7888
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.100.251 --dport 7888 -j SNAT --to-source 91.195.101.20

Первое правило подменяет ip приёмника на внутренний ип, а второе обратно подменяет ип отправителя на внешний.

nginx на Ubuntu – просто!

Задача: построить сервер по технологии front-end back-end (поправьте если я это не так понял)

то есть чтоб nginx занимался работой с посетителями, а апач работал по запросам nginx и отдавал nginx’y хтмл по lo
тем самым не расходуя системных ресурсов зря.
и так у меня есть чистая инсталяция ubuntu-server 8.04

В инете много информации по nginx, но как заставить его работать в паре с apache2 я почему-то не встречал.

Как Апач устанавливать рассказывать не буду, как mysql тоже гугл легко подскажет.

Лишь немного проясню суть.

Качаем nginx
Берём свежую версию тут
http://technokracy.net/nginx/
на момент написания статьи

wget http://technokracy.net/nginx/nginx_0.6.13~grrr-1_i386.deb

Устанавливаем

dpkg -i nginx_*

Также потребуется модуль к Апачу, которого нет в дефолтной поставке

apt-get install libapache2-mod-rpaf

Модуль для трансляции ip адресов, чтоб апач видел не локальные обращения nginx, а ип адреса пользователей.

Теперь сайты, что обслуживает Apache вешаем на локальный интерфейс и на порт например 8080 у меня несколько сайтов на сервере и я их расположил по порядку на 8081 8082 и т.п.

итого в /etc/apache2/ports.conf

Listen 127.0.0.1:8080
Listen 127.0.0.1:8081
Listen 127.0.0.1:8082

в каталоге /etc/apache2/sites-enabled находятся файлы с конфигурациями сайтов.

привожу пример одного из них

ServerAdmin mail@gmail.com
ServerName mysite.net
DocumentRoot /var/www/site1
ServerAlias mysite.net
ErrorLog /var/log/apache2/site1-error.log
CustomLog /var/log/apache2/site1-access.log common
LogLevel error

/etc/nginx/nginx.conf
я не менял ничего
а вот /etc/nginx/sites-enabled
я сделал такой конфиг

server {
listen 80;
server_name mysite.net;

access_log /var/log/nginx/site1-nginx.access.log;

location / {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 40m;
client_body_buffer_size 256k;

proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;

proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#Static files location
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|html|flv|mp3)$ {
root /var/www/site1; }

}

проверяем конфиг на корректность

# nginx -t
ну и если всё замечательно то

/etc/init.d/nginx start

ну и можно попробовать зайти на http://mysite.net

Дальше отснеффирил заголовки от своего web сервера

HTTP/1.1 200 OK
Server: nginx/0.5.32
Date: Mon, 29 Sep 2008 15:35:42 GMT
Content-Type: text/html
Connection: close
Last-Modified: Mon, 29 Sep 2008 13:53:07 GMT
ETag: “8146-ddb6-458092fd0b6c0”
Accept-Ranges: bytes
Content-Length: 56758

значит всё работает.

чтоб nginx стартовал автоматически я добавил в /etc/rc.local
строчку перед exit 0

/usr/local/bin/nginx

хотя можно было через rc-update (когда писал ман, почему пришла такая идея 🙂 )

Отправил будущий сервер в ребут для проверки, как он поднялся, так всё заработало.

Если есть замечания прошу отписывать 🙂