среда, 3 ноября 2010 г.

Настройка своего сервера debian/ubuntu

Мини шпаргалка по настройки полноценного сервера на основе дистрибутивов Linux Debian/Ubuntu. В инете полно такого материала, но везде по чуть-чуть, приходится тратить время на поиск инфы, здесь постарался собрать все что потребуется для запуска своего сервера.
Предполагается что вы только что установили минимальный дистрибутив Дебиана и законнектились по 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

10 комментариев:

  1. Интересно и все в одном месте.

    ОтветитьУдалить
  2. Вопрос у тебя пхп последней версии, а есть ли там поддержка mysqlnd? Мне достался проект где используется mysqli_fetch_all (хотя др. функции mysqli пашут) и метод не пашет, так как требует поддержки mysqlnd

    ОтветитьУдалить
  3. Да есть, я использую готовые пакеты с 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 $

    ОтветитьУдалить
  4. Значит надо мне мою кубунту обновить до 10.10. Вчера обновился до 10.04, но достался проект в который все не удается поднять (не на зф написан :))
    Кстати пытался добавить репы по статье, все сделал нормально, но через менеджер пакетов обновится не могу. Все обновления являются Запрещенными.

    ОтветитьУдалить
  5. Обновил ось и проблема осталась либы mysqlnd нет... Ты не вкурсе как заставить обновить пакеты если менеджер пакетов сообщает что они запрещены для обновления?

    ОтветитьУдалить
  6. Как именно он сообщает?
    Попробуй добавить в /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

    ОтветитьУдалить
  7. очень интересно и все в одном месте, до этой статьи лишь поглядывал в сторону nginx'а, теперь обязательно попробую, тем более после вашей статьи шанс на то, что что-нибудь пойдет не так минимальны, спасибо :)

    ОтветитьУдалить
  8. На серверах желаельно запускать каждый сайт (vhost) от отдельного пользователя и группы. Рекомендую обратить внимание на Apache: apache2-mpm-itk

    ОтветитьУдалить
  9. Спасибо за статью! Действительно, много необходимого в одном месте. Подписался на ваш блог.

    ОтветитьУдалить
  10. Вы можете описать процесс установки и настройки ssh на минимальный дистрибутив Дебиана?

    ОтветитьУдалить