В последнее время установка 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, который будет обрабатывать запросы из браузера.
После этого апач у нас станет слушать порт 8080 и наш сайт станет доступен по адресу exmaple.local:8080
На этом настройку апача можно завершить.
Скачиваем с сайта nginx последнюю версию под windows (nginx/Windows-0.8.53.zip), распаковываем ее в Z:\usr\local\nginx
Далее настраиваем nginx: файл Z:\usr\local\nginx\conf\nginx.conf
Тут наша задача создать виртуальный хост. В моем случае настройки выглядят примерно так:
Тут мы указали что слушаем порт 80, и что если на 127.0.0.1:80 поступает запрос к example.local то мы проксируем этот запрос на example.local:8080, а всю статику соответственно отдаем просто из нашей корневой директории.
Но хотелось бы сделать чтобы nginx запускался и останавливался вместе с денвером, чтобы не приходилось делать лишних телодвижений. Для этого нам понадобится добавить скрипт запуска nginx в денвер.
Создадим в папке Z:\denwer\scripts\init.d файл с названием nginx.pl
В нем будет содержаться код для запуска и остановки сервера nginx. На перле я никогда не писал поэтому просто взял за основу sendmail.pl и переписал его под nginx, у меня получился файл с таким содержимым:
Чтобы в командной строке информация на русском языке отображалась верно, файл необходимо сохранить в кодировке CP-866.
Теперь чтобы nginx стартовал и останавливался вместе с денвером необходимо добавить в папку Z:\denwer\scripts\main\start добавить файл с именем 40_nginx (40 означает, что он будет выполняться самым последним), содержимое файла это просто
Такой же точно файл добавим в папку Z:\denwer\scripts\main\stop
Все, теперь nginx включается и выключается вместе с денвером, и наш локальный сайт, так же, как и раньше, доступен по адресу example.local, только вся статика отдает теперь с использованием 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
О найденных в тексте грамматических ошибках или опечатках просьба писать в личку или в аську чтобы не захламлять комментарии