Настраиваем связку nginx frontend (отдача статики) + apache22 (+php52) backend на FreeBSD

Цель:
— Установить связку nginx frontend (отдача статики) + apache22 (+php52) backend (обработка php)
— Вернуть в логи apache реальный ip-адрес запроса, а не ip-адрес nginx.
1) Устанавливаем nginx

cd /usr/ports/www/nginx
/usr/ports/www/nginx/make install clean

Появится окно выбора нужных опций. Я убираю использование протокола Ipv6 и нажимаю Ок:

2) Устанавливаем apache22 и php52 если они не установлены.
Детальная установка описана в статье — Установка веб-сервера apache22+php52

Далее:
Во всех, используемых у Вас, конфигах apache и виртуалхостов, меняем порт прослушивания c 80 на 88:

httpd.conf:

cat /usr/local/etc/apache22/httpd.conf | grep 88
Listen 88
ServerName www.soulbrat.org.ua:88

httpd-vhosts.conf:

cat /usr/local/etc/apache22/extra/httpd-vhosts.conf | grep 88
NameVirtualHost *:88

soulbrat.org.ua.conf:

cat /usr/local/etc/apache22/Includes/soulbrat.org.ua.conf | grep 88

3) Ставим mod_rpaf для решения проблемы определения рального IP для apache

cd /usr/ports/www/mod_rpaf2
/usr/ports/www/mod_rpaf2/make install clean

После установки идем в:

ee /usr/local/etc/apache22/httpd.conf

находим строку:

#LoadModule rpaf_module       libexec/apache22/mod_rpaf2.so

и раскоментируем её.

LoadModule rpaf_module       libexec/apache22/mod_rpaf2.so

