Kategoria: Nginx

  • Twój serwer jest bezpieczny. Poradnik, jak trwale blokować ataki

    Twój serwer jest bezpieczny. Poradnik, jak trwale blokować ataki

    Trwała czarna lista IP z Fail2ban, UFW i Ipset

    Wstęp: Poza tymczasową ochroną

    W cyfrowym świecie, gdzie ataki na serwery są na porządku dziennym, sama reakcja nie wystarczy. Choć narzędzia takie jak Fail2ban stanowią podstawową linię obrony, ich tymczasowe blokady pozostawiają lukę – uporczywi atakujący, po upływie czasu bana, mogą wrócić i próbować ponownie. Ten artykuł stanowi szczegółowy przewodnik po budowie w pełni zautomatyzowanego, dwuwarstwowego systemu, który zamienia efemeryczne bany w trwałe, globalne blokady. Połączenie Fail2ban, UFW oraz potężnego narzędzia Ipset tworzy mechanizm, który trwale chroni serwer przed znanymi recydywistami.

    Warstwa pierwsza: Reakcja z Fail2ban

    Na początku każdego ataku stoi Fail2ban. Ten daemon monitoruje pliki logów (np. sshd.log, apache.log) w poszukiwaniu wzorców świadczących o próbach włamania – na przykład wielu nieudanych prób logowania. Gdy wykryje taką aktywność, natychmiastowo blokuje adres IP atakującego, dodając go do reguł firewalla na zdefiniowany czas (np. 10 minut, 30 dni). Jest to skuteczna, ale krótkotrwała reakcja.

    Warstwa druga: Trwałość z UFW i Ipset

    Aby ban stał się trwały, potrzebujemy silniejszej, scentralizowanej metody zarządzania adresami IP. W tym miejscu wkraczają UFW i Ipset.

    Czym jest Ipset?Ipset to rozszerzenie do jądra Linuksa, które pozwala na zarządzanie zbiorami (setami) adresów IP, sieci, czy portów. Jest to znacznie bardziej wydajne rozwiązanie niż dodawanie tysięcy pojedynczych reguł do firewalla. Zamiast tego, firewall może odwołać się do całego zestawu za pomocą jednej reguły.

    Instalacja i konfiguracja IpsetPierwszym krokiem jest instalacja Ipset w systemie. Używamy do tego standardowych menedżerów pakietów:sudo apt updatesudo apt install ipsetNastępnie tworzymy dwa zestawy: blacklist dla adresów IPv4 i blacklist_v6 dla IPv6.

    sudo ipset create blacklist hash:ip hashsize 4096
    sudo ipset create blacklist_v6 hash:net family inet6 hashsize 4096

    Parametr hashsize określa maksymalną liczbę wpisów, co jest kluczowe dla wydajności.

    Integracja Ipset z Firewallem UFWAby UFW zaczął korzystać z naszych zestawów, musimy dodać do jego reguł odpowiednie polecenia. Edytujemy pliki konfiguracyjne UFW, dodając reguły blokujące ruch, który pochodzi z adresów zawartych w naszych zestawach Ipset. Dla IPv4 edytujemy

    sudo nano /etc/ufw/before.rules:

    Zaraz po:

    *filter
    :ufw-before-input - [0:0]

    dodajemy:

    # =======================================================
    # Reguły dla trwałej czarnej listy (ipset)
    # Blokuj każdy przychodzący ruch od adresów IP z zestawu 'blacklist' (IPv4)
    -A ufw-before-input -m set --match-set blacklist src -j DROP
    # =======================================================
    

    Dla IPv6 edytujemy

    sudo nano /etc/ufw/before6.rules

    Zaraz po

    *filter
    :ufw6-before-input - [0:0]

    dodajemy:

    # =======================================================
    # Reguły dla trwałej czarnej listy (ipset) - IPv6
    # Blokuj każdy przychodzący ruch od adresów IP z zestawu 'blacklist_v6'
    -A ufw6-before-input -m set --match-set blacklist_v6 src -j DROP
    # =======================================================
    

    Po dodaniu reguł, przeładowujemy UFW, aby weszły w życie:

    sudo ufw reload

    Skrypt do automatycznej aktualizacji czarnej listy

    Sednem systemu jest skrypt, który działa jako pomost między Fail2ban a Ipset. Jego zadaniem jest zbieranie zbanowanych adresów, unikalizowanie ich i synchronizowanie z zestawami Ipset.

    sudo nano /usr/local/bin/update-blacklist.sh

    Poniżej przedstawiono zawartość skryptu. Działa on w kilku krokach:

    1. Tworzy tymczasową, unikalną listę adresów IP z logów Fail2ban oraz istniejącej czarnej listy.
    2. Tworzy tymczasowe zestawy Ipset.
    3. Czyta adresy z unikalnej listy i dodaje je do odpowiednich zestawów tymczasowych (rozróżniając IPv4 i IPv6).
    4. Atomowo zamienia stare zestawy Ipset na nowe, tymczasowe, minimalizując ryzyko przerw w ochronie.
    5. Niszczy stare, tymczasowe zestawy.
    6. Zwraca podsumowanie liczby zablokowanych adresów.
    #!/bin/bash
    BLACKLIST_FILE="/etc/fail2ban/blacklist.local"
    IPSET_NAME_V4="blacklist"
    IPSET_NAME_V6="blacklist_v6"
    touch "$BLACKLIST_FILE"
    (grep 'Ban' /var/log/fail2ban.log | awk '{print $(NF)}' && cat "$BLACKLIST_FILE") | sort -u > "$BLACKLIST_FILE.tmp"
    mv "$BLACKLIST_FILE.tmp" "$BLACKLIST_FILE"
    
    sudo ipset create "${IPSET_NAME_V4}_tmp" hash:ip hashsize 4096 --exist
    sudo ipset create "${IPSET_NAME_V6}_tmp" hash:net family inet6 hashsize 4096 --exist
    
    while IFS= read -r ip; do
      if [[ "$ip" == *":"* ]]; then
        sudo ipset add "${IPSET_NAME_V6}_tmp" "$ip"
      else
        sudo ipset add "${IPSET_NAME_V4}_tmp" "$ip"
      fi
    done < "$BLACKLIST_FILE"
    
    sudo ipset swap "${IPSET_NAME_V4}_tmp" "$IPSET_NAME_V4"
    sudo ipset swap "${IPSET_NAME_V6}_tmp" "$IPSET_NAME_V6"
    
    sudo ipset destroy "${IPSET_NAME_V4}_tmp"
    sudo ipset destroy "${IPSET_NAME_V6}_tmp"
    
    COUNT_V4=$(sudo ipset list "$IPSET_NAME_V4" | wc -l)
    COUNT_V6=$(sudo ipset list "$IPSET_NAME_V6" | wc -l)
    let COUNT_V4=$COUNT_V4-7
    let COUNT_V6=$COUNT_V6-7
    [ $COUNT_V4 -lt 0 ] && COUNT_V4=0
    [ $COUNT_V6 -lt 0 ] && COUNT_V6=0
    
    echo "Czarna lista i ipset zaktualizowane. Zablokowane IPv4: $COUNT_V4, Zablokowane IPv6: $COUNT_V6"
    exit 0
    
    

    Po utworzeniu skryptu, należy nadać mu uprawnienia do wykonania:

    sudo chmod +x /usr/local/bin/update-blacklist.sh

    Automatyzacja i trwałość po restarcie

    Aby skrypt działał bez ingerencji, używamy harmonogramu cron. Otwieramy edytor crontab dla użytkownika root i dodajemy regułę, która uruchomi skrypt co godzinę:

    sudo crontab -e
    0 * * * * /usr/local/bin/update-blacklist.sh

    lub raz dziennie o 6 rano:

    0 6 * * * /usr/local/bin/update-blacklist.sh

    Ostatni, ale kluczowy krok, to zapewnienie, że zestawy Ipset przetrwają restart. Zestawy te są domyślnie przechowywane w pamięci RAM. Tworzymy więc usługę systemd, która zapisze ich stan przed zamknięciem serwera i wczyta go ponownie przy starcie.

    sudo nano /etc/systemd/system/ipset-persistent.service
    [Unit]
    Description=Zapisuje i wczytuje zestawy ipset przy starcie/zamknięciu systemu
    Before=network-pre.target
    ConditionFileNotEmpty=/etc/ipset.rules
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/bin/bash -c "/sbin/ipset create blacklist hash:ip --exist; /sbin/ipset create blacklist_v6 hash:net family inet6 --exist; /sbin/ipset flush blacklist; /sbin/ipset flush blacklist_v6; /sbin/ipset restore -f <(grep -v ' create' /etc/ipset.rules)"
    ExecStop=/sbin/ipset save -f /etc/ipset.rules
    
    [Install]
    WantedBy=multi-user.target
    
    

    Na koniec włączamy i uruchamiamy usługę:

    sudo systemctl daemon-reload
    sudo systemctl enable --now ipset-persistent.service

    Jak to działa w praktyce?

    Cały system to zautomatyzowany łańcuch zdarzeń, który działa w tle, chroniąc serwer przed atakami. Oto, jak wygląda przepływ informacji i działań:

    1. Reakcja na atak (Fail2ban):
      • Ktoś próbuje się włamać na serwer (np. wielokrotnie podając błędne hasło przez SSH).
      • Fail2ban, monitorując logi systemowe (/var/log/fail2ban.log), wykrywa ten wzorzec.
      • Natychmiast dodaje adres IP atakującego do tymczasowej reguły firewalla, blokując mu dostęp na określony czas.
    2. Trwałe banowanie (Skrypt i cron):
      • Co godzinę (zgodnie z ustawieniem w cron), system uruchamia skrypt update-blacklist.sh.
      • Skrypt czyta logi Fail2ban, znajduje wszystkie adresy, które zostały zbanowane (linijki zawierające „Ban”), a następnie porównuje je z istniejącą, lokalną czarną listą (/etc/fail2ban/blacklist.local).
      • Tworzy unikalną listę wszystkich zbanowanych adresów.
      • Tworzy tymczasowe zestawy ipset (blacklist_tmp i blacklist_v6_tmp) i dodaje do nich wszystkie adresy z unikalnej listy.
      • Wykonuje operację ipset swap, która atomowo zamienia stare, aktywne zestawy na nowe, zaktualizowane.
      • UFW, dzięki zdefiniowanym wcześniej regułom, natychmiast zaczyna blokować nowe adresy, które pojawiły się w zaktualizowanych zestawach ipset.
    3. Trwałość po restarcie (Usługa systemd):
      • Działanie Ipset jest ulotne – zestawy istnieją tylko w pamięci. Usługa ipset-persistent.service rozwiązuje ten problem.
      • Przed wyłączeniem/restartem serwera: systemd uruchamia polecenie ExecStop=/sbin/ipset save -f /etc/ipset.rules. Zapisuje ono aktualny stan wszystkich zestawów ipset do pliku na dysku.
      • Po włączeniu/restarcie serwera: systemd uruchamia polecenie ExecStart=/sbin/ipset restore.... Wczytuje ono z pliku /etc/ipset.rules wszystkie zablokowane adresy i automatycznie odtwarza zestawy ipset w pamięci.
      • Dzięki temu, nawet jeśli serwer zostanie zrestartowany, czarna lista IP pozostaje nienaruszona, a ochrona jest aktywna od pierwszych chwil po uruchomieniu systemu.

    Podsumowanie i weryfikacja

    Zbudowany system to w pełni zautomatyzowana, wielowarstwowa ochrona. Atakujący są tymczasowo banowani przez Fail2ban, a ich adresy są automatycznie dodawane do trwałej czarnej listy, która jest natychmiastowo blokowana przez UFW i Ipset. Usługa systemd zapewnia, że czarna lista przetrwa restarty serwera, chroniąc przed recydywistami na stałe. Aby zweryfikować działanie, można użyć poniższych komend:

    • sudo ufw status verbose
    • sudo ipset list blacklist oraz sudo ipset list blacklist_v6
    • sudo systemctl status ipset-persistent.service

    Jak Stworzyć Niezawodną Białą Listę (Whitelist) Adresów IP w UFW i Ipset

    Wprowadzenie: Dlaczego Biała Lista Jest Kluczowa?

    Podczas konfigurowania zaawansowanych reguł firewalla, zwłaszcza tych, które automatycznie blokują adresy IP (jak w systemach z Fail2ban), istnieje ryzyko przypadkowego zablokowania samego siebie lub kluczowych usług. Biała lista (whitelist) to mechanizm, który działa jak przepustka VIP dla Twojego firewalla – adresy IP umieszczone na tej liście zawsze będą miały dostęp, niezależnie od innych, bardziej restrykcyjnych reguł blokujących.

    Ten poradnik pokaże Ci, jak krok po kroku stworzyć solidną i trwałą białą listę, używając UFW (Uncomplicated Firewall) oraz ipset. Jako przykładu użyjemy adresu IP 111.222.333.444, który chcemy dodać jako zaufany.

    Krok 1: Stworzenie Dedykowanego Zestawu ipset dla Białej Listy

    Pierwszym krokiem jest utworzenie osobnego „kontenera” na nasze zaufane adresy IP. Użycie ipset jest znacznie wydajniejsze niż dodawanie wielu pojedynczych reguł do iptables.

    Otwórz terminal i wpisz następujące polecenie:

    sudo ipset create whitelist hash:ip
    

    Co zrobiliśmy?

    • ipset create: Polecenie tworzące nowy zestaw.
    • whitelist: Nazwa naszego zestawu. Jest krótka i jednoznaczna.
    • hash:ip: Typ zestawu. hash:ip jest zoptymalizowany do przechowywania i bardzo szybkiego wyszukiwania pojedynczych adresów IPv4.

    Krok 2: Dodanie Zaufanego Adresu IP

    Teraz, gdy mamy już gotowy kontener, dodajmy do niego nasz przykładowy, zaufany adres IP.

    sudo ipset add whitelist 111.222.333.444
    

    Możesz powtórzyć to polecenie dla każdego adresu, który chcesz dodać do białej listy. Aby sprawdzić zawartość listy, użyj polecenia:

    sudo ipset list whitelist
    

    Krok 3: Modyfikacja Firewalla – Nadanie Priorytetu Białej Liście

    To jest najważniejszy krok. Musimy zmodyfikować reguły UFW tak, aby połączenia z adresów na białej liście były akceptowane natychmiast, zanim firewall zacznie przetwarzać jakiekolwiek reguły blokujące (w tym te z czarnej listy ipset czy Fail2ban).

    Otwórz plik konfiguracyjny before.rules:Jest to plik, w którym znajdują się reguły przetwarzane przed głównymi regułami UFW.

    sudo nano /etc/ufw/before.rules

    Dodaj regułę ACCEPT na samej górze: Przejdź na początek pliku i znajdź sekcję *filter. Zaraz pod linią

    :ufw-before-input - [0:0]

    , dodaj nasz nowy fragment. Umieszczenie go na samej górze gwarantuje, że zostanie przetworzony jako pierwszy.

    *filter
    :ufw-before-input - [0:0]
    # =======================================================
    # Reguła dla białej listy (ipset) - ZAWSZE MA PIERWSZEŃSTWO
    # Akceptuj każdy ruch od adresów IP z zestawu 'whitelist'
    -A ufw-before-input -m set --match-set whitelist src -j ACCEPT
    # =======================================================
    

    -A ufw-before-input: Dodajemy regułę do łańcucha ufw-before-input.

    -m set --match-set whitelist src: Warunek: „jeśli źródłowy (src) adres IP pasuje do zestawu whitelist„.

    -j ACCEPT: Akcja: „natychmiast zaakceptuj (ACCEPT) pakiet i przestań przetwarzać dalsze reguły dla tego pakietu”.

    Zapisz plik i przeładuj UFW:

    sudo ufw reload
    Od tego momentu każde połączenie z adresu 111.222.333.444 będzie natychmiast akceptowane.

    Krok 4: Zapewnienie Trwałości Białej Listy

    Zestawy ipset są przechowywane w pamięci i znikają po restarcie serwera. Aby nasza biała lista była trwała, musimy upewnić się, że jest ona automatycznie wczytywana przy każdym starcie systemu. Wykorzystamy do tego naszą wcześniej stworzoną usługę

    ipset-persistent.service.

    Zaktualizuj usługę systemd: Musimy ją „nauczyć” o istnieniu nowego zestawu whitelist.

    sudo nano /etc/systemd/system/ipset-persistent.service

    Znajdź linię ExecStart i dodaj do niej polecenia create i flush dla whitelist. Jeśli masz już inne zestawy, po prostu dodaj whitelist na początku.

    # Przykład zaktualizowanej linii
    ExecStart=/bin/bash -c "/sbin/ipset create whitelist hash:ip --exist; /sbin/ipset create blacklist hash:ip --exist; /sbin/ipset create blacklist_v6 hash:net family inet6 --exist; /sbin/ipset create blacklist_nets hash:net --exist; /sbin/ipset flush whitelist; /sbin/ipset flush blacklist; /sbin/ipset flush blacklist_v6; /sbin/ipset flush blacklist_nets; /sbin/ipset restore -f <(grep -v '^create' /etc/ipset.rules)"
    


    Najprościej jest zastąpić całą linię ExecStart jej kompletną wersją, uwzględniającą wszystkie Twoje zestawy.

    Przeładuj konfigurację systemd:

    sudo systemctl daemon-reload

    Zapisz aktualny stan wszystkich zestawów do pliku: To polecenie nadpisze stary plik /etc/ipset.rules nową wersją, która zawiera już informacje o Twojej białej liście.

    sudo ipset save > /etc/ipset.rules

    Zrestartuj usługę, aby upewnić się, że działa z nową konfiguracją:

    sudo systemctl restart ipset-persistent.service

    Podsumowanie

    Gratulacje! Stworzyłeś solidny i niezawodny mechanizm białej listy. Dzięki niemu możesz bezpiecznie zarządzać swoim serwerem, mając pewność, że zaufane adresy IP, takie jak 111.222.333.444, nigdy nie zostaną przypadkowo zablokowane. Pamiętaj, aby dodawać do tej listy tylko w pełni zaufane adresy, takie jak Twój domowy lub biurowy adres IP.

    Jak efektywnie blokować adresy IP i podsieci na serwerze Linux

    Blokowanie pojedynczych adresów IP jest łatwe, ale co, jeśli atakujący używają wielu adresów z tej samej sieci? Ręczne banowanie każdego z nich jest nieefektywne i czasochłonne.

    W tym artykule dowiesz się, jak wykorzystać narzędzia ipset i iptables, aby skutecznie blokować całe podsieci, automatyzując ten proces i oszczędzając cenny czas.

    Dlaczego blokowanie całych podsieci jest lepsze?

    Wiele ataków, zwłaszcza tych typu „brute-force”, jest przeprowadzanych z wielu adresów IP należących do tego samego operatora lub z tej samej puli adresów (podsieci). Blokowanie tylko jednego z nich jest jak łatanie małej dziury w dużej zaporze — reszta ruchu wciąż może się przedostać.

    Zamiast tego, możesz zablokować całą podsieć, na przykład 45.148.10.0/24. Taki zapis oznacza, że blokujesz aż 256 adresów jednocześnie, co jest znacznie skuteczniejsze.

    Skrypt do automatycznego blokowania podsieci

    Aby zautomatyzować proces, możesz użyć poniższego skryptu bash. Skrypt ten jest interaktywny — prosi Cię o podanie podsieci do zablokowania, a następnie dodaje ją do listy ipset oraz zapisuje w pliku, dzięki czemu będzie trwale zablokowana.

    Przeanalizujmy skrypt krok po kroku:

    #!/bin/bash
    
    # Nazwa listy ipset, do której będą dodawane podsieci
    BLACKLIST_NAME="blacklist_nets"
    
    # Plik, do którego będą dopisywane zablokowane podsieci
    BLACKLIST_FILE="/etc/fail2ban/blacklistnet.local"
    
    # 1. Tworzy plik z czarną listą, jeśli jeszcze nie istnieje
    touch "$BLACKLIST_FILE"
    
    # 2. Sprawdza, czy lista ipset już istnieje. Jeśli nie, tworzy ją.
    # Użycie "hash:net" pozwala na przechowywanie podsieci, co jest kluczowe.
    ipset list $BLACKLIST_NAME >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        sudo ipset create $BLACKLIST_NAME hash:net maxelem 65536
    fi
    
    # 3. W pętli prosi użytkownika o podanie podsieci do zablokowania.
    # Pętla kończy się, gdy użytkownik wpisze "koniec".
    while true; do
        read -p "Podaj adres podsieci do zablokowania (np. 192.168.1.0/24) lub wpisz 'koniec': " subnet
        
        if [ "$subnet" == "koniec" ]; then
            break
        elif [[ "$subnet" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2}$ ]]; then
            # Sprawdza, czy wprowadzony format jest poprawny
            
            # Sprawdza, czy podsieć nie jest już w pliku, aby uniknąć duplikatów
            if ! grep -q "^$subnet$" "$BLACKLIST_FILE"; then
                echo "$subnet" | sudo tee -a "$BLACKLIST_FILE" > /dev/null
            fi
            
            # Dodaje podsieć do listy ipset
            sudo ipset add $BLACKLIST_NAME $subnet
        else
            echo "Błąd: Nieprawidłowy format. Podaj adres w formacie 'X.X.X.X/Y'."
        fi
    done
    
    # 4. Dodaje regułę w iptables, która blokuje cały ruch z adresów na liście ipset.
    # Upewnia się, że reguła jest dodawana tylko raz.
    if ! sudo iptables -C INPUT -m set --match-set $BLACKLIST_NAME src -j DROP >/dev/null 2>&1; then
        sudo iptables -A INPUT -m set --match-set $BLACKLIST_NAME src -j DROP
    fi
    
    # 5. Zapisuje reguły iptables, aby przetrwały restart serwera.
    # Ten fragment sprawdza, z jakiego narzędzia korzysta system
    if command -v netfilter-persistent &> /dev/null; then
        sudo netfilter-persistent save
    elif command -v service &> /dev/null && service iptables status >/dev/null 2>&1; then
        sudo service iptables save
    fi
    
    echo "Skrypt zakończył działanie. Lista '$BLACKLIST_NAME' została zaktualizowana, a reguły iptables są aktywne."
    
    

    Jak używać skryptu

    1. Zapisz skrypt: Zapisz powyższy kod w pliku, np. block_nets.sh
    2. Nadaj uprawnienia: Upewnij się, że plik ma uprawnienia do wykonania: chmod +x block_nets.sh
    3. Uruchom skrypt: Wykonaj skrypt z uprawnieniami roota: sudo ./block_nets.sh
    4. Podawaj podsieci: Skrypt poprosi Cię o podanie adresów podsieci. Po prostu wpisuj je w formacie X.X.X.X/Y i zatwierdzaj Enterem. Po zakończeniu wpisz koniec.

    Zapewnienie trwałości po restarcie serwera

    Zestawy ipset są domyślnie przechowywane w pamięci RAM i znikają po ponownym uruchomieniu serwera. Aby zablokowane adresy pozostały aktywne, musisz użyć usługi systemd, która wczyta je przy starcie systemu.

    Jeśli masz już taką usługę (np. ipset-persistent.service), musisz ją zaktualizować, aby uwzględniała nową listę blacklist_nets.

    Edytuj plik usługi: Otwórz plik konfiguracyjny swojej usługi:

    sudo nano /etc/systemd/system/ipset-persistent.service

    Zaktualizuj linię ExecStart: Znajdź linię ExecStart i dodaj do niej polecenia create i flush dla zestawu blacklist_nets.Przykładowa, zaktualizowana linia ExecStart powinna wyglądać następująco:

    ExecStart=/bin/bash -c "/sbin/ipset create whitelist hash:ip --exist; /sbin/ipset create blacklist hash:ip --exist; /sbin/ipset create blacklist_v6 hash:net family inet6 --exist; /sbin/ipset create blacklist_nets hash:net --exist; /sbin/ipset flush whitelist; /sbin/ipset flush blacklist; /sbin/ipset flush blacklist_v6; /sbin/ipset flush blacklist_nets; /sbin/ipset restore -f <(grep -v ' create' /etc/ipset.rules)"

    Przeładuj konfigurację systemd:

    sudo systemctl daemon-reload

    Zapisz aktualny stan wszystkich zestawów do pliku: To polecenie nadpisze stary plik /etc/ipset.rules nową wersją, która zawiera już informacje o wszystkich Twoich listach, w tym blacklist_nets.

    sudo ipset save > /etc/ipset.rules

    Zrestartuj usługę:

    sudo systemctl restart ipset-persistent.service

    Dzięki tej metodzie możesz w prosty i wydajny sposób zarządzać bezpieczeństwem swojego serwera, skutecznie blokując całe podsieci, które wykazują podejrzaną aktywność, i mieć pewność, że te reguły pozostaną aktywne po każdym restarcie.

  • Kluczowa Aktualizacja OpenLiteSpeed 1.8.4: Wzmocnienie Jądra Serwera

    Kluczowa Aktualizacja OpenLiteSpeed 1.8.4: Wzmocnienie Jądra Serwera

    1 sierpnia 2025 r. — Nowa wersja popularnego serwera WWW OpenLiteSpeed (OLS) oznaczona numerem 1.8.4 została opublikowana, przynosząc szereg istotnych poprawek. Aktualizacja skupia się na ulepszeniach w „Core” serwera, co oznacza, że zmiany dotyczą fundamentalnych, kluczowych komponentów, odpowiadających za jego bezpieczeństwo, stabilność i wydajność.


    Poprawki w Bezpieczeństwie i Stabilności

    Jedną z najważniejszych zmian jest usunięcie krytycznej luki w protokole HTTP/3, która powodowała wyciek pamięci. Błąd ten mógł prowadzić do stopniowego spowalniania, a nawet awarii serwera, co czyni jego naprawę priorytetem dla administratorów.

    Ponadto, deweloperzy wprowadzili ulepszoną walidację żądań HTTP/2. Ma to na celu lepsze blokowanie złośliwych i źle sformatowanych zapytań, które mogą być elementem ataków typu „denial of service” (DoS). Dzięki temu serwer staje się bardziej odporny na potencjalne zagrożenia i stabilniejszy w obsłudze dużego ruchu.


    Optymalizacja Wydajności

    Aktualizacja 1.8.4 to również szereg usprawnień, które bezpośrednio wpływają na wydajność. Wprowadzono poprawioną obsługę przestrzeni nazw, co jest szczególnie ważne w złożonych środowiskach serwerowych i ułatwia deweloperom zarządzanie kontenerami.

    Usunięto również błąd, który powodował uszkodzenie odpowiedzi serwera z powodu AIO (Asynchronous I/O). AIO jest kluczową techniką, która pozwala serwerowi na jednoczesne przetwarzanie wielu operacji, co jest niezbędne dla płynnego działania witryn o dużym ruchu. Naprawienie tego błędu gwarantuje, że OpenLiteSpeed będzie działał bardziej stabilnie i dostarczał poprawne dane użytkownikom, eliminując ryzyko błędów w ładowaniu treści.


    Jak zaktualizować OpenLiteSpeed?

    Dla administratorów systemów, proces aktualizacji do nowej wersji 1.8.4 jest prosty i zautomatyzowany. OpenLiteSpeed dostarcza skrypt lsup.sh, który zarządza procesem aktualizacji.

    Aby przeprowadzić aktualizację, wystarczy wykonać następujące kroki w terminalu:

    1. Przejdź do katalogu instalacyjnego OpenLiteSpeed:cd /usr/local/lsws
    2. Uruchom skrypt aktualizujący:./lsup.sh

    Skrypt automatycznie pobierze i zainstaluje najnowszą wersję, zachowując istniejące ustawienia serwera. Pełna dokumentacja dotycząca procesu aktualizacji jest dostępna na oficjalnej stronie projektu OpenLiteSpeed.


    Podsumowanie

    Wydanie OpenLiteSpeed 1.8.4 to sygnał, że deweloperzy koncentrują się na solidnych fundamentach swojego oprogramowania. Zmiany w „Core” serwera, skupione na bezpieczeństwie i optymalizacji, sprawiają, że aktualizacja jest niezbędna dla każdego, kto chce utrzymać swoje serwery w optymalnej kondycji.

  • WordPress i błąd „A scheduled event has failed”?

    WordPress i błąd „A scheduled event has failed”?

    Każdy administrator strony na WordPressie zna to uczucie. Logujesz się do panelu, a tam czeka na Ciebie komunikat: „A scheduled event has failed”. Serce na chwilę staje. Czy strona padła? Czy to poważna awaria?

    Spokojnie! Zanim zaczniesz panikować, weź głęboki oddech. Ten błąd, choć brzmi poważnie, rzadko oznacza katastrofę. Najczęściej jest to po prostu sygnał, że wewnętrzny mechanizm harmonogramu zadań w WordPressie nie działa optymalnie.

    W tym artykule wyjaśnimy, czym jest ten błąd, dlaczego się pojawia i jak go profesjonalnie naprawić w różnych konfiguracjach serwerowych.

    Czym jest WP-Cron?

    WordPress musi wykonywać cykliczne zadania w tle: publikować zaplanowane posty, tworzyć kopie zapasowe czy skanować witrynę w poszukiwaniu wirusów (jak w przypadku błędu wf_scan_monitor od wtyczki Wordfence). Do obsługi tych operacji używa wbudowanego mechanizmu o nazwie WP-Cron.

    Problem polega na tym, że WP-Cron nie jest prawdziwym demonem cron znanym z systemów uniksowych. To „pseudo-cron”, który ma fundamentalną wadę: uruchamia się tylko wtedy, gdy ktoś odwiedzi Twoją stronę internetową.

    • Na stronach o małym ruchu: Jeśli nikt nie wchodzi na witrynę, zadania nie są wykonywane o czasie, co prowadzi do błędów.
    • Na stronach o dużym ruchu: WP-Cron jest wywoływany przy każdym załadowaniu strony, co generuje niepotrzebne obciążenie serwera.

    W obu przypadkach rozwiązanie jest takie samo: wyłączyć wbudowany WP-Cron i zastąpić go stabilnym, systemowym zadaniem cron.

    Scenariusz 1: Pojedyncza strona WordPress

    To podstawowa i najczęstsza konfiguracja. Rozwiązanie problemu jest proste i sprowadza się do dwóch kroków.

    Krok 1: Wyłącz wbudowany mechanizm WP-Cron

    Edytuj plik wp-config.php w głównym katalogu swojej strony i dodaj poniższą linię:

    define('DISABLE_WP_CRON', true);
    

    Krok 2: Skonfiguruj systemowy cron

    Zaloguj się do swojego serwera przez SSH i wpisz crontab -e, aby edytować listę zadań systemowych. Następnie dodaj jedną z poniższych linii, która co 5 minut będzie wywoływać mechanizm crona WordPressa we właściwy sposób.

    • Metoda z wget:*/5 * * * * wget -q -O - https://twojadomena.pl/wp-cron.php?doing_wp_cron >/dev/null 2>&1
    • Metoda z curl:*/5 * * * * curl -s https://twojadomena.pl/wp-cron.php?doing_wp_cron >/dev/null 2>&1

    Pamiętaj, aby podmienić twojadomena.pl na właściwy adres. Od teraz zadania będą wykonywane regularnie, niezależnie od ruchu na stronie.

    Scenariusz 2: Wiele stron na standardowym serwerze

    Jeśli zarządzasz wieloma stronami, dodawanie osobnej linii w crontab dla każdej z nich jest niepraktyczne i trudne w utrzymaniu. Lepszym rozwiązaniem jest stworzenie jednego skryptu, który automatycznie znajdzie wszystkie instalacje WordPressa i uruchomi dla nich zadania.

    Krok 1: Stwórz plik skryptu

    Utwórz plik, np. /usr/local/bin/run_all_wp_crons.sh, i wklej do niego poniższą zawartość. Skrypt przeszukuje katalog /var/www/ w poszukiwaniu plików wp-config.php.

    #!/bin/bash
    
    # =================================================================
    # Skrypt do uruchamiania zadań cron dla wszystkich stron WordPress
    # Zoptymalizowany dla struktury katalogów ISPConfig
    # =================================================================
    
    # Główny katalog, w którym znajdują się FAKTYCZNE pliki stron w ISPConfig
    SITES_ROOT="/var/www/clients/"
    
    # Ścieżka do interpretera PHP (może wymagać dostosowania)
    PHP_EXECUTABLE="/usr/bin/php"
    
    # Logowanie (opcjonalne, ale przydatne do debugowania)
    LOG_FILE="/var/log/wp_cron_runner.log"
    echo "Rozpoczynam uruchamianie zadań cron (ISPConfig): $(date)" >> $LOG_FILE
    
    # Znajdź wszystkie pliki wp-config.php i uruchom dla nich wp-cron.php
    find "$SITES_ROOT" -name "wp-config.php" -print0 | while IFS= read -r -d '' config_file; do
    
        # Wyodrębnij katalog, w którym znajduje się WordPress
        WP_DIR=$(dirname "$config_file")
    
        # Wyodrębnij nazwę użytkownika (np. web4) z ścieżki
        # Jest to siódmy element w ścieżce /var/www/clients/client4/web4/web/
        WP_USER=$(echo "$WP_DIR" | awk -F'/' '{print $6}')
    
        if [ -z "$WP_USER" ]; then
            echo "-> OSTRZEŻENIE: Nie udało się określić użytkownika dla: $WP_DIR" >> $LOG_FILE
            continue
        fi
    
        # Sprawdź, czy plik wp-cron.php istnieje w tym katalogu
        if [ -f "$WP_DIR/wp-cron.php" ]; then
            echo "-> Uruchamiam cron dla: $WP_DIR jako użytkownik: $WP_USER" >> $LOG_FILE
            # Uruchom wp-cron.php używając PHP CLI, przełączając się na właściwego użytkownika
            su -s /bin/sh "$WP_USER" -c "(cd '$WP_DIR' && '$PHP_EXECUTABLE' wp-cron.php)"
        else
            echo "-> OSTRZEŻENIE: Znaleziono wp-config, ale brak wp-cron.php w: $WP_DIR" >> $LOG_FILE
        fi
    
    done
    
    echo "Zakończono: $(date)" >> $LOG_FILE
    echo "---" >> $LOG_FILE

    Krok 2: Nadaj skryptowi uprawnienia do wykonania

    chmod +x /usr/local/bin/run_all_wp_crons.sh
    

    Krok 3: Stwórz jedno zadanie cron do zarządzania wszystkim

    Teraz Twój crontab -e może zawierać tylko jedną linię:

    */5 * * * * /usr/local/bin/run_all_wp_crons.sh >/dev/null 2>&1
    

    Scenariusz 3: Wiele stron z panelem ISPConfig

    Panel ISPConfig używa specyficznej struktury katalogów z dowiązaniami symbolicznymi (symlinkami), np. /var/www/twojadomena.pl wskazuje na /var/www/clients/client1/web1/. Użycie powyższego skryptu mogłoby spowodować podwójne wykonanie zadań.

    Aby tego uniknąć, należy zmodyfikować skrypt tak, by przeszukiwał tylko docelowy katalog clients.

    Krok 1: Stwórz skrypt zoptymalizowany dla ISPConfig

    Utwórz plik /usr/local/bin/run_ispconfig_crons.sh. Zwróć uwagę na zmianę w zmiennej SITES_ROOT.

    #!/bin/bash
    
    # Skrypt do uruchamiania zadań cron dla wszystkich stron WordPress
    # Zoptymalizowany dla struktury katalogów ISPConfig
    
    # Przeszukujemy tylko katalog z faktycznymi plikami stron
    SITES_ROOT="/var/www/clients/"
    
    # Ścieżka do interpretera PHP
    PHP_EXECUTABLE="/usr/bin/php"
    
    # Opcjonalny plik logu do śledzenia postępów
    LOG_FILE="/var/log/wp_cron_runner.log"
    echo "Rozpoczynam uruchamianie zadań cron (ISPConfig): $(date)" >> $LOG_FILE
    
    find "$SITES_ROOT" -name "wp-config.php" -print0 | while IFS= read -r -d '' config_file; do
        
        WP_DIR=$(dirname "$config_file")
    
        if [ -f "$WP_DIR/wp-cron.php" ]; then
            echo "-> Uruchamiam cron dla: $WP_DIR" >> $LOG_FILE
            (cd "$WP_DIR" && "$PHP_EXECUTABLE" wp-cron.php)
        fi
    
    done
    
    echo "Zakończono: $(date)" >> $LOG_FILE
    echo "---" >> $LOG_FILE
    

    Krok 2 i 3 są analogiczne jak w scenariuszu 2: nadaj skryptowi uprawnienia (chmod +x) i dodaj jedną linię do crontab -e, wskazując na nowy plik skryptu.

    Podsumowanie

    Błąd „A scheduled event has failed” to nie powód do paniki, a raczej zaproszenie do ulepszenia swojej infrastruktury. To szansa, by przejść z zawodnego, wbudowanego mechanizmu WordPressa na solidne, profesjonalne rozwiązanie systemowe, które gwarantuje stabilność i wydajność.

    Niezależnie od konfiguracji serwera, teraz masz narzędzia, by spać spokojnie, wiedząc, że Twoje zaplanowane zadania wykonują się jak w szwajcarskim zegarku.

  • OpenLiteSpeed (OLS) z Redis. Szybka pamięć Cache dla stron WordPress.

    OpenLiteSpeed (OLS) z Redis. Szybka pamięć Cache dla stron WordPress.

    Zarządzanie serwerem WWW wymaga zrozumienia komponentów, które składają się na jego architekturę. Każdy element odgrywa kluczową rolę w dostarczaniu treści użytkownikom w sposób szybki i niezawodny. Ten artykuł stanowi dogłębną analizę nowoczesnej konfiguracji serwerowej opartej na OpenLiteSpeed (OLS), wyjaśniając jego podstawowe mechanizmy, współpracę z systemem buforowania Redis oraz metody komunikacji z aplikacjami zewnętrznymi.

    Sekcja 1: OpenLiteSpeed (OLS) – Rdzeń Systemu

    Fundamentem każdej witryny jest serwer WWW – oprogramowanie odpowiedzialne za przyjmowanie żądań HTTP od przeglądarek i zwracanie im odpowiednich zasobów, takich jak pliki HTML, CSS, JavaScript czy obrazy.

    Czym jest OpenLiteSpeed?

    OpenLiteSpeed (OLS) to wysokowydajny, lekki serwer WWW o otwartym kodzie źródłowym, rozwijany przez LiteSpeed Technologies. Jego kluczową przewagą nad tradycyjnymi serwerami, takimi jak Apache w domyślnej konfiguracji, jest architektura sterowana zdarzeniami (event-driven).

    • Model procesowy (np. Apache prefork): Dla każdego jednoczesnego połączenia tworzony jest oddzielny proces lub wątek. Model ten jest prosty, ale przy dużym ruchu prowadzi do znacznego zużycia pamięci RAM i zasobów procesora, ponieważ każdy proces, nawet nieaktywny, rezerwuje zasoby.
    • Model sterowany zdarzeniami (OpenLiteSpeed, Nginx): Jeden proces roboczy serwera jest w stanie obsługiwać setki lub tysiące połączeń jednocześnie. Wykorzystuje on nieblokujące operacje wejścia/wyjścia (non-blocking I/O) i pętlę zdarzeń (event loop) do zarządzania żądaniami. Gdy proces czeka na operację (np. odczyt z dysku), nie blokuje się, lecz przechodzi do obsługi innego połączenia. Taka architektura zapewnia znacznie lepszą skalowalność i mniejsze zużycie zasobów.

    Kluczowe Funkcje OpenLiteSpeed

    OLS oferuje zestaw funkcji, które czynią go potężnym i elastycznym narzędziem:

    • Graficzny Interfejs Administracyjny (WebAdmin GUI): OLS posiada wbudowany panel administracyjny dostępny przez przeglądarkę, który umożliwia konfigurację wszystkich aspektów serwera – od wirtualnych hostów, przez ustawienia PHP, po reguły bezpieczeństwa – bez konieczności bezpośredniej edycji plików konfiguracyjnych.
    • Wbudowany Moduł Buforujący (LSCache): Jedną z najważniejszych funkcji OLS jest LSCache, zaawansowany i wysoce konfigurowalny mechanizm buforowania pełnych stron (full-page cache). W połączeniu z dedykowanymi wtyczkami dla systemów CMS (np. WordPress), LSCache przechowuje w pamięci w pełni wyrenderowane strony HTML. Gdy nadchodzi kolejne żądanie o tę samą stronę, serwer dostarcza ją bezpośrednio z bufora, całkowicie omijając wykonanie kodu PHP i zapytania do bazy danych.
    • Wsparcie dla Nowoczesnych Protokołów (HTTP/3): OLS natywnie wspiera najnowsze protokoły sieciowe, w tym HTTP/3 (oparty na QUIC). Zapewnia to mniejsze opóźnienia i lepszą wydajność, zwłaszcza na niestabilnych połączeniach mobilnych.
    • Kompatybilność z Regułami Apache: OLS potrafi interpretować dyrektywy mod_rewrite z plików .htaccess, co jest standardem w ekosystemie Apache. Upraszcza to znacząco proces migracji istniejących aplikacji bez konieczności przepisywania złożonych reguł przepisywania adresów URL.

    Sekcja 2: Redis – Akcelerator Danych w Pamięci Operacyjnej

    Buforowanie (caching) to fundamentalna technika optymalizacyjna, polegająca na przechowywaniu wyników kosztownych operacji w szybszym medium dostępowym. W kontekście aplikacji webowych, Redis jest jednym z najpopularniejszych narzędzi do realizacji tego zadania.

    Czym jest Redis?

    Redis (REmote DIctionary Server) to działająca w pamięci operacyjnej (in-memory) struktura danych, używana najczęściej jako baza danych typu klucz-wartość, bufor lub broker wiadomości. Jego potęga wynika z faktu, że wszystkie dane przechowuje w pamięci RAM, a nie na dysku twardym. Dostęp do RAM jest o rzędy wielkości szybszy niż dostęp do dysków SSD czy HDD, ponieważ jest to operacja czysto elektroniczna, omijająca wolniejsze interfejsy I/O.

    W typowej aplikacji webowej Redis pełni rolę bufora obiektów (object cache). Przechowuje on wyniki zapytań do bazy danych, fragmenty wyrenderowanego kodu HTML lub złożone obiekty PHP, które są kosztowne do ponownego wygenerowania.

    Jak Działa Współpraca OpenLiteSpeed i Redis?

    Mechanizmy buforowania LSCache i Redis nie wykluczają się, lecz doskonale uzupełniają, tworząc wielowarstwową strategię optymalizacji.

    Przepływ żądania (uproszczony):

    1. Użytkownik wysyła żądanie o dynamiczną stronę (np. wpis na blogu).
    2. OpenLiteSpeed odbiera żądanie. Pierwszym krokiem jest sprawdzenie bufora LSCache.
      • TRAFIENIE w LSCache (Cache Hit): Jeśli w LSCache znajduje się aktualna, w pełni wyrenderowana wersja strony, OLS natychmiast ją zwraca. Proces kończy się w tym miejscu. Jest to najszybszy możliwy scenariusz.
      • BRAK w LSCache (Cache Miss): Jeśli strony nie ma w buforze, OLS przekazuje żądanie do odpowiedniej aplikacji zewnętrznej (np. interpretera PHP) w celu jej wygenerowania.
    3. Aplikacja PHP rozpoczyna budowanie strony. Aby to zrobić, musi pobrać dane z bazy danych (np. MySQL).
    4. Zanim PHP wykona kosztowne zapytania do bazy danych, najpierw sprawdza bufor obiektów w Redis.
      • TRAFIENIE w Redis: Jeśli potrzebne dane (np. wyniki zapytań SQL) znajdują się w Redis, są one zwracane natychmiast. PHP używa tych danych do zbudowania strony, omijając komunikację z bazą danych.
      • BRAK w Redis: Jeśli danych nie ma w buforze, PHP wykonuje zapytania do bazy danych, pobiera wyniki, a następnie zapisuje je w Redis na potrzeby przyszłych żądań.
    5. PHP kończy generowanie strony HTML i zwraca ją do OpenLiteSpeed.
    6. OLS wysyła stronę do użytkownika, a jednocześnie zapisuje ją w buforze LSCache, aby kolejne żądania mogły być obsłużone znacznie szybciej.

    Ta dwuwarstwowa strategia zapewnia, że zarówno pierwsze, jak i kolejne odwiedziny strony są maksymalnie zoptymalizowane. LSCache eliminuje potrzebę uruchamiania PHP, a Redis drastycznie przyspiesza sam proces generowania strony, gdy jest to konieczne.

    Sekcja 3: Delegowanie Zadań – Aplikacje Zewnętrzne w OLS

    Nowoczesne serwery WWW są zoptymalizowane do obsługi połączeń sieciowych i dostarczania plików statycznych (obrazy, CSS). Wykonywanie kodu aplikacji (treści dynamicznej) jest delegowane do wyspecjalizowanych programów zewnętrznych. Taki podział obowiązków zwiększa stabilność i bezpieczeństwo.

    OpenLiteSpeed zarządza tymi programami poprzez system Aplikacji Zewnętrznych. Poniżej opisano najważniejsze typy:

    • Aplikacja LSAPI (LiteSpeed SAPI App): Najbardziej wydajna i zalecana metoda komunikacji z aplikacjami PHP, Python czy Ruby. LSAPI to autorski, zoptymalizowany protokół, który minimalizuje narzut komunikacyjny między serwerem a interpreterem aplikacji.
    • Aplikacja FastCGI: Bardziej uniwersalny, standardowy protokół do komunikacji z zewnętrznymi procesami aplikacji. Jest to dobre rozwiązanie dla aplikacji, które nie wspierają LSAPI. Działa na podobnej zasadzie co LSAPI (utrzymując stałe procesy robocze), ale z nieco większym narzutem protokołu.
    • Serwer WWW (Proxy): Ten typ konfiguruje OLS do działania jako odwrotne proxy (reverse proxy). OLS przyjmuje żądanie od klienta, a następnie przekazuje je w całości do innego serwera działającego w tle (tzw. backend), np. serwera aplikacji napisanego w Node.js, Javie czy Go. Jest to kluczowe do budowania architektur opartych na mikroserwisach.
    • Aplikacja CGI: Historyczna i najwolniejsza metoda. Dla każdego żądania uruchamiany jest nowy proces aplikacji, który jest zamykany po zwróceniu odpowiedzi. Ze względu na ogromny narzut wydajnościowy, jest używana tylko dla starszych aplikacji, które nie wspierają nowszych protokołów.

    OLS kieruje ruch do odpowiedniej aplikacji za pomocą Obsługi Skryptów (Script Handlers), która mapuje rozszerzenia plików (np. .php) na konkretną aplikację, lub Kontekstów (Contexts), które mapują ścieżki URL (np. /api/) na aplikację typu proxy.

    Sekcja 4: Język Komunikacji – Porównanie Architektur SAPI

    SAPI (Server Application Programming Interface) to interfejs definiujący, w jaki sposób serwer WWW komunikuje się z interpreterem aplikacji (np. PHP). Wybór implementacji SAPI ma fundamentalny wpływ na wydajność i stabilność całego systemu.

    Ewolucja SAPI

    1. CGI (Common Gateway Interface): Pierwszy standard. Stabilny, ale niewydajny z powodu uruchamiania nowego procesu dla każdego żądania.
    2. Moduł wbudowany (np. mod_php w Apache): Interpreter PHP jest ładowany bezpośrednio do procesu serwera. Zapewnia to bardzo szybką komunikację, ale kosztem stabilności (awaria PHP powoduje awarię serwera) i bezpieczeństwa.
    3. FastCGI: Kompromis między wydajnością a stabilnością. Utrzymuje pulę niezależnych, długo działających procesów PHP, co eliminuje koszt ich ciągłego uruchamiania. Komunikacja odbywa się przez gniazdo, co zapewnia izolację od serwera WWW.
    4. LSAPI (LiteSpeed SAPI): Ewolucja modelu FastCGI. Wykorzystuje tę samą architekturę z oddzielnymi procesami, ale sam protokół komunikacyjny został zaprojektowany od podstaw w celu minimalizacji narzutu, co przekłada się na jeszcze wyższą wydajność niż w przypadku standardowego FastCGI.

    Tabela Porównawcza Architektur SAPI

    CechaCGIModuł Wbudowany (mod_php)FastCGILiteSpeed SAPI (LSAPI)
    Model ProcesuNowy proces na żądanieWspółdzielony proces z serweremStałe procesy zewnętrzneStałe procesy zewnętrzne
    WydajnośćNiskaBardzo wysokaWysokaNajwyższa
    Stabilność / IzolacjaDoskonałaNiskaWysokaWysoka
    Zużycie ZasobówBardzo wysokieUmiarkowaneNiskieBardzo niskie
    Narzut KomunikacyjnyWysoki (uruchamianie procesu)Minimalny (wspólna pamięć)Umiarkowany (protokół)Niski (zoptymalizowany protokół)
    Główna ZaletaPełna izolacjaSzybkość komunikacjiZrównoważona wydajność i stabilnośćZoptymalizowana wydajność i stabilność
    Główna WadaBardzo niska wydajnośćNiestabilność, problemy z bezpieczeństwemBardziej złożona konfiguracjaTechnologia specyficzna dla LiteSpeed

    Porównanie Gniazd Komunikacyjnych

    Komunikacja między procesami (np. OLS a Redis, lub OLS a procesy PHP) odbywa się za pośrednictwem gniazd (sockets). Wybór typu gniazda ma wpływ na wydajność.

    CechaGniazdo TCP/IP (na localhost)Gniazdo Domeny Uniksowej (UDS)
    AdresowanieAdres IP + Port (np. 127.0.0.1:6379)Ścieżka pliku (np. /var/run/redis.sock)
    ZasięgTa sama maszyna lub przez siećTylko ta sama maszyna (IPC)
    Wydajność (lokalnie)NiższaWyższa
    Narzut (Overhead)Wyższy (przechodzi przez stos sieciowy)Minimalny (omija stos sieciowy)
    Model BezpieczeństwaReguły zapory sieciowej (firewall)Uprawnienia systemu plików

    W przypadku komunikacji lokalnej, UDS jest rozwiązaniem wydajniejszym, ponieważ omija cały stos sieciowy systemu operacyjnego, co redukuje opóźnienia i narzut procesora. Dlatego w zoptymalizowanych konfiguracjach jest preferowany do połączeń między OLS, Redis i procesami LSAPI.

    Sekcja 5: Praktyczna Implementacja i Zarządzanie

    Aby przełożyć teorię na praktykę, przeanalizujmy rzeczywistą konfigurację serwera dla wirtualnego hosta solutionsinc.co.uk .

    5.1 Analiza Konfiguracji na Przykładzie solutionsinc.co.uk

    OLS External App2
    1. Definicja Aplikacji Zewnętrznej (External App):
      • W panelu „External App” zdefiniowano aplikację typu LiteSpeed SAPI App o nazwie solutionsinc.co.uk. Jest to centralny punkt konfiguracji dla dynamicznej obsługi strony.
      • Adres (Address): UDS://tmp/lshttpd/solutionsinc.co.uk.sock. Ta linia jest kluczowa. Informuje OLS, że do komunikacji z aplikacją PHP będzie używane Gniazdo Domeny Uniksowej (UDS), a nie gniazdo sieciowe TCP/IP. Plik .sock pod tą ścieżką jest fizycznym punktem końcowym tego wydajnego kanału komunikacji.
      • Polecenie (Command): /usr/local/lsws/lsphp84/bin/lsphp. To jest bezpośrednia ścieżka do pliku wykonywalnego interpretera LiteSpeed PHP w wersji 8.4. OLS wie, że ma uruchomić ten właśnie program do przetwarzania skryptów.
      • Pozostałe parametry, jak LSAPI_CHILDREN=50 czy limity pamięci, służą do precyzyjnego zarządzania zasobami i wydajnością puli procesów PHP.
    2. Powiązanie z Plikami PHP (Script Handler):
      • Sama definicja aplikacji nie wystarczy. W panelu „Script Handler” mówimy OLS, kiedy ma jej używać.
      • Dla sufiksu (rozszerzenia) php ustawiono obsługę przez LiteSpeed SAPI.
      • Jako Handler Name wybrano [VHost Level]: solutionsinc.co.uk, co bezpośrednio wskazuje na aplikację zdefiniowaną w poprzednim kroku.
      • Wniosek: Od tej pory każde żądanie pliku z rozszerzeniem .php na tej stronie zostanie przekazane przez gniazdo UDS do jednego z procesów lsphp84.
    OLS Script Handler2
    OLS

    Ta konfiguracja jest doskonałym przykładem zoptymalizowanego i bezpiecznego środowiska: OLS obsługuje połączenia, a dedykowane, odizolowane procesy lsphp84 wykonują kod aplikacji, komunikując się przez najszybszy dostępny kanał – gniazdo domeny uniksowej.

    5.2 Zarządzanie Gniazdami Domeny Uniksowej (.sock) i Rozwiązywanie Problemów

    Plik .sock, jak widać w przykładzie solutionsinc.co.uk.sock, nie jest zwykłym plikiem. Jest to specjalny plik w systemach uniksowych, który działa jako punkt końcowy dla komunikacji międzyprocesowej (IPC). Zamiast komunikować się przez warstwę sieciową (nawet lokalną), procesy mogą zapisywać i odczytywać dane bezpośrednio z tego pliku, co jest znacznie szybsze.

    Kiedy OpenLiteSpeed uruchamia aplikację zewnętrzną LSAPI, tworzy taki plik gniazda. Procesy PHP nasłuchują na tym gnieździe na przychodzące żądania od OLS.

    Praktyczna porada: „Uparty” plik .sock

    Czasami po wprowadzeniu zmian w konfiguracji PHP (np. modyfikacji pliku php.ini lub instalacji nowego rozszerzenia) i restarcie serwera OpenLiteSpeed (lsws), zmiany mogą nie być widoczne na stronie. Dzieje się tak, ponieważ procesy lsphp mogły nie zostać poprawnie zrestartowane wraz z serwerem, a OLS wciąż komunikuje się ze starymi procesami przez istniejący, „stary” plik .sock.

    W takiej sytuacji, gdy standardowy restart nie pomaga, skutecznym rozwiązaniem jest:

    1. Zatrzymać serwer OpenLiteSpeed.
    2. Ręcznie usunąć odpowiedni plik .sock, np. za pomocą polecenia w terminalu:rm /tmp/lshttpd/solutionsinc.co.uk.sock
    3. Ponownie uruchomić serwer OpenLiteSpeed.

    Po ponownym uruchomieniu OLS, nie znajdując istniejącego pliku gniazda, zostanie zmuszony do stworzenia go na nowo. Co ważniejsze, uruchomi przy tym nową pulę procesów lsphp, które wczytają świeżą konfigurację z pliku php.ini. Usunięcie pliku .sock działa jak twardy reset kanału komunikacyjnego między serwerem a aplikacją PHP, gwarantując, że wszystkie komponenty zostaną zainicjowane od zera z aktualnymi ustawieniami.

    Sekcja 6: Podsumowanie

    Przedstawiona konfiguracja serwera to precyzyjnie zaprojektowany system, w którym każdy element odgrywa istotną rolę.

    • OpenLiteSpeed działa jako wydajny, sterowany zdarzeniami rdzeń, zarządzający połączeniami.
    • LSCache zapewnia błyskawiczne dostarczanie stron z bufora pełnej strony.
    • Redis działa jako bufor obiektów, drastycznie przyspieszając generowanie treści dynamicznych, gdy jest to potrzebne.
    • LSAPI i UDS tworzą zoptymalizowane kanały komunikacyjne, minimalizując narzut i opóźnienia.

    Zrozumienie tych zależności pozwala na świadome zarządzanie serwerem i jego optymalizację w celu osiągnięcia maksymalnej wydajności i niezawodności.

  • Ubuntu Server 24.04 + ISPConfig (Nginx) + OpenLiteSpeed: Nowoczesny i Wydajny Serwer WWW i Email bez CyberPanel

    Ubuntu Server 24.04 + ISPConfig (Nginx) + OpenLiteSpeed: Nowoczesny i Wydajny Serwer WWW i Email bez CyberPanel

    Wstęp

    Witajcie, drodzy administratorzy serwerów, zapaleńcy linuksowych rozwiązań i wszyscy ci, którzy na hasło „reverse proxy” nie wybiegają z pokoju z krzykiem. Dziś podzielę się z Wami historią migracji, która – niczym dobre sci-fi – ma swoje zwroty akcji, niespodzianki i happy end (a przynajmniej na razie!).

    Przez ostatnie lata moim głównym narzędziem do zarządzania serwerem WWW i pocztą był zestaw OpenLiteSpeed z CyberPanel. Jednak życie (a konkretnie: autorzy CyberPanel) postanowili, że Ubuntu 24.04 LTS nie będzie im w głowie. I tak przez ponad 3 lata… Aktualizacja? Zapomnij! Support dla nowych wersji Ubuntu? Pomyliłeś adres! Tak oto w czerwcu 2025 roku, mimo licznych próśb i oczekiwań, CyberPanel wciąż nie wspiera najnowszego Ubuntu. I nie zapowiada się, by coś się w tej kwestii zmieniło.

    Ale nie ma tego złego… Postanowiłem więc wziąć sprawy w swoje ręce. W efekcie powstała hybryda na miarę XXI wieku: Ubuntu Server 24.04, ISPConfig z Nginx jako reverse proxy oraz OpenLiteSpeed bez CyberPanelowego balastu. Dlaczego taka kombinacja? Bo lubię mieć kontrolę, cenię sobie wydajność, elastyczność i – co tu kryć – nie chcę być zakładnikiem archaicznych paneli admina.

    Takie rozwiązanie daje:

    • Świeżutki, wspierany system operacyjny z długim wsparciem (a nie wykopaliska z 2022 roku)
    • Pełną kontrolę nad konfiguracją, bez ograniczeń narzucanych przez CyberPanel
    • Możliwość korzystania z wydajności OpenLiteSpeed i prostoty zarządzania przez ISPConfig
    • Bezproblemową obsługę zarówno stron WWW, jak i poczty (a kto próbował skonfigurować własną pocztę na OLS + CyberPanel ten wie, jak wygląda piekło)
    • Nowoczesność, elastyczność i gotowość na przyszłość – a przy okazji mniej siwych włosów na głowie

    Czy jest to rozwiązanie dla każdego? Pewnie nie – ale jeśli masz dość czekania na łaskę twórców panelu, szukasz czegoś wydajnego i lubisz mieć nad wszystkim kontrolę – zostań ze mną. W kolejnych częściach pokażę, jak skonfigurować taki serwer krok po kroku, bez zbędnych zaklęć i frustracji.

    Dlaczego warto tworzyć osobnych klientów dla każdej strony w ISPConfig?

    Konfigurując serwer w ISPConfig, bezpieczeństwo i porządek to podstawa. Dlatego jedną z najlepszych praktyk jest tworzenie osobnego klienta dla każdej strony internetowej, którą zamierzamy hostować. Takie podejście nie tylko upraszcza zarządzanie, ale przede wszystkim podnosi poziom bezpieczeństwa – nawet jeśli na pierwszy rzut oka wydaje się to bardziej czasochłonne.

    Zalety zakładania osobnego klienta dla każdej strony:

    1. Izolacja danych – Każdy klient (a więc i jego strony, maile, bazy danych) działa w swojej własnej „piaskownicy”. Gdyby doszło do włamania na jedną stronę, pozostałe są dużo lepiej chronione.
    2. Łatwiejsza administracja – Zarządzanie uprawnieniami, kopie zapasowe, limity zasobów – wszystko jest czytelne i można ustawiać indywidualnie dla każdego klienta.
    3. Przejrzystość rozliczeń – Jeśli świadczysz usługi hostingowe, łatwiej rozliczysz się z każdym klientem osobno.
    4. Bezpieczna poczta – Konta e-mail klientów są od siebie oddzielone. Spam lub włamanie do jednego konta nie wpływa na pozostałe.
    5. Prostsze przenosiny lub usuwanie – Usunięcie jednej strony (razem z klientem) nie wpłynie na inne witryny na serwerze.

    Pokażę teraz, jak – krok po kroku – stworzyć klienta pod nową stronę na przykładzie solutionsinc.co.uk.


    Limity i bezpieczeństwo w ISPConfig – dlaczego to takie ważne?

    Po utworzeniu klienta w ISPConfig, jednym z najważniejszych etapów konfiguracji jest ustawienie limitów oraz zadbanie o bezpieczeństwo konta. Dzięki ISPConfig możesz precyzyjnie określić, ile zasobów (stron, kont e-mail, baz danych itp.) może wykorzystać każdy klient – to świetne narzędzie do zarządzania zarówno komercyjnymi usługami hostingowymi, jak i własnymi projektami.

    Przykładowe limity, które możesz ustawić:

    • Maksymalna liczba domen i subdomen
    • Limit przestrzeni dyskowej (Web Quota)
    • Limit transferu (Traffic Quota)
    • Liczba kont FTP, użytkowników SSH
    • Możliwość korzystania z określonych technologii (np. PHP, Python, Ruby, SSL, Let’s Encrypt)
    • Limity dla e-maili, baz danych, zadań Cron i innych usług

    Ustawianie limitów pozwala utrzymać porządek, zapobiega przypadkowemu „przeciążeniu” serwera i chroni przed nadużyciami (np. przez błędną konfigurację aplikacji lub atak DDoS).

    Bezpieczne hasło – Twój pierwszy mur obronny

    Bardzo istotną sprawą podczas tworzenia konta klienta jest ustawienie silnego, długiego hasła – najlepiej losowego, wygenerowanego przez manager haseł. Proponuję wybrać hasło o długości nawet 64 znaków, składające się z małych i wielkich liter, cyfr oraz znaków specjalnych. Dzięki managerowi haseł nie musisz go pamiętać, a Twoje konto jest znacznie bezpieczniejsze przed atakami.

    Pamiętaj: Słabe, powtarzalne lub krótkie hasła to zaproszenie dla cyberprzestępców!

    Opis opcji sekcji „Web Limits” w ISPConfig

    • Webservers: Serwer WWW, na którym będą zakładane strony klienta. Zazwyczaj do wyboru masz zdefiniowane wcześniej serwery w panelu.
    • Max. number of web domains: Maksymalna liczba domen, które klient może dodać. Wartość -1 oznacza brak limitu.
    • Web Quota: Limit przestrzeni dyskowej na pliki stron WWW klienta (w MB). -1 = bez limitu.
    • Traffic Quota: Limit miesięcznego transferu danych (w MB) dla wszystkich stron klienta. -1 = brak limitu.
    • PHP Options: Możesz włączyć/wyłączyć PHP oraz wybrać tryb działania (np. PHP-FPM, Disabled). Ważne dla bezpieczeństwa i wydajności.
    • CGI available: Czy klient może uruchamiać skrypty CGI (zazwyczaj wyłączone ze względów bezpieczeństwa).
    • SSI available: Pozwala na używanie Server Side Includes.
    • Perl available / Ruby available / Python available: Dostępność tych języków dla stron klienta.
    • SuEXEC forced: Wymusza uruchamianie skryptów z uprawnieniami użytkownika domeny, zwiększa bezpieczeństwo.
    • Custom error docs available: Czy można definiować własne strony błędów (np. 404.html).
    • Wildcard subdomain available: Umożliwia obsługę subdomen typu *.twojadomena.pl.
    • SSL available: Czy klient może aktywować SSL na swoich stronach (https).
    • Let’s Encrypt available: Umożliwia generowanie darmowych certyfikatów SSL Let’s Encrypt dla stron klienta.
    • Max. number of web aliasdomains: Maksymalna liczba domen aliasów (np. dodatkowe domeny wskazujące na tę samą stronę).
    • Max. number of web subdomains: Maksymalna liczba subdomen na stronach klienta.
    • Max. number of FTP users: Limit liczby użytkowników FTP dla klienta.
    • Max. number of Shell users: Liczba użytkowników z dostępem do SSH (zazwyczaj 0 dla bezpieczeństwa).
    • SSH-Chroot Options: Określa, czy użytkownicy SSH są ograniczeni (chroot) do swojego katalogu domowego („Jailkit”).
    • Max. number of Webdav users: Limit liczby użytkowników WebDAV.
    • Backupfunction available: Czy klient może wykonywać własne kopie zapasowe z poziomu panelu.
    • Show web server config selection: Pozwala klientowi wybierać dodatkowe opcje konfiguracji serwera WWW (dla zaawansowanych).

    Opis opcji sekcji „Email Limits” w ISPConfig

    • Mailservers: Serwer poczty, na którym obsługiwane będą skrzynki i domeny pocztowe klienta.
    • Max. number of email domains: Maksymalna liczba domen e-mail, które może utworzyć klient (-1 = bez limitu).
    • Max. number of mailboxes: Maksymalna liczba skrzynek pocztowych dla klienta (-1 = bez limitu).
    • Max. number of email aliases: Limit aliasów e-mail (np. dodatkowych adresów przekierowujących do skrzynki).
    • Max. number of domain aliases: Liczba aliasów domeny e-mail (czyli dodatkowych domen przypisanych do tej samej poczty).
    • Max. number of mailing lists: Limit list mailingowych (grupowa wysyłka wiadomości).
    • Max. number of email forwarders: Maksymalna liczba przekierowań e-mail (forwardów).
    • Max. number of email catchall accounts: Liczba kont „catchall”, odbierających wszystkie wiadomości wysyłane na nieistniejące adresy w domenie.
    • Max. number of email routes: Liczba tras routingu e-maili (zaawansowane – przekierowywanie poczty na inne serwery według reguł).
    • Max. number of email white / blacklist entries: Maksymalna liczba pozycji na białej/czarnej liście dla danego klienta.
    • Max. number of email filters: Limit filtrów e-mail (np. do automatycznego sortowania lub oznaczania poczty).
    • Max. number of fetchmail accounts: Liczba zewnętrznych kont (fetchmail) – pobieranie poczty z innych serwerów.
    • Mailbox quota: Limit rozmiaru skrzynki pocztowej (w MB). -1 = bez limitu.
    • Max. number of spamfilter white / blacklist filters: Liczba reguł białej/czarnej listy w filtrze antyspamowym.
    • Max. number of spamfilter users: Liczba użytkowników mających własne ustawienia antyspamu.
    • Max. number of spamfilter policies: Liczba polityk (zestawów reguł) antyspamowych.
    • E-mail backup function available: Czy klient może samodzielnie tworzyć kopie zapasowe poczty przez panel.

    Tworzenie użytkownika bazy danych dla strony – ISPConfig

    Po utworzeniu klienta i ustaleniu limitów, kolejnym krokiem jest stworzenie osobnego użytkownika bazy danych dla nowej strony (np. solutionsinc.co.uk). W tym celu przechodzimy do zakładki Sites, a następnie do sekcji zarządzania bazami danych.

    1. Wybierz klienta z listy (np. SolutionsInc).
    2. Wprowadź nazwę użytkownika bazy danych – ISPConfig automatycznie sugeruje prefiks powiązany z klientem (np. c2_). Dzięki temu każdy użytkownik jest unikalny i łatwy do zidentyfikowania.
    3. Ustaw hasło do bazy danych. Skorzystaj z przycisku Generate Password i wybierz długie, losowe hasło (najlepiej przechowywane w menedżerze haseł). Silne hasło to podstawa bezpieczeństwa, nawet jeśli nie musisz go zapamiętywać.
    4. Powtórz hasło w polu „Repeat Password”.
    5. Kliknij Save, aby utworzyć użytkownika.

    Tworzenie oddzielnych użytkowników do każdej strony to ważny krok – jeśli dojdzie do wycieku hasła, atak ogranicza się tylko do jednej bazy. Dzięki temu nawet poważny błąd w aplikacji nie daje napastnikowi dostępu do innych danych na serwerze.

    Opis opcji zakładki „Domain” przy tworzeniu strony WWW w ISPConfig

    • Server: Serwer WWW, na którym będzie hostowana domena. Wybierz odpowiedni serwer z listy dostępnych.
    • Client: Klient, do którego przypisana będzie ta domena/strona.
    • IPv4-Address: Adres IPv4 przypisany do tej domeny (domyślnie *, czyli dowolny dostępny IP na serwerze).
    • IPv6-Address: Adres IPv6, jeśli jest używany (opcjonalnie).
    • Domain: Nazwa domeny, którą chcesz dodać (np. solutionsinc.co.uk).
    • Harddisk Quota: Limit przestrzeni dyskowej dla tej konkretnej strony (w MB). -1 oznacza brak limitu.
    • Traffic Quota: Limit transferu danych dla tej strony (w MB miesięcznie). -1 oznacza brak limitu.
    • CGI: Czy zezwolić na uruchamianie skryptów CGI na stronie (zazwyczaj wyłączone dla bezpieczeństwa).
    • SSI: Czy włączyć obsługę Server Side Includes.
    • Own Error-Documents: Pozwala na ustawianie własnych stron błędów (np. 404.html).
    • Auto-Subdomain: Domyślna subdomena, która zostanie automatycznie dodana (najczęściej www).
    • SSL: Zaznacz jeśli posiadasz własny certyfikat SSL i chcesz ręcznie wgrać certyfikaty do panelu.
    • Let’s Encrypt SSL: Wybierz tę opcję, jeśli chcesz, aby ISPConfig automatycznie wygenerował darmowy certyfikat SSL Let’s Encrypt dla tej domeny (nie musisz posiadać własnych certyfikatów).
    • PHP: Wybierz tryb działania PHP dla strony. Jeśli zamierzasz używać Nginx jako Reverse Proxy dla OpenLiteSpeed, wybierz koniecznie PHP-FPM oraz dokładnie tę wersję PHP, na której działa OLS. Pozostałe tryby (np. Disabled) nie będą poprawnie współpracować z takim rozwiązaniem.
    • Web server config: Dodatkowe opcje konfiguracyjne serwera WWW (zaawansowane, można zostawić domyślnie).
    • Active: Czy strona ma być aktywna (zaznaczona domyślnie – strona po zapisaniu będzie działać).

    Opis opcji zakładki „Redirect” w ISPConfig (Reverse Proxy)

    • Redirect Type: Określa rodzaj przekierowania dla danej domeny. Jeśli chcesz skonfigurować Nginx jako reverse proxy dla OpenLiteSpeed, koniecznie ustaw tutaj opcję proxy. Dzięki temu ruch HTTP/S będzie przekazywany do właściwego backendu (OLS).
    • Redirect Path: Adres docelowy (URL/backend), do którego ma być przekazywany ruch. W przypadku reverse proxy wpisz tutaj adres backendu (np. http://127.0.0.1:8088/ – pamiętaj, żeby nie używać portu 8080, ponieważ jest on zajęty przez ISPConfig!).
    • SEO Redirect: Opcjonalne przekierowania SEO (np. 301, 302, non-www→www). Najczęściej pozostawiamy jako „No redirect”, chyba że masz specyficzne wymagania SEO.
    • Rewrite Rules: Pole na własne reguły rewrite, zgodne z modułem nginx_http_rewrite_module. Możesz tu dodawać dodatkowe instrukcje modyfikujące ruch HTTP, np. break, if, return, rewrite, set (pełna lista na stronie nginx).
    • Rewrite HTTP to HTTPS: Po zaznaczeniu automatycznie przekierowuje cały ruch z HTTP na HTTPS. Zalecane przy stronach wymagających SSL.

    Uwaga: Pamiętaj, że w przypadku konfiguracji reverse proxy kluczowe jest ustawienie Redirect Type na proxy i prawidłowe podanie backendu w Redirect Path.

    Zakładka SSL w ISPConfig – co tutaj ustawić?

    • Jeśli w zakładce Domain zaznaczyłeś opcję Let’s Encrypt SSL, nie musisz tutaj nic wypełniać. Certyfikat zostanie wygenerowany automatycznie i pola pozostaną puste.
    • Jeśli korzystasz z własnych certyfikatów SSL, wklej je odpowiednio do poniższych pól:
      • SSL Key: Klucz prywatny (private key)
      • SSL Request: Żądanie podpisania certyfikatu (CSR) – opcjonalne, jeśli go używasz
      • SSL Certificate: Właściwy certyfikat SSL (publiczny)
      • SSL Bundle: Certyfikaty pośrednie/CA Bundle (jeśli wymaga tego Twój dostawca SSL)
    • SSL Domain: Domena, dla której generowany/instalowany jest certyfikat (wypełnia się automatycznie)
    • SSL Action: Domyślnie „Save certificate” – zachowuje wprowadzone dane

    Wskazówka: Jeśli zmieniasz typ certyfikatu (np. przechodzisz z własnego certyfikatu na Let’s Encrypt lub odwrotnie), pamiętaj, by odznaczyć zbędne opcje w zakładce Domain i zapisać zmiany.

    Zakładka Statistics w ISPConfig – własne statystyki dla Twojej strony

    Jeśli chcesz mieć niezależny system statystyk strony (poza tym, co oferuje np. WordPress czy Google Analytics), ta zakładka jest dla Ciebie. Tutaj możesz skonfigurować, jaki program będzie generował i prezentował szczegółowe statystyki ruchu na Twojej stronie. Oto krótkie opisy dostępnych opcji:

    • AWStats: Najpopularniejszy program do generowania szczegółowych statystyk www. Analizuje logi serwera i prezentuje czytelne wykresy, podsumowania ruchu, popularność stron, źródła odwiedzin, wyszukiwane frazy i inne dane. Interfejs webowy, obsługa wielu języków.
    • GoAccess: Nowoczesny analizator logów działający w czasie rzeczywistym, także z interfejsem webowym. Bardzo szybki, daje czytelne podsumowania najważniejszych danych (unikalni użytkownicy, najpopularniejsze strony, kody błędów itp.). Może być bardziej „techniczny” od AWStats.
    • Webalizer: Starszy, ale bardzo lekki i szybki program do analizy logów. Prezentuje podstawowe statystyki ruchu, wykresy godzinowe/dniowe, listę najczęściej odwiedzanych stron, ale z mniejszą ilością szczegółów niż AWStats.
    • None: Brak statystyk. Przydatne jeśli korzystasz wyłącznie z zewnętrznych rozwiązań lub chcesz ograniczyć zużycie zasobów.

    Wskazówka: Pamiętaj, by ustawić hasło do panelu statystyk, jeśli chcesz, by dostęp był chroniony!

    Zakładka Backup – Twoja sieć bezpieczeństwa (i spokój ducha)

    W tej zakładce możesz ustawić automatyczne kopie zapasowe strony i bazy danych lub wykonać backup ręcznie, gdy tylko masz na to ochotę (albo poczujesz przypływ zdrowego rozsądku).

    Dostępne opcje:

    • Backup interval: Jak często wykonywać kopie (np. codziennie, co tydzień, co miesiąc, lub wcale – nie polecam tej ostatniej opcji!).
    • Number of backup copies: Ile ostatnich backupów przechowywać na serwerze.
    • Excluded Directories: Katalogi, które mają być pomijane w backupie (np. cache lub katalogi z danymi tymczasowymi).
    • Compression options: Możesz skompresować swoje backupy, żeby nie zajmowały pół serwera – polecam!
    • Encryption options: Możesz zaszyfrować kopie zapasowe – dzięki temu nawet jeśli backup trafi w niepowołane ręce, Twoje dane pozostaną bezpieczne.

    Ręczny backup: Dwa magiczne przyciski – zrób backup bazy lub plików jednym kliknięciem.

    Anegdota: Są dwa typy ludzi: ci, którzy robią backupy, i ci, którzy dopiero będą je robić po pierwszym poważnym krachu. Szkoda, że ta lekcja zawsze przychodzi za późno!

    Zakładka Options – kluczowa dla Reverse Proxy (Nginx → OLS)

    Jeśli używasz Nginx jako Reverse Proxy dla OpenLiteSpeed (lub innego backendu), koniecznie skonfiguruj odpowiednie nagłówki w polu Proxy Directives. Wklej tam poniższe linie:

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    Dlaczego to ważne?

    • proxy_set_header Host $host;
      Przekazuje oryginalną nazwę hosta (domeny), pod jaką użytkownik wszedł na stronę. Dzięki temu backend (OLS) wie, dla jakiej domeny przetwarza żądanie i poprawnie rozpoznaje wirtualne hosty.
    • proxy_set_header X-Real-IP $remote_addr;
      Przekazuje prawdziwy adres IP klienta, a nie adres serwera proxy. Dzięki temu w logach, statystykach oraz przy mechanizmach bezpieczeństwa widoczny jest rzeczywisty użytkownik.
    • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      Dodaje oryginalny adres IP klienta do specjalnego nagłówka X-Forwarded-For. Przydatne jeśli ruch przechodzi przez kilka proxy – można odtworzyć całą „trasę” zapytania.
    • proxy_set_header X-Forwarded-Proto $scheme;
      Informuje backend, czy oryginalne żądanie było po HTTPS czy HTTP. Dzięki temu aplikacje mogą generować poprawne linki zwrotne (np. z https:// zamiast http://).

    Podsumowanie:
    Bez tych nagłówków backend (OLS) nie będzie wiedział, kto naprawdę odwiedza Twoją stronę, pod jaką domeną, i czy używa HTTPS. Skutki mogą być poważne: błędne logi, niepoprawne generowanie linków, problemy z SSL, a nawet luki w bezpieczeństwie.

    Ostatni krok: konfiguracja OpenLiteSpeed pod Reverse Proxy

    Gdy wszystkie ustawienia po stronie ISPConfig są gotowe, przechodzimy do panelu OpenLiteSpeed, który znajdziesz pod adresem http://IP_SERWERA:7080.

    Co robimy:

    1. Przechodzimy do sekcji Listeners.
    2. Usuwamy wszystkie listenery poza Listener Default na porcie 8088 (to na nim OLS będzie „słuchał” żądań od Nginx Reverse Proxy).
    3. Klikamy w ikonkę lupki przy naszym Listenerze i przechodzimy do sekcji Virtual Host Mappings.
    4. Dodajemy mapping dla naszej strony, np. solutionsinc.co.uk (lub innej, którą podajesz w ISPConfig).

    Dlaczego tak?

    • Zarządzaniem SSL (wystawianiem, odnawianiem, przekierowaniami itp.) zajmuje się teraz Nginx wraz z ISPConfig, więc nie trzeba już konfigurować SSL w OLS.
    • Pozostałe zakładki listenery mogą zostać bez zmian – cała magia dzieje się teraz po stronie reverse proxy.

    Podsumowanie:
    Od tej pory Nginx przejmuje na siebie cały ruch (w tym HTTPS), a do OLS przekazuje już czyste żądania na lokalnym porcie (8088). To idealne połączenie wydajności, wygody i bezpieczeństwa.

    Virtual Hosts > Basic w OpenLiteSpeed – jak poprawnie uzupełnić?

    1. Virtual Host Name: Nazwa hosta wirtualnego – wpisz nazwę domeny, np. solutionsinc.co.uk.
    2. Virtual Host Root: Wpisz tu dokładnie taki adres, jak w polu Document Root w ISPConfig (np. /var/www/clients/client1/web1/), pamiętając o końcowym slashem /. Dzięki temu OLS będzie serwował pliki z właściwej lokalizacji.
    3. Config File: Wpisz bashKopiujEdytuj$SERVER_ROOT/conf/vhosts/$VH_NAME/vhost.conf Podczas próby zapisu OLS zgłosi, że taki plik nie istnieje – kliknij wtedy w link pod polem, aby ten plik utworzyć automatycznie. Po tej operacji będzie można zapisać ustawienia bez błędów.
    4. suEXEC User i suEXEC Group:
      Wybierz tutaj dokładnie tego użytkownika i grupę, jakie ISPConfig utworzył dla Twojej domeny. Możesz to sprawdzić w ISPConfig w zakładce Sites > Website > Options.
      To bardzo ważne – pozwala OLS uruchamiać skrypty PHP z prawidłowymi uprawnieniami, poprawia bezpieczeństwo i chroni przed dostępem do plików innych użytkowników.
    5. External App Set UID Mode: Wybierz opcję DocRoot UID. Dzięki temu zewnętrzne aplikacje (np. PHP) będą uruchamiane jako użytkownik powiązany z katalogiem domeny.
    6. W sekcji Security znajdują się opcje kluczowe dla bezpieczeństwa i poprawnego działania hosta wirtualnego. Każdą z tych opcji ustaw na Yes:
      • Follow Symbolic Link:
        Pozwala OLS na podążanie za linkami symbolicznymi w katalogu strony. Jest to wymagane np. przez niektóre aplikacje, frameworki lub podczas aktualizacji oprogramowania.
      • Enable Scripts/ExtApps:
        Umożliwia uruchamianie skryptów (np. PHP) oraz zewnętrznych aplikacji. Bez tej opcji Twoja strona nie będzie mogła przetwarzać PHP ani korzystać z dynamicznych funkcji.
      • Restrained:
        Włącza „tryb ograniczony” – zwiększa bezpieczeństwo, ograniczając możliwości wywoływania pewnych poleceń systemowych przez hosta wirtualnego.
      • Pamiętaj:
      • Ustawienie każdej z tych opcji na Yes jest niezbędne do poprawnej i bezpiecznej pracy Twojej strony przy współpracy z ISPConfig i reverse proxy.

    Zakładka General – OpenLiteSpeed Virtual Host

    Najważniejsze opcje:

    • Document Root:
      Katalog, w którym znajduje się Twoja strona. Tu wklejasz ścieżkę z ISPConfig (Sites → Website → Document Root) i na końcu dodajesz katalog strony, zazwyczaj /web/, czyli np. /var/www/clients/client1/web1/web/. Zawsze sprawdzaj tę ścieżkę w ISPConfig, bo może się różnić!

    Pozostałe opcje:

    • Domain Name:
      (Opcjonalnie) Możesz wpisać główną domenę tego vhosta.
    • Domain Aliases:
      Inne domeny, które mają wskazywać na tego vhosta (np. wersje z www i bez www).
    • Administrator Email:
      E-mail administratora tej strony (przydatny do powiadomień o błędach).
    • Enable GZIP Compression:
      Włącza kompresję GZIP na poziomie serwera – przyspiesza ładowanie strony.
    • Enable Brotli Compression:
      Alternatywna metoda kompresji (jeszcze wydajniejsza niż GZIP).
    • Enable GeoLocation Lookup:
      Pozwala serwerowi sprawdzać, z jakiego kraju pochodzi użytkownik (np. do statystyk).
    • cgroups:
      Opcjonalne ograniczenia zasobów dla vhosta – jeśli chcesz limity CPU/RAM.

    Sekcja Index Files:

    • Use Server Index Files:
      Powinno być ustawione na „No”, aby OLS używał plików indeksowych zdefiniowanych poniżej, a nie globalnych z serwera.
    • Index Files:
      Lista nazw plików, które mają być traktowane jako plik startowy strony (np. index.php, index.html). Jeśli oba istnieją, pierwszy z listy zostanie użyty.
    • Auto Index:
      Pozwala na automatyczne generowanie indeksu katalogu, jeśli nie ma pliku index (zalecane „Not Set”/wyłączone ze względów bezpieczeństwa).
    • Auto Index URI:
      Pozwala wskazać adres, pod którym wyświetli się automatyczny indeks katalogu.

    Customized Error Pages:

    • Tutaj możesz podać własne strony błędów (np. 404, 500).

    Expires Settings:

    • Enable Expires, Expires Default, Expires By Type:
      Kontrolują cache’owanie plików przez przeglądarki (możesz ustawić, jak długo przeglądarka ma trzymać pliki statyczne). Najczęściej zostawiamy domyślnie i konfigurujemy cache przez .htaccess lub w ustawieniach aplikacji.

    File Upload:

    • Temporary File Path, Temporary File Permission, Pass Upload Data by File Path:
      Zaawansowane ustawienia dot. przesyłania plików – gdzie zapisywane są pliki tymczasowe, jakie mają uprawnienia, i czy dane przesyłane są przez ścieżkę pliku (raczej zostaw domyślnie).

    php.ini Override:

    • Pozwala podać własne ustawienia PHP tylko dla tego vhosta – jeśli nie musisz zmieniać limitów (np. upload_max_filesize), zostaw puste.

    Zakładka Log – niezależne logi dla każdej witryny

    Dlaczego warto ustawić osobne logi?

    • Izolacja: Osobne logi dla każdej strony ułatwiają zarządzanie, rozwiązywanie problemów oraz audyt – nie musisz szukać swojej witryny w jednym wielkim pliku wspólnym dla całego serwera.
    • Bezpieczeństwo: Jeżeli masz kilka klientów lub projektów, osobne logi ograniczają dostęp tylko do niezbędnych danych i pomagają zachować porządek.
    • Łatwiejsza analiza: Szybciej wykryjesz, co dzieje się na danej stronie, np. ataki, błędy, czy nieprawidłowe żądania.

    Virtual Host Log (log błędów)

    • Use Server’s Log:
      Jeśli ustawisz na „No”, logi błędów będą prowadzone oddzielnie dla tej strony. Zalecane, bo błędy konkretnej witryny nie zginą wśród błędów innych projektów.
    • File Name:
      Ścieżka do pliku logu błędów tej strony (np. /var/www/clients/client1/solutionsinc.co.uk/log/error.log). Umieszczenie w katalogu domeny ułatwia zarządzanie backupem i dostępem.
    • Log Level:
      Poziom szczegółowości logów (DEBUG, INFO, NOTICE, WARN, ERROR, CRIT).
      DEBUG to najwięcej szczegółów – przydatne przy debugowaniu, ale do codziennego działania wystarczy WARN lub ERROR.
    • Rolling Size (bytes):
      Maksymalny rozmiar pliku logów, po przekroczeniu którego utworzony zostanie nowy plik (np. 10M). Chroni dysk przed zapchaniem.
    • Keep Days:
      Ile dni przechowywać stare logi – przydatne do audytu lub cofania się do przeszłych incydentów.
    • Compress Archive:
      Czy archiwizować i kompresować stare logi. Zalecane przy dużej liczbie logów, pozwala oszczędzić miejsce na dysku.

    Access Log (log dostępu)

    • Log Control:
      Wybierz „Own Log File”, by każdy vhost miał własny plik logu dostępu. Dzięki temu łatwiej analizować ruch na konkretnych stronach.
    • File Name:
      Ścieżka do logu dostępu (np. /var/www/clients/client1/solutionsinc.co.uk/log/access_log).
    • Piped Logger:
      Zaawansowana opcja – logi mogą być przetwarzane „w locie” przez zewnętrzne programy. Zostaw puste jeśli nie używasz.
    • Log Format:
      Format pojedynczego wpisu logu – domyślna opcja sprawdza się w większości przypadków, ale możesz dostosować pod potrzeby analizy.
    • Log Headers:
      Zaznacz „Referrer”, „UserAgent”, „Host” – dzięki temu logi będą zawierały kluczowe informacje o odwiedzających, źródłach wejść i typach urządzeń.
    • Rolling Size (bytes):
      Jak duży może być pojedynczy plik logu, zanim zacznie się tworzyć kolejny (np. 50M).
    • Keep Days:
      Ile dni przechowywać logi dostępu (np. 365 – pełen rok historii).
    • Compress Archive:
      Warto ustawić na „Yes”, by stare logi były automatycznie kompresowane.
    • Bytes log:
      Opcjonalnie: plik, w którym zapisywana jest statystyka przesłanych bajtów (raczej dla zaawansowanych analiz).

    Zalecane ustawienia:

    • Dla produkcji ustaw Log Level na WARN lub ERROR, a na czas uruchamiania i testów – DEBUG.
    • Zawsze kompresuj archiwalne logi.
    • Przechowuj logi co najmniej 30 dni – najlepiej 90 lub więcej, jeśli masz miejsce.
    • Dla Access Log: zawsze osobny plik per domena, zawsze z Referrer, UserAgent i Host.

    Zakładka Security – opis wszystkich opcji

    Uwaga:
    Nie musisz konfigurować tych ustawień, aby uruchomić stronę przez Nginx jako Reverse Proxy!
    Jeśli nie masz doświadczenia z zaawansowaną ochroną i kontenerami – najlepiej najpierw uruchomić stronę, upewnić się że wszystko działa, a dopiero potem wracać tutaj i testować poszczególne opcje.


    Sekcja: LS reCAPTCHA

    • Enable reCAPTCHA, Site Key, Secret Key, reCAPTCHA Type, Max Tries, Concurrent Request Limit
      Pozwala aktywować mechanizmy reCAPTCHA (ochrona przed botami i atakami brute force na poziomie serwera). Trzeba podać klucze z Google oraz ustawić limity prób.
      Praktyka: Tylko dla osób, które dokładnie wiedzą jak to działa – błędna konfiguracja może zablokować ruch na stronie.

    Sekcja: Containers

    • Bubblewrap Container
      Pozwala uruchomić vhost w odizolowanym kontenerze z użyciem narzędzia Bubblewrap (większe bezpieczeństwo – aplikacje są „odcięte” od systemu).
      Zaawansowana funkcja – nie zalecane dla początkujących.
    • Namespace Container, Additional Namespace Template File
      Umożliwiają izolację hosta w osobnej przestrzeni nazw (namespace), dodatkowo zwiększając bezpieczeństwo, ale wymagają wiedzy o konteneryzacji w Linuksie.

    Sekcja: Access Control

    • Allowed List
      Lista adresów IP, które mają mieć dostęp do tej strony.
    • Denied List
      Lista adresów IP, które mają być zablokowane. Uwaga: Jeśli źle to skonfigurujesz, możesz nieświadomie zablokować dostęp do własnej strony!

    Sekcja: Realm List

    • Tutaj możesz skonfigurować „realm” – czyli strefy z własnym uwierzytelnianiem (np. ochrona katalogu hasłem na poziomie serwera).

    Podsumowanie praktyczne

    • Dla działania strony przez Nginx jako Reverse Proxy, NIE musisz nic tu ustawiać.
    • Te opcje to narzędzia dla zaawansowanych administratorów – dla większości użytkowników najlepiej zostawić je domyślne, dopóki strona nie działa poprawnie.
    • Zalecenie: Najpierw uruchom stronę, sprawdź poprawność, potem (opcjonalnie) wracaj do tej zakładki, jeśli chcesz podnieść poziom bezpieczeństwa.

    Zakładka External App – opis i zalecenia

    Ta zakładka odpowiada za powiązanie serwera www z interpreterem PHP, dzięki czemu twoje aplikacje PHP działają poprawnie.

    Najważniejsze pola:

    • Name:
      Nazwa aplikacji zewnętrznej, np. solutionsinc.co.uk. Może być dowolna, ale najlepiej ustawić nazwę zgodną z domeną dla porządku.
    • Address:
      MUST HAVE!
      Gniazdo komunikacji z interpreterem PHP, np. UDS:///tmp/lshttpd/solutionsinc.co.uk.sock
      UDS (Unix Domain Socket) zawsze z dużej litery! Umożliwia szybszą i bezpieczniejszą komunikację niż połączenia sieciowe.
    • Notes:
      Dowolny opis, jeśli potrzebujesz (opcjonalne).
    • Max Connections:
      Maksymalna liczba równoczesnych połączeń do PHP. Zalecane 50, chyba że twoja strona obsługuje bardzo duży ruch – wtedy możesz zwiększyć.
    • Environment:
      Dodatkowe zmienne środowiskowe. Przykład: LSAPI_CHILDREN=50 – ustala liczbę procesów potomnych PHP dla tej aplikacji.
    • Initial Request Timeout (secs):
      Czas oczekiwania na odpowiedź przy pierwszym żądaniu (np. 600 sekund). Dłuższy czas jest bezpieczny przy wolniejszych serwerach lub długich skryptach.
    • Retry Timeout (secs):
      Ile sekund serwer ma czekać i ponawiać próbę w przypadku błędu połączenia z PHP.
    • Persistent Connection:
      Najlepiej zostawić „Yes” – pozwala na utrzymywanie otwartych połączeń i przyspiesza obsługę wielu żądań.
    • Connection Keep-Alive Timeout:
      Jak długo (w sekundach) połączenie z PHP pozostaje otwarte po obsłużeniu żądania (domyślnie 1).
    • Response Buffering:
      „No” oznacza natychmiastowe przekazywanie odpowiedzi do klienta. Zalecane dla stron dynamicznych.
    • Start By Server:
      „Yes (Through CGI Daemon)” – serwer sam uruchamia proces PHP, co jest bezpieczniejsze i wygodniejsze.
    • Command:
      KLUCZOWE!
      Ścieżka do interpretera PHP, np. /usr/local/lsws/lsphp83/bin/lsphp
      Upewnij się, że ten plik istnieje i jest to właściwa wersja PHP, której używasz. Jak sprawdzić:
      W konsoli serwera wpisz: bashKopiujEdytujls -l /usr/local/lsws/lsphp83/bin/lsphp Jeśli plik istnieje – ścieżka jest OK. Jeśli nie – sprawdź czy masz zainstalowaną wersję PHP 8.3 przez LiteSpeed (np. przez menadżer LiteSpeed lub polecenie lsphp).
    • Back Log:
      Maksymalna liczba żądań oczekujących na połączenie z PHP (zalecane 100).
    • Instances:
      Liczba instancji aplikacji (w praktyce: ilość niezależnych procesów). Zwykle 1 – jeśli nie masz bardzo wymagającej aplikacji.
    • Run As User / Run As Group:
      Muszą odpowiadać użytkownikowi i grupie zdefiniowanym w ISPConfig dla tej strony (np. web1/client1). Dzięki temu każdy vhost działa z uprawnieniami przypisanymi tylko do własnych plików, co znacznie podnosi bezpieczeństwo.
    • umask:
      Maska uprawnień dla tworzonych plików – najczęściej zostawiamy puste.
    • Run On Start Up, Max Idle Time, Priority:
      Zaawansowane opcje – zwykle nie wymagają zmiany.
    • Memory Soft Limit / Hard Limit:
      Miękki i twardy limit RAM dla procesu PHP (w bajtach).
      Zalecane: 2047M (2GB) – dostosuj do mocy serwera i potrzeb aplikacji.
    • Process Soft Limit / Hard Limit:
      Ograniczenie liczby procesów (soft/hard).
      Soft – ostrzeżenie, hard – blokada. Przykład: Soft 400, Hard 500.

    Zakładka Script Handler – do czego służy?

    Ta sekcja decyduje, jakie aplikacje mają obsługiwać określone typy plików skryptowych (np. PHP) na poziomie konkretnego Virtual Host. Bez poprawnego handlera, PHP nie zadziała!

    Kluczowe opcje:

    • Suffixes
      Tu wpisujesz rozszerzenia plików, które mają być obsługiwane przez danego handlera.
      W typowej konfiguracji wpisujesz po prostu: nginxKopiujEdytujphp Dzięki temu wszystkie pliki z rozszerzeniem .php będą analizowane przez PHP.

    Suffix – co to jest i jak go ustawić?

    Suffix określa, jakie rozszerzenia plików skryptowych będą obsługiwane przez dany Script Handler. Każdy suffix musi być unikalny w konfiguracji.

    Składnia:

    • Lista rozszerzeń oddzielona przecinkami, bez kropki („.” jest niedozwolona).
    • Przykład: KopiujEdytujphp,php83

    Ważne uwagi (na podstawie dokumentacji OLS):

    • Serwer automatycznie doda specjalny typ MIME (application/x-httpd-[suffix]) dla pierwszego sufiksu w tej liście.
      • Przykład: dla php83, zostanie dodany typ MIME application/x-httpd-php83.
    • Jeśli chcesz używać dodatkowych sufiksów (np. php53,php74), po pierwszym musisz dodać odpowiadające typy MIME ręcznie w ustawieniach MIME.
    • Choć pole „Suffix” wyświetla listę rozszerzeń, w praktyce handler korzysta z typów MIME, nie z samych sufiksów, aby zdecydować, które pliki obsłużyć.
    • Podawaj tylko te rozszerzenia, których rzeczywiście używasz – nie wpisuj niepotrzebnych lub nieużywanych, by nie zwiększać ryzyka błędów lub ataków.

    Przykład poprawnej konfiguracji:

    Jeśli chcesz obsługiwać tylko pliki .php:

    php

    Jeśli chcesz obsługiwać również .php83:

    php,php83

    Pamiętaj, aby dla dodatkowych sufiksów dodać odpowiedni typ MIME w ustawieniach serwera!

    • Handler Type
      Typ obsługiwacza skryptów.
      LiteSpeed SAPI to natywny, najwydajniejszy sposób obsługi PHP w OpenLiteSpeed – pozwala na bezpośrednią i szybką komunikację z interpreterem PHP, korzystając z ustawień z zakładki External App.
    • Handler Name
      Wybierasz tu powiązaną aplikację zdefiniowaną w zakładce External App.
      Jeśli masz kilku Virtual Hostów, możesz mieć kilka różnych wersji PHP lub różnych konfiguracji.
      Uwaga:
      Warto, żeby tu było [VHost Level]: solutionsinc.co.uk – czyli handler, który został utworzony dla tej konkretnej strony.

    Dlaczego to ważne?

    • Bez poprawnego powiązania PHP z właściwym handlerem, serwer nie będzie wiedział, jak uruchamiać twoje pliki .php (może pobierać je jako pliki tekstowe zamiast wykonywać kod!).
    • Wybór LiteSpeed SAPI gwarantuje najlepszą wydajność, bezpieczeństwo i obsługę nowoczesnych funkcji PHP.
    • Jeśli masz kilka stron i każda ma inne wymagania (np. jedna działa na PHP 8.3, druga na PHP 8.1), możesz tu przypisać do każdej Virtual Host odpowiednią wersję interpreter PHP.

    Zakładka Rewrite – do czego służy?

    Zakładka Rewrite pozwala na zarządzanie regułami przepisywania URL-i (tzw. „mod_rewrite”), dzięki którym możesz:

    • Tworzyć przyjazne adresy URL (np. w WordPress, Prestashop, Laravel).
    • Wymuszać przekierowania (np. http→https, non-www→www).
    • Realizować niestandardowe logiki przepisywania (np. maskowanie folderów, obsługa aliasów domen).

    Opis pól

    Rewrite Control

    • Enable Rewrite
      Włącza obsługę mechanizmu przepisywania (mod_rewrite) dla tego Virtual Host.
      Ważne: Bez tego żadne reguły z .htaccess ani wpisy w „Rewrite Rules” nie będą działać!
    • Auto Load from .htaccess
      Pozwala automatycznie ładować reguły rewrite z plików .htaccess znajdujących się w katalogach twojej strony.
      Ważne:
      • Dla WordPressa i większości popularnych CMS-ów koniecznie musi być „Yes”.
      • Jeśli chcesz mieć większą kontrolę nad wydajnością, możesz reguły rewrite wpisać bezpośrednio w „Rewrite Rules”, wtedy to pole można wyłączyć.
    • Log Level
      • Określa poziom szczegółowości logów debugowania mechanizmu rewrite.
      • Zakres wartości: 0–9
        • 0 – wyłącza logowanie rewrite (brak logów).
        • 9 – najbardziej szczegółowe logi debugowania.
      • Im wyższa liczba, tym więcej szczegółowych informacji o działaniach reguł rewrite pojawi się w logach serwera.
      • Aby opcja działała, logi błędów serwera i/lub Virtual Host muszą mieć poziom co najmniej INFO.
      • Przydatne przy testowaniu i rozwiązywaniu problemów z regułami rewrite.
      • Syntax: Liczba całkowita z zakresu 0–9.

    Rewrite Map
    Możliwość zdefiniowania map przepisywania (zaawansowane – np. do dynamicznych przekierowań na podstawie wzorców lub plików).

    • Dla większości użytkowników niewymagane.

    Rewrite Rules
    Miejsce na ręczne wpisanie reguł mod_rewrite (w stylu Apache).

    Przykład:

    RewriteEngine On

    RewriteCond %{HTTPS} !=on

    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    Reguły tutaj mają wyższy priorytet niż te z .htaccess.


    Dlaczego to ważne?

    • Bez rewrite wiele aplikacji nie będzie działać poprawnie (brak przyjaznych linków, błędy 404).
    • Automatyczne ładowanie z .htaccess pozwala korzystać z gotowych .htaccess od popularnych CMS-ów.
    • Ręczne reguły przydają się, gdy potrzebujesz pełnej kontroli lub lepszej wydajności.

    Zakładka Context – wszystkie pola

    1. URI

    • Opis: Ścieżka (URI) katalogu lub podkatalogu, dla którego tworzysz ten kontekst.
    • Kluczowe! Musi dokładnie odpowiadać folderowi, gdzie znajduje się Twoja strona (np. /web/ dla katalogu /var/www/clients/client1/web1/web/).
    • Uwaga: Jeśli URI kończy się na /, wszystkie podkatalogi są również objęte tym kontekstem. Jeśli twoja strona jest w katalogu głównym, wpisz po prostu /.

    2. LSAPI App

    • Opis: Wybierasz aplikację LiteSpeed SAPI (np. PHP) powiązaną z tym kontekstem. Lista rozwijana zawiera aplikacje zdefiniowane w External App.
    • Dlaczego ważne? To łączy obsługę PHP (lub innego języka) z Twoją stroną. Bez tego, PHP nie będzie działać w tym katalogu!

    3. Notes

    • Opis: Pole informacyjne, możesz tu wpisać własne notatki.
    • Wskazówka: Użyteczne przy większych instalacjach lub testach, ale pole nie jest obowiązkowe.

    4. Header Operations

    • Opis: Dodatkowe operacje na nagłówkach odpowiedzi HTTP (np. ustawianie, dodawanie, kasowanie nagłówków).
    • Składnia: Zbliżona do Apache mod_headers.
    • Przykład: pgsqlKopiujEdytujset Cache-control no-cache append Cache-control no-store
    • Wskazówka: Przydatne, gdy chcesz sterować cache’owaniem lub bezpieczeństwem na poziomie katalogu.

    5. Realm / Authentication Name / Require (Authorized Users/Groups) / Access Allowed / Access Denied / Authorizer

    • Opis: Opcje autoryzacji dostępu do danego katalogu (możesz tu ustawić prostą ochronę hasłem, dostęp tylko dla wybranych grup/użytkowników).
    • Wskazówka: Domyślnie zostawiasz puste. Stosujesz, jeśli chcesz ograniczyć dostęp do panelu admina, katalogu testowego itp.

    6. Add Default Charset

    • Opis: Określa, czy domyślny zestaw znaków ma być dodany do odpowiedzi HTTP.
    • Domyślnie: Off
    • Ustaw, jeśli: Masz stronę o nietypowym kodowaniu lub chcesz wymusić np. UTF-8.

    7. Customized Default Charset

    • Opis: Pozwala wskazać własny domyślny zestaw znaków (np. UTF-8, ISO-8859-2).
    • Ustaw, jeśli: Potrzebujesz specyficznego kodowania znaków.

    8. Enable GeoLocation Lookup

    • Opis: Pozwala włączyć sprawdzanie lokalizacji geograficznej użytkowników na podstawie IP.
    • Wskazówka: Zostaw domyślnie wyłączone, chyba że tworzysz stronę z personalizacją wg kraju.

    Dlaczego ta zakładka jest ważna?

    • Dzięki Context możesz precyzyjnie ustawić, jak serwer ma obsługiwać wybrane katalogi/podkatalogi, np. wybrać inną wersję PHP dla /admin/, zabezpieczyć panel logowania, zmienić nagłówki bezpieczeństwa tylko w jednym folderze.
    • URI to absolutna podstawa – błędne ustawienie tej ścieżki sprawi, że ustawienia nie zadziałają!
    • Dzięki temu masz elastyczność niedostępną w prostych hostingach.

    Podsumowanie

    Po wykonaniu wszystkich powyższych kroków – od konfiguracji ISPConfig, przez ustawienie Nginx jako reverse proxy, po precyzyjne dobranie opcji w OpenLiteSpeed – Twoja strona WordPress lub dowolna inna aplikacja powinna działać jak złoto. Oczywiście pod warunkiem, że nie zapomniałeś o poprawnych rekordach DNS (np. w CloudFlare) – bez nich nawet najpiękniej skonfigurowany serwer będzie świecił pustkami jak lodówka po sesji!

    Jeśli wszystko śmiga, gratulacje – możesz teraz spokojnie napić się herbaty, bo Twój serwer właśnie wszedł na wyższy poziom! Jeśli coś nie działa… cóż, sprawdź jeszcze raz DNS, logi oraz to, czy przypadkiem nie wpadłeś na pomysł zrobienia wszystkiego o 3 w nocy. Powodzenia!

  • Serwer www LiteSpeed vs Apache vs Nginx. Który lepszy?

    Serwer www LiteSpeed vs Apache vs Nginx. Który lepszy?

    Szukając hostingu dla swojej strony internetowej musisz brać pod uwagę nie tylko powierzchnię dyskową, rodzaj dysków twardych (SSD, HDD, NVMe), miesięczny limit transferu, czy liczbę baz danych, ale także to, jaki serwer www będzie obsługiwał Twoją stronę. Na rynku jest wiele różnych serwerów www, jednak trzy najpopularniejsze: Apache, Nginx i LiteSpeed zgarniają ponad 78% rynku. Nie liczę tutaj serwera Cloudflare server, bo działa on na trochę innej zasadzie co wymienione trzy. Wszystkie z nich są bardzo stabilne, rozwojowe i bogate w funkcje, jednak istnieją pomiędzy nimi ogromne różnice które będą miały wpływ na działanie Twojej witryny i na wygodę użytkowania.

    Co to jest serwer www?

    Serwer www to oprogramowanie które obsługuje żądania które wysyłają odwiedzający stronę i wysyła do nich gotową stronę do wyświetlenia na ich przeglądarkach internetowych. Za każdym razem gdy wpisujesz adres strony internetowej w przeglądarce, wysyłasz żądanie do serwera http/https, który albo wyświetla plik http – w przypadku statycznych stron http, albo generuje dynamicznie stronę PHP która jest przechowywana w bazie danych, jak to się dzieje w przypadku stron stworzonych w WordPress, Joomla, czy Drupal.

    Porównamy trzy najpopularniejsze serwery www, byś mógł wybrać najlepsze rozwiązanie dla Twojej witryny internetowej. Od jakiegoś czasu najpopularniejszym serwerem www jest Nginx, który zdeklasował serwer Apache. Na trzecim miejscu szybko pnący się do góry plasuje się LiteSpeed.

    Apache

    Apache serwer www

    Zacznijmy prezentację od Apache, bo jest on najstarszym z prezentowanych tu serwerów www. Ten powstały w 1995 roku serwer Open Source, przez długi czas był niekwestionowanym liderem popularności. Praktycznie rządził na maszynach z systemem Linux, a i na komputerach Windows był często wybierany zamiast komercyjnego IIS od Microsoft.

    Nginx

    pngwing.com

    Nginx powstał, by usunąć istniejące wady serwera Apache i początkowo działał jedynie jako odwrotny serwer proxy i load balancer. Dopiero później przekształcono go w pełnoprawny serwer www. Jest kompatybilny z Apache, więc łatwo można przetransferować istniejące strony z Apache do Nginx.

    LiteSpeed

    LiteSpeed serwer www

    LiteSpeed to najmłodszy serwer www z całej trójki. Podobnie jak Nginx jest on również w pełni kompatybilny z Apache i obsługuje pliki .htaccess i mod_rewritemod_security.

    Główne różnice

    Architektura

    Apache

    Apache ma architekturę opartą na procesach. Każde żądanie HTTP jest obsługiwane przez osobny proces. Tymi wszystkimi procesami zarządza jeden główny proces nadrzędny.

    Jest to główną wadą Apache. Problem z architekturą opartą na procesach polega na tym, że mają one spory problem z ilością zużywanej pamięci RAM. O ile na nieobciążonych stronach nie jest to dużym problemem, o tyle w przypadku popularnych witryn ten problem jest zauważalny. W przypadku dużego obciążenia witryny, drastycznie spada wydajność i szybkość ładowania się stron.

    Nginx

    Serwer www Nginx działa zupełnie inaczej. Jego architektura oparta jest na zarządzaniu zdarzeniami. Jest jeden proces główny i kilka procesów pomocniczych zarządzających całym ruchem na stronie. Taka architektura jest znacznie wydajniejsza. W przypadku Nginx nie ma takiego spadku wydajności nawet dla znacznie obciążonych witryn internetowych.

    LiteSpeed

    Podobnie jak w Nginx, architektura LiteSpeed jest oparta na zarządzaniu zdarzeniami. Dlatego też podobnie jak w Nginx, spadek wydajności przy zwiększającej się liczbie odwiedzających jest dużo mniejszy niż w Apache.

    Szybkość

    W przypadku mało odwiedzanych witryn, prędkość wszystkich trzech serwerów www jest na podobnym poziomie. Lecz im więcej witryna posiada aktywnych użytkowników, tym bardziej Apache zaczyna odstawać od pozostałej dwójki. Co prawda po zainstalowaniu W3 Total Cache w Apache jest trochę lepiej, ale przy 100 odwiedzających jednocześnie i tak Nginx i LiteSpeed biją Apache na głowę.

    Ngnix z FastCGI Cache jest znacznie szybszy od Apache z W3 Total Cache, ale dopiero LiteSpeed z zainstalowanym LiteSpeed Cache dla WordPress pokazuje prawdziwą przewagę. Dla witryny opartej na WordPress serwer Apache był w stanie obsłużyć 826,5 żądań na sekundę, Nginx 6025 żądań na sekundę, natomiast LiteSpeed obsłużył aż 69618 żądań na sekundę.

    Środowisko testowe

    • Testowane serwery www:

      • LiteSpeed Web Server v5.4.1
      • nginx v1.16.1
      • Apache v2.4.41
    • WordPress:

      • WordPress wersja: 5.2.2
      • LiteSpeed cache: LiteSpeed Cache dla WordPress
      • nginx cache: FastCGI Cache
      • Apache cache: W3 Total Cache
    • Maszyna klienta:

      • RAM: 1GB
      • Procesory: 1
      • Wątki CPU: 1
      • Model procesora: Virtual CPU 6db7dc0e7704
      • Dysk: NVMe SSD
    • Serwer:

      • RAM: 1GB
      • Procesory: 1
      • Wątki CPU: 1
      • Model procesora: Virtual CPU 6db7dc0e7704
      • Dysk: NVMe SSD
    • Sieć:

      • Przepustowość: 9.02 Gbits/sek
      • Opóźnienie: 0.302 ms
    • Cloud VM:

      • Vultr High Frequency Compute 1GB VM

    Buforowanie – Cache

    Pamięć podręczna służy do tymczasowego przechowywania często używanych danych. Pamięć podręczna serwera www przechowuje często odwiedzane strony sieci web i inne zasoby. Oto jak działa typowy serwer www z włączonym buforowaniem:

    1. Przeglądarka wysyła żądanie HTTP do serwera www
    2. Jeśli żądane dane znajdują się w pamięci podręcznej, cache przechwytuje żądanie i odpowiada na nie wysyłają dane do przeglądarki klienta bez obciążania serwera www.
    3. Jeśli żądane dane nie znajdują się w pamięci podręcznej, serwer www przetwarza dane i wysyła do przeglądarki klienta, jednocześnie zapisując dane do pamięci podręcznej. Pamięć podręczna przechowuje dane zgodnie z zapisanymi ustawieniami serwera www.

    Zmniejsza to obciążenie serwera, zwiększa ogólną wydajność/przepustowość witryny i skraca czas ładowania strony internetowej.

     

    Apache

    Apache ma różne moduły buforowania, takie jak: 

    Możesz je zaimplementować na swoim serwerze Apache, by zwiększyć wydajność często dowiedzanych stron.

    Nginx

    Buforowanie na serwerze Nginx możesz włączyć przy pomocy cPanelPlesk jeśli masz je zainstalowane, lub bezpośrednio w plikach konfiguracyjnych Nginx.

    LiteSpeed

    Pamięć podręczna Cache w LiteSpeed możesz bardzo łatwo włączyć przy pomocy wtyczek do 

    Pamięć podręczna oferuje też kilka innych wyjątkowych funkcji, jak na przykład Cache Crawler. Cache Crawler skanuje Twoją witrynę internetową, gdy nie jest obciążona, wychwytuje najczęściej odwiedzane strony i przenosi je do pamięci podręcznej, by jeszcze bardziej przyspieszyć Twoją witrynę. LiteSpeed cache poprawia wydajność sklepów internetowych, przenosząc do pamięci podręcznej koszyki zakupowe klientów.

    Obsługiwane systemy operacyjne

    Apache

    Apache jako najstarszy serwer www z całej trójki, wspiera najwięcej systemów operacyjnych. Obsługuje wszystkie systemy Unix/Linux: CentOS, RedHat, Fedora, Ubuntu, OpenSuse itd. Jako jedyny jest w pełni wspierany przez systemy Microsoft Windows.

    Nginx

    Nginx również możesz zainstalować na wszystkich systemach Unix/Linux, jednak nie na systemach Windows działa poprawnie.

    LiteSpeed

    LiteSpeed możesz zainstalować na systemach CentOS 7+, Ubuntu 14.04+*, Debian 8+, FreeBSD 9+, Fedora 31+, Linux Kernel 3.0+

    *Na styczeń 2023 możesz zainstalować LiteSpeed na Ubuntu 22.04, jednak w tej wersji systemu nie działa CyberPanel. Jeśli chcesz używać CyberPanel z wygodnym GUI, pozostań na Ubuntu 20.04.

    Łatwość konfiguracji

    Jeśli dopiero zaczynasz przygodę z serwerami www, łatwość obsługi może być dla Ciebie istotna. O wiele przyjemniej obsługuje się serwer www z poziomu przeglądarki www z wygodnym interfejsem graficznym, niż przy pomocy CLI, lub edycję plików konfiguracyjnych.

    Apache

    Apache konfiguruje się najczęściej poprzez edycję pliku .htaccess. Ustawia się tam między innymi przekierowania, ochronę hasłem, niestandardowe komunikaty o błędach, indeksowanie i wiele więcej. Edycja tego pliku wymaga jednak trochę wiedzy z zakresu konfiguracji serwerów www, bez której można łatwo popełnić błąd i całkowicie unieruchomić naszą witrynę. Dlatego przed jakąkolwiek edycją tego pliku konieczne wykonaj kopię bezpieczeństwa.

    Nginx

    Serwer Nginx konfiguruje się przy pomocy plików konfiguracyjnych .conf. W standardzie Nginx nie ma żadnego panelu kontrolnego z interfejsem graficznym, ale możesz doinstalować jeden z kilku Paneli Kontrolnych. Część z nich jest bezpłatnych – jak na przykład Hestia Control Panel, za niektóre z nich trzeba będzie zapłacić.

    LiteSpeed

    Darmowy OpenLiteSpeed domyślnie instaluje się z Dashboard z wygodnym, graficznym interfejsem użytkownika.

    Dodatkowo możemy zainstalować jeden z kilku paneli kontrolnych , na przykład darmowy, doskonały CyberPanel, z poziomu którego możemy zarządzać całym serwerem. Możemy zainstalować nową stronę internetową, zainstalować WordPress wraz z LiteSpeed Cache, możemy jednym kliknięciem zainstalować certyfikaty SSL, zarówno darmowe przez Let’s Encrypt, jak i własne płatne certyfikaty. Możemy skonfigurować DNS, FTP, SSH, tworzyć kopie bezpieczeństwa, zmienić wersję PHP dla każdej strony oddzielnie, zainstalować serwer pocztowy i wiele więcej.

    Bezpieczeństwo

    Wszystkie trzy opisywane serwery www bardzo poważnie podchodzą do tematów bezpieczeństwa. Apache dodatkowo ma czujną i najliczniejszą społeczność programistów, która błyskawicznie reaguje na wszelkie wykryte luki bezpieczeństwa. Oferuje także różne parametry konfiguracyjne chroniące stronę przed atakami DDoS i eskalacją uprawnień, jednak ich wprowadzenie wymaga odrobinę wiedzy informatycznej.

    W Nginx oprócz społeczności o bezpieczeństwo dba firma F5, która wykupiła prawa do Nginx. Posiada obszerną dokumentację na temat bezpieczeństwa i możliwych zagrożeń.

    LiteSpeed jest również bardzo bezpieczny i cały czas sprawnie rozwijany. Wszelkie wykryte luki bezpieczeństwa są na bieżąco łatane.

     

    Panele kontrolne

    Apache

    • cPanel
    • Kloxo
    • Ajenti
    • OpenPanel
    • ZPanel

    Nginx

    • cPanel
    • aaPanel
    • Vesta
    • Hestia CP

    LiteSpeed

    • cPanel
    • Plesk
    • DirectAdmin
    • CyberPanel
    • CloudPages
    • Vitrualmin
    • WHM

    Wtyczki

    Wtyczki pozwalają rozszerzyć możliwości serwera www. Apache ma chyba najbardziej rozbudowaną listę wtyczek. Między innymi do zarządzania połączeniami SQL, kompresji danych, czy wykonywania skryptów CGI. Listę wtyczek znajdziesz na stronie Wikipedia.

    Do Nginx również istnieje wiele wtyczek, które są pisane przez społeczność programistów. Dzięki nim możesz na przykład zarządzać uwierzytelnianiem HTTPS SSL, czy na przykład dynamicznie blokować adresy IP.

    Pod względem ilości wtyczek na pierwszy rzut oka najsłabiej wypada LiteSpeed, ale tylko pozornie, bo wiele rzeczy które musisz instalować osobno w Apache, czy Nginx, w LiteSpeed dostajesz je w standardzie.

    Obsługa języków skryptowych

    Apache współpracuje z różnymi językami programowania, jak na przykład PHP, Python, czy Perl.

    Nginx obsługuje 6 języków: JavaScript, Go, Perl, PHP, Python, Ruby i eksperymentalnie serwlety Java.

    LiteSpeed obsługuje wszystkie języki skryptowe, w tym Perl, Java, Ruby, PHP, Python i inne.

    Obsługa HTTP/3

    Na dzień dzisiejszy Apache nie obsługuje HTTP/3.

    Nginx dopiero pracuje nad wprowadzeniem obsługi dla HTTPS/3.

    LiteSpeed w pełni obsługuje HTTP/3, HTTP/2 i QUIC.

    Obsługa systemów CMS

    Wszystkie trzy serwery bez problemu wspierają Systemy Zarządzania Treścią CMS:

    • Joomla
    • Drupal
    • Magento
    • OpenCart
    • PrestaShop
    • Shopware
    • MediaWiki
    • inne

    Podsumowanie

    Każdy serwer www ma pewne wady i zalety. Jednak najbardziej przyszłościowy na dzień dzisiejszy wydaje się LiteSpeed, choć Nginx jeszcze nie powiedział ostatniego słowa, zwłaszcza że jest wspierany przez dużą, amerykańską korporację F5. Apache z kolei ma najliczniejszą społeczność i jest najlepiej udokumentowany. Jednak jesteśmy zdania, że gdy spróbujesz wygodny graficzny interfejs użytkownika CyberPanel i dashboard LiteSpeed, nie będziesz już chciał wrócić do Apache.