17 сентября 2009 г.

NGINX как реверс прокси в связке с Apache

Apache является довольно мощным сервером с кучей возможностей, однако напрягать такую махину выдачей статического контента - все равно что стрелять из гаубицы по воробьям. Нагружая Apache дурной работой мы рискуем тем, что он будет занят тогда, когда он действительно нам необходим, например, для генерации странички с помощью PHP. Сегодня рассмотрим пример, как разгрузить Apache используя NGINX как реверс прокси. Как это работает? По сути на сервере будет стоять два веб сервера - NGINX и Apache. NGINX висит на 80 порту а Apache, например, на 88. Все HTTP запросы первым делом попадают на 80 порт, т.е. на NGINX, который по маске определяет как ему дальше работать. Если запрашиваемый контент попадает под маску статического, то NGINX сам отдает его, если нет - отправляет запрос на 88 порт, где уже Apache обрабатывает его и возвращает результат обратно NGINX'у, который в свою очередь передает его клиенту. Теперь рассмотрим примеры конфигураций для работы Apache в связке с NGINX. В конфигурации Apache необходимо просто указать что запускать веб сервер нужно на 88 порту. Откроем конфиг Apache (по умолчанию это файл default)
cd /etc/apache2/sites-available
sudo vi ./default
Измененная строка будет выглядеть так
<VirtualHost *:88>
Теперь внесем изменения в конфигурацию NGINX
cd /etc/nginx/sites-available
sudo vi ./default
в результате конфиг должен выглядеть приблизительно так
server {
    listen   80;
    server_name  example.com www.example.com;

    location / {
        proxy_pass http://localhost:88/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location ~* \.(htm|html|jpeg|jpg|gif|png|css|js|pdf|txt|tar)$ { 
        root /var/www/example.com; 
    }
}
Есть один нюанс - скрипты php, обрабатываемые Apache, в переменной окружения сервера $_SERVER['REMOTE_ADDR'] будут видеть всегда один IP - 127.0.0.1. Чтобы получить IP адрес клиента мы в конфигурации NGINX с помощью директивы
proxy_set_header X-Real-IP $remote_addr;
вставляем новый заголовок X-Real-IP. Из скриптов он доступен через переменную окружения $_SERVER['HTTP_X_REAL_IP']. Теперь перегружаем Apache и NGINX и проверяем их работу.
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/nginx restart

Комментариев нет:

Отправка комментария