Полноценный веб-сервер на FreeBSD 8.2

В этой статье я постараюсь описать свой вариант FAMP (FreeBSD8.2 + Apache2 + MySQL5.1 + PHP5.3.10 + другие вкусности по мере возможности).

Итак, для хостинг площадки я выбрал Amazon AWS EC2, так называемый cloud-хостинг, что очень не плохо для меня, так как "бесплатно" на целый год, но более подробно об этом в другой статье. Конечно же тут есть свои нюансы, так как это не обычный хостинг, трудности в основном в виртуализации, иногда надо ткнуть носом в определенное устройство и указать что это и как оно должно работать, например, количество цилиндров виртуального жесткого диска система определяет не правильно (если использовать для разметки sysinstall), но об этом не здесь :).

Установка:

Так как я использую cloud хостинг, мне нет необходимости устанавливать саму ОС, так как она уже установлена, ее надо всего лишь "подключить", и она уже будет работать. В Amazon EC2 – это называется instance, то есть экземпляр работающей машины (виртуальной), в которую подключаются жесткие диски (виртуальные), сетевые устройства (также виртуальные) и т.д. Ну а вообще установка ОС FreeBSD не составляет трудностей.

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

Первым делом ставим для root пароль:

passwd

Далее обновляем порты:

portsnap fetch extract
portsnap fetch update

Добавляем нового пользователя:

adduser

Добавляем ему группу wheel.
Переопределяем редактор по умолчанию (vi на ee), кому как, но мне стандартный редактор по умолчанию очень не удобный:

echo $SHELL

определяем шелл, если csh, то вставляем строки в ~/.tcshrc

echo 'setenv EDITOR /usr/bin/ee' >> ~/.tcshrc

Приступаем к установке веб-сервера, мой выбор – apache2:

cd /usr/ports/www/apache22/
make config
make install clean

Как настроить apache22 вы уже разберетесь сами, благо для этого существует уйма документации в интернете, могу лишь поделиться своими настройками:

ServerRoot "/usr/local"
#Порт, на котором будет прослушиваться сервер, но в виртуальном хосте его можно переопределить, читайте далее
Listen 80
#Подключаемые модули, те, которые вам не нужны вы можете просто закоментировать
LoadModule authn_file_module libexec/apache22/mod_authn_file.so
LoadModule authn_dbm_module libexec/apache22/mod_authn_dbm.so
LoadModule authn_anon_module libexec/apache22/mod_authn_anon.so
LoadModule authn_default_module libexec/apache22/mod_authn_default.so
LoadModule authn_alias_module libexec/apache22/mod_authn_alias.so
LoadModule authz_host_module libexec/apache22/mod_authz_host.so
LoadModule authz_groupfile_module libexec/apache22/mod_authz_groupfile.so
LoadModule authz_user_module libexec/apache22/mod_authz_user.so
LoadModule authz_dbm_module libexec/apache22/mod_authz_dbm.so
LoadModule authz_owner_module libexec/apache22/mod_authz_owner.so
LoadModule authz_default_module libexec/apache22/mod_authz_default.so
LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so
LoadModule auth_digest_module libexec/apache22/mod_auth_digest.so
LoadModule file_cache_module libexec/apache22/mod_file_cache.so
LoadModule cache_module libexec/apache22/mod_cache.so
LoadModule disk_cache_module libexec/apache22/mod_disk_cache.so
LoadModule dumpio_module libexec/apache22/mod_dumpio.so
LoadModule reqtimeout_module libexec/apache22/mod_reqtimeout.so
LoadModule include_module libexec/apache22/mod_include.so
LoadModule filter_module libexec/apache22/mod_filter.so
LoadModule charset_lite_module libexec/apache22/mod_charset_lite.so
LoadModule deflate_module libexec/apache22/mod_deflate.so
LoadModule log_config_module libexec/apache22/mod_log_config.so
LoadModule logio_module libexec/apache22/mod_logio.so
LoadModule env_module libexec/apache22/mod_env.so
LoadModule mime_magic_module libexec/apache22/mod_mime_magic.so
LoadModule cern_meta_module libexec/apache22/mod_cern_meta.so
LoadModule expires_module libexec/apache22/mod_expires.so
LoadModule headers_module libexec/apache22/mod_headers.so
LoadModule usertrack_module libexec/apache22/mod_usertrack.so
LoadModule unique_id_module libexec/apache22/mod_unique_id.so
LoadModule setenvif_module libexec/apache22/mod_setenvif.so
LoadModule version_module libexec/apache22/mod_version.so
LoadModule ssl_module libexec/apache22/mod_ssl.so
LoadModule mime_module libexec/apache22/mod_mime.so
LoadModule dav_module libexec/apache22/mod_dav.so
LoadModule status_module libexec/apache22/mod_status.so
LoadModule autoindex_module libexec/apache22/mod_autoindex.so
LoadModule asis_module libexec/apache22/mod_asis.so
LoadModule info_module libexec/apache22/mod_info.so
LoadModule cgi_module libexec/apache22/mod_cgi.so
LoadModule dav_fs_module libexec/apache22/mod_dav_fs.so
LoadModule vhost_alias_module libexec/apache22/mod_vhost_alias.so
LoadModule negotiation_module libexec/apache22/mod_negotiation.so
LoadModule dir_module libexec/apache22/mod_dir.so
LoadModule imagemap_module libexec/apache22/mod_imagemap.so
LoadModule actions_module libexec/apache22/mod_actions.so
LoadModule speling_module libexec/apache22/mod_speling.so
LoadModule userdir_module libexec/apache22/mod_userdir.so
LoadModule alias_module libexec/apache22/mod_alias.so
LoadModule rewrite_module libexec/apache22/mod_rewrite.so
#сюда будет вставлена строка модуля PHP
#Определяем пользователя и группу, от имени которой будет работать apache
User www
Group www
ServerAdmin [email protected]
#Определяем имя сервера по умолчанию, на тот случай, если мы используем виртуальные хосты и кто-то введет в адресной строке браузера просто IP
ServerName 100.org.ua:80
#Определяем доступ к директоряим по умолчания, то есть закрываем доступ всем и всюду
<Directory />
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory
<IfModule dir_module>
    #я добавил сюда index.php, но он будет установлен позже
    DirectoryIndex index.php index.html
