среда, 26 декабря 2012 г.

Установка Nginx под Windows

Чтобы установить nginx/Windows, скачайте дистрибутив с сайта nginx.org. Затем распакуйте дистрибутив, перейдите в каталог nginx-1.3.10 и запустите nginx. Вот пример для корневого каталога на диске C:

cd c:\
unzip nginx-1.3.10.zip
cd nginx-1.3.10
start nginx

(Опытным путем было выяснено, что в тарых версиях под Windows Nginx должен быть обязательно установлен на диск C, иначе он не запускается. Но в новых версиях (проверил на nginx/Windows-1.0.11) это замечание не актульно. Устанавливать можно на любой диск.)

В результате выполнения данных команд запустится сервер Nginx.
Проверить его работу вы можете в браузере, перейдя по адресу http://localhost





Чтобы увидеть процессы nginx, запустите утилиту командной строки tasklist:

C:\nginx-1.3.10>tasklist /fi "imagename eq nginx.exe"
C:\nginx-1.3.10>tasklist /fi "imagename eq nginx.exe"

Image Name           PID Session Name     Session#    Mem Usage
=============== ======== ============== ========== ============
nginx.exe            652 Console                 0      2 780 K
nginx.exe           1332 Console                 0      3 112 K



Один из процессов основной, другой - рабочий. Если nginx не запускается, нужно искать причину в в файле лога ошибок logs\error.log. Если же лог-файл не создался, то причину этого следует искать в Windows Event Log. Если вместо ожидаемой страницы выводится страница с ошибкой, нужно также искать причины ошибки в файле logs\error.log.

nginx/Windows использует каталог, в котором он был запущен, в качестве префикса для относительных путей в конфигурации. В вышеприведённом примере префиксом является C:\nginx-1.3.10\. Пути в конфигурационном файле должны задаваться в UNIX-стиле с использованием прямых слэшей:

access_log   logs/site.log;
root         C:/web/html;

nginx/Windows работает как стандартное консольное приложение (не сервис) и управляется при помощи следующих команд:

nginx -s stop     быстрое завершение
nginx -s quit     плавное завершение
nginx -s reload     изменение конфигурации, запуск новых рабочих процессов с новой конфигурацией, плавное завершение старых рабочих процессов
nginx -s reopen     переоткрытие лог-файлов


Для простоты управления веб-сервером nginx создадим несколько bat файлов в папке сервера C:\nginx-1.3.10:

Файл start.bat

@ECHO OFF
start C:\nginx-1.3.10\nginx.exe

ping 127.0.0.1 > NUL
echo Starting nginx
ping 127.0.0.1 > NUL
EXIT

Файл stop.bat

@ECHO OFF
start C:\nginx-1.3.10\nginx.exe -s stop


Файл reload.bat

@ECHO OFF
start C:\nginx-1.3.10\nginx.exe -s reload


http://coder.v-tanke.ru/download/file.php?id=168&mode=view&h=/pic.png

При запуске файла start.bat на некоторое время появится окно, показывающее, что серевер запускается.

http://coder.v-tanke.ru/download/file.php?id=169&mode=view&h=/pic.png


Установка MySQL.

Создадим папку C:\nginx-1.3.10\mysql

Скачиваем MySQL установщик mysql-5.1.41-win32.msi и запускаем его.

http://coder.v-tanke.ru/download/file.php?id=423&mode=view&h=/pic.png

Нажимаем "Next".

http://coder.v-tanke.ru/download/file.php?id=424&mode=view&h=/pic.png

Выбираем режим "Custom", чтобы иметь возможность указать папки для установки и исключаем из установки документацию ("Documentation").

http://coder.v-tanke.ru/download/file.php?id=425&mode=view&h=/pic.png

Затем выбираем пункт "MySQL Server" и нажимаем кнопку "Change...", после чего выбираем созданную нами ранее директорию C:\nginx-1.3.10\mysql.

Повторяем выбор директории и для пункта "MySQL Server Datafiles". После этого нажимаем "Next".


