Pull to refresh

Установка nginx в качестве фронт-энда для денвера

Website development *
Tutorial
В последнее время установка nginx в качестве проксирующего веб-сервера и для отдачи статики становится довольно распространенной практикой в интернете. Но кроме этого, nginx можно использовать для кучи других полезных вещей: автоматический ресайз картинок, удобные динамические поддомены и т.д.

Раньше для тестирования настроек nginx мы пользовались копией продакшн сервера, но сегодня наконец-то мне надоело каждый раз заходить на сервер чтобы попробовать какую-нибудь мелочь, и я решил настроить nginx на локальной windows-машине, в качестве сервера на которой установлен денвер.

Почему именно денвер? Потому что я считаю что это самый быстрый и прстой способ развернуть необходимое для разработки окружение на windows-машине. Конечно, любители настраивать все мелочи вручную со мной не согласятся, но мне кажется что тонкая настройка — удел продакшн-серверов, а на локальной машине достаточно и настроек по-умолчанию.

Сразу предупрежу, что статья ориентирована в основном на новичков, и гуру врядли найдут в ней что-то интересное.


Сразу определимся что денвер установлен с настройками по-умолчанию, т.е. в частности диск денвера это z:\. Также предположим что наш локальный сайт называется example.local и соответсвенно он раньше был доступен в браузере по адресу example.local и лежал в папке z:\home\example.local

Настройка апача

Заходим Z:\usr\local\apache\conf\httpd.conf и изменяем шаблон для виртуального хоста, соответсвенно указываем везде порт 8080 — чтобы апач слушал порт, отличный от порта по-умолчанию (80), а на 80 порт мы потом повесим nginx, который будет обрабатывать запросы из браузера.
##
## НАЧАЛО ШАБЛОНА ВИРТУАЛЬНОГО ХОСТА.
##
## Если вы хотите по умолчанию запускать Apache на порту, отличном от 80,
## измените номер порта в следующей далее директиве.
##
#Listen $&{ip:-127.0.0.1}:$&{port:-8080}
#NameVirtualHost $&{ip:-127.0.0.1}:$&{port:-8080}
#<VirtualHost $&{ip:-127.0.0.1}:$&{port:-8080}>
#  DocumentRootMatch "/home/(?!cgi-)(.*)^1/(?!cgi$|cgi-)(.*)"
#  DocumentRootMatch "/home/(?!cgi-)(.*)/public_html^1"
#  DocumentRootMatch "/home/(?!cgi-)(.*)/public^1"
#  DocumentRootMatch "/home/(?!cgi-)(.*)^1/html/(.*)"
#  DocumentRootMatch "/home/(?!cgi-)(.*)^1/domains/(?!cgi$|cgi-)(.*)"
#  DocumentRootMatch "/var/www/html/(?!cgi-)~(.*)^1/(?!cgi$|cgi-)(.*)"
#  DocumentRoot "$&"  
#  ServerName "%&/-www"
#  ServerAlias "%&/-www" "%&/-www/www" $&{host:-}
#
#  $&{directives:-}
#
#  ScriptAlias /cgi/ "$^1/cgi/"
#  ScriptAlias /cgi-bin/ "$^1/cgi-bin/"
#</VirtualHost>


После этого апач у нас станет слушать порт 8080 и наш сайт станет доступен по адресу exmaple.local:8080
На этом настройку апача можно завершить.

Настройка nginx


Скачиваем с сайта nginx последнюю версию под windows (nginx/Windows-0.8.53.zip), распаковываем ее в Z:\usr\local\nginx
Далее настраиваем nginx: файл Z:\usr\local\nginx\conf\nginx.conf
Тут наша задача создать виртуальный хост. В моем случае настройки выглядят примерно так:
     server {
        listen 127.0.0.1:80;
        server_name example.local;
        location / {
            proxy_pass http://example.local:8080;
            proxy_redirect http://example.local:8080/ /;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
         
        }
        location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
            root Z:\home\example.local\www;
            access_log Z:\home\example.local\example.local.access.log;
            error_page 404 = @fallback;
        }
        location @fallback {
            proxy_pass http://example.local:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

Тут мы указали что слушаем порт 80, и что если на 127.0.0.1:80 поступает запрос к example.local то мы проксируем этот запрос на example.local:8080, а всю статику соответственно отдаем просто из нашей корневой директории.

Настройка денвера

Но хотелось бы сделать чтобы nginx запускался и останавливался вместе с денвером, чтобы не приходилось делать лишних телодвижений. Для этого нам понадобится добавить скрипт запуска nginx в денвер.
Создадим в папке Z:\denwer\scripts\init.d файл с названием nginx.pl
В нем будет содержаться код для запуска и остановки сервера nginx. На перле я никогда не писал поэтому просто взял за основу sendmail.pl и переписал его под nginx, у меня получился файл с таким содержимым:
#!perl -w
# файл для запуска nginx вместе со стартом денвера

package Starters::Nginx;
BEGIN { unshift @INC, "../lib"; }

use Tools;
use Installer;
use ParseHosts;
use VhostTemplate;
use StartManager;

# Get common pathes.
my $basedir = '\\usr\\local\\nginx';
my $startExe = 'nginx.exe';
my $stopExe = 'nginx.exe -s stop';

chdir($basedir);

StartManager::action 
  $ARGV[0],
  start => sub {
    ###
    ### START.
    ###
    print "Запускаем NGINX...\n";
    if (!-f $startExe) {
        die "  Не удается найти $startExe.\n";
    } else {
        system("start $startExe");
        print "  Готово.\n";
    }
  },
  stop => sub {
    ###
    ### STOP.
    ###
    print "Останавливаем NGINX\n";
    system("$stopExe");
    print "  Готово.\n";

  },
;


sub checkDaemonIfRunning {
}

return 1 if caller;

Чтобы в командной строке информация на русском языке отображалась верно, файл необходимо сохранить в кодировке CP-866.

Теперь чтобы nginx стартовал и останавливался вместе с денвером необходимо добавить в папку Z:\denwer\scripts\main\start добавить файл с именем 40_nginx (40 означает, что он будет выполняться самым последним), содержимое файла это просто
init.d/nginx
Такой же точно файл добавим в папку Z:\denwer\scripts\main\stop

Все, теперь nginx включается и выключается вместе с денвером, и наш локальный сайт, так же, как и раньше, доступен по адресу example.local, только вся статика отдает теперь с использованием nginx

О найденных в тексте грамматических ошибках или опечатках просьба писать в личку или в аську чтобы не захламлять комментарии
Tags: nginxapachedenwerвеб-разработка
Hubs: Website development
Total votes 27: ↑16 and ↓11 +5
Comments 11
Comments Comments 11

Popular right now