</IfModule>
#Определяем права на доступ и редактирование файлов, имя которых начинается с .ht*
<FilesMatch "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</FilesMatch>
#Определяем место хранения файла логов об ошибках
ErrorLog "/www/log/httpd-error.log"
#Указываем, тип каких ошибок нам нужно фиксировать в файле логов (смотрите выше
LogLevel warn
#Определяем формат содержимого файла логов об ошибках
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "/www/log/httpd-access.log" combined
</IfModule>
<IfModule alias_module>
    #Определяем алиас, то есть теперь запрос типа http://host/cgi-bin/ будет apache-ем перенаправляться в папку /www/cgi-bin/
    ScriptAlias /cgi-bin/ "/www/cgi-bin/"
</IfModule>
<Directory "/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>
#Определяем тип отдаваемого контента по умолчанию, конечно же в скрипте PHP, а также в файле .htaccess виртуального хоста можно переопределить эту директиву
DefaultType text/plain
<IfModule mime_module>
    TypesConfig etc/apache22/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    #Следующие две строки надо раскоментировать, когда вы установите PHP
    #AddType application/x-httpd-php .php
    #AddType application/x-httpd-php-source .phps
</IfModule>
#Определяем путь к файлу настроек виртуальных хостов, а у меня есть виртуальные хосты
Include etc/apache22/extra/httpd-vhosts.conf
#Определяем путь к другим каким-либо динамически подключенным файлам настроек apache
Include etc/apache22/Includes/*.conf

Далее идем в настройки виртуальных хостов:

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "/www/sites/100.org.ua/public_html"
    ServerName 100.org.ua
    ServerAlias www.100.org.ua vmmelnic.org.ua *.vmmelnic.org.ua eone.org.ua *.eone.org.ua ione.org.ua *.ione.org.ua i1.org.ua *.i1.org.ua e-one.org.ua *.e-one.org.ua i-one.org.ua *.i-one.org.ua
    ErrorLog "/www/sites/100.org.ua/log/error_log"
    CustomLog "/www/sites/100.org.ua/log/access_log" common
    <Directory "/www/sites/100.org.ua/public_html">
      Options -Indexes FollowSymlinks
      AllowOverride All
      Order allow,deny
      Allow from all
    </Directory>
</VirtualHost>
#И так для каждого виртуального хоста...

Как вы уже, наверное, заметили, перед тем как запускать apache с такими настройками, нам необходимо создать структуру директорий. К примеру, у меня для веб-сервера отдельно примонтирован диск, /www, в нем /www/sites/ и т.д. Вы сами можете проследить по настройкам, предоставленным выше.

Чтобы запустить apache необходимо выполнить команду:

/usr/local/etc/rc.d/apache22 start

А для того, чтобы apache запускался автоматически при запуске системы – выполните:

echo 'apache22_enable="YES"' >> /etc/rc.conf

Установка MySQL:

cd /usr/ports/databases/mysql51-server/
make config
#Выбираете необходимые вам найстройки
make install clean

Я предпочитаю хранить базы данных в моей предопределенной директории, для этого вписываем в /etc/rc.conf:

echo 'mysql_dbdir="/www/mysql"' >> /etc/rc.conf
echo 'mysql_enable="YES"' >> /etc/rc.conf

Заодно и пропишем автоматический запуск сервера баз данных.

Копируем конфигурационный файл:

/usr/local/share/mysql/my-large.cnf /www/mysql/my.cnf

Изменяем кодировку для баз данных по умолчанию:

ee /www/mysql/my.cnf
#Находим строку [mysqld] и добавляем туда строчки:
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci

Запускаем сервер баз данных:

/usr/local/etc/rc.d/mysql-server onestart

Проверить работу сервера как apache так и mysql можно с помощью простой команды:

ps -aux | grep httpd
#или для mysql
ps -aux | grep mysql
sockstat | grep mysql

Сервер запущен. Осталось настроить только к нему доступ:

rehash
mysql_secure_installation

Установка PHP:

cd /usr/ports/*/php5/
make config
#Выбираем необходимые нам настройки
make install clean

