FreeBSD 7.0 (amd64) Extremal Webhosting HOWTO FreeBSD

автор О.Мельников

http://wiki.bsdportal.ru/doc:extremal_webhosting

Аналогично прошлой моей статьи, данный материал так же представляет собой нечто вроде документирования проводимых мною работ по установке и настройке сервера, предназначенного для работы в сети Интернет в качестве ВебСервера. Особенность построения - необходимость работы сервера в несколько экстремальных условиях. В первую очередь это обеспечение обработки достаточно большого количества одновременных запросов, в районе 2500 и выше.

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

Обсуждаем статью тут.

Цели

Сконструировать сервер, который сможет обслуживать достаточно большое количество одновременных запросов по протоколу HTTP в сети Интернет.

Используемое ПО

OS:

FreeBSD 7.0-RELEASE (amd64)

WEB-сервер:

lighttpd 1.4.18

Скрипты:

PHP 5.2.5

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

В данном разделе описываю различные улучшения (субъективно конечно), которые считаю оправданными с точки зрения удобства: установка локали, смена шела, установка файлового менеджера, смены текстового редактора, также установку основного софта и его настройку.

установка mc

копирование /usr/ports/distfiles

установка различных параметров rc.conf

установка локали и редактора по умолчанию "mcedit"

установка различных полезных системных настроек

установка и настройка lighttpd и php

настройка ssh и ftp доступа

настройка pf

Установка mc

Удобная для работы штука. И каталоги частого использования можно по Ctrl+ быстро вызывать, и редактор совсем не плох. Любители командной строки и vi могут сие пропускать, а я уж потружусь ...

# cd /usr/ports/misc/mc

# make install clean

Копирование /usr/ports/distfiles

Пункт необязателен, но полезен, если уже один разок такая установка уже делалась совсем недавно. Заливаем сохраненное содержимое в этот каталог по FTP по локальной сети. Цель - избавиться от повторного выкачивания из Интернета, один раз уже ж это качали.

Установка различных параметров rc.conf

Добавляем следующие строки в /etc/rc.conf.

sshd_enable="YES" # Включить SSH

ftpd_enable="YES" # Включить FTP

ftpd_flags="-l" # -

lighttpd_enable="YES" # Включить Lighttpd

pf_enable="YES" # Включить PF (загрузить модуль если необходимо)

pf_rules="/etc/pf.conf" # определение правил для pf

pflog_enable="YES" # запустить pflogd(8)

pflog_logfile="/var/log/pflog" # где pflogd должен сохранять протокол

Установка локали и редактора по умолчанию "mcedit"

В файл /root/.cshrc изменяем/добавляем строки:

setenv EDITOR mcedit

setenv LANG ru_RU.KOI8-R

setenv MM_CHARSET KOI8-R

Для себя я применяю еще одну радикальную меру:

# cp `which vi` `which vi`.backup

# ln -sf `which mcedit` `which vi`

Это позволит, читая мануалы и не задумываясь, выполнять vi <файл>. Ну не нравится мне vi.

Установка различных полезных системных настроек

Для улучшения производительности системы добавляем в файл /etc/sysctl.conf следующие настройки (большинство настроек взято из материалов выступления Сысоева Игоря Владимировича):

# ------------------------------------------------------------

# Увеличение скорости копирования мелких файлов

# ------------------------------------------------------------

net.inet.tcp.delayed_ack=0

net.inet.ip.portrange.first=1024

net.inet.ip.portrange.last=65535

# ------------------------------------------------------------

# Увеличение буферов TCP

# ------------------------------------------------------------

net.inet.tcp.sendspace=65535

net.inet.tcp.recvspace=65535

net.local.stream.recvspace=65535

net.local.stream.sendspace=65535

# ------------------------------------------------------------

# Увеличение размера очереди

# ------------------------------------------------------------

kern.ipc.somaxconn=16384

# ------------------------------------------------------------

# Число одновременно открытых дискрипторов файлов

# ------------------------------------------------------------

kern.maxfiles=204800

kern.maxfilesperproc=200000

# ------------------------------------------------------------

# TCP Brandwidth Delay Product

# ------------------------------------------------------------

net.inet.tcp.inflight.enable=1

net.inet.tcp.inflight.min=8192

# ------------------------------------------------------------

# Прочее

# ------------------------------------------------------------

kern.maxvnodes=200000

kern.maxprocperuid=65535

kern.ipc.nmbclusters=262144

kern.ipc.maxsockets=204800

net.inet.ip.forwarding=1

net.inet.ip.portrange.randomized=0

net.inet.tcp.always_keepalive=0

net.inet.tcp.blackhole=1

net.inet.tcp.fast_finwait2_recycle=1

net.inet.tcp.nolocaltimewait=1

net.inet.tcp.syncookies=1

