Предполагается что вы только что установили минимальный дистрибутив Дебиана и законнектились по ssh.
1. Обновим список пакетов
deb http://php53.dotdeb.org lenny all deb-src http://php53.dotdeb.org lenny all
echo 'APT::Default-Release "stable";' > /etc/apt/apt.conf.d/default # что бы по-умолчанию все ставилось из стабильной ветки # Ключи для dotdeb репозитория gpg --keyserver keys.gnupg.net --recv-key 89DF5277 gpg -a --export 89DF5277 | sudo apt-key add - aptitude update aptitude install debian-archive-keyring # Что бы не ругалось на отсутствие подписей aptitude update # еще разик
2. Установим локаль
aptitude install locales dpkg-reconfigure locales [*] ru_RU.UTF-8 UTF-8
3. Время и временная зона
rm /etc/localtime ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime date MMDDhhmmCCYY.ss # MM — месяц, DD — день месяца, hh — часы, mm — минуты, CCYY — 4 цифры года, ss — секунды
4. Прячем ssh со стандартного порта
nano /etc/ssh/sshd_config Port xxxx # Любой другой порт 1024-65535 /etc/init.d/ssh restart
5. Добавляем нового пользователя и включаем его в группу www-data
adduser example usermod -G www-data example id example # инфа о пользователе
6. Ставим nginx
aptitude install nginx /etc/init.d/nginx start # стартуем, проверяем что работает update-rc.d nginx defaults # Добавление в автозагрузку
7. Настраиваем nginx для работы в связке с apache.
rm /etc/nginx/sites-enabled/defaultРедактируем /etc/nginx/nginx.conf примерно так
user www-data; worker_processes 1; error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; sendfile on; tcp_nopush on; keepalive_timeout 65; tcp_nodelay on; gzip on; gzip_comp_level 3; gzip_proxied any; gzip_min_length 1100; gzip_http_version 1.0; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+css text/javacript text/json include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
/etc/init.d/nginx stop # Останавливаем nano /etc/nginx/proxy.conf # Создаем файл конфигурации proxy.conf
Со следующим содержимым
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 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;
Создаем файл виртуального хоста:
nano /etc/nginx/sites-available/example.ru
upstream backend { # Адрес back-end'a server 127.0.0.1:8080; } server { listen 80; server_name www.example.ru example.ru; access_log /home/example/example.ru/logs/nginx_access.log; error_log /home/example/example.ru/logs/nginx_error.log info; # Перенаправление на back-end location / { proxy_pass http://backend; proxy_redirect http://127.0.0.1:8080/ /; # подменяем внутренний адрес на внешний include /etc/nginx/proxy.conf; } # Статическиое наполнение отдает сам nginx # back-end этим заниматься не должен location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js)$ { root /home/example/example.ru/public/; access_log off; error_page 404 = @fallback; } # с не найденным пусть разбирается апач location @fallback { proxy_pass http://backend; proxy_redirect http://127.0.0.1:8080/ /; include /etc/nginx/proxy.conf; }
Включаем новый хост
ln -s /etc/nginx/sites-available/example.ru /etc/nginx/sites-enabled/example.ru
8. Либо, настраиваем для работы с php-fpm без Apache
Зарезервировано
9. Ставим Apache2 и PHP5
Для сохранения памяти на сервере apache ставится именно с apache2-mpm-prefork, а не с apache2-mpm-worker.
aptitude install apache2 apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-rpaf
А также php5 и самые необходимые для начала работы с сервером модулей php5:
aptitude install libapache2-mod-php5 php5 php5-common php5-curl php5-dev php5-mysql php5-gd php5-mcrypt php5-xmlrpc php5-apc
Настройка Apache
Корректируем конфигурационный файл:
nano /etc/apache2/apache2.conf # Таймаут 90 секунд Timeout 90 # Выключаем KeepAlive KeepAlive Off
Сократим нагрузку, соответственно уменьшим потребление памяти (применимо к серверам с малым объемом оперативной памяти ).
nano /etc/apache2/apache2.conf
Находим похожее в /etc/apache2/apache2.conf и изменяем.
<IfModule mpm_prefork_module> StartServers 1 MinSpareServers 1 MaxSpareServers 2 # можно поставить и больше, с соответственно большим расходом памяти. MaxClients 10 MaxRequestsPerChild 1000 # помогает избегать утечек памяти </IfModule>Перезапускаем Апач:
/etc/init.d/apache2 restart
Проверяем корректную настройку apache, открываем в браузере: "http://127.0.0.1" (IP той машины, где был установлен apache). Должно появиться "It works!".
Отключаем хост по умолчанию:
a2dissite 000-default
Настраиваем apache на работу с портом 8080, а не 80 и закрываем доступ извне:
# nano /etc/apache2/ports.conf NameVirtualHost *:8080 Listen 127.0.0.1:8080
Настройка mod_rpaf
Теперь, если посмотреть в логи apache, то там все запросы будут идти с адреса front-end'a. Чтобы это исправить, необходимо установить модуль mod_rpaf:
aptitude install libapache2-mod-rpafИ настроить его:
nano /etc/apache2/mods-enabled/rpaf.confДолжен выглядеть примерно так:
<IfModule mod_rpaf.c> # Включаем модуль RPAFenable On # Приводит в порядок X-Host RPAFsethostname On # Адрес фронтенда (nginx) RPAFproxy_ips 127.0.0.1 192.168.0.1 </IfModule>
/etc/init.d/apache2 force-reload
Настройка виртуального хоста в Apache
Создаем файл виртуального хоста:
# nano /etc/apache2/sites-available/example.ru NameVirtualHost *:8080 Listen 127.0.0.1:8080 <VirtualHost *:8080> ServerAdmin admin@example.ru ServerName www.example.ru ServerAlias example.ru DocumentRoot /home/example/example.ru/public <Directory /home/example/example.ru/public> AllowOverride All Order allow,deny Allow from all DirectoryIndex index.php index.html </Directory> LogLevel warn ErrorLog /home/example/example.ru/logs/apache_error.log CustomLog /home/example/example.ru/logs/apache_access.log combined </VirtualHost>
a2ensite example.ru /etc/init.d/apache2 reload
MySQL
aptitude install mysql-server mysql-clientуменьшить потребление памяти mysql сервером, зайдем в my.cnf
Найдем в /etc/mysql/my.cnf следующую строчку:
#skip-innodb и разкомментируем ее
Обезопасим mysql стандартной утилитой mysql_secure_installation
Примерные вопросы, которые будут задаваться пользователю:
mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! ............. Enter current password for root (enter for none): # введите mysql пароль, установленный вами выше. Set new root password? [Y/n] # задать новый парооль суперпользователя? Жмем Y (да) и New password: # вводим пароль Re-enter new password: # и его проверку Remove anonymous users? [Y/n] # Удалить анонимных пользователей? Да. Disallow root login remotely? [Y/n] # запретить удаленных вход под суперпользователем? Да (обязательно!) Remove test database and access to it? [Y/n] # удалить тестовую БД? Да. Reload privilege tables now? [Y/n] # перезагрузить привилегии? Да.
Перезапускаем MySQL:
/etc/init.d/mysql restart
Все выше перечисленное прекрасно работает на VDS со 128Мб памяти и процессором 400MHz. Тестировался на проекте использующем Zend Framework и Doctrine 2.
Расход памяти (правда еще куча всего установлено)
total used free shared buffers cached Mem: 131072 87156 43916 0 0 0 -/+ buffers/cache: 87156 43916 Swap: 0 0 0
ab -n 1000 -c 50 http://testsite.ru/ # 1000 запросов от 50 пользователей Concurrency Level: 50 Time taken for tests: 202.609 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 3581142 bytes HTML transferred: 3191142 bytes Requests per second: 4.94 [#/sec] (mean) Time per request: 10130.467 [ms] (mean) Time per request: 202.609 [ms] (mean, across all concurrent requests) Transfer rate: 17.26 [Kbytes/sec] received
Установка и настройка окружения разработчика
Поставим pear и обновим его
aptitude install php-pear pear install PEAR-1.9.1 rm /usr/bin/pear; ln -s /usr/share/php/bin/pear /usr/bin/pear
Установка XDebug и подключение в качестве Zend Extension
pecl install xdebug
zend_extension="/path/to/xdebug.so" xdebug.remote_enable = on
Установка PHPUnit 3.5
pear channel-discover pear.phpunit.de pear channel-discover components.ez.no pear channel-discover pear.symfony-project.com pear install phpunit/PHPUnit ln -s /usr/share/php/bin/phpunit /usr/bin/phpunit
Пропишем верные пути к PEAR в php.ini
include_path=".:/usr/share/php/PEAR:/usr/share/php"
Установка Mockery - очень гибкого фреймворка для Mock-объектов
pear channel-discover pear.survivethedeepend.com pear install deepend/Mockery
Материал будет дополняться
Материал собран со следующих источников
http://debianworld.ru/articles/ustanovka-nginx-kak-front-end-k-apache-v-debian-ubuntu-2/
http://wiki.vdsplanet.ru/Готовим_сервер_к_работе_-_Debian/Ubuntu
http://adw0rd.ru/2010/ubuntu-php53/
http://server-tuning.info
http://www.siniy.ws/2010/04/03/nginx_php-fpm
Интересно и все в одном месте.
ОтветитьУдалитьВопрос у тебя пхп последней версии, а есть ли там поддержка mysqlnd? Мне достался проект где используется mysqli_fetch_all (хотя др. функции mysqli пашут) и метод не пашет, так как требует поддержки mysqlnd
ОтветитьУдалитьДа есть, я использую готовые пакеты с dotdeb.org судя по phpinfo php собран как раз с поддержкой mysqlnd.
ОтветитьУдалитьMysqlI Support enabled
Client API library version mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $
PDO Driver for MySQL enabled
Client API version mysqlnd 5.0.7-dev - 091210 - $Revision: 300533 $
Значит надо мне мою кубунту обновить до 10.10. Вчера обновился до 10.04, но достался проект в который все не удается поднять (не на зф написан :))
ОтветитьУдалитьКстати пытался добавить репы по статье, все сделал нормально, но через менеджер пакетов обновится не могу. Все обновления являются Запрещенными.
Обновил ось и проблема осталась либы mysqlnd нет... Ты не вкурсе как заставить обновить пакеты если менеджер пакетов сообщает что они запрещены для обновления?
ОтветитьУдалитьКак именно он сообщает?
ОтветитьУдалитьПопробуй добавить в /etc/apt/sources.list вот так, может кубунту не понимает lenny
deb http://php53.dotdeb.org stable all
deb-src http://php53.dotdeb.org stable all
Потом:
sudo aptitude update
sudo aptitude install php5-mysql=5.3.3-0.dotdeb.1
очень интересно и все в одном месте, до этой статьи лишь поглядывал в сторону nginx'а, теперь обязательно попробую, тем более после вашей статьи шанс на то, что что-нибудь пойдет не так минимальны, спасибо :)
ОтветитьУдалитьНа серверах желаельно запускать каждый сайт (vhost) от отдельного пользователя и группы. Рекомендую обратить внимание на Apache: apache2-mpm-itk
ОтветитьУдалитьСпасибо за статью! Действительно, много необходимого в одном месте. Подписался на ваш блог.
ОтветитьУдалитьВы можете описать процесс установки и настройки ssh на минимальный дистрибутив Дебиана?
ОтветитьУдалить