Konfiguracja serwera Apache 2.4 oraz PHP 7 FastCGI pod Windows

Artykuł dodany: 15 grudnia 2015. Ostatnia modyfikacja: 24 lutego 2018.

Stopień trudności (1 - dla początkujących, 5 - dla ekspertów): 1

Kilka lat temu napisałem artykuł opisujący konfigurację serwera testowego pod Windows, opartego o Zend Server CE. Niestety sporo się od tego czasu zmieniło na niekorzyść – Zend Server CE przestał istnieć na rzecz w pełni płatnego Zend Server (z miesiącem okresu testowego). Początkujący programista na pewno nie jest tak zdeterminowany, aby płacić firmie Zend (czy też Rogue Wave) za ich rozwiązania. Dlatego tym razem powtórzę instrukcję konfiguracji z wykorzystaniem darmowego serwera Apache. Wykorzystam też, wydaną kilka dni temu, najnowszą wersję PHP oznaczoną numerem 7. Mimo wszystko zalecam zapoznanie się jeszcze z poprzednim artykułem, gdyż opisałem kilka ciekawych rzeczy dotyczących funkcjonowania całego systemu czy też serwerów DNS.

Pobieranie plików

Do uruchomienia naszego serwera będziemy potrzebować kilku plików. Dla ułatwienia zbiorę je teraz razem, później omówię do czego służą.

Visual C++ Redistributable for Visual Studio 2015
PHP dla Windows
Serwer Apache z modułami

W zależności od posiadanego systemu operacyjnego, pobieramy pakiety dla architektury 32-bit lub 64-bit. Czyli przykładowo ze strony Apache Lounge pliki httpd-2.4.18-win64-VC14.zip oraz mod_fcgid-2.3.9-win64-VC14.zip. Nasz serwer Apache będzie obsługiwał PHP jako moduł FastCGI, co daje dużą wydajność oraz większe możliwości przydzielania zasobów systemowych. Oba pliki zostały skompilowane przy użyciu najnowszego Visual Studio 2015, które pobieramy i instalujemy ze strony firmy Microsoft. Z kolei ze strony PHP będzie nam potrzebny plik php-7.0.0-Win32-VC14-x64.zip oznaczony jako VC14 ×64 Thread Safe.

Przygotowanie do pracy

Nasz serwer pobieramy jako standardowe archiwum ZIP które możemy rozpakować i zainstalować w dowolnym miejscu. Ja przyjąłem że nie będziemy tego robić na partycji systemowej (choćby ze względu na problemy podczas reinstalacji systemu) tylko utworzymy specjalny folder na drugim dysku / partycji. Niech będzie to D:\Server. Rozpakowujemy zatem nasz plik httpd-2.4.18-win64-VC14.zip w dowolnym miejscu a zawartość, czyli katalog `Apache24`, przenosimy do D:\Server. Jego struktura zawiera wszystkie pliki uruchomieniowe (bin), konfiguracyjne (conf), moduły (modules) oraz logi (logs). Skoro jesteśmy przy podstawowym kopiowaniu, rozpakujmy również drugi plik mod_fcgid-2.3.9-win64-VC14.zip a jego zawartość czyli mod_fcgid.so przenieśmy do D:\Server\Apache24\modules. Będzie nam jeszcze potrzebne PHP. Aby ułatwić sobie pracę w przyszłości i ewentualnie łatwo podmieniać wersje PHP, plik php-7.0.0-Win32-VC14-x64.zip wypakujmy do D:\Server\php-7.0.0.

Konfiguracja serwera Apache

