Pull to refresh

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

В этой статье речь пойдет о поднятии и настройке веб сервера и виртуальных хостов. nginx мы делаем, как фронт энд к apache.

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

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

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

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

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

apt-get install apache2 mysql php5

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

apt-get install 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



Пути необходимо заменить на свои, разумеется и папки создать для логов и файлы — 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 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 был написан Игорем Сысоевым, его програма популярна во всем мире и является самым производительным веб сервером на сегодняшний день. Такие вот дела, господа.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.