Если, при перезапуске апача у Вас возникает ошибка «Can’t locate API module structure `rpaf2_module’ in file /usr/local/libexec/apache22/mod_rpaf2.so»
Проверте, что бы название модуля rpaf_module — было без цифры «2″ . Этот баг исправили в новой версии модуля.

В конце файла httpd.conf, добавляем следующие строки:

# Включаем модуль
RPAFenable On
# Доводит до ума X-Host
RPAFsethostname On
# Адрес фронтенда (nginx) - реальный IP-адрес вашго сервера
RPAFproxy_ips 195.8.40.80 127.0.0.1
# Имя отправляемого заголовка
RPAFheader X-Forwarded-For

сохраняем httpd.conf и закрываем.

4) Сохраняем с другим именем созданный конфиг nginx.conf и создаем свой:

mv /usr/local/etc/nginx/nginx.conf /usr/local/etc/nginx/nginx.conf.default

создаем свой конфиг:

ee /usr/local/etc/nginx/nginx.conf

# пользователь и группа от которого запускается процесс
user  www www;

# 3 рабочих процесса
# рекомендуют делать по количеству ядер
# но время отклика реально уменьшяется если запутить побольше воркеров
# ps ax -o %cpu,vsz,wchan,command | grep "nginx\|PID"
# Если один из рабочих процессов находится в состоянии ожидания "kqread" в колонке
# "WCHAN", то значит их количество достаточно. Ну а если уж все они
# постоянно находятся в этом состоянии, то их количество можно сократить до одного...
# И не забывайте контролировать логи ошибок nginx, если количество соединений
# превысит значение, которое в может обслужить nginx текущим количеством
# процессов, то в логах это будет соответствующее сообщение.
worker_processes  8;

# Уменьшает число системных вызовов gettimeofday(), что приводит к увеличению
# производительности
timer_resolution 100ms;

# Изменяет ограничение на число используемых файлов RLIMIT_NOFILE для рабочего
# процесса.
worker_rlimit_nofile 8192;

# Директива задаёт приоритет рабочих процессов от -20 до 20 (отрицательное число
# означает более высокий приоритет)..
worker_priority -5;

# Лог для ошибок, делаем отдельный каталог
error_log  /usr/logs/nginx-error.log;
events {

    # максимум рабочих соединений
    worker_connections  2048;
    # Метод обработки соединений
    # kqueue  эффективный метод, используемый во FreeBSD
        use kqueue;
        }
http {
    # Лог доступа всего веб-сервера
    access_log  /usr/logs/nginx-access.log;
    open_log_file_cache off;

    gzip  on;
    # Минимальная длина ответа, при которой модуль будет жать, в байтах
    gzip_min_length  1024;
    # Разрешить сжатие для всех проксированных запросов
    gzip_proxied     any;
    # MIME-типы которые необходимо жать
    gzip_types       text/plain application/xml application/x-javascript text/javascript text/css text/json;
    # Запрещает сжатие ответа методом gzip для IE6
    gzip_disable     "msie6";
    # Уровень gzip-компрессии
    gzip_comp_level  6;
    # Подключаем таблицу mime
    include       mime.types;
    # mime-тип по умолчанию
    default_type  application/octet-stream;

    ###Защита от срыва стека###
    #
    # Задаёт максимально допустимый размер тела запроса клиента,
    # указываемый в поле Content-Length. заголовка запроса. Если размер больше
    # заданного, то клиенту возвращается ошибка 413 (Request Entity Too Large).
    # Следует иметь в виду, что браузеры не умеют корректно показывать эту ошибку.
    # Установка параметра размер в 0 отключает проверку размера тела
    # запроса клиента.
    # Если сервер должен поддерживать загрузку файлов, это значение
    # необходимо увеличить
    client_max_body_size       1m;
    #
    # Максимальный размер буфера для хранения тела запроса клиента
    client_body_buffer_size    1k;
    #
    # Директива задаёт размер буфера для чтения заголовка запроса клиента
    client_header_buffer_size    1k;
    #
    # Директива задаёт максимальное число и размер буферов для чтения большого
    # заголовка запроса клиента
    large_client_header_buffers  2 1k;
    ############################

    ### Повышение производительности
    # Директива задаёт таймаут при чтении тела запроса клиента
    client_body_timeout    3m;
    # Директива задаёт таймаут при чтении заголовка запроса клиента
    client_header_timeout  3m;
    # Директива задаёт таймаут при передаче ответа клиенту
    send_timeout           1m;

    # Директива задаёт таймаут, в течение которого keep-alive соединение с клиентом
    # не будет закрыто со стороны сервера
    keepalive_timeout      2m;

    # Включить sendfile(). Использование sendfile() экономит системные вызовы,
    # уменьшает число копирований данных,
    # позволяет использовать меньше физической памяти
    # Директива разрешает или запрещает использовать sendfile()
    sendfile        on;

    # Директива разрешает или запрещает использовать опции
    # TCP_NOPUSH во FreeBSD
    #keepalive_timeout
    #tcp_nopush     on;

    ### http://nginx.org/ru/docs/hash.html
    # Задаёт размер корзины в хэш-таблицах имён серверов.
    # Значение по умолчанию зависит от размера строки кэша процессора
    # Эта директива необходима если у вас большое колличество виртуалхостов
    server_names_hash_bucket_size 128;
    # Задаёт максимальный размер хэш-таблиц имён серверов
    server_names_hash_max_size 512;

    # Это заставит nginx скрывать информацию о типе и версии Web-сервера на
    # страницах, генерируемых в ответ на ошибочный запрос клиента
    #server_tokens off;

    # Модуль позволяет описывать группы серверов, которые могут использоваться
    # в директивах proxy_pass и fastcgi_pass
    upstream backend {
        # Директива задаёт имя и параметры сервера Обратите внимание, мы будем
        # использовать имя "backend" в директиве proxy_pass
        server 127.0.0.1:88;
                     }

## где будут лежать виртуалхосты
include /usr/local/etc/nginx/Includes/*;
}

Создаем необходимые каталоги:

mkdir /usr/local/etc/nginx/Includes
mkdir /usr/logs

Добавляем nginx в автозапуск:

echo 'nginx_enable="YES"' >> /etc/rc.conf

Теперь необходимо создать нужные виртуалхосты, все которые прописаны в apache. Создадим один, по этому примеру создаются и остальные:

touch /usr/local/etc/nginx/Includes/soulbrat.org.ua.conf
ee /usr/local/etc/nginx/Includes/soulbrat.org.ua.conf

server {
        # Слушать 80 порт
        # фильтр позволяет отфильтровывать.
        # все не хттп соеденения до их установки на уровне ядра.
        # (собираются все пакеты анализируется GET загаловок,.
        # если его нет соеденение отбрасывается, если есть то соедененине.
        # появляется в системе и нгинксе, оч полезно от примитивного доса).
        listen       80 default accept_filter=httpready;
        # Следует учитывать, что фильры необходимо запустить только на одном виртуалхосте, иначе при запуске вы получите ошибку:
        # nginx: [emerg] duplicate listen options for 0.0.0.0:80
        # На всех остальных вируталхостах, я прописываю так:
        # listen       80;

        server_name  soulbrat.org.ua www.soulbrat.org.ua  ;
        location / {
        proxy_pass         http://127.0.0.1:88/;
        proxy_redirect     off;

                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $remote_addr;

                        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;
                                        }
        # Где лежат статические файлы и собственно сам сайт
        location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
        root  /usr/www/soulbrat.org.ua/WWW/;
        }
        # Статистика апача
        location ^~ /server-status/ {
        proxy_pass http://127.0.0.1:88;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }
        # Статистика нгинкс
        location = /stat {
        stub_status on;
        access_log  off;
        allow 10.0.0.0/24;
        deny all;
                }
        location ~ /\.ht {     # закрываем доступ к файлам .htpasswd
        deny        all;
            }
}

Если вы прописали использование фильтров default accept_filter=httpready
необходимо включить их в ядро командами:

kldload accf_http
kldload accf_data

Проверяем:

[root@soulbrat /usr/local/etc/rc.d]# kldstat | grep accf
 5    1 0xc5510000 2000     accf_http.ko
 6    1 0xc5512000 2000     accf_data.ko

Что бы модули грузили автоматически, при перезагрузке системы, пропишите запуск в файл loader.conf:

ee /boot/loader.conf

accf_http_load=YES
accf_data_load=YES

Теперь все готово к запуску.

Перезагружаем apache и запускаем nginx:

/usr/local/etc/rc.d./apache22 restart && ./nginx start

Performing sanity check on apache22 configuration:
Syntax OK
Stopping apache22.
Waiting for PIDS: 72827.
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Starting nginx.

Если все запустилось без ошибок,значит все найстроки прописаны верно. Можете проверяь работу вашего сайта на новой связке nginx (frontend) + apache (backend)

=================
Несколько советов по работе с алиасами nginx:
=================
Конструкция алиаса:

location ^~ /phpmyadmin/ {
         proxy_pass http://127.0.0.1:88;
                }

просто отдаст запрос апачу на алиас phpmyadmin, используя адрес локалхоста. Если вам необходимо передавать в заголовке имя, передаваемое к проксируемому серверу, пропишите так:

location ^~ /phpmyadmin/ {
        proxy_pass http://127.0.0.1:88;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }

Еще пример, если для сбора статистики вы используете awstats, конструкция выглядит так:

location ^~ /awstatsicons {
            alias /usr/www/soulbrat.org.ua/awstats/icons/;
            access_log off;
                    }
location ^~ /awstatscss {
            alias /usr/www/soulbrat.org.ua/awstats/css/;
            access_log off;
                    }
location ^~ /awstatsclasses {
            alias /usr/www/soulbrat.org.ua/awstats/classes/;
            access_log off;
                    }

По материалам: soulbrat.org.ua/?p=971

Запись опубликована в рубрике *CentOS, *Unix,*Linux, *Web, FreeBSD. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не спамер This plugin created by Alexei91