Решение проблемы

Настройка web сервера на Freebsd 10


В первой и второй частях мы рассмотрели установку и настройку операционной системы Freebsd 10.1 для  разворачивания на ней блога wordpress. Теперь предстоит установить и настроить программное обеспечение, необходимое для нашего web сервера.

Содержание:

  • 1 Устанавливаем ftp сервер vsftpd
  • 2 Установка и настройка Mysql
  • 3 Устанавливаем и настраиваем apache24
  • 4 Устанавливаем php и phpextensions
  • 5 Настройка frontend сервера nginx
  • 6 Установка phpmyadmin на виртуальный хост
  • 7 Дополнительные материалы по Freebsd

Я буду рассматривать самый простой и быстрый вариант настроек, с небольшим отклонением от дефолтных для нашего удобства. По каждому пункту могут возникать вопросы и нюансы, я не буду касаться всего этого в этой статье.

Устанавливаем ftp сервер vsftpd

Настройка web сервера на Freebsd 10

Начнем нашу настройку с установки ftp сервера vsftpd. Для авторизации мы будем использовать системные учетные записи, анонимный доступ отключим.

Первым делом обновим порты:

# portsnap fetch update

После обновления, ставим сервер:

# cd /usr/ports/ftp/vsftpd

# make install clean

Компоненты оставляем по-умолчанию. Добавляем загрузку vsftpd в /etc/rc.conf:

# echo 'vsftpd_enable="YES"' >> /etc/rc.conf

Редактируем конфиг /usr/local/etc/vsftpd.conf, приводим его к следующему виду:

anonymous_enable=NO

local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
listen=YES
background=YES
secure_chroot_dir=/usr/local/share/vsftpd/empty

Запускаем сервер:

# /usr/local/etc/rc.d/vsftpd start

Проверяем, запустился ли демон:

# sockstat | grep 21

В ответ должны увидеть что-то похожее:

root     vsftpd     4793  3  tcp4   *:21                  *:*

Это означает, что сервер запустился и слушает входящие соединения на 21 порт.  С текущими настройками можно залогиниться учетной записью root и перемещаться по всему серверу. Это очень небезопасно, призываю внимательно относиться к этим возможностям. Рекомендую подробнее ознакомиться с настройками сервера, обратить внимание на директивы userlist_enable, userlist_file, chroot_local_uses, chroot_list_enable, chroot_list_file. С помощью них можно ограничивать доступ к серверу и перемещение пользователей по папкам. Вообще, у vsftpd много настроек и возможностей, в интернете достаточно статей на подобную тему. Можно без проблем хранить базу пользователей сервера в mysql. В завершение порекомендую ограничить доступ к ftp через firewall.

Установка и настройка Mysql

Дальше устанавливаем сервер баз данных mysql:

# cd /usr/ports/databases/mysql55-server

# make install clean

Настройки оставляем дефолтные.

Сервер тянет за собой достаточно большое количество зависимостей. Установка постоянно тормозится и выскакивает окно с настройками очередной зависимости. Чтобы не отвлекаться на это и не тормозить процесс, я рекомендую перед командой make install clean ввести команду:

# make config-recursive

Она проверит все зависимости и выведет сразу настройки этих зависимостей. Потом в процессе сборки пакета уже не будет прерываний.

После завершения установки добавляем запуск сервера в rc.conf:

# echo 'mysql_enable="YES"' >> /etc/rc.conf

# echo 'mysql_dbdir="/web/mysql"' >> /etc/rc.conf

Создаем необходимые папки и выставляем права:

# mkdir /web && cd /web && mkdir mysql && chown mysql:mysql mysql/

Создаем файл конфигурации:

# touch /web/mysql/my.cnf

# chown mysql:mysql /web/mysql/my.cnf

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

[client]

