Przedwczoraj z HitMe.pl dotarła do mnie informacja, że matka serwera VPS na którym działa(ł) Webinsider.pl powoli zmierza na emeryturę (choć może dostanie pewnie jakieś zajęcie, by się nie nudziła ;-)), w związku z tym dostałem propozycję nowego serwera VPS. Oprócz tego, że oznacza to więcej mocy (więcej RAMu, więcej CPU, i dysk SSD do tego) to również przy tej okazji zmienił się typ wirtualizacji –  z XEN na KVM. W związku z tym uznałem, że choć mógłbym spróbować dokonać migracji za pomocą SSH i Rsync, to postanowiłem, że skonfiguruję środowisko (web) serwera ręcznie, przy okazji robiąc notatki do nowej wersji artykułu na ten temat…

Serwer WWW (LEMP) na przykładzie systemu Debian 9

Od razu zaznaczam, że będzie to poradnik mniej typowy (jak na Webinsider.pl), bo nie będzie w stylu „krok po kroku” (step-by-step), a sama esencja. Dlatego (zwłaszcza) osoby mniej doświadczone zachęcam do zapoznania się ze starszą wersją, która nie tylko jest nadal aktualna (aktualizowana na bieżąco), to dużo bardziej szczegółowo prowadzi przez cały proces instalacji i konfiguracji webserwera…

Kolejną zmianą jest to, że wprawdzie nadal będziemy pracować na Debianie, to jednak tym razem nie będziemy korzystać z wbudowanych źródeł pakietów (oprogramowania), a serwer WWW (Nginx), obsługę PHP i bazę danych (MySQL) zainstalujemy z zewnętrznych źródeł, dzięki czemu uzyskamy nowsze wersje oprogramowania, niż te znajdujące się w repozytorium Debiana (tak dla odmiany ;-)).

Nginx, czyli serwer WWW

Jako podstawy użyjemy (web)serwer, z którego zazwyczaj korzystam już do dłuższego czasu, i ogólnie jestem zadowolony, choć brakuje kilku elementów znanych np. z Apache2 (dynamiczne dodawanie modułów, czy obsługa pliku .htaccess).

Do pliku \etc\apt\source.list dodajemy:

deb http://nginx.org/packages/mainline/debian/ stretch nginx
deb-src http://nginx.org/packages/mainline/debian/ stretch nginx

Do tego odpowiednie kluczyki:

wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key

I na koniec odświeżamy listę pakietów:

sudo apt-get update

Z powyższego polecenia korzystamy po każdej modyfikacji źródeł pakietów…

Powyższe dotyczy Debiana 9 Stretch. Jeśli korzystacie z Debiana 8 Jessie, i nie macie możliwości aktualizacji systemu do nowszej wersji, to możecie skorzystać z takich źródeł pakietów:

deb http://nginx.org/packages/mainline/debian/ jessie nginx
deb-src http://nginx.org/packages/mainline/debian/ jessie nginx

Ew. wersja alternatywna, dającą m.in. obsługę HTTP/2 i ALPN:

deb http://httpredir.debian.org/debian/ jessie-backports main contrib non-free
deb-src http://httpredir.debian.org/debian/ jessie-backports main contrib non-free
deb http://packages.dotdeb.org jessie-nginx-http2 all
deb-src http://packages.dotdeb.org jessie-nginx-http2 all

Dalej instalacja nowszej wersji OpenSSL:

sudo apt-get install -t jessie-backports openssl

Dodanie odpowiednich kluczy do systemu:

wget https://www.dotdeb.org/dotdeb.gpg
sudo apt-key add dotdeb.gpg

I na koniec sama instalacja Nginx:

sudo apt-get install -t jessie-nginx-http2 nginx

Dzięki temu nawet w systemie Debian 8 możecie cieszyć się obsługą HTTP/2 i ALPN…

Nginx dostępny w repozytoriach Debiana pliki konfiguracyjne trzyma w katalogu:

/etc/nginx/sites-enabled/

Natomiast Nginx instalowany „od producenta” trzyma je w katalogu:

/etc/nginx/conf.d/*.conf

Np.:

/etc/nginx/conf.d/webinsider.conf

Trzeba o tym pamiętać, bo inaczej vHosty stron nie będą działać. Alternatywnie można dodać obsługę „debianowego stylu”, modyfikując plik /etc/nginx/nginx.conf, w którym poniżej linijki:

include /etc/nginx/conf.d/*.conf;

Dodajemy:

include /etc/nginx/sites-enabled/*;

Ma to sens na start, gdy jeszcze nie „przerzucicie” konfiguracji do nowego katalogu, lub gdy podejrzewacie, że być może kiedyś wrócicie do wersji dostępnej w repozytoriach Debiana.

MySQL, czyli baza danych

W Debianie 9 miejsce serwera baz danych MySQL zajęła Maria… MariaDB. I choć ogólnie lubię ten projekt, i trzymam za niego kciuki, to… z pewnych przyczyn w tym poradniku pokaże jak zainstalować MySQL w wersji 5.7 (ale można w innej, modyfikując odrobinę źródła pakietów).

Dopisujemy źródła do pliku source.list (zamiast „stretch” można dać też „jessie” dla Debiana 8):

deb http://repo.mysql.com/apt/debian/ stretch mysql-5.7
deb-src http://repo.mysql.com/apt/debian/ stretch mysql-5.7

Dodajemy klucze:

wget -O /tmp/RPM-GPG-KEY-mysql https://repo.mysql.com/RPM-GPG-KEY-mysql
sudo apt-key add /tmp/RPM-GPG-KEY-mysql

I na koniec instalujemy serwer MySQL:

sudo apt-get install mysql-server

Można dodatkowo zainstalować od razu skrypt do łatwiejszego zarządzani bazą danych, czyli phpMyAdmin:

sudo apt-get install phpmyadmin

Choć ja ostatnio najczęściej decyduje się na formę bezinstalacyjną, czyli kopiuje pliki do katalogu z którego mają być dostępne… Tu na koniec tylko tworze tabelę o odpowiedniej zawartości:

mysql -u root -p

CREATE DATABASE phpmyadmin;
exit

mysql -u root -p phpmyadmin < /var/www/[...]/phpmyadmin/sql/create_tables.sql

I w sumie to tyle jeśli chodzi o bazę danych (MySQL) i phpMyAdmin…

PHP7, czyli… PHP

Oczywiście mogę sobie wyobrazić serwer WWW bez obsługi PHP (ba, nawet zdarzyło mi się takie serwery konfigurować), to jednak w większości przypadków obsługa PHP jest elementem niezbędnym (to już prędzej baza danych MySQL nie będzie potrzebna).

Jeszcze niewiele ponad rok temu, podając (w kontekście tego artykułu) zewnętrzne źródła pakietów dla PHP być może zaproponował bym źródła z Dotdeb (zwłaszcza, gdy korzystacie ze starszych wersji Debiana – Jessie, Wheezy):

deb http://packages.dotdeb.org stretch all
deb-src http://packages.dotdeb.org stretch all

Do tego klucze:

wget https://www.dotdeb.org/dotdeb.gpg
sudo apt-key add dotdeb.gpg

Ale na początku 2017 pojawiła się informacja, że projekt zostaje zamknięty. Z tego co widzę, pojawiają się jeszcze aktualizacje bezpieczeństwa, ale już np. na PHP 7.1 czy 7.2 raczej nie ma co liczyć.

Oczywiście można korzystać (zwłaszcza Debian 7 i 8), ale lepiej skorzystać z serwisu deb.sury.org, który prowadzi Ondřej Surý. W tym przypadku źródło wygląda tak:

deb https://packages.sury.org/php/ stretch main

Do tego trzeba jeszcze dodać klucze, oraz zainstalować w systemie niezbędne pakiety:

sudo apt install apt-transport-https lsb-release ca-certificates
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

Dalej już klasycznie, czyli:

sudo apt-get install php7.0 php7.0-fpm php7.0-cli php7.0-mysql php7.0-gd php7.0-zip php7.0-xml php7.0-curl php7.0-geoip php7.0-intl php7.0-json php7.0-mcrypt php7.0-xsl php7.0-cgi php7.0-bz2 php7.0-imap php7.0-mbstring php7.0-sqlite3 php-mbstring php7.0-mbstring

Jest to przykładowa lista pakietów, dobrać ją należy wedle potrzeb. Zwłaszcza, że jest z czego wybierać, m.in.:

php7.0-cgi php7.0-cli php7.0-common php7.0-curl php7.0-dev php7.0-gd php7.0-gmp php7.0-json php7.0-ldap php7.0-mysql php7.0-odbc php7.0-opcache php7.0-pgsql php7.0-pspell php7.0-readline php7.0-recode php7.0-snmp php7.0-sqlite3 php7.0-tidy php7.0-xml php7.0-xmlrpc php-all-dev libphp7.0-embed php7.0-bcmath php7.0-bz2 php7.0-enchant php7.0-fpm php7.0-imap php7.0-interbase php7.0-intl php7.0-mbstring php7.0-mcrypt php7.0-phpdbg php7.0-soap php7.0-sybase php7.0-zip php7.0-xsl php-apcu

Jest to wersja dla PHP w wersji 7.0, w przypadku innych wersji (np. 7.1 czy 7.2) należy zmienić nazwy pakietów (niektóre mogą być niedostępne). Celowo wybrałem wersję 7.0, bo chyba daje największy zysk względem wersji 5.6, a zarazem jest mniejsza szansa, że jakieś oprogramowanie będzie niekompatybilne, niż w przypadku wersji 7.1 czy 7.2 (ale jeśli macie pewność, że z kompatybilnością nie będzie problemów, to śmiało brać 7.1 czy nawet 7.2).

Listę dostępnych pakietów można sprawdzić za pomocą poleceń:

apt-cache search php7.0-\*
apt-cache search php7.1-\*
apt-cache search php7.2-\*

Gdybyście zdecydowali się na więcej niż jedną wersję PHP (tak, jest taka możliwość), to wyboru domyślnej wykonacie za pomocą polecenia:

sudo update-alternatives --config php

Ważne jest też to, by w konfiguracji vHostów w Nginx podać odpowiednią ścieżkę do obsługi (przekazywania) PHP:

/var/run/php/php7.0-fpm.sock

I jeśli chodzi o webserwer w podstawowej konfiguracji, to właściwie tyle – jest serwer WWW Nginx, jest baza danych (MySQL) oraz obsługa plików PHP. I tak jak uprzedzałem na wstępie – tym razem jest to poradnik raczej dla osób, które już coś tam wiedzą, ew. przeczytały wcześniejszy artykuł o przygotowaniu webserwera… ;-)

Serwer to nie tylko webserwer

Oczywiście konfiguracja webserwera to nie jedyna rzecz, którą należy wykonać na (nowym) serwerze (VPS czy dedykowanym). Powiem nawet więcej – jest to jedna z ostatnich rzeczy, które ja robię.

Warto zacząć od zmiany portu, na którym łączymy się po SSH, skonfigurować dwuskładnikowe uwierzytelnienie korzystające z kodów jednorazowych (token programowy) i/lub klucza (certyfikatu), oraz skonfigurować firewall, korzystając choćby z skutecznego i prostego w obsłudze programu UFW. Dzięki tym kilku prostym zabiegom znacznie wzrośnie bezpieczeństwo naszego serwera.

Idąc dalej warto rozważyć zainstalowanie programów takich jak Rkhunter i Chkrootkit, Logwatch, czy Fail2Ban. Nie zaszkodzi skonfigurować również powiadomienie na adres e-mail o każdym zalogowaniu do systemu (wymagana obsługa wysyłania wiadomości na serwerze). W przypadku samego webserwera (PHP w Nginx lub Apache2) można też skorzystać z PHP Pools.

Przyda się też kilka programów narzędziowych, zaczynając chyba od mojego ulubionego – Screen, do tworzenia wirtualnych sesji w konsoli. Dalej to już zależy od Was, ale mogę np. zaproponować pakiety bootlogd, apache2-utils, htop, atop, vnstat, mc, git, p7zip, iptraf (wszystkie dostepne w standardowych repozytoriach Debiana).

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk