[Debian] Nginx jako proxy przed Apache

W poprzednim wpisie opisałem jak zainstalować i skonfigurować serwer LEMP, czyli Linux, Nginx (Engine X), MySQL oraz PHP. Ponieważ Nginx, inaczej niż Apache, nie posiada modułu do obsługi PHP, aby umożliwić działanie stronom WWW napisały w PHP, użyliśmy FastCGI. Po odebraniu przez serwer żądania HTTP o przesłanie (GET) pliku z rozszerzeniem .php, serwer najpierw nawiązuje połączenie z „wewnętrznym serwerem” FastCGI, przesyła mu skrypt i odpowiada klientowi już sparsowaną stroną WWW, którą otrzymuje od FastCGI po sparsowaniu przez parser PHP.

Dzisiaj opiszę, w jaki sposób uzyskać podobny efekt, korzystając jednocześnie z Nginx i Apache. Nginx będzie uruchomiony na porcie 80, czyli domyślnym porcie na którym przeglądarka WWW łączy się z serwerem HTTP. Podczas przetwarzania żądania przesłania pliku statycznego, tj. .html, .png, itp. czyli takiego który nie wymaga przed przesłaniem sparsowania na serwerze, Nginx po prostu udostępni plik. Po odebraniu żądania dotyczącego pliku .php, Nginx prześle to żądanie do serwera Apache uruchomionego na innym porcie np. 8080, a po odebraniu odpowiedzi od Apache, wyśle ją do przeglądarki WWW klienta.

Nginx, w porównaniu z Apache, jest wydajniejszy przy udostępnianiu treści statycznych. Możemy więc z jego wykorzystaniem znacznie zwiększyć wydajność serwera.

Przygotowanie

Jeśli stawiamy wszystkie usługi od początku, a nie przyśpieszamy już zainstalowanego Apache, musimy go zainstalować, wraz z PHP. Opisałem to w tym wpisie. Całą instalacja w zasadzie sprowadza się do wydania poniższego polecenia:

apt-get update
apt-get install apache2 php5 mysql-server phpmyadmin

Po wydaniu powyższych poleceń, Apt, czyli Debianowy manager pakietów, odświeży swój cache repozytoriów, a następnie zainstaluje paczki apache2, php5, mysql-server oraz phpmyadmin. Fragment mysql-server i phpmyadmin nie jest nam tutaj potrzebny. Jest on odpowiedzialny za instalację serwera baz danych MySQL oraz web aplikacji służącej do administrowania tymi bazami.

Podczas instalacji, instalator poprosi o kilka informacji:

  • hasło użytkownika root, serwera baz danych MySQL – hasło to powinno być inne niż hasło systemowego root-a.
  • powtórzenie ww. hasła
  • wybranie serwera HTTP do przekonfigurowania dla phpMyAdmin – wybieramy Apache
  • decydujemy, czy chcemy, aby instalator stworzył za nas bazę danych dla phpMyAdmin (jest ona konieczna do jego poprawnego funkcjonowania)
  • ponownie podajemy hasło root-a MySQL
  • wybieramy nowe hasło dla bazy danych phpMyAdmin
  • powtarzamy ww. hasło

Kolejnym krokiem będzie stworzenie hostów wirtualnych dla każdej domeny. Zostało to opisane tutaj.

Rekonfiguracja Apache

1. Jeśli nie mamy zainstalowanego na serwerze edytora nano, instalujemy go poleceniem:

apt-get install nano

2. Przestawiamy Apache, aby nasłuchiwał na porcie 8080, dla połączeń nieszyfrowanych oraz na porcie 44380, dla połączeń szyfrowanych. W tym celu edytujemy kolejno:

a) Plik /etc/apache2/ports.conf

nano /etc/apache2/ports.conf

Odnajdujemy poniższy fragment tekstu:

NameVirtualHost *:80
Listen 80

i zamieniamy go na:

NameVirtualHost *:8080
Listen 8080

Odnajdujemy:

Listen 443
[...]
Listen 443

i zamieniamy na:

Listen 44380
[...]
Listen 44380

Przypominam że, aby zapisać plik i zamknąć edytor, używamy kombinacji klawiszy – CTRL+X, wpisujemy Y, aby potwierdzić chęć nadpisania pliku i klikamy enter.

b) Pliki konfiguracyjne wszystkich vhostów