Skoro wszystkie wymagane pliki są już na miejscu pora zająć się samą konfiguracją. Pierwsze co będzie nam potrzebne, to poinformowanie serwera Apache że musi wczytać moduł FastCGI. Główny plik konfiguracyjny serwera nosi nazwę httpd.conf i znajduje się w katalogu D:\Server\Apache24\conf. Otwieramy go w naszym ulubionym edytorze tekstowym (najlepiej żeby nie był to systemowy notatnik) i naszym oczom powinno ukazać się około 500 linii kodu. Plik jest dość dobrze opisany ( `#` na początku linii oznacza komentarz i linia go zawierająca nie jest przetwarzana) więc zalecam choćby krótką lekturę aby poznać możliwe opcje. Nas interesuje duży blok poleceń zaczynających się od LoadModule. W ten sposób doczytujemy zewnętrzne moduły znajdujące się w folderze `modules`. Po ostatniej linii, zaraz za innymi modułami, możemy dodać:

LoadModule fcgid_module modules/mod_fcgid.so

Tym samym wczytaliśmy moduł FastCGI ale nie jest on jeszcze skonfigurowany. Potrzebny nam będzie plik konfiguracyjny, który w wersji gotowej do użytku znajduje się w archiwum ZIP razem z plikiem modułu. Na samym końcu pliku httpd.conf dodajmy jeszcze kilka linii:

<IfModule fcgid_module>
Include conf/extra/httpd-fcgi.conf
</IfModule>

Jest to krótka dyrektywa warunkowa mówiąca dokładnie: jeżeli został wczytany moduł `fcgid_module`, dołącz plik `conf/extra/httpd-fcgi.conf`. Ponieważ pliku tego jeszcze nie posiadamy, utwórzmy go w D:\Server\Apache24\conf\extra. Możemy wykonać proste kopiuj – wklej z przykładu zawartego w archiwum, z uwzględnieniem nowych ścieżek do naszego serwera:

FcgidInitialEnv PATH "D:\Server\php-7.0.0;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"
FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "C:/WINDOWS/Temp"
FcgidInitialEnv TMP "C:/WINDOWS/Temp"
FcgidInitialEnv windir "C:/WINDOWS"
FcgidIOTimeout 64
FcgidConnectTimeout 16
FcgidMaxRequestsPerProcess 1000 
FcgidMaxProcesses 50 
FcgidMaxRequestLen 8131072
# Location php.ini:
FcgidInitialEnv PHPRC "D:/Server/php-7.0.0"
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000

<Files ~ "\.php$">
  AddHandler fcgid-script .php
  FcgidWrapper "D:/Server/php-7.0.0/php-cgi.exe" .php
</Files>

Jako że nasz serwer raczej nie będzie stał w środowisku produkcyjnym, tuningowanie pliku nie ma szczególnego znaczenia. Ważne są prawidłowe ścieżki do interpretera PHP czyli `D:/Server/php-7.0.0/php-cgi.exe`. Jeżeli w przyszłości będziesz chciał użyć innej wersji PHP, właśnie tutaj trzeba będzie ją zmienić. W przykładzie użyłem nazwy katalogu `php-7.0.0` z dokładnym oznaczeniem numeru wersji. Ma to taką zaletę, że gdybyśmy chcieli dokonać aktualizacji, a interpreter zawierałby poważne błędy, moglibyśmy łatwo wykonać downgrade. Z drugiej strony, aktualizacje będą dość uciążliwe i być może wystarczy samo D:\Server\php + zastępowanie plików. Wybór należy do Ciebie.

Jest jeszcze jedna ważna opcja w pliku httpd.conf. Mianowicie ServerRoot. Dyrektywa ta informuje o bazowej ścieżce do serwera Apache, wszystkich modułach, logach i innych plikach. W naszym wypadku powinna ona wyglądać w taki sposób:

ServerRoot "D:\Server\Apache24"

Innymi słowy – jest to miejsce instalacji naszego serwera.

Odwiedzając adresy internetowe nie musimy zazwyczaj podawać jaki plik chcemy wczytać. Wpisujemy po prostu nazwę domeny, przykładowo https://prophp.pl i to wystarcza. Serwer sam wie, że głównym plikiem dla takiego wywołania jest index.php a nie https://prophp.pl/abrakadabra.php. Skąd to wie?

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