http://coder.v-tanke.ru/download/file.php?id=180&mode=view&h=/pic.png

Просматриваем, что все верно и жмем "Install".
Теперь ждем пока MySQL установится.

http://coder.v-tanke.ru/download/file.php?id=426&mode=view&h=/pic.png

Далее появляется рекламка, но она нам неинтересна, поэтому пролистываем ее нажимая кнопку "Next".

После этого появляется окно с приглашением выполнить настройку MySQL и зарегистрировать его.

Регистрировать не будем, поэтому снимаем эту галочку и жмем кнопку "Finish".

http://coder.v-tanke.ru/download/file.php?id=427&mode=view&h=/pic.png

Открывается окно настройки MySQL, жмем кнопку "Next".

http://coder.v-tanke.ru/download/file.php?id=428&mode=view&h=/pic.png

Выбираем "Standard Configuration", жмем кнопку "Next".

http://coder.v-tanke.ru/download/file.php?id=429&mode=view&h=/pic.png

Далее ничего не меняем, жмем кнопку "Next".

http://coder.v-tanke.ru/download/file.php?id=430&mode=view&h=/pic.png

После этого нас просят указать пароль для пользователя root имеющего полные права на доступ и управление MySQL.

http://coder.v-tanke.ru/download/file.php?id=431&mode=view&h=/pic.png

Запомните, а лучше даже запишите эти данные (логин - root, пароль - который Вы укажите), так как они потребуются нам позже, при установке на веб-сервер какого-либо php-скрипта, работающего с базой данных.

http://coder.v-tanke.ru/download/file.php?id=432&mode=view&h=/pic.png

Все готово к применению настроек жмем "Execute".

Если никаких проблем не возникло, должно результат должен быть как на картинке ниже.

http://coder.v-tanke.ru/download/file.php?id=433&mode=view&h=/pic.png

Жмем кнопку "Finish"

На этом установка MySQL оканчивается.

Установка PHP.

Скачаем и распакуем php-5.2.12-Win32-VC6-x86.zip в  C:\nginx-1.3.10\php

Скопируем C:\nginx-1.3.10\php\php.ini-recommended в C:\nginx-1.3.10\php\php.ini
Далее переходим к редактированию C:\nginx-1.3.10\php\php.ini

Внимание! По умолчанию вывод ошибок на страницах отключен.
Вывод ошибок рекомендуется включать только для тестирования и отладки скриптов. Для включения необходимо заменить

  Код:
    display_errors = Off

на

  Код:
    display_errors = On


Далее увеличиваем ограничения на вложения
заменить

  Код:
    post_max_size = 8M

на

  Код:
    post_max_size = 30M


заменить

  Код:
    upload_max_filesize = 2M

на

  Код:
    upload_max_filesize = 20M


Затем указываем директорию с расширениями - заменяем

  Код:
    extension_dir = "./"

на

  Код:
    extension_dir = "./ext"


После этого подключаем необходимые расширения, найдя и раскомментировав (убрав ";" вначале строки) следующие строки

  Код:
    ;extension=php_gd2.dll
    ;extension=php_mbstring.dll
    ;extension=php_sockets.dll
    ;extension=php_mysql.dll
    ;extension=php_mcrypt.dll
    ;extension=php_zip.dll


Дорабатываем .bat файлы созданные на первом этапе.

Файл start.bat

@ECHO OFF
start C:\nginx-1.3.10\nginx.exe
start C:\nginx-1.3.10\php\php-cgi.exe -b 127.0.0.1:521 -c c:\nginx\php\php.ini
ping 127.0.0.1 > NUL
echo Starting nginx
ping 127.0.0.1 > NUL
EXIT


Файл stop.bat

@ECHO OFF
taskkill /f /IM nginx.exe
taskkill /f /IM php-cgi.exe
EXIT


Теперь при запуске start.bat вместе с Nginx будет запускаться и PHP.
Внимание! После запуска start.bat появляется консольное окно php-cgi, которое не надо закрывать!