Не забудьте в настройках выбрать модуль для apache, если вы конечно хотите, чтобы ваш PHP работал как модуль apache, в чем разница между модулем и отдельным процессом – читайте в интернет, возможно и на этом ресурсе :).

копируем дефолтный файл настроек, и редактируем по своему усмотрению:

cd /usr/local/etc
cp php.ini-production php.ini
#редктируем файл
ee php.ini
.....
......
.....
#изменяем права доступа к файлу настроек
chmod 0440 php.ini

Итак, файл настроек PHP у нас находится по адресу /usr/local/etc/php.ini, все измененные настройки в этом файле будут работать только после перезапуска apache.

Расширения для PHP.

Надо определиться, какие именно расширения вам необходимы, а потом их устанавливать. Подключать все расширения, которые имеются для PHP не обязательно, помните, что каждое расширение (модуль) постоянно висит в памяти и требует соответственно ресурсов вашего сервера.

Есть два способа установки дополнительных модулей (расширений) для PHP: а) – использовать специальный порт "php5-extensions", который поможет вам выбрать, сконфигурировать и установить расширения; б) – устанавливать каждое расширени вручную. Плюсы и минусы того и иного способа: если использовать php5-extensions, то легче конечно же все установить, да и при обновлении портов в будущем возни меньше, обновляете просто php5-extensions и все; при ручном же способе установки расширений (который я и рекомендую), возможны коллизии с портами, их версиями, зависимостфми и т.д., но, вы таким образом уж точно выучите все ньюансы в работе с портами.

ВНИМАНИЕ! Некоторые расширения любят четкую последовательность подключения в файле /usr/local/etc/php/extensions.ini. Например, библиотека gd.so (.dll для windows) не любит, когда ее подключают в самом конце. При вызове соответствующих функций в php скриптах, например "imagecreatefrompng()", вы не будете получать требуемый результат, смотрите в логи php и apache, если у вас возникли необъяснимые проблемы в работе с какими либо расширениями – это может быть причиной этих пролем.

Итак расширения, установка ничем не отличается от всех предыдущих портов (да, это такие же порты), например:

cd /usr/ports/*/php5-gd
make config && install && clean

Таким образом мы установили расширение GD для PHP, чтобы оно вошло в действие надо перезапустить apache. Так как у нас PHP подключен к apache как модуль, а расширение php5-gd является расширением для PHP, то при перезапуске apache – перезапускается и сам PHP, и все расширения вместе с ним.

Если же вы все таки решили воспользоваться автоматическим управлением ваших расширений для PHP, тогда устанавливаем php5-extensions:

cd /usr/ports/*/php5-extensions
make config && install && clean

Все подключенные расширения к PHP вы сможете увидеть в файте /usr/local/etc/php/extensions.ini:

cat /usr/local/etc/php/extensions.ini

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

%pkg_info | grep php5-
php5-5.3.10_1       PHP Scripting Language
php5-curl-5.3.10_1  The curl shared extension for php
php5-ftp-5.3.10_1   The ftp shared extension for php
php5-gd-5.3.10_1    The gd shared extension for php
php5-iconv-5.3.10_1 The iconv shared extension for php
php5-json-5.3.10_1  The json shared extension for php
php5-mbstring-5.3.10_1 The mbstring shared extension for php
php5-mysql-5.3.10_1 The mysql shared extension for php
php5-mysqli-5.3.10_1 The mysqli shared extension for php
php5-session-5.3.10_1 The session shared extension for php
php5-simplexml-5.3.10_1 The simplexml shared extension for php
php5-xml-5.3.10_1   The xml shared extension for php
php5-zlib-5.3.10_1  The zlib shared extension for php

Продолжение следует…

Leave a Reply