nginx + apache2 (проксирующая связка и виртуальные хосты) в ubuntu

| 11.02.2013

В этой статье речь пойдет о поднятии и настройке веб сервера и виртуальных хостов. После того, как мы установили систему, мы также сразу же установили и LAMP сервере (linux+apache+mysql+php), куда вошли последние пакеты. Если Вы это не сделали, Вам надо установить их:

apt-get install apache2 mysql php5

Если у Вас уже все было установлено, Вам надо установить лишь nginx:

apt-get install nginx

Зачем нам еще один веб сервер? Все просто, nginx мы делаем, как фронт энд к apache, это надо для улучшения производительности и более быстрой работы под высокими нагрузками, что очень актуально для социальных сетей или порталов с высокой посещаемостью. Суть всей этой затеи такова:

Apache является большой, толстой и неповоротливой скотиной, он долго выполняет и отдает содержимое, но он нужен, т.к. многие cms или фрэймворки используют его модули для организации своих ссылок и путей. Все эти конструкции можно ручками переписать для nginx, но, согласитесь, вместо быстрой установки cms, надо еще пол дня потратить на настройку — не лучший вариант. Выход из этого прост, схема такая:

на фронт энде стоит nginx, он получает запросы. Если от него хотят статическое содержимое (картинки, html файлы, pdf или что-то еще, что не надо выполнять), то сам nginx сразу же быстро эти данные вернет. Если надо обработать какой-нибудь php запрос, то nginx отдаст его на выполнение apache, он обработает и вернет nginx, а nginx быстро отдаст нам.

Взаимодействие на одной машине между apache и nginx намного быстрее, чем если бы мы просто работали с apache.
Таким образом мы получаем хорошую связку для быстрой работы, где шустрый и быстрый nginx берет часть работы на себя.

Давайте настроим всю эту тему. Для этого мы настроим nginx так. чтобы он работал на всех интерфейсах и хостах на 80 порту, а apache висел только на localhost и порту 8080. Также нам понадобится модуль для apache mod_rpaf, давайте установим и его.

apt-get install libapache2-mod-rpaf

Модуль этот нужен для того, чтобы apache видел реальный ip подключения, а не ip nginx, т.е. модуль «пробрасывает» его через прокси и в логах мы видем настоящий ip подключения, что, безусловно, полезно. Хоть ниже мы и настраиваем proxy.conf, все равно модуль стоило бы поставить. У меня изначальные его настройки были верными. Посмотреть их можно в /etc/apache2/mods-enabled/rpaf.conf

Теперь перейдем к настройкам apache, давайте создадим файл конфигурации виртуального хоста. Допустим мы хотим поднять сайт ololo.lol, тогда нам надо создать файл в /etc/apache2/sites-enabled/ololo.lol

 
<VirtualHost *:8080>

ServerAdmin mail@mail.ru
ServerName www.ololo.lol
DocumentRoot /home/domains/ololo.lol/public_html/
ServerAlias ololo.lol
Options -MultiViews
AllowOverride All

ErrorLog /home/domains/ololo.lol/logs/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel info

CustomLog /home/domains/ololo.lol/logs/access.log combined

</VirtualHost >

Пути необходимо заменить на свои, разумеется и папки создать для логов и файлы — error.log для логирования ошибок и access.log для логирования подключений.

Теперь необходимо настроить nginx, но сначала настроим для него конфигурацию проксирования, в файле /etc/nginx/proxy.conf мы указываем переменные, значения которых определяют режим работы. Сколько данных можно передать, какое время максимально это может занять и т.п. По имени переменных все понятно. У меня этот файл такой:

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 32k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

Ну теперь конфиг виртуального хоста для сайта: /etc/nginx/sites-enabled/ololo.lol

upstream backend {
# Адрес back-end’a
server localhost:8080;
}

server {
listen 80;
server_name www.ololo.lol ololo.lol;

access_log /home/domains/ololo.lol/logs/nginx_access.log;
error_log /home/domains/ololo.lol/logs/nginx_error.log;

# Перенаправление на back-end
location / {
proxy_pass http://backend;
include /etc/nginx/proxy.conf;
}

# Статическиое наполнение отдает сам nginx
# back-end этим заниматься не должен
location ~* \.(jpg|jpeg|gif|png|css|ico|bmp|swf|js)$ {
root /home/domains/ololo.lol/public_html/;
}
}

Для каждого сайта лучше делать отдельный поток (upstream) и указывать его имя в proxy_pass для более лучшей производительности и скорости работы (многопоточность ведь), однако это займет дополнительные аппаратные ресурсы, но работать все будет быстрее.

Вот и все. Кстати nginx был написан Игорем Сысоевым, его програма популярна во всем мире и является самым производительным веб сервером на сегодняшний день. Такие вот дела, господа.