port = 3306
socket = /tmp/mysql.sock
[mysqld]
port = 3306
bind-address =127.0.0.1
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 8
#log=/var/log/mysql.log # Лог всех SQL-запросов
#log-bin=/var/log/mysql-bin.log # Бинарный лог всех SQL-запросов
log-error=/var/log/mysql-err.log # Лог ошибок в работе демона СУБД MySQL
#log-slow-queries=/var/log/mysql.slow # Лог всех медленных SQL-запросов
#log-bin=mysql-bin
#log=/var/log/mysql.log
#binlog_format=mixed
server-id = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout

Закомментированные строки включаем на свое усмотрение в процессе отладки. Если будет включен лог всех SQL запросов, то нужно не забыть настроить ротацию логов, файл будет расти очень быстро, можно забыть и пропустить момент, когда файл займет все свободное место.

Лог файлы нужно обязательно создать самим и выставить на них права пользователя mysql. Если этого не сделать, то сервер не будет стартовать, и что самое неприятное, не будет никаких сообщений в лог файлах. Они будут созданы с правами root:wheel и сервер ничего туда не сможет записать. Так что создаем файлы сами:

# touch /var/log/mysql-err.log

# chown mysql:mysql /var/log/mysql-err.log

И стартуем сервер:

# /usr/local/etc/rc.d/mysql-server start

Проверяем, все ли запустилось как следует:

# ps axw | grep mysql

Если все в порядке, то вы увидите что-то похожее на это:

52490 - Is 0:00.02 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/web/mysql/my.cnf --user=mysql --datadir=/web/mysql --pid-file=/web/mysql/websrv.local.pid

52784 - I 0:00.17 /usr/local/libexec/mysqld --defaults-extra-file=/web/mysql/my.cnf --basedir=/usr/local --datadir=/web/mysql --plugin-dir=/usr/local/lib/mysql/plugin --user=mysql --log-err
52802 1 S+ 0:00.00 grep mysql

Дальше воспользуемся стандартным скриптом для безопасной настройки mysql:

# /usr/local/bin/mysql_secure_installation

Задаем пароль root пользователя mysql. Обращаю внимание, что это не системный root. В mysql свои пользователи. На остальные вопросы отвечаем положительно, в принципе, там все понятно описано, ничего сложного нет. Удаляется тестовая база, тестовый пользователь, запрещается удаленный доступ к серверу.

На этом настройка mysql окончена. Идем дальше.

Устанавливаем и настраиваем apache24

Настройка web сервера на Freebsd 10

Устанавливаем непосредственно web сервер apache:

# cd /usr/ports/www/apache24

# make config-recursive

Оставляем все настройки по-умолчанию. Запускаем установку:

# make install clean

Добавляем apache в атозагрузку:

# echo 'apache24_enable="YES"' >> /etc/rc.conf

Теперь создадим 2 виртуальных хоста. На первом будет располагаться phpmyadmin, на втором наш сайт, в данном случае wordpress. Не забываем настроить в DNS эти хосты. Раскомментируем строчку в конфиге /usr/local/etc/apache24/httpd.conf

Include etc/apache24/extra/httpd-vhosts.conf

Дальше идем в папку /usr/local/etc/apache24/extra/ и редактируем файл httpd-vhosts.conf до следующего вида:

<VirtualHost 127.0.0.1:80>

ServerAdmin root@websrv.local
DocumentRoot "/web/sites/websrv.local/www"
ServerName websrv.local
ServerAlias www.websrv.local
ErrorLog "/web/sites/websrv.local/log/error.log"
CustomLog "/web/sites/websrv.local/log/access.log" common
php_admin_value open_basedir "/web/sites/websrv.local:."
php_admin_value upload_tmp_dir "/web/sites/websrv.local/tmp"
php_admin_value session.save_path "/web/sites/websrv.local/tmp"
<Directory /web/sites/websrv.local/www/>
AllowOverride All
RewriteEngine On
Require all granted
DirectoryIndex index.php index.html index.htm
Order allow,deny
Allow from All
</Directory>
</VirtualHost>
<VirtualHost 127.0.0.1:80>
ServerAdmin root@websrv.local
DocumentRoot "/web/sites/pma53.websrv.local/www"
ServerName pma53.websrv.local
ServerAlias www.pma53.websrv.local
ErrorLog "/web/sites/pma53.websrv.local/log/error.log"
CustomLog "/web/sites/pma53.websrv.local/log/access.log" common
php_admin_value open_basedir "/web/sites/pma53.websrv.local:."
php_admin_value upload_tmp_dir "/web/sites/pma53.websrv.local/tmp"
php_admin_value session.save_path "/web/sites/pma53.websrv.local/tmp"
<Directory /web/sites/pma53.websrv.local/www/>
AllowOverride All
Require all granted
DirectoryIndex index.php index.html index.htm
Order allow,deny
Allow from All
</Directory>
</VirtualHost>