Powyższy warunek informuje, iż domyślnymi plikami w katalogu są (według kolejności) index.php, następnie index.html jeżeli index.php nie zostanie odnaleziony. Jest to konfiguracja wykorzystywana w większości serwerów na świecie. Zawsze plikiem głównym jest `index` i raczej tego nie zmieniaj. Dopisz tylko `index.php` do konfiguracji, gdyż domyślna go nie zawiera a my dodaliśmy wcześniej interpreter PHP.

Pozostało nam jeszcze poinformować serwer Apache, gdzie ma szukać naszych plików ze stroną WWW. Mówi o tym dyrektywa DocumentRoot. Zmodyfikuj ją następująco, razem z opcją folderów:

DocumentRoot "D:\Server\vhosts"
<Directory "D:\Server\vhosts">
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Allow from all
    Require all granted
</Directory>

Utwórz też od razu katalog D:\Server\vhosts. Hosty wirtualne to pojęcie bardzo szerokie ale w skrócie jest to nasza domena. Odwołując się do konkretnego adresu w sieci podajesz nazwę domeny (prophp.pl, google.pl itd.) która zamieniana jest przez system DNS na adres IP typu 1.2.3.4. Pod tym adresem, na domyślnym porcie 80 dla stron zwykłych oraz 443 dla połączeń szyfrowanych, nasłuchuje serwer HTTP. Serwer może obsługiwać dziesiątki różnych domen. Kiedy przyjmuje połączenie, sprawdza czy w jego konfiguracji występuje dana domena – czyli host wirtualny i jeżeli tak, serwuje odpowiednią treść. Aby ułatwić sobie pracę (ale też bardzo często potrzebujemy pogrupować nasze projekty według domeny) utwórzmy teraz host wirtualny. W pliku httpd.conf należy odkomentować linię:

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

W pliku D:\Server\Apache24\conf\extra\httpd-vhosts.conf znajdują się już przykładowe hosty ale możemy je usunąć i dodać nowy vhost testowy:

<VirtualHost *:80>
    ServerName test.local  
    DocumentRoot "D:/Server/vhosts/test.local"
    ErrorLog "logs/test.local-error.log"
    CustomLog "logs/test.local-access.log" common
    <Directory "D:/Server/vhosts/test.local">
        Options Indexes FollowSymLinks MultiViews Includes ExecCGI
        AllowOverride All
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

Host czyli domena nosi nazwę `test.local`, znajduje się w katalogu `D:/Server/vhosts/test.local`. Dla hosta utworzyliśmy oddzielne pliki logów – ErrorLog, CustomLog. Będą one zapisywane w katalogu D:\Server\Apache24\logs. Aby uruchomić PHP niezbędne jest też dodanie opcji ExecCGI.

Jak teraz odwołać się do nazwy domeny lokalnej? W systemie Windows, wszystkie informacje o hostach znajdują się w pliku C:\Windows\System32\drivers\etc\hosts. Aby zmodyfikować plik który wymaga uprawnień administratora, najłatwiej jest go przegrać na pulpit, poprawić i wgrać ponownie do folderu. Niektóre programy antywirusowe uniemożliwiają wprowadzanie w nim zmian gdyż złośliwy wirus mógłby podmienić np. stronę banku na adres przestępców. Jeśli tak się stanie dodaj odpowiedni wyjątek do swojego antywirusa. Otwórz teraz plik, dodaj do niego:

# local domains
127.0.0.1     test.local
127.0.0.1     test2.local

I zapisz wprowadzone zmiany. 127.0.0.1 albo localhost to adres pętli zwrotnej czyli Twojego komputera. Po tym jak już uruchomimy serwer, możliwe będzie wpisywanie w pasku adresu przeglądarki http://test.local lub http://test2.local. Taka konfiguracja powinna wystarczyć aby teraz wystartować nasz serwer.

Uruchomienie serwera Apache

