Настройка web-сервера на основе VPS/VDS в Ubuntu/Debian

Если уж судьба заставила вас променять обычный хостинг на VDS, для размещения ваших интернет-ресурсов, это скорее всего значит что ваши сайты стали слишком прожорливы и требовательны к ресурсам хостинга. Что ж, есть в этом и свои плюсы, но теперь вам предстоит самому настроить программное обеспечение для организации web-сервера. Большинство провайдеров в комплекте к VDS выдают настроенную OS и удобную хост-панель, но максимальной производительности и стабильности с дефолтными настройками не добьешься.

Собственно я решил поделиться своим опытом в построении полноценного и быстрого веб-сервера. Все в одной статье вместить будет сложно, поэтому я решил написать несколько отдельных статей, касающихся данной темы: настройка LAMP, FTP, ведение статистики, оптимизация быстродействия и т.п.

В данной статье я опишу настройку основных компонентов веб-сервера и некоторых дополнительных полезных вещей, а именно:

  • Apache 2
  • PHP 5
  • MySQL 5
  • phpMyAdmin
  • Nginx
  • Memcached
  • XCache
  • Zend Optimizer

Для своих серверов я использую Debian Lenny, поэтому настройку буду описывать именно для этого дистрибутива, но данные инструкции будут практически идентичны для Ubuntu, за исключением некоторых нюансов, которые я также постараюсь упомянуть.

Итак, у нас есть чистый Дебиан или Убунту. Легким движением руки установим Apache, PHP и MySQL:

$ sudo apt-get install apache2 php5 php5-mysql mysql-server mysql-client phpmyadmin

В процессе установки конфигуратор попросит задать пароль администратора MySQL.

Вбиваем в браузере IP сервера и должны увидеть что-то типа «It works!» обрадовавшись тому что все работает, пробуем залогиниться в май админ:

http://адрес_сервера/phpmyadmin

Вводим root и пароль который задавали выше. Если залогинись — значит Apache, PHP и MySQL работают нормально.

примечание: в некоторых предыдущих версиях Ubuntu (8.04, 8.10 и т.п.) при установке phpMyAdmin не прописывает автоматически свои настройки в Apache, поэтому нужно сделать это вручную:

$ sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf.d/phpmyadmin.conf

и перезапустить Апач:

$ sudo /etc/init.d/apache2 restart

Далее установим Nginx. Объясню в двух словах что это такое и зачем оно нам. Nginx — это веб-сервер более легкий и быстрый чем Apache, это значит что он быстрее обрабатывает запросы и кушает меньше ресурсов, но при этом имеет меньше возможностей. В нашем случае, Nginx будет делать то, что у него лучше всего получается — отдавать статику (картинки, текст, видео, флеш и т.п.) Apache будет заниматься только обработкой PHP.

Итак установим же его если он такой классный :) В репозиториях как правило лежит старая версия пакета, поэтому качаем новый пакет отсюда:

http://ftp.de.debian.org/debian/pool/main/n/nginx/

выбираем последнюю стабильную версию для своей архитектуры, качаем и устанавливаем:

$ wget http://ftp.de.debian.org/debian/pool/main/n/nginx/nginx_0.7.67-1_amd64.deb
$ sudo dpkg -i nginx_*.deb

или же лезем на http://nginx.org/ качаем самый новый исходник и собираем Nginx руками, но я не сильно люблю таким страдать.
Также нужно установить модуль «mod_rpaf» для Apache, что бы он смог работать в паре с Nginx:

$ sudo apt-get install libapache2-mod-rpaf

Далее нам нужно сделать так, что бы Nginx слушал 80 порт и отдавал клиентам статику, а запросы к PHP-скриптам передавал на обработку Апачу. Для этого открываем своим любимым редактором (я использую nano) конфиг Апача и вешаем его на другой порт:

$ sudo nano /etc/apache2/ports.conf

там где «Listen *:80» вместо 80 пишем любой другой свободный порт например:

Listen *:8080

сразу же настроим виртуалхост:

$ sudo nano /etc/apache2/sites-available/default

