Если уж судьба заставила вас променять обычный хостинг на 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. Прошу прощения за дотошность в некоторых моментах, но статья рассчитана на новичков и хотелось охватить как можно больше мелочей, с которыми сам в свое время сталкивался.
Пробовал, все шло но не сел nginx. Требовал более свежих библиотек.
причина понятная и практически очевидная, для ее избежания можно поставить более раннюю версию Nginx из репозитариев.
Здравствуйте, скажите пожалуйста … это для какого Ubuntu Server ?
2 I am: Статью писал для Ubuntu 9.10 и Debian Lenny 5.0, но данные инструкции подойдут так же для более новых или более старых версий Ubuntu, за исключением мелких нюансов, которые я старался упомянуть в своей статье.
И вообще нужно это на Ubuntu Server стовить или на просто Ubuntu Desktop?
Или без разницы?
без разницы. Ubuntu Desktop отличается только наличием графической оболочки и прочей юзерфильной лабуды. если компьютер предполагается использовать только как сервер, то лучше установить Ubuntu Server, т.к. графическая оболочка съедает львиную долю ресурсов и на веб-сервере абсолютно не нужна.
Я хотел бы использовать Ubuntu с флешки, без установки … чтобы научиться пользоваться … а потом уже купить сервер … так можно ? …
что бы «научиться пользоваться» советую установить Убунту на какой-нибудь виртуальной машине типа VMware или Virtualbox, при чем, именно консольную версию (Ubuntu Server). можно, в принципе, и на флешку, но это как по мне неудобно (много гуглить придется паралельно).
У меня на страницу phpmyadmin не заходит, после «Далее установим Nginx» и все что идет дальше. Тоесть до установки Nginx phpmyadmin работал, а сейчас не хочет заходить. В чем может быть проблема?
2 Derman:
Неправильно сконфигурирована связка Nginx+Apache. Следует понимать что в статье я привел свои конфиги только для примера, в любом случае их нужно править «под себя». По настройке Nginx советую почитать — http://sysoev.ru/nginx/
Очень интересный пост. По больше таких надо!
2 HuTpu4:
А обязательно ставить ngnix? Если будет только Apache2+MySQL+PHP5 то норм будет? А то я пользуюсь webmin, там модуль есть для работы с Apache — очень удобно, а то это, чтобы вхост добавить надо сначало прописывать в Apache, затем еще в ngnix — геморно как то. Можно ведь сделать все, как тут описано, ТОЛЬКО без ngnix?
Необязательно. Если от сервера не требуется высокой производительности, то Nginx по сути вообще не нужен.
У меня 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
Разобрался, у меня модули просто находятся не в «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)
Привет …
Да, вот всё таки пришлось купить сервер и очень рад что сохранил страницу в закладки.
Хотел вот что узнать, если ли в Debian команда или что-то, что может сбросить все настройки, например если я посталю MySQL, но передумал и хочу использовать Oracle, так вот как удалить MySQL ? … Или например хочу удалить PHP и поставить другой язык …
Именно без переустановки ОС вернуться к чистому листу как можно ?
HuTpu4, что-то редко видать в блоге … =[
2 I am: что бы удалить, или установить пакет есть специальные утилиты. в Дебиане/Убунту это например apt-get или aptitude. например, что бы удалить MySQL сервер:
apt-get remove mysql-server
штатных средств «вернуться к чистому листу» нету. это можно организовать какими-то сторонними утилитами, создавая образы дисков, или что-то в этом роде, но т.к. с хорошим инетом установка Debian с минимального диска занимает минут 20, то смысла нету заморачиваться с образами.
з.ы. Новогодние праздники, личная жизнь, последние недели 2 на блог элементарно не хватало времени даже на коммент ответить.
HuTpu4, ну всё … праздники закончились, пора возвращаться в строй … =]
Спасибо за ответ … сейчас поставил ISP … но всё таки по этой статье ещё поставлю всё что не хаватает …
Вот вы представляете каково настраивать Debian виндусятнику (то есть мне) при практически нулевом знании оного? И при этом я умудряюсь натыкаться на пропущенные ньюансы в вашей статье. Для меня этот опыт ценен, сделайте одолжение исправьте недочеты ;) А то так скоро совсем седой буду ))))
Эта статья не панацея….нет рецепта на все случаи жизни, нюансы есть и будут всегда :)
Но все же, о каких недочетах вы говорите? Можно конкретней?