Если уж судьба заставила вас променять обычный хостинг на 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 виндусятнику (то есть мне) при практически нулевом знании оного? И при этом я умудряюсь натыкаться на пропущенные ньюансы в вашей статье. Для меня этот опыт ценен, сделайте одолжение исправьте недочеты ;) А то так скоро совсем седой буду ))))
Эта статья не панацея….нет рецепта на все случаи жизни, нюансы есть и будут всегда :)
Но все же, о каких недочетах вы говорите? Можно конкретней?
Hello, I think your website might be having browser compatibility issues.
When I look at your website in Safari, it looks fine but when opening in Internet
Explorer, it has some overlapping. I just wanted to give you a quick heads up!
Other then that, superb blog!
This article presents clear idea designed for the new visitors of blogging, that truly how to do blogging.
whoah this weblog is excellent i love studying your articles.
Keep up the great work! You know, lots of people are searching round for this information, you could help them greatly.