Я использую тестовый домен websrv.local В общем случае тут должен быть непосредственно домен вашего сайта, что-то вроде myblog.ru. Для phpmyadmin я использую поддомен с произвольным непопулярным именем, чтобы туда не заходил тот, кому не следует.

Обращаю внимание на параметр Require all granted. На предыдущих серверах я его не указывал. В этот же раз при обращении к виртуальному домену в логах получал ошибку:

AH01630: client denied by server configuration

Скорее всего это особенность apache24, до этого я пользовался более ранними версиями.

Сайты я размещаю в каталоге /web/sites. Для каждого домена отдельная папка. Для улучшения безопасности можно настроить отдельных пользователей для каждого поддомена, сделать пользователя ftp, доступ к логам и так далее. В этой статье я не буду касаться этого вопроса. У нас будет один сайт и один пользователь. Создаем необходимые папки:

# mkdir /web/sites

# mkdir /web/sites/websrv.local && mkdir /web/sites/pma53.websrv.local
# cd /web/sites/websrv.local && mkdir log tmp www
# cd /web/sites/pma53.websrv.local && mkdir log tmp www
# chown -R www:www /web/sites

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

Устанавливаем php и phpextensions

Дальше устанавливаем php, настройки оставляем настройки по-умолчанию:

# cd /usr/ports/lang/php5

# make config-recursive
# make install clean

После установки создаем файл конфигурации:

# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini

Устанавливаем расширения:

# cd /usr/ports/lang/php5-extensions

# make config-recursive

Помимо настроек по-умолчанию, обязательно добавляем CURL, DOM, POSIX, FTP, GD, HASH, ICONV, XML, JSON, MBSTRING, MYSQL, MYSQLI, OPENSSL, SOCKETS, TOKENIZER, XMLREADER, ZLIB, EXIF, GETTEXT,

# make install clean

Теперь поставим модуль php для apache. Он теперь стал почему-то отдельным портом. Я не сразу первый раз сообразил, куда делся модуль, который всегда ставился вместе с портом php. В общем, ставим отдельно:

# cd /usr/ports/www/mod_php5

# make install clean

Для того, чтобы apache правильно обрабатывал php файлы, необходимо в конфиг httpd.conf добавить следующие строки:

<IfModule mod_php5.c>

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
DirectoryIndex index.php index.html
</IfModule>

Теперь можно запустить apache и проверить, все ли у нас в порядке. Сначала проверим, нет ли у нас ошибок в конфигурации:

# apachectl -t

AH00526: Syntax error on line 15 of /usr/local/etc/apache24/extra/httpd-vhosts.conf:
Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration

У нас ошибка, модуль mod_rewrite не подключен. Чтобы это исправить, раскомментируем в конфиге апача строку

LoadModule rewrite_module libexec/apache24/mod_rewrite.so

Проверяем снова:

# apachectl -t

AH00557: httpd: apr_sockaddr_info_get() failed for websrv.local
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

Снова ошибка, но не критичная, можно работать и с ней, но мы все равно ее исправим. В фале httpd.conf находим строку со значением ServerName и приводим ее к виду:

ServerName websrv.local:80

Сохраняем файл, проверяем конфигурацию:

# apachectl -t

Syntax OK

Все в порядке, можно стартовать apache:

# /usr/local/etc/rc.d/apache24 start

Проверяем, все ли запустилось:

# ps ax | grep httpd

