Nginx: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Решение)
(На '''Интернет сервере''' делаем...)
 
(не показано 12 промежуточных версий этого же участника)
Строка 9: Строка 9:
  
 
=Решение=
 
=Решение=
 +
 +
                        Решение делается на 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 сервер!
 +
 +
 +
<br clear="all">
 
[[Изображение:nginx11.png|center]]
 
[[Изображение:nginx11.png|center]]

Текущая версия на 01:55, 22 августа 2009

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

Задача

Выпустить в интернет веб-сервисы с различных 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