Не буду описывать все тонкости настройки виртуалхостов и директорий в Apache, может когда-то напишу отдельную статью по этому поводу, а сейчас рассмотрим только общий случай настройки дефолтного виртуалхоста под себя:

#ip адрес и порт
<VirtualHost *:8080>

#имя виртуалхоста
ServerName www.example.com

#псевдонимы, их может быть несколько через пробел
ServerAlias example.com

#почта вебмастера
ServerAdmin webmaster@example.com

#корневая папка сайта
DocumentRoot /var/www/example.com

#настройки корневой директории сайта
<Directory /var/www/example.com>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

#куда писать логи данного виртуалхоста
ErrorLog /var/log/apache2/error.log

LogLevel warn
############
ServerSignature On

</VirtualHost>

Теперь настроим Nginx. Открываем главный конфиг:

$ sudo nano /etc/nginx/nginx.conf

и приводим его примерно к следующему виду:

user  www www;

#------------------------------
worker_processes  4;
#------------------------------
error_log  /var/log/nginx.error_log  info;

pid /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
#------------------------------
    server_names_hash_bucket_size 64;
#------------------------------
    access_log  /var/log/nginx/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;
#------------------------------
    gzip                on;
    gzip_proxied        any;
    gzip_min_length     1100;
    gzip_http_version   1.0;
    gzip_buffers        4 8k;
    gzip_comp_level     7;
    gzip_types          text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
#------------------------------
    output_buffers   1 32k;
    postpone_output  1460;

    sendfile         on;
    tcp_nopush       on;
    tcp_nodelay      on;
    send_lowat       12000;

    keepalive_timeout  75 20;
}

параметры, которые отличаются от стандартного конфига я отметил с помощью «#———» и выделил курсивом.

Настроим виртуалхост для Nginx:

server {
        listen        80;
# имя сервера
        server_name   example.com  www.example.com;

# путь к логам
        access_log   /var/log/nginx.access_log;

        location / {

# путь к корневой папке сайта
            root               /var/www/example.com;

# передаем обработку php апачу
            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;

            proxy_connect_timeout      60;
            proxy_send_timeout         90;
            proxy_read_timeout         90;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
        }

# отдаем статику nginx
        location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx)$ {
            root         /var/www/example.com;
            access_log   off;
            expires      30d;
     }

}

Более подробную информацию по настройке Nginx и виртуалхоста к нему можно найти по адресу http://sysoev.ru/nginx/.

Проверим правильность синтаксиса конфигов Nginx:

$ nginx -t

Установка memcached на данном этапе сводится к одной команде:

$ sudo apt-get install memcached

Файл конфигурации memcached находится по адресу /etc/php5/conf.d/memcache.ini но я оставил дефолтные настройки.

Теперь установим парочку расширений для PHP — XCache и Zend Optimizer.

XCache — это дополнение к PHP, которое ускоряет обработку PHP-скриптов путем кэширования их байт-кода в оперативной памяти. Устанавливаем:

$ sudo apt-get install php5-xcache

Для настройки XCache правим его конфиг, который находится в /etc/php5/conf.d/xcache.ini. Здесь можно настроить размер кеша и по желанию включить веб-интерфейс, для просмотра кешированых скриптов. Этот конфиг в принципе тоже можно оставить дефолтным, но все же я приведу свой для примера:

[xcache-common]
;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
zend_extension = /usr/lib/php5/20060613/xcache.so

[xcache.admin]
xcache.admin.enable_auth = On
# Configure this to use admin pages
xcache.admin.user = "xcache_adm"
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = "62a1d553d98595515fecba5c12e537f8"

[xcache]
; ini only settings, all the values here is default unless explained

; select low level shm/allocator scheme implemenation
xcache.shm_scheme =        "mmap"
; to disable: xcache.size=0
; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size  =                64M
; set to cpu count (cat /proc/cpuinfo |grep -c processor)
xcache.count =                 2
; just a hash hints, you can always store count(items) > slots
xcache.slots =                8K
; ttl of the cache item, 0=forever
xcache.ttl   =                 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval =           0

; same as aboves but for variable cache
xcache.var_size  =            64M
xcache.var_count =             1
xcache.var_slots =            8K
; default ttl
xcache.var_ttl   =             0
xcache.var_maxttl   =          0
xcache.var_gc_interval =     300

