Установка связки Nginx+Apache+PHP+MySQL в Windows

Аватара пользователя
Distructor
Администратор
Сообщения: 1631
Зарегистрирован: 28 дек 2009
Ранее рассматривался вариант установки чистой связки nginx+PHP+MySQL. На этот раз мы рассмотрим установку nginx как front-end к Apache. Т.е. все запросы изначально будут обрабатываться nginx - статические файлы будут отдаваться сразу, а обработка остальных файлов будет передаваться Apache.
web_sch_2.png
Картинка из статьи http://adw0rd.ru/2009/nginx-and-apache-install/


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

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


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

    AppServ по умолчанию настраивает Apache на прослушивание 80го порта, что вполне логично и правильно, но в нашем случае 80й порт будет прослушиваться nginx'ом, поэтому и требуется перенести Apache на другой порт.

    Открываем C:\AppServ\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); ?>).
    ng1.PNG


Этап 2. Установка nginx

    Для установки nginx достаточно распаковать nginx-0.7.65.zip в папку где у нас будет находиться веб-сервер,
    например в C:\AppServ\nginx.
    Опытным путем было выяснено, что под Windows Nginx должен быть обязательно установлен на диск C, иначе он не запускается.

    Для простоты управления веб-сервером nginx создадим несколько bat файлов:
    start.bat
    @ECHO OFF
    start c:\nginx\nginx.exe
    stop.bat
    @ECHO OFF
    start c:\nginx\nginx.exe -s stop
    reload.bat
    @ECHO OFF
    start c:\nginx\nginx.exe -s reload


    После этих действий можно запустить nginx и посмотреть как он работает (естественно, что пока мы не подключили php обрабатывать его файлы nginx не сможет)
    Итак запускаем start.bat и идем в браузер смотреть, что получилось. Вводим в адресной строке http://localhost и получаем в ответ
    ng2.PNG

    На этом пока остановимся, выключим nginx (запустив stop.bat) и перейдем к следующему шагу

Этап 3. Настройка nginx

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

    Код: Выделить всё

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

    # лог для ошибок
    error_log  C:/nginx/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:/AppServ/www;
                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; 
            
    ...
        }

    }
     
    Отдельного внимания заслуживают секции location, позволяющие разруливать запросы, но их рассмотрение лучше вынести в отдельную статью

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

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

    Скачиваем mod_rpaf
    mod_rpaf.rar    2.15 КБ • 1097 скачиваний

    и распаковываем в папку модулей Apache (C:\AppServ\Apache2.2\modules). После этого открываем C:\AppServ\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:\AppServ\Apache2.2\icons в папку C:\AppServ\www. Без этого при просмотре содержимого каталогов (опция Indexes в Apache) nginx будет пытаться загрузить несуществующие иконки для файлов.

    Теперь можно запустить nginx (start.bat) и проверять работу веб-сервера в браузере.
    Введем в адресной строке http://localhost/test.php (файл test.php мы создали на первом шаге) и увидим
    ng3.PNG

На этом можно и остановиться.
Более подробно про директивы используемые в конфигурационном файле nginx можно почитать на сайте разработчика
http://sysoev.ru/nginx/docs/

Вопросы и уточнения и пожелания пишите в разделе Вопросы по веб-серверам

Copyright © 2010 Creaternal (v-tanke.ru).
При копировании информации ссылка на источник и указание copyright обязательны.

Вернуться в «Статьи по nginx»