Nginx

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску

Все познается в примерах...

Задача

Выпустить в интернет веб-сервисы с различных ip хостов одной подсети через сервер, имеющий выход в интернет через pppoe соединение.

При этом хосты, на которых крутятся web-сервисы должны видеть только сервер, смотрящий в интернет, сами в интернет смотреть не должны.

Работающие apache на каждой из ip хостов должны в свои логи получать реальные ip адреса клиентов из интернета.

Решение

                       Решение делается на Ubuntu Server 8.04.3 LTS. Ориентируемся по картинке ниже...
                       Некоторые ссылки для написания статьи:
                       http://debianworld.ru/articles/ustanovka-nginx-kak-front-end-k-apache-v-debian-ubuntu/
                       http://www.opennet.ru:8101/base/net/nginx_frontend_apache.txt.html

На Интернет сервере делаем...

  • Устанавливаем nginx
aptitude install nginx
  • Редактируем конфиг nginx
sudo nano /etc/nginx/nginx.conf

приблизительно так:

# пользователь, от которого запускается процесс
user www-data;
# кол-во рабочих процессов. Обычно равно кол-ву ядер на машине
worker_processes  2;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream; 
    access_log  /var/log/nginx/access.log;
    sendfile        on;
    tcp_nopush     on;
    keepalive_timeout  2;
    tcp_nodelay        on;
    gzip  on;
    gzip_comp_level 3;
    gzip_proxied any;
    gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
} 
  • Останавливаем nginx:
/etc/init.d/nginx stop
  • Создаем файл конфигурации 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        10m;
client_body_buffer_size     128k;
proxy_connect_timeout       90;
proxy_send_timeout          90;
proxy_read_timeout          90;
proxy_buffer_size           4k;
proxy_buffers               4 32k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;
  • Создаем файл виртуального хоста:
nano /etc/nginx/sites-available/mysite.ru

приблизительно так создаем виртуальный хост для ВебСервера 2 с виртуальным хостом mysite.ru:

 upstream mysite.ru {
  # Внимание!, если back-end apache имеет виртуальные хосты, то название mysite.ru должно совпадать с названием виртуального хоста на apache!
  # Адрес back-end'a! 
  server 192.168.10.7:80;
}
server {
    listen   80;
    server_name www.mysite.ru mysite.ru; 
    access_log /home/site/mysite.ru/logs/nginx_access.log;
    error_log /home/site/mysite.ru/logs/nginx_error.log; 
    # Перенаправление на back-end
    location / {
        proxy_pass  http://mysite.ru;
        include     /etc/nginx/proxy.conf;
    }
    # Статическиое наполнение отдает сам nginx
    # back-end этим заниматься не должен
    # Теоретически в эту директорию nginx должен кешировать файлы, типы которых указаны.
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js)$ {
        root /home/site/debianworld.ru/static/;
    }
}
  • Включаем новый хост:
ln -s /etc/nginx/sites-available/mysite.ru /etc/nginx/sites-enabled/mysite.ru
  • Запускаем nginx
/etc/init.d/nginx start
  • Добавляем в /etc/rc.local команду для автоматического запуска nginx при загрузке сервера
nano /etc/rc.local

до exit 0 добавляем строчку

/etc/init.d/nginx start

На одном из Веб серверов делаем...

                  Как Вы уже догадались, делаем на ВебСервере 2...
                  Предполагается, что на этом сервере уже работает apache с настроенным виртуальным хостом mysite.ru
  • Устанавливаем поддержку apache-м модуля mod_rpaf

Данный модуль для apache необходим для работы связки nginx - front-end/apache - back-end. Необходимость в данном модуле возникает по следующей причине: запросы к apache приходят с ip адреса на котором работает nginx (в простейшем случае это тот же самый адрес на котором работает apache), соответственно в журнальных файлах apache будет фигурировать только ip nginx сервера, что не очень хорошо. Также без использования данного модуля начнутся проблемы со скриптами в которых используется ip адрес посетителя и станет правильно работать механизм ограничения доступа по ip адресам с помощью .htaccess.

итак, устанавливаем

aptitude install libapache2-mod-rpaf

настраиваем

nano /etc/apache2/mods-available/rpaf.conf
изменяем значение параметра RPAFproxy_ips на ip адрес сервера с nginx тем самым давая возможность apach-у получать реальные ip в логах виртуальных хостов
<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 192.168.10.1
</IfModule>

перезапускаем apache

/etc/init.d/apache2 restart

проверяем работоспособность

Примечание: В этой статье не рассматривается настройка ДНС. Для работы с адресами, работающими через nginx еще необходимо настроить DNS сервер!



Nginx11.png