Настройка web сервера на Freebsd 10
В первой и второй частях мы рассмотрели установку и настройку операционной системы Freebsd 10.1 для разворачивания на ней блога wordpress. Теперь предстоит установить и настроить программное обеспечение, необходимое для нашего web сервера.
Я буду рассматривать самый простой и быстрый вариант настроек, с небольшим отклонением от дефолтных для нашего удобства. По каждому пункту могут возникать вопросы и нюансы, я не буду касаться всего этого в этой статье.
Устанавливаем ftp сервер vsftpd
Начнем нашу настройку с установки 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 сервер 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
Теперь будем настраивать наш 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 и пользуемся.