Если открытое окно мешает можно воспользоваться следующим способом:

Вариант скрытого запуска php-cgi.

1. Скачать программу chp.exe http://www.commandline.co.uk/chp/
2. Разместить chp.exe в каталоге с nginx ( C:\nginx-1.3.10\chp.exe)
3. Модифицировать start.bat следующим образом:

  Код:
    @ECHO OFF
    start  C:\nginx-1.3.10\nginx.exe
    chp.exe " C:\nginx-1.3.10\php\php-cgi.exe -b 127.0.0.1:521 -c  C:\nginx-1.3.10\php\php.ini"
    ping 127.0.0.1 > NUL
    echo Starting nginx
    ping 127.0.0.1 > NUL
    EXIT

Еще один вариант (но chp.exe под Windows 7 не заработал).

1. Скачать программу Hidden Start http://www.ntwind.com/software/hstart.html
2. Разместить hstart.exe в каталоге с nginx (C:\nginx-1.3.10\hstart.exe)
3. Модифицировать start.bat следующим образом:

  Код:
    @ECHO OFF
    start C:\nginx-1.3.10\nginx.exe
    start C:\nginx-1.3.10\hstart.exe /NOCONSOLE "C:\nginx-1.3.10\php\php-cgi.exe -b 127.0.0.1:521 -c C:\nginx-1.3.10\php\php.ini"
    ping 127.0.0.1 > NUL
    echo Starting nginx
    ping 127.0.0.1 > NUL
    EXIT

Далее создадим в папке C:\nginx-1.3.10\html (являющеюся на данный момент корневой для веб-сервера) файл test.php следующего содержания:

<?php phpinfo(); ?>

После запускаем наш веб-сервер, через файл start.bat и открываем в браузере адрес http://localhost/test.php

http://coder.v-tanke.ru/download/file.php?id=172&mode=view&h=/pic.png

Как вы можете видеть nginx отдал php-файл как обычный текстовый,
потому что мы еще не сказали ему как с ними работать.

Итак, на этом этап настройки php можно считать оконченным, остановить веб-сервер, используя файл stop.bat и переходить к настройке nginx.

Настройка Nginx.

Так как, скорее всего, наиболее популярным будет вопрос по созданию виртуальных хостов в Nginx, то сразу рассмотрим как их сделать на примере установки phpMyAdmin на отдельный хост.

Файл с основным конфигом nginx у нас находится в папке C:\nginx-1.3.10\conf и называется nginx.conf.

Создадим папки, которые будут корневыми для наших виртуальных хостов: C:\nginx-1.3.10\html\default и C:\nginx-1.3.10\html\pma

Итак приступим к настройке.
Пропишем в C:\WINDOWS\system32\drivers\etc\hosts имя хоста для доступа к phpMyAdmin.

Код:

127.0.0.1       pma

Может потребовать перезагрузить браузер или компьютер, если изменения в файле hosts не подхватятся сразу.

Заменим содержимое C:\nginx-1.3.10\conf\nginx.conf на код:

    worker_processes  1;

    error_log  logs/error.log;
    pid        logs/nginx.pid;

    events {
        worker_connections  64;
    }

    http {
        include       mime.types;
        default_type  application/octet-stream;

        log_format  main  '$remote_addr - $remote_user "$request" $status "$http_referer" "$http_user_agent"';
      
        sendfile        on;
        #tcp_nopush     on;
      
        client_header_timeout  3m;
        client_body_timeout    3m;
        send_timeout           3m;
      
        #keepalive_timeout  0;
        keepalive_timeout  65;
        #gzip  on;


        server {
            root                 html/default/;
            set  $root_for_cgi   "C:/nginx-1.3.10/html/default/";
            listen               80;
            server_name          _;
          
            access_log logs/default.access.log main;
            error_log logs/default.error.log error;
      
            location / {
                index index.php;
            }
          
            location ~* .php$ {
                include fastcgi;
            }
        }
      
        server {
            root                 html/pma/;
            set  $root_for_cgi   "C:/nginx-1.3.10/html/pma/";
            listen               80;
            server_name          pma;
          
            access_log logs/pma.access.log main;
            error_log logs/pma.error.log error;
      
            location / {
                index index.php;
            }
          
            location ~* .php$ {
                include fastcgi;
            }
        }
      
      
        upstream  backend  {
            server   127.0.0.1:521;
        }

    }