60555 - Ss 0:00.06 /usr/local/sbin/httpd -DNOHTTPACCEPT
60556 - I 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT
60557 - I 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT
60558 - I 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT
60559 - I 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT
60560 - I 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT

Если получаете что-то подобное, значит все в порядке. Сейчас можно в браузере набрать http://ip-сервера/ и увидеть страничку с одной единственной надписью:

It works!

Это означает, что веб сервер apache работает, все в порядке.

Настройка frontend сервера nginx

Настройка web сервера на Freebsd 10

Теперь будем настраивать наш frontend — nginx. Он будет смотреть в интернет и принимать запросы от пользователей, чтобы потом их перенаправлять на apache. Идем в порты и устанавливаем nginx:

# cd /usr/ports/www/nginx-devel

# make install clean

Выбираем опции:

[X] HTTP_MODULE Enable HTTP module

[X] HTTP_ADDITION_MODULE Enable http_addition module
[X] HTTP_DAV_MODULE Enable http_webdav module
[X] HTTP_FLV_MODULE Enable http_flv module
[X] HTTP_PERL_MODULE Enable http_perl module
[X] HTTP_REALIP_MODULE Enable http_realip module
[X] HTTP_REWRITE_MODULE Enable http_rewrite module
[X] HTTP_SSL_MODULE Enable http_ssl module
[X] HTTP_STATUS_MODULE Enable http_stub_status module
[X] HTTP_SUB_MODULE Enable http_sub module
[X] WWW Enable html sample files

Добавим nginx в автозагрузку:

# echo 'nginx_enable="YES"' >> /etc/rc.conf

Редактируем конфиг nginx /usr/local/etc/nginx/nginx.conf, приводим его к следующему виду:

worker_processes 1;

pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 145.152.71.220:80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_send_lowat 12000;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /var/tmp/nginx;
}
}
}

В строке

listen 145.152.71.220:80;

Указываем свой внешний ip адрес. Проверяем настройки nginx:

# nginx -t

Если видите:

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok

nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

значит все в порядке.

Теперь необходимо изменить конфигурацию apache, чтобы он слушал только локальный интерфейс 127.0.0.1, а все внешние запросы принимал nginx и перенаправлял к apache. Меняем в /usr/local/etc/apache24/httpd.conf  строку с параметром Listen, приводим к виду:

Listen 127.0.0.1:80

Перезапускаем apache:

# /usr/local/etc/rc.d/apache24 restart

Запускаем nginx:

# /usr/local/etc/rc.d/nginx start

Наш веб сервер готов. Теперь проверим его работу. Создадим в папке /web/sites/websrv.local/www файл index.php с содержимым

<?php phpinfo(); ?>

Заходим в браузере по адресу http://websrb.local

Если вы видите информацию о версии php и его модулях, значит все настроено и работает.

Установка phpmyadmin на виртуальный хост

Остался последний шаг в нашем деле — установка phpmyadmin. В принципе, wordpress можно установить уже сейчас, но без удобного средства работы с mysql как-то неловко. В будущем оно все равно пригодится. Так что ставим из портов:

# cd /usr/ports/databases/phpmyadmin

# make install clean

По-умолчанию, phpmyadmin устанавливается в папку /usr/local/www/phpMyAdmin, но так как мы для него создали отдельный виртуальный хост, то переносим все содержимое папки туда:

# mv /usr/local/www/phpMyAdmin/* /web/sites/pma53.websrv.local/www/

# chown -R www:www /web/sites/pma53.websrv.local/www/

Создаем папку для конфига:

# mkdir /web/sites/pma53.websrv.local/www/config

# chmod 0750 /web/sites/pma53.websrv.local/www/config && chown www:www /web/sites/pma53.websrv.local/www/config

Дальше идем по адресу http://pma53.websrv.local/setup/ нажимаем «новый сервер» и настраиваем. Не буду подробно на этом останавливаться, там все просто и многократно описано в интернете. Выбираем все значения инсталлятора по умолчанию.

На этом все. Наш web сервер готов. Загружаем скрипты сайта в /web/sites/websrv.local/www и пользуемся.


СМОТРИ ТАКЖЕ