nano /etc/apache2/sites-available/*

Symbol gwiazdki oznacza że wyedytowane zostaną po kolei wszystkie pliki znajdujące się w danym folderze.

W każdym z plików które zostaną otworzone w edytorze nano, odnajdujemy poniższy fragment, dotyczący połączeń nieszyfrowanych:

i zamieniamy go na:

W przypadku połączeń szyfrowanych, fragment ten będzie wyglądał następująco:

Zamieniamy go wtedy na:

Zamiast gwiazdki może zostać użyta zmienna lub jeden z adresów IP serwera.

3. Przeładowujemy konfiguracje Apache, aby zmiany nastąpiły od razu.

/etc/init.d/apache2 reload

Instalacja i konfiguracja Nginx

1. Instalujemy serwer Nginx

apt-get update
apt-get install nginx

Jeśli zainstalowaliśmy przed chwilą edytor nano, nie musimy wydawać polecenia „apt-get update„, ponieważ repozytoria zostały już odświeżone.

2. Zmieniamy nazwę aliasu (w folderze sites-enabled) do pliku konfiguracyjnego domyślnego vhosta (znajdującego się w folderze sites-available), tak aby był on przetwarzany zawsze jako pierwszy, dodając „000-” przed jego nazwą. Nazwy kolejnych vhostów również będą zaczynały się od licznika.

Przypominam że domyślny vhost, to ten który zawiera konfigurację strony dla każdej domeny wskazującej na serwer oraz każdego adresu IP przypisanego do serwera, który nie ma dedykowanego vhosta.

mv /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/000-default

3. Edytujemy plik konfiguracyjny domyślnego vhosta, dodając w nim fragmenty odpowiedzialne za obsługę pliku index.php jako strony startowej, oraz przekazywanie żądań dotyczących plików .php do serwera Apache uruchomionego na porcie 8080.

nano /etc/nginx/sites-available/default

Odnajdujemy poniższy fragment:

    location / {
        root   /var/www;
        index  index.html index.htm;
    }

i zamieniamy na:

    location / {
        root /var/www;
        index index.php index.html index.htm;
    }

Odnajdujemy:

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
        #proxy_pass   http://127.0.0.1;
    #}

i zamieniamy na:

    location ~ \.php {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
    }

4. Dla każdego vhosta dodanego w Apache tworzymy nowego vhosta w Nginx-ie. Pokażę to na przykładzie mojego vhosta – vps-admin.eu.

a) Tworzymy nowy plik konfiguracyjny vhosta, edytując go w nano i wklejamy do niego zawartość poniższej ramki, oczywiście zamieniając przy tym vps-admin.eu, na nazwę swojego vhosta.

nano /etc/nginx/sites-available/vps-admin.eu
server {
    server_name vps-admin.eu www.vps-admin.eu;
    access_log /home/vps-admin.eu/logs/access.log;
    error_log /home/vps-admin.eu/logs/error.log;
    root /home/vps-admin.eu/htdocs;

    location / {
        index index.php index.html index.htm;
    }

    location ~ \.php {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;
    }
}

b) Włączamy tego vhosta, tworzą dla niego alias w folderze /etc/nginx/sites-enabled. Każdy alias powinien zaczynać się od kolejnego numerka.

ln -s /etc/nginx/sites-available/vps-admin.eu /etc/nginx/sites-enabled/001-vps-admin.eu

5. Uruchamiamy Nginx-a

/etc/init.d/nginx start

Teraz wszystko powinno już działać zgodnie z założeniem z początku wpisu. Do phpMyAdmin mamy dostęp wpisując w przeglądarce adres http://{ADRES_IP_LUB_DOMENA}:8080/phpmyadmin. Dostęp przez domyślny port, na którym działa obecnie Nginx, nie jest jeszcze możliwy. Aby to zmienić, musimy w pliku konfiguracyjnym domyślnego vhosta Nginx, przed końcem klamerki server, dodać poniższy fragment kodu (oczywiście bez server {...).

nano /etc/nginx/sites-available/default
server {
    [...]

    location /phpmyadmin {
        root /usr/share/;
        index index.php index.html index.htm;

        location ~ ^/phpmyadmin/(.+\.php)$ {
            root /usr/share/;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
            proxy_pass http://127.0.0.1:8080;
        }

        location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
            root /usr/share/;
        }
    }
}

Autor: Aleksander Kurczyk