25.01.20236 min
Michał Giza

Michał Giza Administrator systemów / DevOps

Obsługa PHP w IIS na Windows Server

Sprawdź, w jaki sposób wygodnie zainstalować w systemie Windows Server interpretator PHP.

Obsługa PHP w IIS na Windows Server

Interpretery języka PHP działają najczęściej wraz z serwerami NGINX czy Apache w środowiskach z Linuxem. Jednak z powodzeniem można uruchomić obsługę PHP w przypadku Windows i serwera IIS. Zdecydowanie nie jest to najczęściej spotykana konfiguracja, natomiast w praktyce może pojawić się potrzeba jej wdrożenia.

W IIS PHP może być dostępny poprzez interfejs FastCGI. Dostosowanie ustawień PHP standardowo ogranicza się do pliku php.ini bądź też w plikach o nazwach zdefiniowanych jako user_ini.filename umieszczonych w katalogach z witrynami (wtedy oczywiście obejmują one konkretną witrynę, nie wszystkie hostowane w ramach jednego serwera).

Ogólną zaletą korzystania z serwerów Windows jest stosunkowo większa prostota zarządzania, ponieważ sporą ilość ustawień można po prostu „wyklikać”. Niestety wątpliwe jest założenie, że na IIS mamy szansę skutecznie uruchomić dowolne aplikacje napisane w PHP. Jak to często bywa, dla zastosowań deweloperskich Docker + WSL może okazać się najlepszym rozwiązaniem. Natomiast hostowanie aplikacji zbudowanych przykładowo na WordPress jak najbardziej jest możliwe z wykorzystaniem serwera IIS.


Konfiguracja PHP w IIS

Pierwszym krokiem jest instalacja CGI. Wystarczy w zakładce Web Server Role (IIS) -> Role Services w Add Roles and Features Wizard zaznaczyć checkbox przy opcji CGI w gałęzi Application Development.


Następnie pobieramy i instalujemy pakiet redystrybucyjny ze stron Microsoftu. Brak tych bibliotek uniemożliwi uruchomienie wybranej wersji PHP.

Dalszym krokiem jest już pobranie archiwum ZIP ze składnikami interpretera PHP. Zgodnie z podaną na niej informacją, w przypadku IIS i (szczególnie) FastCGI należy używać wersji NTS (Non Thread Safe). Archiwum wystarczy wypakować do określonego folderu. Przykładowo, jeśli pobraliśmy PHP 8.2, to zawartość można wyodrębnić do folderu C:\PHP8.2.

Przydatne jest dodanie tego folderu do zmiennej PATH, dzięki czemu interpreter PHP będzie dostępny z poziomu Wiersza polecenia. Globalnie możemy osiągnąć to poleceniem setx z parametrem /M:

setx /M PATH "%PATH%;C:\PHP8.2"

Działanie można sprawdzić, wyświetlając informacje o dostępnej wersji PHP:


W kolejnym kroku otwieramy IIS Manager i w widoku serwera przechodzimy do Handler Mappings -> Add Module Mapping… Dodajemy analogiczny do poniższego zrzutu ekranu wpis:


Przechodzimy do ustawień wybranej strony w IIS i w opcji Default Document dodajemy index.php. Z reguły podstawowe skrypty powinny już teraz być poprawnie interpretowane. Niestety te bardziej złożone aplikacje do uruchomienia wymagają jeszcze dodatkowej konfiguracji PHP i pliku web.config.

Przykładowo dla WordPress istotne jest dodanie reguły rewrite, której ten system będzie potrzebował do obsługi bezpośrednich odnośników (zamiast ?p=<id>). Możemy tego dokonać edytując web.config lub poprzez moduł URL Rewrite w IIS. Powinno to wyglądać w ten sposób:

<rule name="WordPress">
    <match url=".*" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="index.php" />=
</rule>



Jeśli serwis korzysta z HTTPS, to również możemy dodać przekierowanie każdego żądania HTTP na wersję szyfrowaną:

<rule name="Redirect">
    <match url=".*" />
    <conditions>
        <add input="{HTTPS}" pattern="^OFF$" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}/{REQUEST_URI}" appendQueryString="false" />
</rule>


Oprócz tego musimy w folderze z PHP skopiować plik php.ini-production lub php.ini-development (różnice między nimi dotyczą przede wszystkim wyświetlania błędów) do php.ini i „odkomentować” listę rozszerzeń, co jest konieczne, chociażby do obsługi połączenia z bazą MySQL. Dodatkowo w zasadzie powinniśmy ustawić co najmniej te opcje:

fastcgi.impersonate = 1
extension_dir = "C:\PHP8.2\ext"
session.save_path = "C:\PHP_Temp"
upload_tmp_dir = "C:\PHP_Temp"
error_log = "C:\PHP_Logs\php8.2-error.log"
date.timezone = Europe/Warsaw
user_ini.filename = ".user.ini"