И создадим файл C:\nginx-1.3.10\conf\fastcgi с кодом:

fastcgi_connect_timeout 1;
fastcgi_next_upstream timeout;

fastcgi_param  SCRIPT_FILENAME  $root_for_cgi$fastcgi_script_name;

fastcgi_pass   backend;

fastcgi_param  QUERY_STRING     $query_string;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

Для теста в папке C:\nginx-1.3.10\html\default создадим файл C:\nginx-1.3.10\html\test.php с кодом:

<?php phpinfo(); ?>

А в папке C:\nginx-1.3.10\html\pma создадим файл test2.php с кодом:

<?php echo 'For phpMyAdmin'; ?>

Теперь запускаем наш веб-сервер (через файл start.bat) и смотрим что получилось:

http://coder.v-tanke.ru/download/file.php?id=173&mode=view&h=/pic.png

http://coder.v-tanke.ru/download/file.php?id=174&mode=view&h=/pic.png

Теперь у нас есть работающий вер-сервер.

Установка связки Nginx + Apache.

Выше рассматривался вариант установки чистой связки Nginx + PHP + MySQL. Далее мы рассмотрим установку Nginx как front-end к Apache. То есть все запросы изначально будут обрабатываться Nginx - это значит, что статичные файлы будут отдаваться сразу, а обработка остальных файлов будет передаваться серверу Apache.

http://coder.v-tanke.ru/download/file.php?id=1057&sid=6b8979befe3d91ca4d58e4ee6e548073&mode=view&h=/pic.png

 Для установки нам понадобится:

    - установленный Apache
    - актуальная версия Nginx

Вместо чистого Apache можно применять любую сборку веб-сервера основанную на Apache: например Denwer (Денвер), TopServer, XAMPP и тому подобное, либо собрать связку Apache + PHP + MySQL самому вручную.

Итак, порядок установки:
Этап 1. Перенос Apache на порт отличный от 80-го.
Этап 2. Настройка Nginx для работы с Apache.
Этап 3. Установка и настройка RPAF в Apache.

Этап 1. Перенос Apache на порт отличный от 80-го.

Изначально Apache настроен на прослушивание 80-го порта, что вполне логично и правильно, но в нашем случае 80-й порт будет прослушиваться Nginx'ом, поэтому и требуется перенести Apache на другой порт.

Открываем C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf и ищем в нем строчку Listen 80 (либо свой номер порта, если у Вас веб-сервер был установлен на другом порту) и заменяем ее на Listen 127.0.0.1:81
Также просматриваем строчки задания виртуальных хостов (если они есть) и меняем их тоже:
находим NameVirtualHost *:80 и меняем на NameVirtualHost *:81
находим все <VirtualHost *:80> и меняем на <VirtualHost *:81>

После этого сохраняем изменения и перезапускаем Apache.

Теперь можно проверить, что веб-сервер отвечает на порту 81 (Для проверки был создан файл test.php содержащий <?php phpinfo(1); ?>).

http://coder.v-tanke.ru/download/file.php?id=1053&sid=6b8979befe3d91ca4d58e4ee6e548073&mode=view&h=/pic.png

Этап 2. Настройка Nginx для работы с Apache.

Открываем файл конфига  C:\nginx-1.3.10\conf\nginx.conf и заменяем его на код:

#2 рабочих процесса
worker_processes  2;

# лог для ошибок
error_log   C:/nginx-1.3.10/logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

