Скачать 131.39 Kb.
|
Министерство образования и науки Российской Федерации МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
КУРСОВАЯ РАБОТА Организация веб-сервера с использованием Apache и nginx
Москва 2009 ОглавлениеЦели работы 3 Введение 4 Общие сведения о веб-серверах 4 Основные проблемы веб-серверов 4 Frontend и backend 4 Обзор веб-серверов и конфигураций их установки 5 Настройка выбранной конфигурации 6 Распределение функций между Apache и nginx 6 Установка и первичная настройка nginx 7 Установка 7 Основные параметры 7 Группа настроек events 8 Группа настроек http 8 Наиболее простая конфигурация (листинг) 11 Установка и первичная настройка Apache 13 Настройки безопасности nginx 13 Дополнительная настройка ngnix 13 Автоматические добавление поддоменов 13 Дополнительная настройка Apache 15 Итоги работы 16 Список литературы 17 Цели работыЦелями данной работы являются:
ВведениеОбщие сведения о веб-серверахСервер — один из основных компонентов модели клиент-сервер, программный компонент вычислительной системы, выполняющий сервисные функции по запросу клиента, предоставляя ему доступ к определённым ресурсам. Веб-сервер — это сервер, принимающий HTTP-запросы от клиентов(в большинстве случаев браузеры) и выдающий им HTTP-ответы, обычно вместе с HTML-страницей, изображением, файлом, медиа-потоком или другими данными. Кроме основной функции передачи ответа на HTTP-запросы веб-серверы как правило имеют ряд других функций:
Основные проблемы веб-серверовНаиболее важными проблемами веб-серверов являются: быстродействие и безопасность. На быстродействие сервера влияет его архитектура, количество и частота выполнения им функций. Безопасность сервера сводится к ограничению доступа к управлению сервером. Также эти две проблемы пересекаются при решении задачи защиты сервера от DDoS-атак, где главной целью является не допустить перегрузки сервера и следовательно его зависания. Frontend и backendНаиболее распространенная модель в архитектуре клиент-сервер, позволяющая значительно снизить нагрузку на сервер и предотвратить ряд проблем с безопасность. Суть модели заключается в разделении серверной части на две: принимающую запросы (Frontend) и обрабатывающую (backend). Также между этими частями разделяются и задачи сервера вцелом: основной задачей принимающего является увеличение быстродействия и предотвращение DDoS-атак (однако это не избавляет Frontend от задач безопасности полностью), обрабатывающий сервер занимается генерацией HTTP-ответов с последующей передачей их через Frontend клиенту. Backend имеет связь только с Frontend и не имеет прямого доступа к интернету, что обеспечивает его безопасность. Frontend сервер ставят простым и быстрым, не нагружая его дополнительными функциями такими, как поддержка динамически генерируемых страниц. Сервер обеспечивает функции файлового, предоставляя доступ только к статическим данным. В случае запроса динамических данных (php, asp и другие скрипты серверных языков) Frontend перенаправляет запрос к backend серверу. Обзор веб-серверов и конфигураций их установкиХотя простой веб-сервер можно написать самостоятельно и займет это немного времени, существует около десятка готовых решений, которые имеют большой функционал и отказоустойчивость. Почти все популярные современные веб-серверы являются бесплатными opensource-продуктами, что позволяет их дорабатывать и менять в соответствии со своими предпочтениями. Apache HTTP Server – самый популярный сервер, на данный момент чуть менее половины(49%) всех веб-серверов работает на нем. Соответственно отличается крайне широким функционалом, наибольшим количеством дополнительных модулей. Недостатком сервера является относительно низкая скорость работы. Internet Information Server (IIS) – единственный небесплатный веб-сервер с закрытым кодом. Поставляется в комплекте с операционными системами семейства Windows NT. Обеспечивает работу с основными службами и протоколами интернета. Lighttpd – один из вариантов для сильно нагруженных систем. Реализован наиболее популярный набор функций. Однако, из-за работы не со стандартными системными интерфейсами, а непосредственно с ядром ОС имеет некоторые трудности в настройке. Nginx – отечественный свободный сервер. Отличается высокой скоростью и гибкой, простой настройкой. Ко всем серверам существует вся необходимая документация, в том числе на русском (только для lighttpd неполная). Достаточно часто используется комбинация серверов. Apache ставят backend-сервером и обращаются к нему только в случае необходимости(генерации динамического контента, работы модулей, не реализованных в других серверах), а с клиентом общается lighttpd или nginx, отличающиеся быстродействием. В этой работе будет рассмотрена конфигурация, где frontend-сервером будет nginx. Настройка выбранной конфигурацииРаспределение функций между Apache и nginxApache – наиболее популярный HTTP-сервер благодаря его функционалу. К Apache существует большое количество модулей, которых нет в других серверах, поэтому для наиболее гибкой настройки веб-сервера строятся именно на Apahce. Nginx – веб-сервер с упором на быстродействие. Он не поддерживает такого множества модулей, как апач, лишь в качестве эксперимента на нем можно включить обработку Perl (модуль ngx_http_perl_module). Однако, наиболее популярное использование nginx – Frontend сервер обработки запросов на статические данные и перенаправление запросов на динамические на backend сервер. Nginx будет принимать запросы от клиета (браузера пользователя) на 80 порт, который является стандартным для HTTP-запросов. Затем, в случае, если запрошены динамические данные, то перенаправлять запрос по 88 порту к Apache (можно использовать любой другой свободный порт). Схема работы конфигурации серверов Apache и nginx: HTTP-клиент (браузер пользователя) Nginx 80 порт Файлы (статические данные сайта) Apache 88 порт. Генерация динамических данных (РНР, Perl…) Статические данные Динамические данные Установка и первичная настройка nginxУстановкаУстановка производится стандартными средствами выбранной операционной системы. Установка на FreeBSD: cd /usr/ports/www/nginx make config make install clean Установка в Debian-подобных системах: apt-get install nginx Установка под Windows (поместить архив в корень диска): cd c:\ unzip nginx-0.7.57.zip cd nginx-0.7.57 start nginx Основные параметрыПосле установки необходимо настроить файл конфигурации. В нем можно полностью настроить поведение сервера, здесь же и связь с Apache, отделение статических данных от динамических. В FreeBSD файл конфигурации находится: /usr/local/etc/nginx/nginx.conf В Debian-подобных системах: /etc/nginx/nginx.conf Рассмотрим основные параметры этого файла: Прежде всего необходимо указать пользователя, через которого будут осуществляться все операции на сервере. По умолчанию это www, лучше так и оставить: user www www; Затем нужно задать количество рабочих процессов: worker_processes 2; Как правильно определить нужное количество процессов? Если у вас совсем небольшой сайт, который полностью может поместиться в оперативную память сервера и обойтись без подключения к диску, то лучше ставить это значение 1. Если часто необходимо подключаться к диску, то лучшим вариантом будет поставить это значение в районе 5-10, тогда можно будет обрабатывать соединения процессами, не заблокированными на диске. Для корректной работы необходимо придерживаться правила, что на одном рабочем процессе должно быть не более 300 соединений. Также более 20 стоит ставить, если вы используете стандартные методы соединений poll/select (об этом ниже). Максимальное количество рабочих процессов 1024. Далее можно задать адрес для отчетов об ошибках: error_log /var/log/nginx.error_log info; Группа настроек eventsВ этой группе настроек указаны параметры соединений. Можно задать максимальное количество рабочих соединений (помните о связи с рабочими процессами). worker_connections 1024; Далее задается важный параметр – метод обработки соединений. Существует несколько методов, рассчитанных на различные операционные системы и стандартные методы. Крайне рекомендуется не выбирать стандартный без необходимости, так как это чревато излишней нагрузкой. Для FreeBSD нужно использовать kqueue, для Linux 2.2.19+ использовать rtsig, для Solaris 10 - eventport. Стандартными методами являются select и poll для любых систем. Синтаксис задания параметра: use kqueue; Группа настроек httpОсновная группа настроек, в которой задаются параметры определения типов файлов, шаблон ведения лога и различные таймауты. Сперва нужно подключить MIME-таблицу и определить MIME-тип по умолчанию: include mime.types; default_type application/octet-stream; Далее можно задать формат отображения логов для отображения и более подробный для скачивания: log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio"'; log_format download '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_range" "$sent_http_content_range"'; Далее задаются таймауты. Все таймайты указаны в примерах в минутах (m). client_header_timeout 3m; # таймаут при чтении заголовка запроса клиента client_body_timeout 3m; # таймаут при чтении тела запроса клиента send_timeout 3m; # таймаут при передаче ответа клиенту keepalive_timeout 2m; # таймаут поддержки keep-alive соединения сервера с клиентом Далее следует переключатель возможности использования функции sendmail(). Лучше отключить, чтобы избежать использования для отправки спама. sendfile off; Далее задаются размеры буфера для чтения заголовков запроса клиента. Разделают обычные и большине запросы, также можно задать максимальное количество используемых буферов (число до размера): client_header_buffer_size 1k; large_client_header_buffers 4 4k; Следующим можно задать параметры использования сжатия gzip, максимальный размер и количество буферов. gzip on; gzip_min_length 1100; gzip_buffers 4 8k; gzip_types text/plain; Далее в группе http описывается группа модуля upstream backend, которая будет использоваться для задания backend сервера (указывается его порт): upstream backend { server 127.0.0.1:88; } Далее в этой же группе http описывается собственно группа настроек самого сервера server, в которой определим, какие типы файлов являются статическими и будут обрабатываться nginx'ом. Параметры можно задавать как в целом для всего сервера, так и для отдельных папок, файлов, масок имен файлов. Сперва задаются порт, адрес сервера и кодировка (указываем порт, с которым будет работать frontend серер, то есть 80): listen test.ru:80; server_name test.ru www.test.ru; charset koi8-r; Также можно задать максимальный размер тела запроса клиента: client_max_body_size 101M; Теперь в подгруппах location прописываем правила доступа на файлы и перенаправления запросов. Если запрашивается статический контент (картинки, javascript-файлы, фреш), то просто указываем путь, где это находится: location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js)$ { root /home/test/test.ru; } Остальные типы файлов отправляем на обработку backend серверу (адрес backend был задан выше командой upstream), задаем также таймауты на получение данных, отправку и время поддерживания соединения в секундах: location / { proxy_pass http://backend/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 120; proxy_send_timeout 120; proxy_read_timeout 180; } Не лишним для безопасности будет запретить доступ к ht файлам (.htaccess, .htpass, etc): location ~ /\.ht { deny all; } Также в группе http прописываются действия при ошибках (40* и 50*), для этого можно либо для каждой ошибки задать действие (в этом примере используется передача в ответ готовой страницы ошибки): error_page 404 /404.html; Либо сформировать группу и задать действие для нее (в данном примере при ошибке используется перенаправление в корневую директорию сервера): error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/local/www/nginx-dist; } На этом первичное редактирование файла конфигурации завершено. Наиболее простая конфигурация (листинг)user www www; worker_processes 3; error_log logs/error.log; events { worker_connections 1024; use kqueue; } 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"'; access_log logs/access.log main; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; keepalive_timeout 2m; sendfile off; client_header_buffer_size 1k; #large_client_header_buffers 4 4k; upstream backend { server 127.0.0.1:88; } server { listen 80; server_name test.ru www.test.ru; charset koi8-r; access_log logs/host.access.log main; client_max_body_size 101M; location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js)$ { root /home/pyha/pyha.ru; } location ~ /\.ht { deny all; } location / { proxy_pass http://backend/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 120; proxy_send_timeout 120; proxy_read_timeout 180; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/local/www/nginx-dist; } } } Установка и первичная настройка ApacheУстановка Apache осуществяется аналогично с nginx для всех систем. Пример в FreeBSD: cd /usr/ports/www/apache2 make config make install clean Все, что остается поменять в конфигурации Apache для стабильной работы связки серверов – это порт. Файл конфигурации в FreeBSD находится по адресу: /usr/local/etc/apache2/httpd.conf В Debian-системах находится по адресу: /etc/apache2/ports.conf Нужно найти строку, где задается прослушиваемый порт и поменять 80 на 88: Listen 88 Необходимо также исправить номер порта в httpd-vhosts.conf для всех хостов. После этого остается только перезапустить оба сервера и конфигурация будет работать. Настройки безопасности nginxНекоторые настройки уже заданы: таймауты, ограничение на рабочие процессы и соединения – это дает защиту от DDoS-атак, закрыт доступ к .ht-файлам, в которых могут храниться важные данные. Защита от DDoS-атак осуществляется обычно на уровне ОС, на уровне nginx же все сводится к уменьшению числа рабочих процессов и соединений. Также можно ограничить скорость передачи ответа клиенту. Скорость задается в байтах в секунду в группе настроек server. limit_rate 4k Скорость задается для одного соединения, поэтому лучшей регулировки, нужно задавать также ограничение на количество соединений для клиента. Дополнительная настройка ngnixАвтоматические добавление поддоменовЕсли нужно автоматически создавать поддомены, то удобно не описывать каждый новый в конфигурации, а сделать автоматическое определение адреса поддомена и перенаправлять клиента в нужную папку. В данном примере перенаправление идет на одноименную папку в корне сайте: server { listen 80; server_name test.ru *. test.ru; root /var/www/ test.ru /$subdomain; set $subdomain ""; if ($host ~* ^([a-z0-9-\.]+)\. test.ru $) { set $subdomain $1; } if ($host ~* ^www. test.ru $) { set $subdomain ""; } } Также нужно прописать условие для поддомена www (переадресация на сам сайт) и других, если это необходимо. Дополнительная настройка ApacheПри данной конфигурации в обработанных на Apache скриптах будет некорректной переменная REMOTE_ADDR, так как это адрес не пользователя, а nginx’а. Чтобы в этой переменной отображался IP-адрес пользователя, нужно установить на Apache модуль RPAF. Затем добавить в httpd.conf: RPAFenable On RPAFsethostname On RPAFproxy_ips *.*.*.* RPAFheader X-Forwarded-For В параметр RPAFproxy_ips вставьте IP-адрес nginx сервера. После этого перезапустите Apache. Быстродействие Apache можно улучшить, включив FollowSymLinks и отключив SymLinksIfOwnerMatch, это позволит избежать проверки символических ссылок, которая занимает относительно большое время, в Apache, оставив эту работу для nginx. Также можно отключить в Apache поддержку .htaccess, так как этим также занимается nginx на frontend'е. Вообще, на nginx можно повесить много функций, который затем отключить в Apache. Использовать в Apache лучше только то, что еще не поддерживается в nginx. Итоги работыВ ходе работы были произведены:
Список литературы
|
Рабочая программа Наименование дисциплины Московский государственный институт электроники и математики (технический университет) | Рабочая программа Наименование дисциплины Московский государственный институт электроники и математики (технический университет) | ||
Рабочая программа Наименование дисциплины Московский государственный институт электроники и математики (технический университет) | Рабочая программа Наименование дисциплины Московский государственный институт электроники и математики (технический университет) | ||
Рабочая программа Наименование дисциплины Московский государственный институт электроники и математики (технический университет) | Рабочая программа Наименование дисциплины «Московский государственный институт электроники и математики (технический университет)» | ||
Реферат в аспирантуру на тему: «Организация видеопроизводства» Московский государственный институт электроники и математики (технический университет) | Московский государственный институт электроники и математики (технический университет) Негосударственное образовательное частное учреждение высшего профессионального образования | ||
Реферат по дисциплине «Культурология» на тему «Искусство как форма протеста (дадаизм)» Московский государственный институт электроники и математики (технический университет) | Программа по формированию навыков безопасного поведения на дорогах... Московский государственный институт электроники и математики (технический университет) | ||
Курсовая работа по дисциплине «Организация эвм» Тема: «Устройства ввода настоящего и будущего» Московский Государственный Институт Электроники и Математики (Технический Университет) | Рабочая программа по дисциплине «Дискретная математика» Государственное образовательное учреждение высшего профессионального образования Московский государственный институт электроники... | ||
Рабочая программа Наименование дисциплины : Видеотехнологии Номер... Московский государственный институт электроники и математики (технический университет) | Рабочая программа Наименование дисциплины : Компьютерная графика... Московский государственный институт электроники и математики (технический университет) | ||
Московский энергетический институт Московский государственный технический университет радиотехники, электроники и автоматики (мгту мирэа) | Диалектика Московский государственный институт радиотехники, электроники и автоматики (технический университет) |