Oraz zależnie od potrzeb user_ini.cache_ttl = 0, aby wartości w plikach .user.ini były uwzględniane ad hoc, zamiast po 5 minutach. To podstawowe zmiany, pozostają jeszcze wartości typu memory_limit, max_execution_time czy post_max_size, które jednak należy dostosować do własnych wymagań.

Po dokonaniu zmian musimy zrestartować application pool naszej witryny bądź cały serwer IIS. W celu restartu IIS wystarczy użyć polecenia iisreset.

Kolejna kwestia to uprawnienia do folderu ze stroną. Odpowiednie dostępy, czyli

  • Read & execute
  • List folder contents
  • Read
  • Write

muszą mieć użytkownicy IUSR i IIS_IUSRS. Uprawnienia można standardowo nadać poprzez interfejs graficzny lub poleceniem icacls. Użytkownik IUSR jest powiązany z opcją fastcgi.impersonate, którą aktywowaliśmy. Jest to zresztą zalecane działanie, ponieważ w pewnym stopniu zwiększa ono poziom zabezpieczeń:

When impersonation is enabled, PHP performs all the file system operations on behalf of the user account that has been determined by IIS authentication; this ensures that even if the same PHP process is shared across multiple IIS Web sites, the PHP scripts in those Web sites cannot access each other's files as long as different user accounts are used for IIS authentication on each Web site.

Tak przygotowana konfiguracja pozwoli na obsługę większości aplikacji, które nie posiadają zaawansowanych wymagań. Typowe instalacje WordPress, jak i innych popularnych systemów CMS, powinny działać całkowicie poprawnie.


Serwer FTP na Windows

Skoro witryna jest już hostowana, możemy udostępnić dostęp do jej folderu poprzez FTP. IIS zapewnia wbudowany serwer FTP, który dodajemy z poziomu Server Roles w gałęzi Web Server (IIS). W IIS Manager prawym przyciskiem myszy wybieramy witrynę i przechodzimy do opcji Add FTP Publishing… Ustawiamy adres IP, pod którym serwer będzie dostępny oraz ewentualnie dodajemy obsługę SSL.

Jeśli aktywujemy opcję Enable Virtual Host Names, to w celu połączenia z serwerem FTP jako nazwę użytkownika należało będzie podawać ciąg postaci <domena>|<użytkownik>. Jest to jednak rozwiązanie w sytuacji, gdy utrzymujemy wiele udziałów FTP. Niestety do jednego adresu IP może być przypisany w danym momencie tylko jeden udział. Kolejne udziały zostaną co prawda dodane, ale nie będzie możliwości ich jednoczesnego uruchomienia.

Następnie przypisujemy użytkownika do tworzonego udziału FTP. W polu Authentication zaznaczamy Basic, a w polu Authorization wybieramy Specified users i wpisujemy nazwę użytkownika oraz nadajemy mu wybrane prawa dostępu (odczyt / zapis). Jeśli użytkowników będzie wielu, ich nazwy oddzielamy przecinkami. Odpowiednie uprawnienia trzeba ustawić także na danym zasobie na poziomie systemu plików.



Używanie zapory Windows Defender wiąże się z koniecznością restartu systemu. Automatycznie dodawane są trzy reguły (dla FTP, passive mode oraz FTPS), więc nie ma potrzeby konfiguracji polityk po naszej stronie, natomiast firewall musi się „przeładować”.

Innym rozwiązaniem jest FileZilla Server, którego instalator pobierzemy ze strony projektu. Na etapie instalacji podajemy hasło administratora, a po jej zakończeniu możemy od razu połączyć się z lokalną usługą zarządzania działającą na porcie 14148. Wchodzimy w Server -> Configure… -> Users i wybieramy Add. Wpisujemy nazwę użytkownika FTP i ustalamy hasło. Ustawiamy ścieżkę do naszej witryny i uprawnienia do udostępnianego folderu.

Firewall nie jest automatycznie ustawiany, ale jego konfiguracja ogranicza się do zezwolenia na ruch obsługiwany przez FileZilla. Regułę można dodać, uruchamiając przystawkę wf.msc i wchodząc w Inbound Rules -> New Rule… Ścieżka do pliku wykonywalnego to %ProgramFiles%\FileZilla Server\filezilla-server.exe.


Podsumowanie

Wydaje się, że hostowanie serwisu napisanego w PHP na IIS to specyficzne podejście. W pewnym sensie jest to prawda. Niemniej jednak taka konfiguracja zapewnia porównywalne możliwości do tradycyjnych rozwiązań, przynajmniej w sytuacji typowych wymagań. Jest też ważne, żeby znać alternatywne metody do tych powszechnie stosowanych, aby w razie potrzeby można było je sprawnie wdrożyć.

 
<p>Loading...</p>