events {
    # максимум рабочих соединений
    worker_connections   2000;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # Формат лога
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    # Лог доступа всего веб-сервера
    #access_log  logs/access.log  main;

    # Таймаут при чтении заголовка запроса клиента
    client_header_timeout  3m;
    # Таймаут при чтении тела запроса клиента
    client_body_timeout    3m;
    # Таймаут при передаче ответа клиенту
    send_timeout           3m;
    # Таймаут keep-alive соединения
    keepalive_timeout      2m;
   
    #gzip  on;
   
    server {
        # Слушать 80 порт
        listen       80;
        # Использовать следующие хосты.
        server_name  _;

        # Лог доступа для конкретного виртуального хоста
        #access_log  logs/host.access.log  main;

        # Отдаем статику напрямую
        location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|js)$ {
            root         C:/Program Files/Apache Software Foundation/Apache2.2\htdocs;
            access_log   off;
            expires      30d;
        }
        # Запрещаем обращение к файлам .htaccess и .htpasswd
        location ~ /\.ht {
                deny  all;
        }
        # Передаем запрос Apache
        location / {
                # Адресс и порт Apache
                proxy_pass http://127.0.0.1:81/;
                proxy_redirect     off;

                proxy_set_header   Host             $host;
                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;
                #client_body_temp_path      tmp/client_body_temp;

                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;
                #proxy_temp_path            tmp/proxy_temp;

                charset  koi8-r;
        }

        #error_page  404              /404.html;

        # При перечисленных ошибках показывать статическую страницу /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Комментарии по тексту есть, но все же поясню пару мест.

Если на сервере будет находиться не один сайт, как в конфиге выше, а несколько, то для каждого должен быть указан свой блок server. Причем первый блок server считается сервером по умолчанию и он будет вызываться при обращении по IP или хосту не описанному ни в одном server_name.
В server_name может быть указано: "_" - аналог default в Apache; один или несколько хостов через пробел; хост начинающийся с точки - описывает все его поддомены

Приведу пример каркаса структуры для пояснения:

...
http {
    ...
    server {
        # хост по умолчанию
        server_name  _;
        ...
    }

    server {
        # несколько перечисленных хостов
        server_name  pupkin.ru www.pupkin.ru;
        ...
    }

    server {
        # все поддомены vasia.ru
        server_name  .vasia.ru;
        ...
    }

}

Этап 3. Установка и настройка RPAF в Apache.

Так как у нас обращение к Apache идет не напрямую, а через Nginx, то теперь в REMOTE_ADDR у нас не пользовательский IP, а IP-адрес сервера, на котором расположен Nginx. Поэтому на помощь приходит RPAF, он берет тело заголовка X-Forwarded-For, присланного от фронтенда и формирует в Apache из него REMOTE_ADDR.

Таким образом заголовок REMOTE_ADDR снова имеет пользовательский IP.

Скачиваем mod_rpaf
mod_rpaf.rar
и распаковываем в папку модулей Apache (C:\Program Files\Apache Software Foundation\Apache2.2\modules). После этого открываем C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf и добавляем в конец файла следующий код:

LoadModule rpaf_module modules/mod_rpaf.so

RPAFenable On
RPAFsethostname On
RPAFheader X-Forwarded-For
RPAFproxy_ips 192.168.1.26 127.0.0.1

Вместо 192.168.1.26 укажите IP адрес сервера, на котором расположен Nginx.
Теперь сохраняем изменения и перезапускаем Apache.

Также желательно перенести папку C:\Program Files\Apache Software Foundation\Apache2.2\icons в папку C:\Program Files\Apache Software Foundation\Apache2.2\htdocs. Без этого при просмотре содержимого каталогов (опция Indexes в Apache) Nginx будет пытаться загрузить несуществующие иконки для файлов.

Теперь можно запустить Nginx (start.bat) и проверить работу веб-сервера в браузере.

Введем в адресной строке http://localhost/test.php (файл test.php мы создали на первом шаге) и увидим страницу.

http://coder.v-tanke.ru/download/file.php?id=1056&sid=6b8979befe3d91ca4d58e4ee6e548073&mode=view&h=/pic.png

На этом можно и остановиться.

Комментариев нет:

Отправить комментарий