xcache.test =                Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won't share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
xcache.mmap_path =    "/dev/zero"

; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it's writable by php (without checking open_basedir)
xcache.coredump_directory =   ""

; per request settings
xcache.cacher =               On
xcache.stat   =               On
xcache.optimizer =            On

[xcache.coverager]
; per request settings
; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
xcache.coverager =          Off

; ini only settings
; make sure it's readable (care open_basedir) by coverage viewer script
; requires xcache.coverager=On
xcache.coveragedump_directory = ""

Zend Optimizer — расширение к PHP, для ускорения скриптов, закодированых с помощью Zend Encoder.

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

http://hutpu4.org.ua/downloads/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
http://hutpu4.org.ua/downloads/ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz

Распаковываем и в папке data ищем нужный нам модуль в соответствии с нашей версией PHP. Что бы узнать версию PHP:

$ php -v

Копируем файл ZendOptimizer.so в папку с модулями PHP:

$ sudo cp ZendOptimizer.so /usr/lib/php5/modules/zendoptimizer.so

Создаем конфиг:

$ sudo nano -w /etc/php5/conf.d/zendoptimizer.ini

и добавляем в него:

extension=/usr/lib/php5/modules/zendoptimizer.so

Перезагружаем Apache и Nginx:

$ sudo /etc/init.d/apache restart
$ sudo /etc/init.d/nginx restart

проверим конфигурацию PHP:

$ php -v

должно быть что-то вроде:

Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
    with XCache v1.3.0, Copyright (c) 2005-2009, by mOo
    with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies

Ну вот собственно и все. Наш сервер должен работать как задумывалось. Заливаем сайт, или логинимся в PHPMyAdmin что бы проверить работоспособность.

p.s. Прошу прощения за дотошность в некоторых моментах, но статья рассчитана на новичков и хотелось охватить как можно больше мелочей, с которыми сам в свое время сталкивался.