Aby dokończyć konfigurację musimy przejść do wiersza poleceń Windows (jako Administrator). W systemie Windows 8 i późniejszym, najszybciej możemy tego dokonać klikając prawym przyciskiem myszy na logo Windows i wybierając `Wiersz polecenia (administrator)`. Można też oczywiście uruchomić cmd.exe w inny sposób. Pierwsze co będziemy chcieli zrobić to przetestować konfigurację Apache. Pamiętaj że klawisz tabulacji (wciskany wielokrotnie) podpowiada nazwy katalogów.

d:\
cd Server\Apache24\bin

W katalogu `bin` znajduje się właściwy plik serwera httpd.exe. W pierwszej kolejności należy sprawdzić czy składnia plików konfiguracyjnych Apache jest prawidłowa:

httpd.exe -t

W wyniku powinniśmy otrzymać:

Syntax OK

U mnie pojawiło się jeszcze ostrzeżenie dotyczące braku globalnego ustawienia dyrektywy ServerName, ale nie ma to na tym etapie większego znaczenia. Jeżeli wystąpiły jakieś inne błędy typu brak katalogu, błąd składniowy – należy je poprawić. Niestety nie jestem w stanie przewidzieć wszystkich przypadków dlatego zapraszam albo do pisania o nich w komentarzach, albo wyszukiwania rozwiązań w internecie.

Skoro konfiguracja jest prawidłowa można dodać serwer Apache do usług systemu Windows.

httpd.exe -k install

Restart serwera czy jego włączanie / wyłączanie możliwy jest przez komendy:

httpd.exe -k start
httpd.exe -k stop
httpd.exe -k restart

Natomiast pomoc po uruchomieniu:

httpd.exe /?

W folderze bin znajduje się także agent serwera Apache – ApacheMonitor.exe. Po dodaniu Apache do usług systemowych możemy uruchomić ten program w trybie graficznym. Program będzie rezydował w zasobniku systemowym i w łatwy sposób będziemy mogli wykonać akcje typu restart na naszym serwerze.

Pora sprawdzić czy nasze zabiegi przyniosły skutek. Dodajmy plik:

D:\Server\vhosts\test.local\index.php

<?php
phpinfo();

Po wpisaniu w przeglądarce http://test.local naszym oczom powinna ukazać się standardowa plansza PHP z wypisaną konfiguracją, w tym “PHP Version 7.0.0”. Wcześniej w Windowsowym pliku `hosts` dodaliśmy również drugi host `test2.local`. Pora sprawdzić czy hosty wirtualne działają:

D:\Server\vhosts\test2.local\index.php

<?php
echo 'test2';

D:\Server\Apache24\conf\extra\httpd-vhosts.conf

# Dodajemy konfigurację poniżej pierwszego hosta
<VirtualHost *:80>
    ServerName test2.local  
    DocumentRoot "D:/Server/vhosts/test2.local"
    ErrorLog "logs/test2.local-error.log"
    CustomLog "logs/test2.local-access.log" common
    <Directory "D:/Server/vhosts/test2.local">
        Options Indexes FollowSymLinks MultiViews Includes ExecCGI
        AllowOverride All
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

Pamiętaj aby po każdej zmianie w konfiguracji zrestartować serwer. Jeżeli teraz po uruchomieniu http://test2.local zobaczymy napis `test2`, a pod adresem http://test.local wynik działania phpinfo(), oznacza to że wszystko funkcjonuje prawidłowo. Dodatkowo pierwszy vhost z konfiguracji odczytywany jest jako domyślny, więc pod adresem http://localhost (lub http://127.0.0.1) również zobaczymy wynik działania phpinfo().

Konfiguracja PHP

Wróćmy jeszcze na chwilę do konfiguracji samego PHP. Bardzo ważny jest plik php.ini. Początkującym programistom bardzo dużo czasu zajmuje zlokalizowanie właściwego. Po uruchomieniu funkcji phpinfo() możemy z niej odczytać:

Configuration File (php.ini) Path 	C:/Windows
Loaded Configuration File 	(none) 

Oznacza to, że PHP działa obecnie na ustawieniach domyślnych. Standardową ścieżką dla pliku php.ini jest C:/Windows i nie został wczytany żaden inny plik. Jednak w samej konfiguracji modułu FastCGI ustawiliśmy zmienną:

FcgidInitialEnv PHPRC "D:/Server/php-7.0.0"

Zajrzyjmy do wymienionego folderu. Znajdują się w nim dwa pliki:

php.ini-development 
php.ini-production

Zmieńmy teraz nazwę pliku php.ini-development na php.ini i zresetujmy serwer. Jaki wynik daje teraz phpinfo()?

Configuration File (php.ini) Path 	C:/Windows
Loaded Configuration File 	D:\Server\php-7.0.0\php.ini 

Skoro już tak dobrze idzie, włączmy jeszcze kilka popularnych rozszerzeń.

D:/Server/php-7.0.0/php.ini

; należy odkomentować linię, inaczej PHP będzie szukał rozszerzeń w innym katalogu
extension_dir = "ext"

extension=php_curl.dll
extension=php_fileinfo.dll
extension=php_intl.dll
extension=php_mbstring.dll
extension=php_openssl.dll
extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll

Po zmianach, jak zawsze, należy wykonać restart serwera. Jeżeli z jakiegoś powodu nie chce się uruchomić lub wyświetla błąd 500, przyczyn możemy szukać w logach serwera lub systemowych. Jeżeli jakieś rozszerzenie powoduje błąd, łatwo można sprawdzić w czym problem uruchamiając php.exe z linii poleceń. Przykładowo będzie to:

Warning: PHP Startup: Unable to load dynamic library 'C:\php\php_pdo_sqlite.dll'
 - Nie można odnaleźć określonego modułu.
 in Unknown on line 0

Instalacja rozszerzenia ImageMagick (php-imagick)

ImageMagick jest, oprócz GD, podstawową biblioteką do obsługi plików graficznych (obracanie, nakładanie filtrów, zmiana rozmiaru itd.). Jest w pełni obiektowa, w moim indywidualnym odczuciu szybsza i daje lepsze efekty końcowe niż GD. Jednak instalacja rozszerzenia do PHP sprawia naprawdę sporo problemów. Jak się okazuje, jeżeli wiemy gdzie szukać i co zmieniać, sprowadza się do 5 minut pracy. Na początek będą potrzebne nam dwa pliki:

PHP dla Windows – PECL zależności
PHP dla Windows – PECL Imagick

Z pierwszego linka pobieramy najnowszy plik dla naszej architektury ImageMagick-6.9.2-vc14-x64.zip, z drugiego php_imagick-3.4.0rc3-7.0-ts-vc14-x64.zip. Zawartość `ImageMagick-6.9.2-vc14-x64.zip` wypakowujemy do D:\Server\ImageMagick-6.9.2-vc14-x64 – katalog zawiera wszystkie biblioteki ImageMagick oraz zależne moduły. Z drugiego archiwum ZIP potrzebny nam będzie wyłącznie plik php_imagick.dll który musimy przegrać do folderu D:\Server\php-7.0.0\ext. Następnym krokiem będzie poinformowanie PHP o nowym module. Otwieramy nasz plik php.ini i dodajemy w nim linię:

extension=php_imagick.dll

Rozszerzenie możemy dodać po innych, wcześniej zapisanych. Następnym krokiem będzie przekazanie informacji o ścieżkach do modułu FastCGI. Należy zmodyfikować plik D:\Server\Apache24\conf\extra\httpd-fcgi.conf:

FcgidInitialEnv PATH "D:/Server/ImageMagick-6.9.2-vc14-x64/bin;D:\Server\php-7.0.0;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"

