заметки на полях

Блокнот разработчика

Настройка nginx + apache на debian

Основная задача – что бы apache слушал запросы на
127.0.0.1:81 #порт можно взять и другой, к примеру 8080
а nginx слушал запросы с внешних адресов на 80 порту, разбирал статику или еще какие действия выполнял, а остальные запросы прокидывал на apache на локальный адрес 127.0.0.1 и 81 порт

Установка nginx:

1
apt-get install nginx

Сначала настроим nginx для работы, дефолтный конфиг и создадим конфиги для все используемых сайтов.
В самом конфиге (/etc/nginx/nginx.conf) получилось следующее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
user www-data;
worker_processes  1;

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;
server_names_hash_bucket_size 64;
access_log  /var/log/nginx/access.log;

sendfile        on;

keepalive_timeout  65;
tcp_nodelay        on;

gzip  on;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

И проверяем что не закралась ошибка:

1
2
3
sudo nginx -t
[info] 31015#0: the configuration file /etc/nginx/nginx.conf syntax is ok
[info] 31015#0: the configuration file /etc/nginx/nginx.conf was tested successfully

Далее правим дефолтный конфиг /etc/nginx/sites-available/default, для всех запросов. Так как запросы, кроме определенных сайтов нам не нужны, повесим их переадресацию на заглушку /var/www/nginx-default/index.html, больше нам здесь ничего не надо – 404 можно перекидывать сюда же:

1
2
3
4
5
6
7
8
9
10
11
12
server {
        listen   80;
        server_name  localhost;

        access_log  /var/log/nginx/localhost.access.log;

        location / {
                root /var/www/nginx-default;
                index index.html;
        }
        error_page      404     /index.html;
}

В итоге все неразобранные запросы попадут на нашу заглушку: http://77.220.185.16/.

Далее создаем настройки для всех поддерживаемых ресурсов, по аналогии с apache конфиги хранятся в /etc/nginx/sites-available/, а подключенные в /etc/nginx/sites-enabled/. Создаем /etc/nginx/sites-available/svdev.ru:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server {
        listen   80;
        server_name svdev.ru www.svdev.ru;

        access_log  /var/www/svdev.ru/logs/nginx-access.log;

        location / {
                proxy_pass         http://127.0.0.1:81/; # делаем переадресацию запросов на apache
                proxy_redirect     off;

                proxy_set_header   Host             $host;
                # Эти настройки необходимы, что бы из скриптов было видно реальные IP пользователя, а не фронт-части
                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;
        }
}

Перовоначальные настройки позволяют просто перенаправлять запросы с nginx на apache. Настройкой правил для отдачи статики без участия apache и прочим займемся позже. После создания настроек их необходимо подключить, по аналогии apache утилит a2ensite и a2dissite нет и надо создать симлинк самому:

1
sudo ln -s /etc/nginx/sites-available/svdev.ru /etc/nginx/sites-enabled/svdev.ru

Далее заставляем apache слушать 81 порт с внутреннего интерфейса, поправив /etc/apache2/ports.conf:

1
2
NameVirtualHost *:81
Listen 127.0.0.1:81

И необходимо подправить настройки хостов apache /etc/apache2/sites-available/svdev.ru:

1
2
# заменить 80 порт на выбранный, у меня 81
<VirtualHost *:81>

Таким образом попасть на apache теперь можно только через nginx, т. е. снаружи он недоступен!

Для удобства необходимо еще установить пакет

libapache2-mod-rpaf - module for Apache2 which takes the last IP from the 'X-Forwarded-For' header
1
sudo apt-get install libapache2-mod-rpaf

Мне дополнительно настраивать ничего не пришлось, после установки в $_SERVER["REMOTE_ADDR"] начал подставляться реальный IP посетителя, вместо 127.0.0.1 Дополнительную информацию по модулю можно найти погуглив, в документации или по ссылкам ниже.

Далее настроим ротацию логов. Сначала для nginx, приятно был удивлен, увидев /etc/logrotate.d/nginx, добавим туда еще один файл:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/var/log/nginx/*.log {
    daily
    missingok
    rotate 2
    compress
    delaycompress
    notifempty
    create 640 root adm
    sharedscripts
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
        cat /var/log/nginx/error.log.1 | mail root
    endscript
}

cat /var/log/nginx/error.log.1 | mail root – таким образом данные из последнего обработанного файла будут отправлену на почту рута, а уж куда она придет можно настраивать в /etc/aliases

Полезные ссылки

Официальная документация по nginx
OperNET: Настройка совместной работы Apache и nginx (web nginx http)
Установка и настройка Nginx.

Tags: , ,

3 Responses to “Настройка nginx + apache на debian”

  1. Настройка nginx + apache на debian | Технический блог о хостинге и веб-серверах Says:

    [...] © http://svdev.ru/blog/setup-nginx-apache-under-debian/ Основная задача – что бы apache слушал запросы на 127.0.0.1:81 #порт можно взять и другой, к примеру 8080 а nginx слушал запросы с внешних адресов на 80 порту, разбирал статику или еще какие действия выполнял, а остальные запросы прокидывал на apache на локальный адрес 127.0.0.1 и 81 порт [...]

  2. CyberMax Says:

    «Перовоначальные настройки позволяют просто перенаправлять запросы с nginx на apache. Настройкой правил для отдачи статики без участия apache и прочим займемся позже.»

    Так а где прочитать про «займемся позже»? :) Это класный получился у вас пост про настройку nginx + apache на debian, один из лучших что я видел, но вот настройки виртуального хоста, чтобы через nginx работал, здесь не хватает.

  3. Дерябин Сергей Says:

    Так а где прочитать про «займемся позже»?

    Попробовав такую связку – позже я занялся тем, что отказался от Apache совсем. Зачем отдавать обработку скриптов апачу, если с этим может прекрасно справиться сам nginx?

    Ну а так если все же настраивать статику, то перед конструкцией location / { можно определить правила для статики, например это директория upload и файлы, неважно в какой директории, но с предопределенным расширением:

            location ~ ^/upload/
            {
                    access_log /dev/null;
                    error_log /dev/null;
                    expires 5d;
                    fastcgi_intercept_errors on;
                    break;
            }

            location ~ .*(gif|jpg|jpeg|png|ico|css|swf|js|html|htm|xml|txt|gz|bmp|xls)$
            {
                    access_log   /dev/null;
                    expires      5d;
                    fastcgi_intercept_errors on;
                    break;
            }

    И вот еще очень полезный разбор написания рерайтов для nginx с примерами как надо и как не надо делать http://habrahabr.ru/blogs/nginx/74135/

Leave a Reply