Настройка web-сервера на основе VPS/VDS в Ubuntu/Debian: 22 комментария

  1. chimcat

    Пробовал, все шло но не сел nginx. Требовал более свежих библиотек.

    1. HuTpu4 Автор записи

      причина понятная и практически очевидная, для ее избежания можно поставить более раннюю версию Nginx из репозитариев.

  2. I am

    Здравствуйте, скажите пожалуйста … это для какого Ubuntu Server ?

    1. HuTpu4 Автор записи

      2 I am: Статью писал для Ubuntu 9.10 и Debian Lenny 5.0, но данные инструкции подойдут так же для более новых или более старых версий Ubuntu, за исключением мелких нюансов, которые я старался упомянуть в своей статье.

  3. I am

    И вообще нужно это на Ubuntu Server стовить или на просто Ubuntu Desktop?

    1. HuTpu4 Автор записи

      без разницы. Ubuntu Desktop отличается только наличием графической оболочки и прочей юзерфильной лабуды. если компьютер предполагается использовать только как сервер, то лучше установить Ubuntu Server, т.к. графическая оболочка съедает львиную долю ресурсов и на веб-сервере абсолютно не нужна.

  4. I am

    Я хотел бы использовать Ubuntu с флешки, без установки … чтобы научиться пользоваться … а потом уже купить сервер … так можно ? …

  5. HuTpu4 Автор записи

    что бы «научиться пользоваться» советую установить Убунту на какой-нибудь виртуальной машине типа VMware или Virtualbox, при чем, именно консольную версию (Ubuntu Server). можно, в принципе, и на флешку, но это как по мне неудобно (много гуглить придется паралельно).

  6. Derman

    У меня на страницу phpmyadmin не заходит, после «Далее установим Nginx» и все что идет дальше. Тоесть до установки Nginx phpmyadmin работал, а сейчас не хочет заходить. В чем может быть проблема?

  7. HuTpu4 Автор записи

    2 Derman:
    Неправильно сконфигурирована связка Nginx+Apache. Следует понимать что в статье я привел свои конфиги только для примера, в любом случае их нужно править «под себя». По настройке Nginx советую почитать — http://sysoev.ru/nginx/

  8. Derman

    2 HuTpu4:
    А обязательно ставить ngnix? Если будет только Apache2+MySQL+PHP5 то норм будет? А то я пользуюсь webmin, там модуль есть для работы с Apache — очень удобно, а то это, чтобы вхост добавить надо сначало прописывать в Apache, затем еще в ngnix — геморно как то. Можно ведь сделать все, как тут описано, ТОЛЬКО без ngnix?

    1. HuTpu4 Автор записи

      Необязательно. Если от сервера не требуется высокой производительности, то Nginx по сути вообще не нужен.

  9. Derman

    У меня ZOptimizer не хочет работать. Ставил все, что в данной статье было написано, кроме nginx. php -v вот что выдает:

    PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php5/20060613+lfs//usr/lib/php5/modules/zendoptimizer.so’ — /usr/lib/php5/20060613+lfs//usr/lib/php5/modules/zendoptimizer.so: cannot open shared object file: No such file or directory in Unknown on line 0
    PHP 5.2.6-1+lenny9 with Suhosin-Patch 0.9.6.2 (cli) (built: Aug 4 2010 03:25:57)
    Copyright (c) 1997-2008 The PHP Group
    Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with XCache v1.2.2, Copyright (c) 2005-2007, by mOo
    with Xdebug v2.0.3, Copyright (c) 2002-2007, by Derick Rethans
    with Suhosin v0.9.27, Copyright (c) 2007, by SektionEins GmbH

  10. Derman

    Разобрался, у меня модули просто находятся не в «modules», а в «20060613+lfs». И я уж было подумал все, терь все норм будет, как вдруг php -v ошибку в конце выводит =(. Кто знает в чем может быть проблема?

    PHP 5.2.6-1+lenny9 with Suhosin-Patch 0.9.6.2 (cli) (built: Aug 4 2010 03:25:57)
    Copyright (c) 1997-2008 The PHP Group
    Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with XCache v1.2.2, Copyright (c) 2005-2007, by mOo
    with Xdebug v2.0.3, Copyright (c) 2002-2007, by Derick Rethans
    with Suhosin v0.9.27, Copyright (c) 2007, by SektionEins GmbH
    with Zend Optimizer v3.3.9, Copyright (c) 1998-2009, by Zend Technologies
    Ошибка сегментирования (core dumped)

  11. I am

    Привет …
    Да, вот всё таки пришлось купить сервер и очень рад что сохранил страницу в закладки.
    Хотел вот что узнать, если ли в Debian команда или что-то, что может сбросить все настройки, например если я посталю MySQL, но передумал и хочу использовать Oracle, так вот как удалить MySQL ? … Или например хочу удалить PHP и поставить другой язык …
    Именно без переустановки ОС вернуться к чистому листу как можно ?

    1. HuTpu4 Автор записи

      2 I am: что бы удалить, или установить пакет есть специальные утилиты. в Дебиане/Убунту это например apt-get или aptitude. например, что бы удалить MySQL сервер:

      apt-get remove mysql-server

      штатных средств «вернуться к чистому листу» нету. это можно организовать какими-то сторонними утилитами, создавая образы дисков, или что-то в этом роде, но т.к. с хорошим инетом установка Debian с минимального диска занимает минут 20, то смысла нету заморачиваться с образами.

      з.ы. Новогодние праздники, личная жизнь, последние недели 2 на блог элементарно не хватало времени даже на коммент ответить.

  12. I am

    HuTpu4, ну всё … праздники закончились, пора возвращаться в строй … =]
    Спасибо за ответ … сейчас поставил ISP … но всё таки по этой статье ещё поставлю всё что не хаватает …

  13. FoxTime

    Вот вы представляете каково настраивать Debian виндусятнику (то есть мне) при практически нулевом знании оного? И при этом я умудряюсь натыкаться на пропущенные ньюансы в вашей статье. Для меня этот опыт ценен, сделайте одолжение исправьте недочеты ;) А то так скоро совсем седой буду ))))

    1. Доктор Добрянский Автор записи

      Эта статья не панацея….нет рецепта на все случаи жизни, нюансы есть и будут всегда :)
      Но все же, о каких недочетах вы говорите? Можно конкретней?

Обсуждение закрыто.