Dodaliśmy tylko naszą nową ścieżkę biblioteki ImageMagick do zmiennej systemowej PATH. Nie trzeba zmieniać nic w konfiguracji systemu Windows. Teraz pozostaje już tylko zrestartować serwer Apache i rozszerzenie powinno być dostępne – jak zawsze najlepiej sprawdzić to poprzez funkcję phpinfo().

Podsumowanie

Jak widać, bazowa konfiguracja serwera Apache nie jest aż tak skomplikowana. W porównaniu do gotowych rozwiązań typu XAMPP, nie potrzebowaliśmy zainstalować języka Perl, zbędnych rozszerzeń. Pliki konfiguracyjne są czyste, łatwo je modyfikować, nic nie ingerowało w nasz system operacyjny. Wiedza nabyta podczas całego procesu z pewnością zaowocuje w przyszłości. Kolejnym krokiem może być instalacja serwerów baz danych MySQL oraz PostgreSQL oraz dodanie wsparcia dla protokołu SSL. Dobrym pomysłem będzie również zainstalowanie menedżera pakietów Composer. Pod Windows nie jest to również nic skomplikowanego. Gotowe instalatory rozwiązują za nas większość problemów. Natomiast jeżeli pracujemy na bazie SQL Server, przyda nam się jeszcze porada dotycząca konfiguracji środowiska dla tego SBD.

Komentarze

  • Ugrzęzłem na poziomie uruchamiania Serwera Apache . Sprawdzając, czy składnia plików konfiguracyjnych Apache jest prawidłowa, wpisując w wierszu poleceń “httpd.exe -t” wyskakuje komunikat “Aplikacja nie zostaławłaściwie uruchomiona(0xc000007b)”. Sprawdziłem jeszcze raz czy prawidłowo wprowadzałe zmiany w plikach i fini. Tylko ten komunikat wyskakuje, nic nie działa.<br /> Pozdrawiam.

  • Avatar użytkownika viking

    @Ted07: Instalując serwer XAMPP niczego się nie nauczysz. Jest to gotowy pakiet (który dodatkowo zawiera zbędne oprogramowanie) i przykładowo chcąc wgrać nową wersję PHP musisz zainstalować cały pakiet od nowa. Nie masz nad nim żadnej kontroli, nie wiesz co dzieje się w srodku. Samodzielna instalacja serwera nie jest trudna a daje znacznie więcej możliwości.

  • Czy zamiast instalacji w/w serwera można zainstalować serwer xampp?

  • Avatar użytkownika viking

    Zobacz jeszcze raz sekcję “Pobieranie plików”. Ze strony Apache musisz pobrać oddzielnie moduł Fast-CGI.

  • Wszystko poszło dobrze, ale w moim Apache24/modules nie ma pliku o nazwie mod_fcgid, są tylko trzy pliki o takiej nazwie, ale z różnymi sufiksami (np. mod_proxy_fcgi, mod_authnz_fcgi). Który podłączyć w takiej sytuacji?

  • Avatar użytkownika viking

    Myślę że jeżeli podasz:

    ServerName localhost:80

    w pliku httpd.conf, Apache nie będzie miał żadnych problemów.

  • Super!

    Zawsze korzystałem z gotowych pakietów AMP, ale chcący pobawić się nowym PHP trzeba było pójść o krok do przodu ;) Poradnik klarowny, wszystko działa tak jak trzeba. Tak samo jest u mnie problem. Podczas włączania serwera nakazuje zmienić dyrektywę ServerName. Szukałem na stacku ale żadne rozwiązanie nie działa. Chciałbym się pozbyć tego problemu, bo troszkę denerwuje. Zmieniałeś to może?

    Pozdrawiam!

Dodaj komentarz

*
Nazwa zostanie wyświetlona wraz z komentarzem. Możesz też utworzyć nowe konto w serwisie, dzięki czemu uzyskasz dodatkową funkcjonalność.
*
Akceptowana jest ograniczona składnia Textile. Wszystkie tagi HTML zostaną usunięte.