Настройка Debian сервера на VPS

Моя шпоргалка по настройке Debian на DigitalOcean VPS в качестве сервера для сайтов и IRC-софта. Это не эталонная инструкция для всех и в некоторых деталях подходит только для меня. Читайте, вникайте и думайте, что делаете.

Содержание

  1. Обновление Debian
  2. Создание swap-файла
  3. Смена стандартного SSH-порта
  4. Настройка подключения к SSH по ключам
  5. Настройка параметров ядра в файле "sysctl.conf"
  6. Отключение лишних сервисов (утилита rcconf)
  7. Русифицикация консоли
  8. Настройка времени (часового пояса)
  9. Базовая настройка файерволла iptables
  10. Установка и настройка утилиты для защиты от брутфорса Fail2Ban
  11. Установка дополнительных утилит
  12. Установка и настройка веб-сервера Apache2
  13. Установка и настройка PHP интерпретатора
  14. Установка и настройка веб-сервера Nginx
  15. Установка и настройка утилиты для кэширования PHP-скриптов Eaccelerator
  16. Установка и настройка утилиты для кэширования Zend Optimizer Plus
  17. Установка и настройка сервера баз данных MySQL и веб-панели phpMyAdmin
  18. Установка и настройка почтового сервера Exim4
  19. Установка и настройка сервера ротации логов Logrotate
  20. Установка серверного JavaScript - Node.js
  21. Установка скриптового языка программирования TCL
  22. Настройка IPv6-туннеля
  23. Тесты скорости работы сервера
  1. Обновление Debian

    // Меняем источники обновления Debian
    // На всякий случай делаем копию файла "sources.list" и очищаем его
    cp /etc/apt/sources.list /etc/apt/sources.list.default && echo '' > /etc/apt/sources.list
    
    // Открываем файл "sources.list" для редактирования
    // Конфиг указан ниже
    nano /etc/apt/sources.list
    
    // Обновляем информацию о пакетах, содержащихся в репозиториях
    apt-get update
    
    // Обновляем пакеты, для которых в репозитории доступны новые версии
    apt-get upgrade
    показать файл "sources.list"
    deb http://mirror.yandex.ru/debian/ wheezy main contrib non-free
    deb-src http://mirror.yandex.ru/debian/ wheezy main contrib non-free
    
    deb http://security.debian.org/ wheezy/updates main contrib non-free
    deb-src http://security.debian.org/ wheezy/updates main contrib non-free
    
    deb http://nginx.org/packages/debian/ wheezy nginx
    deb-src http://nginx.org/packages/debian/ wheezy nginx


    версия ядра:
    uname -a
    , верcия Debian:
    lsb_release -a
  2. Создание swap-файла

    (нужен ли? за и против)
    // Создадим файл "swapfile" в корне системы размером 500мб (размер свапа обычно делают равному числу оперативной памяти)
    dd if=/dev/zero of=/swapfile bs=1M count=500
    
    // Делаем из файла "swapfile" swap-файл
    mkswap /swapfile && swapon /swapfile
    
    // Даем необходимые права файлу "swapfile"
    chown root:root /swapfile && chmod 0600 /swapfile
    
    // Добавляем в конец файла "/etc/fstab" упоминание о swap-файле, чтобы он не терялся при перезапуске системы
    echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
    Проверим наличие swap в системе командой
    free
  3. Смена стандартного SSH-порта

    (не обязательно)
    // Меняем в файле "/etc/ssh/sshd_config" порт 22 на порт 12345
    grep -lr -e 'Port 22' /etc/ssh/sshd_config | xargs sed -i 's/Port 22/Port 12345/g'
    
    // Перезапускаем SSH сервер
    service ssh restart
    При следующем подключении по SSH к серверу используем новый порт 12345.
  4. Настройка подключения к SSH по ключам

    (не обязательно)
    // Генерируем SSH-ключи
    ssh-keygen -t rsa -b 4096
    
    // Даем необходимые права директории "/root/.ssh/" и файлам "/root/.ssh/id_rsa" и "/root/.ssh/id_rsa.pub"
    chmod 0700 ~/.ssh/ && chmod 0600 ~/.ssh/id_rsa*
    
    // Подключаемся к этому же серверу для создания и копирования публичных ключей
    // 12345 - SSH порт, 1.2.3.4 - IP адрес сервера
    ssh-copy-id "-p 12345 root@1.2.3.4"
    
    // Даем необходимые права созданным ключам
    chmod 0600 ~/.ssh/authorized_keys
    Настройка Putty в Windows для работы с ключами
    1. С помощью WinSCP (или любого другого FTP клиента) скопируйте файл "/root/.ssh/id_dsa" на свой компьютер и добавьте расширение ".ppk", чтобы файл имел вид "id_rsa.ppk"
    2. Запустите puttygen.exe, выставьте настройки "SSH-2 RSA", "4096"
    3. Нажимаем "Load" и выбираем файл "id_rsa.ppk"
    4. После его загрузки нажимаем "Save private key" и сохраняем в любое место с расширением ".ppk"
    5. Запускаем putty.exe и в меню слева "Connection" -> "SSH" -> "Auth": в поле "Private key file for authentication" выбираем выше созданный файл
    6. "Connection" -> "Data": в поле "Auto-login username" вписываем "root"
    7. Переходим в "Session" и сохраняем все настройки - "Save"
    8. Теперь вход по SSH будет автоматический. Аналогично можно создать ключи для всех пользователей сервера. Файл "id_rsa.ppk" с компьютера можно удалить.
  5. Настройка параметров ядра в файле "sysctl.conf"

    // На всякий случай делаем копию файла "sysctl.conf" -> "sysctl.conf.default"
    cp /etc/sysctl.conf /etc/sysctl.conf.default
    
    // Очищаем файл "sysctl.conf"
    echo '' > /etc/sysctl.conf
    
    // Открываем файл "sysctl.conf" и вставляем в него строки, указанные ниже
    nano /etc/sysctl.conf
    
    // Применяем новые параметры
    sysctl -p
    Показать файл "sysctl.conf"
    // Uncomment the following to stop low-level messages on console
    #kernel.printk = 3 4 1 3
    
    // Защита от спуфинга
    net.ipv4.conf.all.rp_filter = 1
    net.ipv4.conf.default.rp_filter = 1
    
    // Защита от SYN-флуда
    net.ipv4.tcp_syncookies = 1
    
    // Отключаем перенаправление пакетов с одного сетевого интерфейса на другой
    net.ipv4.ip_forward = 0
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.default.send_redirects = 0
    #net.ipv6.conf.all.forwarding=0
    #net.ipv6.conf.default.forwarding=0
    
    # Против ICMP перенаправлений
    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.all.secure_redirects = 0
    net.ipv4.conf.all.accept_source_route = 0
    net.ipv4.conf.default.accept_source_route = 0
    #net.ipv6.conf.all.accept_source_route = 0
    #net.ipv6.conf.all.accept_redirects = 0
    #net.ipv6.conf.all.secure_redirects = 0
    
    # Log Martian Packets
    net.ipv4.conf.all.log_martians = 1
    
    # Защита от smurf-атак
    net.ipv4.icmp_echo_ignore_broadcasts = 1
    
    # Защита от неправильных ICMP-сообщений
    net.ipv4.icmp_ignore_bogus_error_responses = 1
    
    # Включаем ExecShield
    #kernel.exec-shield = 1
    
    kernel.randomize_va_space = 1
    
    net.core.netdev_max_backlog = 10000
    net.ipv4.tcp_window_scaling = 1
    
    # Увеличиваем число входящих соединений, которые могут стоять в очереди, прежде чем будут отброшены
    net.core.somaxconn = 65535
    
    # Максимальное число сокетов, находящихся в состоянии TIME-WAIT одновременно.
    # При превышении этого порога «лишний» сокет разрушается и пишется сообщение в системный журнал.
    # Цель этой переменной – предотвращение простейших разновидностей DoS-атак.
    net.ipv4.tcp_max_tw_buckets = 720000
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_fin_timeout = 30
    
    # Проверять TCP-соединение каждые 2 мин. Если на другой стороне - легальная машина,
    # она сразу ответит. Дефолтовое значение - 2 часа.
    net.ipv4.tcp_keepalive_time = 120
    
    # Повторить пробу через 30 секунд
    net.ipv4.tcp_keepalive_intvl = 30
    
    # Количество проверок перед закрытием соединения
    net.ipv4.tcp_keepalive_probes = 5
    
    # Переменная определяет максимальное время хранения SYN-запросов в памяти
    # до момента получения третьего, завершающего установление соединения, пакета
    net.ipv4.tcp_max_syn_backlog = 1024
    
    # Уменьшение времени удержания «полуоткрытых» соединений
    net.ipv4.tcp_synack_retries=1
    
    # Контролирует процент свободной памяти, при которой начнется активный сброс страниц в раздел swap.
    vm.swappiness=10
    
    # Digital Ocean
    net.core.wmem_max=12582912
    net.core.rmem_max=12582912
    net.ipv4.tcp_rmem= 10240 87380 12582912
    net.ipv4.tcp_wmem= 10240 87380 12582912
  6. Отключение лишних сервисов (утилита rcconf).

    • Устанавливаем утилиту
      apt-get install rcconf
    • Запускаем
      rcconf
    • Отключаем ненужные службы "acpid", "anacron", "atd", "console-setup", "kbd", "x11-common", "sudo"
    • Удаляем их
      apt-get purge consolekit anacron acpid console-setup kbd x11-common sudo
      (не обязательно)
  7. Русифицикация консоли

    (не обязательно)
    • Настраиваем языковые параметры
      dpkg-reconfigure locales
    • Активируем локали
      ru_RU.CP1251 CP1251
      и
      ru_RU.UTF-8 UTF-8
      , по-умолчанию выбираем
      ru_RU.UTF-8 UTF-8
    • При следующем подключении к серверу по SHH проверяем
      locale

      Результат:
      LANG=ru_RU.UTF-8
      LANGUAGE=
      LC_CTYPE="ru_RU.UTF-8"
      LC_NUMERIC="ru_RU.UTF-8"
      LC_TIME="ru_RU.UTF-8"
      LC_COLLATE="ru_RU.UTF-8"
      LC_MONETARY="ru_RU.UTF-8"
      LC_MESSAGES="ru_RU.UTF-8"
      LC_PAPER="ru_RU.UTF-8"
      LC_NAME="ru_RU.UTF-8"
      LC_ADDRESS="ru_RU.UTF-8"
      LC_TELEPHONE="ru_RU.UTF-8"
      LC_MEASUREMENT="ru_RU.UTF-8"
      LC_IDENTIFICATION="ru_RU.UTF-8"
      LC_ALL=
  8. Настройка времени (часового пояса)

    • Настраиваем
      dpkg-reconfigure tzdata
    • Проверяем
      date
      . Результат:
      Птн Фев 19 16:59:17 MSK 2014
  9. Базовая настройка файерволла iptables


    • Правила для IPv4
      // Установим Linux утилиту для загрузки правил файерволла из/в файлы, которые не будут теряться при перезапуске системы
      // После установки утилиты система предложит сохранить имеющиеся iptables правила в файлы "/etc/iptables/rules.v4" для IPv4 и "/etc/iptables/rules.v6" для IPv6
      // Можно сохранить и посмотреть, какие правила в системе уже имеются (по-умолчанию все порты открыты)
      apt-get install iptables-persistent
      
      // Очищаем файл с правилами для IPv4
      echo '' > /etc/iptables/rules.v4
      
      // Открываем для редактирования файл "/etc/iptables/rules.v4" и вставляем ниже приведенные базовые правила для IPv4
      nano /etc/iptables/rules.v4
      
      // Применяем правила для файерволла, указанные в файле "/etc/iptables/rules.v4"
      iptables-restore < /etc/iptables/rules.v4
      
      // Сохраняем изменения
      service iptables-persistent save
      Показать файл "rules.v4" (базовые правила для IPv4)
      *filter
      
      // входящие запрещены
      :INPUT DROP [0:0]
      
      // перенаправления запрещены
      :FORWARD DROP [0:0]
      
      // исходящие разрешены
      :OUTPUT ACCEPT [0:0]
      
      // локально разрешено всё
      -A INPUT -i lo -j ACCEPT
      
      // пинг и прочие icmp ответы сервера разрешены
      -A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 8 -j ACCEPT
      -A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 11 -j ACCEPT
      -A INPUT -p icmp -m state --state NEW -m icmp --icmp-type 3 -j ACCEPT
      
      // разрешены только установленные соединения
      -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
      
      // некорретные/ненужные пакеты запрещены
      -A INPUT -m state --state INVALID -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
      -A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
      
      // открываем доступ к 12345 порту (SSH) и 80 порту (Веб сервер)
      -A INPUT -p tcp -m tcp --dport 12345 -j ACCEPT
      -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
      
      COMMIT
    • Правила для IPv6 не работает!

      Показать файл "rules.v6" (базовые правила для IPv6)
      *filter
      :INPUT DROP [0:0]
      :FORWARD DROP [0:0]
      :OUTPUT ACCEPT [0:0]
      -A INPUT -i lo -j ACCEPT
      -A INPUT -p ipv6-icmp -j ACCEPT
      -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
      -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
      -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
      COMMIT
    • Примеры работы с iptables
      • Открыть порт 7676:
        iptables -A INPUT -p tcp -m tcp --dport 7676 -j ACCEPT
      • Открыть порт 3434 только для IP-адреса 1.2.3.4:
        iptables -A INPUT -s 1.2.3.4 -p tcp -m tcp --dport 3434 -j ACCEPT
      • Забанить IP-адрес 3.4.5.6:
        iptables -A INPUT -s 3.4.5.6 -j DROP
      • Удалить правило, созданное для порта 7676:
        iptables -D INPUT -p tcp -m tcp --dport 7676 -j ACCEPT
      • Перенаправление с порта 2323 на 4545:
        iptables -t nat -A PREROUTING -p tcp --dport 2323  -j REDIRECT --to-port 4545
      • Перенаправление с порта 2323 на удаленный сервер 1.2.3.4 на порт 7894:
        iptables -A PREROUTING -i eth0 -p tcp -m tcp --dport 3446 -j DNAT --to-destination 1.2.3.4:7894

      Для IPv6 вместо iptables используется ip6tables. Вместо одного IP-адреса можно подставлять подсети IP-адресов.
    • Сохранение iptables-правил в файлы
      • IPv4:
        iptables-save > /etc/iptables/rules.v4
      • IPv6:
        ip6tables-save > /etc/iptables/rules.v6
  10. Установка и настройка утилиты для защиты от брутфорса Fail2Ban



    Установка
    apt-get install fail2ban

    изучить сервис и его конфиг (/etc/fail2ban/jail.conf): https://zauris.ru/fail2ban.html
  11. Установка дополнительных утилит

    (не обязательно)
    • Компиляторы (make, c++, g++)
      apt-get install build-essential
    • Утилита для поиска неиспользуемых пакетов: установка
      apt-get install deborphan
      , использование
      deborphan
    • Диспетчер процессов (более информативный аналог "top"): установка
      apt-get install htop
      , использование
      htop
    • Сетевой диспетчер iftop: установка
      apt-get install iftop
      , использование
      iftop -NP
    • Файловый диспетчер Midnight Commander: установка
      apt-get install mc
      , использование
      mc
    • Сканер портов nmap: установка
      apt-get install nmap
      , использование
      nmap [флаги] хост
    • Утилита netcat, позволяющая передавать или принимать данные через TCP/UDP соединения: установка
      apt-get install netcat
      , примеры использования: раз, два, три, четыре, пять, шесть, семь (англ).
    • Консольный браузер lynx: установка
      apt-get install lynx
      , использование
      lynx сайт
  12. Установка и настройка веб-сервера Apache2

    • Создание пользователя и директорий под сайт
      // Создаем пользователя "dim", от которого будут работать сайты
      // не обзятельно, если в системе уже есть другой пользователь
      adduser dim
      
      // Создаем директорию "www", где будут находиться сайты пользователя "dim"
      mkdir /home/dim/www
      
      // Создаем директорию "dim.st", где будут находиться файлы сайта "dim.st"
      mkdir /home/dim/www/dim.st
      
      // Создаем директорию ".sys", в которой будут находиться логи веб-сервера, сессии и прочие системые файлы
      mkdir /home/dim/www/.sys
      
      // Создаем директории "logs" и "sessions", где будут храниться логи веб-сервера и файлы PHP сессий
      mkdir /home/dim/www/.sys/logs && mkdir /home/dim/www/.sys/sessions
      
      // Отдаем права на директорию "www" пользователю "dim"
      chown -R dim:dim /home/dim/www
    • Установка и настройка Apache2 как бэкенд в связке с Nginx
      // Установка Apache2 с модулем "itk", позволяющим запускать каждый сайт от отдельного пользователя
      // Если это не требуется, ставим более быстрый "apache2-mpm-prefork"
      apt-get install apache2-mpm-itk
      
      // Отключаем ненужные модули "status", "cgi", "alias", "autoindex", "negotiation", "setenvif"
      // Подробнее о модулях http://www.softtime.ru/forum/read.php?id_forum=5&id_theme=8359
      a2dismod status && a2dismod cgi && a2dismod alias && a2dismod autoindex && a2dismod negotiation && a2dismod setenvif
      
      // Включаем нужные модули "rewrite" и "expires"
      a2enmod rewrite && a2enmod expires
      
      // На всякий случай делаем копию файла "apache2.conf" с окончанем ".default"
      cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.default
      
      // Очищаем содержимое файла "apache2.conf", чтобы вставить туда свой конфиг
      echo '' > /etc/apache2/apache2.conf
      
      // Открываем файл "apache2.conf" для редактирования и вставляем ниже приведенный конфиг
      nano /etc/apache2/apache2.conf
      
      // В файле "ports.conf" меняем порт веб-сервера Apache c дефолтного 80 на 81
      // так как на основном 80 порту будет веб-сервер Nginx
      echo -e "NameVirtualHost *:81\nListen 81\n\n#\n#    Listen 443\n#\n" > /etc/apache2/ports.conf
      
      Показать файл "apache2.conf"
      ServerName dim.st
      
      LockFile ${APACHE_LOCK_DIR}/accept.lock
      
      PidFile ${APACHE_PID_FILE}
      
      User ${APACHE_RUN_USER}
      Group ${APACHE_RUN_GROUP}
      
      KeepAlive Off
      MaxKeepAliveRequests 0
      KeepAliveTimeout 5
      
      Timeout 120
      ServerLimit 100
      
      #<IfModule mpm_prefork_module>
      <IfModule mpm_itk_module>
          StartServers         5
          MinSpareServers      5
          MaxSpareServers      10
          MaxClients           100
          MaxRequestsPerChild  500
      </IfModule>
      
      AccessFileName .htaccess
      <Files ~ "^.ht">
          Order allow,deny
          Deny from all
          Satisfy all
      </Files>
      
      DefaultType None
      
      TraceEnable off
      HostnameLookups Off
      
      CustomLog /dev/null combined
      ErrorLog /dev/null
      LogLevel warn
      
      ServerSignature Off
      ServerTokens Prod
      
      <Directory "/usr/share/phpmyadmin">
       php_admin_value eaccelerator.enable 0
      </Directory>
      
      Include mods-enabled/*.load
      Include mods-enabled/*.conf
      Include ports.conf
      Include conf.d/
      Include sites-enabled/

      Документация по параметрам apache2.conf, Оптимизация производительности Apache
    • Добавление сайтов (виртуальных хостов)
      // Создаем файл "dim.st" с конфигурарацией сайта
      // Конфиг указан ниже
      nano /etc/apache2/sites-available/dim.st
      
      // Создаем файл "sys" с конфигурарацией сайта, доступного по IP-адресу сервера
      // Конфиг указан ниже
      nano /etc/apache2/sites-available/sys
      
      // Включаем сайты "dim.st" и "sys"
      a2ensite dim.st && a2ensite sys
      
      // Отключаем демонстрационный сайт "default" и удаляем его файлы
      a2dissite default && rm /etc/apache2/sites-available/default*
      
      // Удаляем демонстрационный приветственный файл "index.html" с содержанием "It works!"
      rm /var/www/index.html
      Показать файл "dim.st"
      // Указываем порт, на котором Apache2 будет работать
      <VirtualHost *:81>
      
       // Указываем название сайта
       ServerName dim.st
      
       // Алиас (второй адрес) сайта
       #ServerAlias dimlife.com
      
       // Email админа сайта
       ServerAdmin i@dim.st
      
       // Расположение директории с файлами сайта
       DocumentRoot /home/dim/www/dim.st
      
       // Расположение файла с логами ошибок веб-сервера
       ErrorLog /home/dim/www/.sys/logs/apache_error.log
      
       // Расположение файла с логами обращений к сайту
       // Это будет логировать Nginx
       #CustomLog /home/dim/www/.sys/logs/apache_access.log combined
      
       // Если Apache2 установлен с модулем "itk", то указываем, от какого пользователя запускать процессы веб-сервера
       // Если Apache2 установлен с модулем "prefork", то этот блок можно стереть
       <IfModule mpm_itk_module>
        AssignUserId dim dim
       </IfModule>
      </VirtualHost>


      Показать файл "sys"
      <VirtualHost *:81>
       ServerName 188.226.150.107
       ServerAdmin i@dim.st
       DocumentRoot /var/www
       ErrorLog /var/www/sys_apache_error.log
      <IfModule mpm_itk_module>
      AssignUserId root root
      </IfModule>
      </VirtualHost>
  13. Установка и настройка PHP интерпретатора

    // Установка PHP пакетов
    apt-get install php5 libapache2-mod-php5 php5-dev php5-cli php5-common php5-curl php5-gd
    
    // На всякий случай делаем копию файла "php.ini" с конфигом по-умолчанию
    cp /etc/php5/apache2/php.ini /etc/php5/apache2/php.ini.default
    
    // Очистим файл "php.ini"
    echo '' > /etc/php5/apache2/php.ini
    
    // Открываем файл "php.ini" для редактирования
    // Конфиг указан ниже
    nano /etc/php5/apache2/php.ini
    показать файл "php.ini"
    [PHP]
    ;user_ini.filename = ".user.ini"
    ;user_ini.filename =
    ;user_ini.cache_ttl = 300
    
    engine = On
    short_open_tag = On
    asp_tags = Off
    precision = 14
    output_buffering = 4096
    ;output_handler =
    
    zlib.output_compression = Off
    ;zlib.output_compression_level = -1
    ;zlib.output_handler =
    
    implicit_flush = Off
    unserialize_callback_func =
    serialize_precision = 17
    ;open_basedir =
    
    disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
    disable_classes =
    
    ;highlight.string  = #DD0000
    ;highlight.comment = #FF9900
    ;highlight.keyword = #007700
    ;highlight.default = #0000BB
    ;highlight.html    = #000000
    
    ;ignore_user_abort = On
    
    ;realpath_cache_size = 16k
    ;realpath_cache_ttl = 120
    
    zend.enable_gc = On
    ;zend.multibyte = Off
    ;zend.script_encoding =
    
    expose_php = Off
    
    max_execution_time = 86400
    max_input_time = 86400
    ;max_input_nesting_level = 64
    ; max_input_vars = 1000
    
    memory_limit = 512M
    
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
    display_errors = Off
    display_startup_errors = Off
    log_errors = On
    log_errors_max_len = 1024
    ignore_repeated_errors = Off
    ignore_repeated_source = Off
    
    report_memleaks = On
    ;report_zend_debug = 0
    track_errors = Off
    
    ;xmlrpc_errors = 0
    ;xmlrpc_error_number = 0
    
    html_errors = On
    
    ;docref_root = "/phpmanual/"
    ;docref_ext = .html
    
    ;error_prepend_string = "<span style='color: #ff0000'>"
    ;error_append_string = "</span>"
    ;error_log = php_errors.log
    
    ;arg_separator.output = "&"
    ;arg_separator.input = ";&"
    
    variables_order = "GPCS"
    request_order = "GP"
    
    register_argc_argv = Off
    auto_globals_jit = On
    ;enable_post_data_reading = Off
    
    post_max_size = 100M
    
    auto_prepend_file =
    auto_append_file =
    
    default_mimetype = "text/html"
    ;default_charset = "UTF-8"
    
    ;always_populate_raw_post_data = On
    ;include_path = ".:/usr/share/php"
    
    doc_root =
    user_dir =
    ;extension_dir = "./"
    
    enable_dl = Off
    
    ;cgi.force_redirect = 1
    ;cgi.nph = 1
    ;cgi.redirect_status_env = ;
    ;cgi.fix_pathinfo=1
    ;fastcgi.impersonate = 1;
    ;fastcgi.logging = 0
    ;cgi.rfc2616_headers = 0
    
    file_uploads = On
    ;upload_tmp_dir =
    upload_max_filesize = 100M
    max_file_uploads = 20
    allow_url_fopen = On
    allow_url_include = Off
    
    ;from="john@doe.com"
    ;user_agent="PHP"
    default_socket_timeout = 60
    ;auto_detect_line_endings = Off
    
    [CLI Server]
    cli_server.color = On
    
    [Date]
    date.timezone = Asia/Yekaterinburg
    ;date.default_latitude = 31.7667
    ;date.default_longitude = 35.2333
    ;date.sunrise_zenith = 90.583333
    ;date.sunset_zenith = 90.583333
    
    [filter]
    ;filter.default = unsafe_raw
    ;filter.default_flags =
    
    [iconv]
    ;iconv.input_encoding = ISO-8859-1
    ;iconv.internal_encoding = ISO-8859-1
    ;iconv.output_encoding = ISO-8859-1
    
    [intl]
    ;intl.error_level = E_WARNING
    
    [sqlite]
    ;sqlite.assoc_case = 0
    
    [sqlite3]
    ;sqlite3.extension_dir =
    
    [Pcre]
    ;pcre.backtrack_limit=100000
    ;pcre.recursion_limit=100000
    
    [Pdo]
    ;pdo_odbc.connection_pooling=strict
    ;pdo_odbc.db2_instance_name
    
    [Pdo_mysql]
    pdo_mysql.cache_size = 2000
    pdo_mysql.default_socket=
    
    [Phar]
    ;phar.readonly = On
    ;phar.require_hash = On
    ;phar.cache_list =
    
    [mail function]
    SMTP = localhost
    smtp_port = 25
    sendmail_from = bot@dim.st
    sendmail_path = /usr/sbin/exim4 -t
    ;mail.force_extra_parameters =
    mail.add_x_header = On
    ;mail.log =
    
    [SQL]
    sql.safe_mode = Off
    
    [ODBC]
    ;odbc.default_db    =  Not yet implemented
    ;odbc.default_user  =  Not yet implemented
    ;odbc.default_pw    =  Not yet implemented
    ;odbc.default_cursortype
    odbc.allow_persistent = On
    odbc.check_persistent = On
    odbc.max_persistent = -1
    odbc.max_links = -1
    odbc.defaultlrl = 4096
    odbc.defaultbinmode = 1
    ;birdstep.max_links = -1
    
    [Interbase]
    ibase.allow_persistent = 1
    ibase.max_persistent = -1
    ibase.max_links = -1
    ;ibase.default_db =
    ;ibase.default_user =
    ;ibase.default_password =
    ;ibase.default_charset =
    ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
    ibase.dateformat = "%Y-%m-%d"
    ibase.timeformat = "%H:%M:%S"
    
    [MySQL]
    mysql.allow_local_infile = On
    mysql.allow_persistent = On
    mysql.cache_size = 2000
    mysql.max_persistent = -1
    mysql.max_links = -1
    mysql.default_port =
    mysql.default_socket =
    mysql.default_host =
    mysql.default_user =
    mysql.default_password =
    mysql.connect_timeout = 60
    mysql.trace_mode = Off
    
    [MySQLi]
    mysqli.max_persistent = -1
    ;mysqli.allow_local_infile = On
    mysqli.allow_persistent = On
    mysqli.max_links = -1
    mysqli.cache_size = 2000
    mysqli.default_port = 3306
    mysqli.default_socket =
    mysqli.default_host =
    mysqli.default_user =
    mysqli.default_pw =
    mysqli.reconnect = Off
    
    [mysqlnd]
    mysqlnd.collect_statistics = On
    mysqlnd.collect_memory_statistics = Off
    ;mysqlnd.net_cmd_buffer_size = 2048
    ;mysqlnd.net_read_buffer_size = 32768
    
    [OCI8]
    ;oci8.privileged_connect = Off
    ;oci8.max_persistent = -1
    ;oci8.persistent_timeout = -1
    ;oci8.ping_interval = 60
    ;oci8.connection_class =
    ;oci8.events = Off
    ;oci8.statement_cache_size = 20
    ;oci8.default_prefetch = 100
    ;oci8.old_oci_close_semantics = Off
    
    [PostgreSQL]
    pgsql.allow_persistent = On
    pgsql.auto_reset_persistent = Off
    pgsql.max_persistent = -1
    pgsql.max_links = -1
    pgsql.ignore_notice = 0
    pgsql.log_notice = 0
    
    [Sybase-CT]
    sybct.allow_persistent = On
    sybct.max_persistent = -1
    sybct.max_links = -1
    sybct.min_server_severity = 10
    sybct.min_client_severity = 10
    ;sybct.timeout=
    ;sybct.packet_size
    ;sybct.login_timeout=
    ;sybct.hostname=
    ;sybct.deadlock_retry_count=
    
    [bcmath]
    bcmath.scale = 0
    
    [browscap]
    browscap = /etc/php5/apache2/full_php_browscap.ini
    
    [Session]
    session.save_handler = files
    session.save_path = "/home/dim/www/.sys/sessions"
    session.use_cookies = 1
    ;session.cookie_secure =
    session.use_only_cookies = 1
    session.name = ID
    session.auto_start = 0
    session.cookie_lifetime = 315360000
    session.cookie_path = /
    session.cookie_domain =
    session.cookie_httponly =
    session.serialize_handler = php
    session.gc_probability = 0
    session.gc_divisor = 1000
    session.gc_maxlifetime = 315360000
    session.bug_compat_42 = Off
    session.bug_compat_warn = Off
    session.referer_check =
    ;session.entropy_length = 32
    ;session.entropy_file = /dev/urandom
    session.cache_limiter = nocache
    session.cache_expire = 180
    session.use_trans_sid = 0
    session.hash_function = 0
    session.hash_bits_per_character = 5
    url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
    ;session.upload_progress.enabled = On
    ;session.upload_progress.cleanup = On
    ;session.upload_progress.prefix = "upload_progress_"
    ;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
    ;session.upload_progress.freq =  "1%"
    ;session.upload_progress.min_freq = "1"
    
    [MSSQL]
    mssql.allow_persistent = On
    mssql.max_persistent = -1
    mssql.max_links = -1
    mssql.min_error_severity = 10
    mssql.min_message_severity = 10
    mssql.compatability_mode = Off
    ;mssql.connect_timeout = 5
    ;mssql.timeout = 60
    ;mssql.textlimit = 4096
    ;mssql.textsize = 4096
    ;mssql.batchsize = 0
    ;mssql.datetimeconvert = On
    mssql.secure_connection = Off
    ;mssql.max_procs = -1
    ;mssql.charset = "ISO-8859-1"
    
    [Assertion]
    ;assert.active = On
    ;assert.warning = On
    ;assert.bail = Off
    ;assert.callback = 0
    ;assert.quiet_eval = 0
    
    [COM]
    ;com.typelib_file =
    ;com.allow_dcom = true
    ;com.autoregister_typelib = true
    ;com.autoregister_casesensitive = false
    ;com.autoregister_verbose = true
    ;com.code_page=
    
    [mbstring]
    ;mbstring.language = Japanese
    ;mbstring.internal_encoding = EUC-JP
    ;mbstring.http_input = auto
    ;mbstring.http_output = SJIS
    ;mbstring.encoding_translation = Off
    ;mbstring.detect_order = auto
    ;mbstring.substitute_character = none;
    ;mbstring.func_overload = 0
    ;mbstring.strict_detection = Off
    ;mbstring.http_output_conv_mimetype=
    
    [gd]
    ;gd.jpeg_ignore_warning = 0
    
    [exif]
    ;exif.encode_unicode = ISO-8859-15
    ;exif.decode_unicode_motorola = UCS-2BE
    ;exif.decode_unicode_intel    = UCS-2LE
    ;exif.encode_jis =
    ;exif.decode_jis_motorola = JIS
    ;exif.decode_jis_intel    = JIS
    
    [Tidy]
    ;tidy.default_config = /usr/local/lib/php/default.tcfg
    tidy.clean_output = Off
    
    [soap]
    soap.wsdl_cache_enabled=1
    soap.wsdl_cache_dir="/tmp"
    soap.wsdl_cache_ttl=86400
    soap.wsdl_cache_limit = 5
    
    [sysvshm]
    ;sysvshm.init_mem = 10000
    
    [ldap]
    ldap.max_links = -1
    
    [mcrypt]
    ;mcrypt.algorithms_dir=
    ;mcrypt.modes_dir=
    
    [dba]
    ;dba.default_handler=
    
    cgi.fix_pathinfo=0
    
    ;extension=pdo_sqlite.so
    ;extension=sqlite3.so
  14. Установка и настройка веб-сервера Nginx

    • Установка и настройка Nginx как фронтенд для Apache2
      // Устанавливаем Nginx
      // В "etc/apt/sources.list" должны быть ссылки на Nginx, иначе пакет будет не найден
      apt-get install nginx
      
      // Создаем директории под конфигурации сайтов
      mkdir /etc/nginx/sites-available && mkdir /etc/nginx/sites-enabled
      
      // Очищаем содержимое файла "nginx.conf"
      echo '' > /etc/nginx/nginx.conf
      
      // Заполняем файл "nginx.conf"
      // Конфиг указан ниже
      nano /etc/nginx/nginx.conf
      
      // Создаем файл "proxy.conf", в котором указаны правила перенаправления запросов с Nginx на Apache2
      // Конфиг указан ниже
      nano /etc/nginx/proxy.conf
      Показать файл "nginx.conf"
      user www-data;
      worker_processes  1;
      error_log /home/dim/www/.sys/logs/nginx_error.log;
      pid /var/run/nginx.pid;
      events { worker_connections 512; }
      
      http
      {
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
        access_log /home/dim/www/.sys/logs/nginx_access.log;
        #error_page 403 =403 /.pages/403.html;
        #error_page 404 =404 /.pages/404.html;
        sendfile on;
        tcp_nopush on;
        server_tokens off;
        keepalive_timeout 2;
        tcp_nodelay on;
        gzip on;
        gzip_comp_level 5;
        gzip_proxied any;
        gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
        #proxy_cache_path /var/cache/nginx levels=2 keys_zone=pagecache:5m inactive=10m max_size=50m;
        #include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
      }
      


      Показать файл "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 100m;
      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;
    • Создание сайтов (виртуальных хостов)
      // Создаем файл "dim.st" c конфигурацией сайта
      // Конфиг указан ниже
      nano /etc/nginx/sites-available/dim.st
      
      // Создаем симлинк (ссылка, ярлык) сайта "dim.st", тем самым "включаем" сайт
      ln -s /etc/nginx/sites-available/dim.st /etc/nginx/sites-enabled/dim.st
      
      // Создаем файл "sys" с конфигурарацией сайта, доступного по IP-адресу сервера
      // Конфиг указан ниже 
      nano /etc/nginx/sites-available/sys
      
      // Создаем симлинк (ссылка, ярлык) сайта "sys", тем самым "включаем" сайт
      ln -s /etc/nginx/sites-available/sys /etc/nginx/sites-enabled/sys
      
      // Устанавливаем модуль "rpaf"
      // По-умолчанию Nginx передает Apache2 не IP пользователя, посетившего сайт, а IP самого сервера из за особенностей проксирования
      // Для решения этой особенности используется модуль "rpaf" для веб-сервера Apache2
      apt-get install libapache2-mod-rpaf
      
      // Cоздадим файл ".htpasswd", в котором будет находиться логин "dim" и пароль,
      // по которым будет осуществляться доступ к системному сайту
      htpasswd -c /var/www/.htpasswd dim
      
      // Перезапускаем веб-сервер Nginx
      service nginx restart
      Показать файл "dim.st"
      server
      {
        listen 80;
        listen [::]:80;
        server_name dim.st dimlife.com www.dim.st www.dimlife.com;
        access_log /home/dim/www/.sys/logs/dim-st_nginx_access.log;
        error_log /home/dim/www/.sys/logs/dim-st_nginx_error.log;
      
        location /
        {
          if ($request_method !~ ^(GET|HEAD|POST)$) { return 444; }
          if ($host !~ ^(dim.st|dimlife.com|www.dim.st|www.dimlife.com)$) { return 444; }
          if ($host = 'www.dimlife.com') { rewrite  ^(.*)$  http://dim.st$1  permanent; }
          if ($host = 'www.dim.st') { rewrite  ^(.*)$  http://dim.st$1  permanent; }
          if ($host = 'dimlife.com') { rewrite  ^(.*)$  http://dim.st$1  permanent; }
          if ($http_user_agent ~* "libwww-perl") { return 444; }
          if ($http_user_agent ~* "WebDAV") { return 444; }
          if ($http_host ~* "^188.226.150.107") { return 444; }
      
          proxy_pass http://127.0.0.1:81/;
          include /etc/nginx/proxy.conf;
        }
      
        location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt|ttf|woff)$
        {
          root /home/dim/www/dim.st/;
          rewrite ^/-img/(.*)$ /.imgs/$1;
          rewrite ^/-css/(.*)$ /.styles/$1;
          rewrite ^/-js/(.*)$ /.scripts/$1;
          rewrite "^/i([0-9]{5})\.(png|PNG|jpg|JPG|gif|GIF|jpeg|JPEG|bmp|BMP)$" /.upimgs/$1.$2;
         expires 7d;
        }
      
        #proxy_cache_valid 200 301 302 304 5m;
        #proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
        #proxy_hide_header "Set-Cookie";
        #proxy_ignore_headers "Cache-Control" "Expires";
        #proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
        #proxy_cache pagecache;
      }


      Показать файл "sys"
      server
      {
        listen 80;
        listen [::]:80;
        server_name 188.226.150.107;
      
        access_log /var/www/sys_nginx_access.log;
        error_log /var/www/sys_nginx_error.log;
      
        location /
        {
          auth_basic "dim.st";
          auth_basic_user_file /var/www/.htpasswd;
          proxy_pass http://127.0.0.1:81/;
          include /etc/nginx/proxy.conf;
        }
        
        location ~ /\.ht { deny all; }
      }
  15. Установка и настройка утилиты для кэширования PHP-скриптов Eaccelerator

    (не обязательно)

    Eaccelerator - расширение для PHP, основное назначение которого - увеличение производительности интерпретатора при обработке сценариев путем кэширования их байт-кода.

    //Переходим в директорию "/usr/local"
    cd /usr/local
    
    // Скачиваем с GitHub'а Eaccelerator и переходим в скачанную директорию
    git clone https://github.com/eaccelerator/eaccelerator.git && cd eaccelerator
    
    // Подготовка PHP
    phpize
    
    // конфигурация, компиляция, тест, установка Eaccelerator
    ./configure && make && make test && make install
    
    // Открываем файл "php.ini" и добавляем конфигурацию Eaccelerator'a в конец файла
    // Конфиг указан ниже
    nano /etc/php5/apache2/php.ini
    
    // Cоздаем директорию под кэш и даём необходимые права на запись
    mkdir cache && chmod 0777 cache
    
    // Cоздаем директорию для панели управления Eaccelerator
    mkdir /var/www/ea
    
    // Копируем PHP-скрипт панели управления Eaccelerator в директорию
    // системного сайта, доступного только по IP-адресу сервера http://1.2.3.4/ea/
    cp control.php /var/www/ea/index.php
    
    // Перезапускаем веб-сервер Apache2
    service apache2 restart
    Показать конфигурацию Eaccelerator'a
    [eaccelerator]
    extension = eaccelerator.so
    eaccelerator.shm_size = 10
    eaccelerator.cache_dir = /usr/local/eaccelerator/cache
    eaccelerator.enable = 1
    eaccelerator.optimizer = 1
    eaccelerator.check_mtime = 1
    eaccelerator.debug = 0
    ;eaccelerator.filter=
    eaccelerator.shm_max = 0
    eaccelerator.shm_ttl = 3600
    eaccelerator.shm_prune_period = 1800
    eaccelerator.shm_only = 0
    eaccelerator.compress = 1
    eaccelerator.compress_level = 9
    ;eaccelerator.keys = disk_only
    ;eaccelerator.sessions = disk_only
    ;eaccelerator.content = disk_only
    eaccelerator.allowed_admin_path = /var/www/ea/index.php

    Для проверки успешной активации Eaccelerator'a создадим PHP-файл с содержимым
    <?php phpinfo();?>
    и откроем его в браузере

    Если найдём в нём строки:

    This program makes use of the Zend Scripting Language Engine:
    Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
        with eAccelerator v1.0-dev, Copyright (c) 2004-2012 eAccelerator, by eAccelerator

    Значит Eaccelerator успешно установлен.

  16. Установка и настройка утилиты для кэширования Zend Optimizer Plus

    (не обязательно) вызвал проблемы у nginx

    Zend Optimizer - модуль для PHP, который немного ускоряет обработку PHP-скриптов засчет кэширования.

    //Переходим в директорию "/usr/local"
    cd /usr/local
    
    // Скачиваем с GitHub'а Zend Optimizer Plus и переходим в скачанную директорию
    git clone https://github.com/zendtech/ZendOptimizerPlus.git && cd ZendOptimizerPlus
    
    // Подготовка PHP
    phpize
    
    // конфигурация, компиляция, тест Zend Optimizer'а
    ./configure && make && make test
    
    // Копируем модуль Zend Optimizer'а в директорию модулей PHP
    // Название директории "20100525+lfs" может быть иным
    cp .libs/opcache.so /usr/lib/php5/20100525+lfs/opcache.so
    
    // Открываем файл "php.ini" и добавляем конфигурацию Zend Optimizer'а в конец файла
    // Конфиг указан ниже
    nano /etc/php5/apache2/php.ini
    
    // Перезапускаем веб-сервер Apache2
    service apache2 restart
    Показать конфигурацию Zend Optimizer'a
    [zend]
    zend_extension=/usr/lib/php5/20100525+lfs/opcache.so
    zend_optimizerplus.memory_consumption=128
    zend_optimizerplus.interned_strings_buffer=8
    zend_optimizerplus.max_accelerated_files=4000
    zend_optimizerplus.revalidate_freq=60
    zend_optimizerplus.save_comments=0
    zend_optimizerplus.fast_shutdown=1
    zend_optimizerplus.enable_file_override=1
    zend_optimizerplus.enable_cli=1


    Для проверки успешной активации Zend Optimizer'a создадим PHP-файл с содержимым
    <?php phpinfo();?>
    и откроем его в браузере

    Если найдём в нём строки:

    This program makes use of the Zend Scripting Language Engine:
    Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
        with eAccelerator v1.0-dev, Copyright (c) 2004-2012 eAccelerator, by eAccelerator
        with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

    Значит Eaccelerator успешно установлен.

  17. Установка и настройка сервера баз данных MySQL и веб-панели phpMyAdmin

    // Устанавливаем MySQL сервер и клиент, необходимые пакеты для PHP и phpMyAdmin
    apt-get install mysql-server mysql-client php5-mysql libapache2-mod-php5 libapache2-mod-auth-mysql libmysqlclient-dev phpmyadmin
    
    // Удаляем конфигурационный файл веб-панели "phpmyadmin.conf"
    rm /etc/apache2/conf.d/phpmyadmin.conf
    
    // Копируем директорию с файлами веб-панели "phpmyadmin" в директорию
    // системного сайта, доступного только по IP-адресу сервера http://1.2.3.4/pma/
    cp -r /usr/share/phpmyadmin /var/www/pma
    
    // создаем директорию "/var/www/sessions" для хранения файлов сессий phpMyAdmin'a
    mkdir /var/www/sessions
    
    // создаем файл "/var/www/.htaccess", в котором указываем место хранения файлов сессий системного сайта
    echo 'php_value session.save_path /var/www/sessions' > /var/www/.htaccess
    
    // перезапускаем веб-сервер Apache2
    service apache2 restart
    
    // Настраиваем безопасность MySQL-сервера: смена пароля root'a, удаленный
    // доступ root'a, удаление тестовой базы, удаление анонимных пользователей
    // Подробнее http://serveradministrator.ru/mysql/mysql-secure-installation/
    mysql_secure_installation
    Работа с MySQL в консоли
    • Настройки безопасности MySQL-сервера
      mysql_secure_installation
    • Подключение к MySQL-серверу как пользователь "vasya"
      mysql -uvasya -p
    • Создание базы данных "test"
      CREATE DATABASE test;
    • Создание пользователя "vasya" с паролем "pass" и выдача ему полных прав на управление базой данных "test"
      GRANT ALL PRIVILEGES ON test.* TO 'vasya'@'%' IDENTIFIED BY 'pass' WITH GRANT OPTION;
    • Обновить привилегии пользователей
      FLUSH PRIVILEGES;
    • Выйти из mysql
      quit
    • Перейти к базе данных "test"
      use test;
    • Загрузить в базу данных "test" дамп из файла "bd.sql"
      \. /путь/до/bd.sql
      (перед точной обратный слеш \)
    • Показать все таблицы базы данных "test"
      show tables;
    • Показать содержимое таблицы "table"
      select * from table;
    • Проверить на ошибки базу данных "test"
      mysqlcheck -o test;
  18. Установка и настройка почтового сервера Exim4

    // Устанавливаем Exim4
    apt-get install exim4
    
    // Настраиваем exim4 (подробнее http://lib.clodo.ru/email/exim_debian.html)
    // Ответы на вопросы ниже
    dpkg-reconfigure exim4-config
    
    // Открываем файл "/etc/email-addresses" для редактирования, в котором указываются
    // пользователи и соответствующие им email-адреса, которые будут указываться
    // по-умолчанию в параметре "From" (От кого)
    // Конфиг указан ниже
    nano /etc/email-addresses
    Ответы на вопросы при dpkg-reconfigure
    1 -> [1]
    2 -> dim.st
    3 -> 127.0.0.1; ::1
    4 -> dim.st; dimlife.com
    5 -> [пусто]
    6 -> [пусто]
    7 -> [нет]
    8 -> [1]
    9 -> [нет]
    10 -> i@dim.st


    Показать файл "email-addresses"
    root: bot@dim.st
    www-data: bot@dim.st
    dim: bot@dim.st


    Проверка работы почтового сервера:
    echo 'сообщение' | mail -s тест test@mail.ru
    - отправить email с темой "тест", сообщением "сообщение" на email-адрес "test@mail.ru"
  19. Установка и настройка сервера ротации логов Logrotate

    (не обязательно)

    Программа для управления лог-файлами, которая автоматически архивирует, удаляет и очищает их.

    // Устанавливаем Logrotate
    apt-get install logrotate 
    
    // Создаем файл "/etc/logrotate.d/nginx" c настройками ротации логов веб-сервера Nginx
    // Конфиг указан ниже
    nano /etc/logrotate.d/nginx
    
    // Проверяем выше созданный файл на ошибки
    logrotate -d /etc/logrotate.d/nginx
    
    // Запускаем ротацию логов веб-сервера Nginx
    logrotate -v -f /etc/logrotate.d/nginx
    Показать файл ротации логов "nginx"
    /home/dim/www/.sys/logs/*.log
    {
      daily
      rotate 3
      missingok
      notifempty
      #compress
      sharedscripts
      create 640 www-data www-data
      postrotate
      [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript
    }
  20. Установка серверного JavaScript - Node.js

    (не обязательно)

    Первый вариант

    // Устанавливаем утилиту для работы с URL в командной строке
    apt-get install curl
    
    // Переходим в директорию "/usr/local/src"
    cd /usr/local/src
    
    // Скачиваем архив с последней версией Node.js
    wget http://nodejs.org/dist/node-latest.tar.gz
    
    // Распаковываем скачанный архив и переходим в распакованную директорию
    tar -xf node-latest.tar.gz && cd node-v*
    
    // Конфигурируем, компилируем и устанавливаем Node.js
    ./configure && make && make install
    
    // Даем права пользователю "dim", от которого будут работать Node.js скрипты
    chown -R dim /usr/local
    
    // Скачиваем файл "install.sh" - установщик пакетного менеджера для Node.js "NPM"
    wget --no-check-certificate http://npmjs.org/install.sh
    
    // Даем файлу "install.sh" права на выполнение и запускаем его
    chmod +x install.sh && ./install.sh

    Второй вариант

    // Скачиваем и запускаем установщик Node.js
    curl -sL https://deb.nodesource.com/setup_6.x | bash -
    
    // Устанавливаем Node.js как пакет
    apt-get install -y nodejs
  21. Установка скриптового языка программирования TCL

    (не обязательно)
    // Переходим в директорию "/tmp"
    cd /tmp
    
    // Скачиваем TCL
    // 8.5 или
    ftp://ftp.tcl.tk/pub/tcl/tcl8_5/tcl8.5.19-src.tar.gz
    // 8.6
    ftp://ftp.tcl.tk/pub/tcl/tcl8_6/tcl8.6.6-src.tar.gz
    
    // Распаковываем скачанный архив
    tar -zxf tcl* && cd tcl*/unix
    
    // Конфигурируем, компилируем и устанавливаем TCL
    ./configure && make && make install
  22. Настройка IPv6-туннеля

    (не обязательно)
  23. Тесты скорости работы сервера

    (не обязательно)

    Для оценки производительности сервера нужно проводить тесты параллельно на двух разных серверах и сравнивать результаты между собой

    • Консольный аналог speedtest.net для проверки скорости загрузки и скачивания на сервере
      Установка
      apt-get install python-pip && pip install speedtest-cli

      Запуск:
      speedtest
    • Проверка скорости загрузки с помощью утилиты "wget"
      wget http://mirror.yandex.ru/freebsd/releases/amd64/11.0-RELEASE/src.txz
    • Проверка пинга, например, до Яндекса
      ping -c 5 ya.ru
    • Проверка скорости работы жёсткого диска помощью утилиты "dd"
      На диск запишем файл размером 1гб
      dd if=/dev/zero of=testfile bs=64k count=16k conv=fdatasync

      Узнаем скорость чтения записанного файла
      dd if=testfile of=/dev/null bs=64k

      Удаляем файл
      rm testfile