net.inet.udp.blackhole=1

# ------------------------------------------------------------

# Core-файлы -> в "нужное место"

# ------------------------------------------------------------

kern.corefile="/var/tmp/%U.%N.core"

net.inet.tcp.always_keepalive поставил пока равным нулю, думаю в сильно нагруженном режиме висящие процессы будут сильно плодиться. Надо экспериментировать с этим.

В /boot/loader.conf добавляем это:

net.inet.tcp.syncache.hashsize=1024

net.inet.tcp.syncache.bucketlimit=100

net.inet.tcp.tcbhashsize=4096

kern.ipc.nsfbufs=10240

Установка и настройка lighttpd и php

Делаем все как обычно. При конфигурировании, перед сборкой php, обязательно выбираем опции «Build CGI version» и «Enable fast cgi support».

# cd /usr/ports/www/lighttpd

# make install clean

# cd /usr/ports/lang/php5

# make install clean

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

# make install clean

в принципе конфигурацию php можно сделать и с командной строки make ... не помню какие тут аргументы вписывать, разбираться/вспоминать нет времени. Далее создаем файлик конфигурации php и редактируем его:

# cd /usr/local/etc

# cp php.ini-dist php.ini

# mcedit php.ini

Находим и устанавливаем следующие переменные в php.ini

max_execution_time = 600

max_input_time = 600

memory_limit = 32M

cgi.fix_pathinfo = 1

Аналогично поступаем с конфигурацией сервера lighttpd

# mkdir /var/run/lighttpd

# chmod 0770 /var/run/lighttpd

# chown www:www /var/run/lighttpd

# cd /usr/local/etc

# cp lighttpd.conf.sample lighttpd.conf

# mcedit lighttpd.conf

Находим и устанавливаем следующие переменные в lighttpd.conf

server.modules = (

"mod_access",

"mod_fastcgi",

"mod_cgi",

"mod_accesslog" )

# ********************************************************

# у меня /tree монтируется на рэйд-массив

# для /tree/www:

# chmod 0770 /tree/www

# chown www:www /tree/www

# ********************************************************

server.document-root = "/tree/www/"

server.errorlog = "/var/log/lighttpd-error.log"

accesslog.filename = "/var/log/lighttpd-access.log"

# ваш IP сервера

server.bind = "192.168.1.1"

# установка разрешения fast-cgi

fastcgi.server = (

".php" =>

( "localhost" =>

(

"socket" => "/var/run/lighttpd/php-fastcgi.socket",

"bin-path" => "/usr/local/bin/php-cgi"

)

)

)

# ну и прочее

server.max-keep-alive-requests = 0

server.max-write-idle = 2400

Настройка ssh и ftp доступа

Для настройки ssh редактируем файлы (без подробностей, там все понятно):

/etc/ssh/ssh_config

/etc/ssh/sshd_config (тут используем «UseDNS no» - чтобы предотвратить таймаут резольва IP ssh-клиента)

/root/.ssh/authorized_keys

Настройка pf

Потом создадим файл правил /etc/pf.conf и отредактируем его:

touch /etc/pf.conf

mcedit /etc/pf.conf

Файл правил должен иметь следующий вид:

## ===================================================================

## Набор правил для фильтрации трафика на хосте

## -------------------------------------------------------------------

## Автор О.Мельников

## ===================================================================

# определения --------------------------------------------------------

if="em0"

icmp_types="echoreq"

table <trusted> { 10.1.1.1 }

table <abusive> persist

# опции --------------------------------------------------------------

set block-policy drop

set loginterface $if

set skip on lo

# нормализация трафика -----------------------------------------------

scrub in

# Фильтрация ---------------------------------------------------------

block in

pass out keep state

antispoof quick for $if

block in quick from <abusive>

# Правило: пропускаем трафик вебсервера ------------------------------

pass in on $if inet proto tcp from any to $if port www

flags S/SA synproxy state

(source-track rule, max-src-states 96, max-src-conn 48, max-src-conn-rate 48/60, overload <abusive> flush)

# Правило: пропускаем трафик ssh -------------------------------------

pass in quick log on $if proto tcp from <trusted> to any port 22 keep state

block in log on $if proto tcp from any to any port 22

# Правило: пропускаем трафик ftp -------------------------------------

pass in on $if proto tcp from <trusted> to any port > 49151 keep state

pass in quick on $if proto tcp from <trusted> to any port 21 keep state

# Правило: пропускаем весь ICMP трафик -------------------------------

pass in inet proto icmp all icmp-type $icmp_types keep state

# Правило: протоколируем несанкционированный доступ к ftp и ssh -----

block in log on $if proto tcp from any to any port 21

block in log on $if proto tcp from any to any port 22

..... продолжение следует

Обновлено: 12.03.2015