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

© http://svdev.ru/blog/setup-nginx-apache-under-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

Leave Your Comment