Настройка 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.
Январь 18th, 2010 at 22:17
[...] © http://svdev.ru/blog/setup-nginx-apache-under-debian/ Основная задача – что бы apache слушал запросы на 127.0.0.1:81 #порт можно взять и другой, к примеру 8080 а nginx слушал запросы с внешних адресов на 80 порту, разбирал статику или еще какие действия выполнял, а остальные запросы прокидывал на apache на локальный адрес 127.0.0.1 и 81 порт [...]
Апрель 14th, 2010 at 17:30
«Перовоначальные настройки позволяют просто перенаправлять запросы с nginx на apache. Настройкой правил для отдачи статики без участия apache и прочим займемся позже.»
Так а где прочитать про «займемся позже»?
Это класный получился у вас пост про настройку nginx + apache на debian, один из лучших что я видел, но вот настройки виртуального хоста, чтобы через nginx работал, здесь не хватает.
Апрель 14th, 2010 at 19:14
Попробовав такую связку – позже я занялся тем, что отказался от Apache совсем. Зачем отдавать обработку скриптов апачу, если с этим может прекрасно справиться сам nginx?
Ну а так если все же настраивать статику, то перед конструкцией
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/