Instalacja LEMP - Nginx, MariaDB i PHP na VPSie

Poradniki
vps, www
DBanaszewski
DBanaszewski α-tester v3

LEMP na VPSie


Poradnik został napisany pod Ubuntu 18.04 Jeżeli korzystasz z innej wersji, może coś przestać działać.


Ten poradnik pokaże Ci, jak zainstalować:

  • serwer WWW z obsługą PHP 7.4
  • serwer MySQL
  • phpMyAdmin

Takie tam informacje...

Jeżeli instalujesz LEMP na koncie root to nie musisz wpisywać sudo przed każdą komendą.

Krok 1

Przydałoby się zaktualizować system i pakiety, więc...

sudo apt update
sudo apt upgrade

Krok 2

Przydałyby się pewne komendy, które ułatwią nam pracę. Wpisz komendę sudo add-apt-repository. Jeżeli otrzymasz ten wynik: sudo: add-apt-repository: command not found przejdź do kroku 2.1. Jeżeli otrzymasz ten wynik: Error: need a repository as argument przejdź do kroku 3.

Krok 2.1

Nie posiadasz komend, które ułatwią Ci pracę oraz umożliwią instalację wymaganych paczek. Aby zainstalować to ułatwienie, wpisz:

sudo apt install software-properties-common python-software-properties

Po instalacji wróć do kroku 2.

Krok 3

Posiadasz ułatwienie, które nam pomoże pracować. Możemy przejść do instalacji. Najpierw zainstalujemy nginx'a, czyli serwer WWW. Obecnie, PHP jeszcze nie będzie działać, musisz kontynuować instalację.

Najpierw dodajemy nieoficjalne, ale aktualizowane repozytoria nginx przy pomocy:

sudo add-apt-repository ppa:ondrej/nginx

W trakcie akceptacji klucza GPG będziemy musieli kliknąć ENTER.

Po zaakceptowaniu i dodaniu repozytorium należy zaktualizować repozytoria przy pomocy:

sudo apt update

A następnie zainstalujemy nginx'a przy pomocy:

sudo apt install nginx

Potwierdzamy instalację i cierpliwie czekamy. Po instalacji przechodzimy dalej.

Krok 4

Nginx zainstalowany, teraz go początkowo skonfigurujemy. Do edycji plików będę używał edytora vi/vim. Możesz użyć swojego ulubionego. Najpierw edytujemy główną konfigurację nginx'a, czyli plik /etc/nginx/nginx.conf. Wpisujemy sudo vim /etc/nginx/nginx.conf i przechodzimy do okna edytora. Edytujemy podane linijki niżej:

# server_tokens off;
# server_name_in_redirect off;

Na te:

server_tokens off;
server_name_in_redirect off;

W skrócie - wystarczy odkomentować te linijki. Jest to najmniejsze zabezpieczenie nginx'a, ale zawsze jest. O tym w innym artykule, który może za pewien czas się pojawi.

Zapisujemy zmiany, klikamy ESC i wpisujemy :wq. Robimy restart serwera WWW przy pomocy sudo service nginx restart. Idziemy dalej.

Krok 5

Serwer WWW z podstawową obsługą HTML już mamy, teraz przydałby się PHP. PHP będzie w najnowszej wersji - 7.4. Możesz zainstalować inną zmieniając wersję w komendach, np. php7.4-cgi na php7.0-cgi.

Najpierw dodajemy nieoficjalne, ale aktualizowane repozytoria PHP przy pomocy:

sudo add-apt-repository ppa:ondrej/php

W trakcie akceptacji klucza GPG będziemy musieli kliknąć ENTER. Po zaakceptowaniu i dodaniu repozytorium należy zaktualizować repozytoria przy pomocy:

sudo apt update

A następnie zainstalujemy PHP przy pomocy:

sudo apt install php7.4 php7.4-mysql php7.4-fpm php7.4-mbstring php7.4-xml php7.4-curl

Potwierdzamy instalację i cierpliwie czekamy.

Po instalacji przechodzimy dalej.

Krok 6

Mamy PHP, teraz musimy skonfigurować nginx'a, aby mógł obsługiwać skrypty PHP. Wpisujemy sudo vim /etc/nginx/sites-available/default i przechodzimy do okna edytora. Edytujemy podane linijki niżej:

index index.html index.htm index.nginx-debian.html;

Na te:

index index.php index.html index.htm;

Musimy jeszcze dodać integrację z interpreterem PHP, dodając to:

location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

Musimy to dodać w sekcji server, nie możemy tego dać gdzie chcemy. Plik powinien wyglądać tak (wersja bez komentarzy + blokuje dostęp do .htaccess, które i tak nie działa):

server {
    listen 80 default_server;
    listen [::]:80 default_server;
 
    root /var/www/html;
    index index.php index.html index.htm;
 
    server_name _;
 
    location / {
        try_files $uri $uri/ =404;
    }
 
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
 
    location ~ /\.ht {
        deny all;
    }
}

Zapisujemy zmiany, klikamy ESC i wpisujemy :wq. Robimy restart serwera WWW przy pomocy sudo service nginx restart. Idziemy dalej.

Krok 7

Mamy nginx'a z obsługą PHP, teraz instalujemy serwer MySQL, a dokładniej MariaDB. Najpierw dodajemy oficjalne repozytoria MariaDB przy pomocy:

sudo apt-get install software-properties-common 
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb http://mariadb.mirrors.ovh.net/MariaDB/repo/10.3/ubuntu bionic main'

W trakcie akceptacji klucza GPG będziemy musieli kliknąć ENTER.

Po zaakceptowaniu i dodaniu repozytorium należy zaktualizować repozytoria przy pomocy:

sudo apt update

A następnie instalujemy serwer MySQL przy pomocy:

sudo apt install mariadb-server

Potwierdzamy instalację i cierpliwie czekamy do momentu, kiedy pokaże nam się to: zdjęcie

Wpisujemy tam swoje hasło i musimy je jeszcze później powtórzyć. Po zainstalowaniu idziemy dalej.

Krok 8

MySQL zainstalowany, teraz możemy go skonfigurować przy pomocy:

sudo mysql_secure_installation

Wpisujemy hasło i idziemy dalej. Następnymi krokami będzie odpowiadanie na pytania. Możesz sam odpowiedzieć, tutaj podam zalecane wartości.

Change the root password? [Y/n]

Pisząc Y żądasz zmiany hasła. Pisząc N pomijasz ten krok.

Remove anonymous users? [Y/n]

Zalecam opcję Y - usuwa anonimowych użytkowników.

Disallow root login remotely? [Y/n]

Tutaj zalecam Y, aczkolwiek jeżeli jesteś osobą pracującą na roocie prawie wszędzie to możesz wpisać N.

Remove test database and access to it? [Y/n]

Tutaj będzie usuwać testową bazę danych o nazwie test, zalecam Y.

Reload privilege tables now? [Y/n]

Zalecam Y, wtedy przeładuje wszystkie tabele.

Koniec konfiguracji, przejdź do następnego kroku.

WAŻNE!

Domyślnie, konto root jest zablokowane i dostęp z zewnątrz jest niemożliwy. Teraz dodamy inne konto, które będzie posiadać prawie takie same uprawnienia co root. Wpisujemy mysql -u root -p, wpisujemy hasło (jeżeli prosi nas) i wklepujemy to:

CREATE USER 'admin'@'%' IDENTIFIED BY 'HASLO';
GRANT ALL PRIVILEGES ON * . * TO 'admin'@'%';
FLUSH PRIVILEGES;
EXIT;

Pamiętaj! Podmień HASŁO na hasło nowego konta! Najlepiej skorzystaj z generatora haseł.

Możemy iść dalej!

Krok 9

Mamy serwer WWW z obsługą PHP, mamy serwer MySQL, teraz przydałaby się aplikacja usprawniająca zarządzanie serwerem MySQL. Wybierzemy phpMyAdmin. Pobieramy najnowszą wersję phpMyAdmin przy pomocy:

sudo wget -O phpmyadmin.zip https://files.phpmyadmin.net/phpMyAdmin/4.9.0.1/phpMyAdmin-4.9.0.1-all-languages.zip

Do rozpakowania plików .zip zalecam zainstalować zip przy pomocy:

sudo apt install zip

Aby rozpakować archiwum wpisz:

sudo unzip phpmyadmin.zip

Po rozpakowaniu, w obecnym folderze będziesz miał nowy folder o nazwie phpMyAdmin-4.9.0.1-all-languages. Możemy zmienić nazwę tego folderu na np. pma. Zrobimy to za pomocą:

sudo mv phpMyAdmin-4.9.0.1-all-languages/ pma/

Następnie, po zmianie nazwy, przenosimy folder pma do /var/www/html/. Jest to domyślna ścieżka naszych plików, które będą odczytywane przez serwer WWW. Przenosimy przy pomocy:

sudo mv pma/ /var/www/html/

Po przeniesieniu idziemy dalej.

Krok 10

Prawie wszystko gotowe, teraz tylko konfiguracja phpMyAdmin. Wchodzimy do folderu /var/www/html/pma i tworzymy nowy plik przy użyciu:

sudo vim /var/www/html/pma/config.inc.php

Przykładowa treść konfiguracji:

 tutaj uzupełniamy, jeżeli serwer MySQL stoi poza serwerem WWW/VPS
//$cfg['Servers'][$i]['port'] = 3306; --> tutaj uzupełniamy, jeżeli serwer MySQL stoi poza serwerem WWW/VPS (domyślnie 3306)
$cfg['Servers'][$i]['socket'] = '/var/run/mysqld/mysqld.sock'; //to musimy zakomentować, jeżeli uzupełnimy konfigurację dla ZEWNĘTRZENGO serwera (te dwie wyżej)
$cfg['Servers'][$i]['compress'] = true;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'HASLO_DO_ROOTA';
$cfg['ZipDump'] = false;
$cfg['GZipDump'] = false;
$cfg['BZipDump'] = false;
$cfg['CompressOnFly'] = false;
$cfg['blowfish_secret'] = 'NM68ta213@!A#@!S#A@3rd43r'; //zalecam zmianę tego, walnij kilka razy w klawiaturę =P
$cfg['VersionCheck'] = false;
$cfg['OBGzip'] = 0;
$cfg['ShowStats'] = true;
$cfg['ShowServerInfo'] = true;
$cfg['ShowPhpInfo'] = true;
$cfg['DefaultTransformations']['Substring'] = array (
  0 => '0',
  1 => 'all',
  2 => '…',
);
$cfg['DefaultTransformations']['External'] = array (
  0 => '0',
  1 => '-f /dev/null -i -wrap -q',
  2 => '1',
  3 => '1',
);
$cfg['DefaultTransformations']['PreApPend'] = array (
);
$cfg['DefaultTransformations']['DateFormat'] = array (
  0 => '0',
  1 => 'local',
);
$cfg['DefaultTransformations']['Inline'] = array (
  0 => '100',
  1 => '100',
);
$cfg['DefaultTransformations']['TextImageLink'] = array (
  0 => '100',
  1 => '50',
);
$cfg['DefaultTransformations']['TextLink'] = array (
);
$cfg['DefaultLang'] = 'pl';
$cfg['ServerDefault'] = 1;
?>

Zapisujemy zmiany, klikamy ESC i wpisujemy :wq.

Teraz ważne, bez tego może nie działać.

Musimy przyznać wszystkie uprawnienia dla www-data, czyli użytkownika, który będzie miał dostęp do tych plików. Z tego konta będzie korzystał serwer WWW. Zrobimy to przy pomocy:

sudo chown -R www-data:www-data /var/www/

Gotowe!

Właśnie zainstalowałeś serwer WWW z obsługą PHP, serwer MySQL i phpMyAdmin 😉

Pytania, uwagi, komentarze proszę pisać poniżej.

LinGruby
LinGruby Pionier

poradnik fajny, ale jak kiedyś instalowałem ( LAMP ) to wszystko instalowało się jednym skryptem ;-) a tutaj przy ( LEMP ) wszystko instaluje się oddzielnie więc trochę to dziwne ale nie o to chodzi, ważne że działa jak mniemam ;-)

Lempik
Lempik

DBanaszewski:

Krok 6

Mamy PHP, teraz musimy skonfigurować nginx’a, aby mógł obsługiwać skrypty PHP. Najpierw edytujemy główną konfigurację nginx’a, czyli plik /etc/nginx/nginx.conf . Wpisujemy sudo vim /etc/nginx/nginx.conf i przechodzimy do okna edytora. Edytujemy podane linijki niżej:

index index.html index.htm index.nginx-debian.html

Na te:

index index.php index.html index.htm

Jestem w tym kroku, ale w całym pliku nie ma ciągu "index", a co dopiero całego wiersza z takimi słowami. Nie ma tam też "htm".

DBanaszewski
DBanaszewski α-tester v3

Mógłbyś pokazać dokładnie całą konfigurację?

Lempik
Lempik

Jeżeli chodzi o plik nginx.conf, to on wygląda tak:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        server_tokens off;
        # server_names_hash_bucket_size 64;
        server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##
        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;

I tak wygląda katalog:

total 76
drwxr-xr-x   8 root root 4096 Oct 26 16:09 .
drwxr-xr-x 100 root root 4096 Oct 26 16:28 ..
drwxr-xr-x   2 root root 4096 Aug  5 05:05 conf.d
-rw-r--r--   1 root root 1077 Aug  5 04:59 fastcgi.conf
-rw-r--r--   1 root root 1007 Aug  5 04:59 fastcgi_params
-rw-r--r--   1 root root 2837 Aug  5 04:59 koi-utf
-rw-r--r--   1 root root 2223 Aug  5 04:59 koi-win
-rw-r--r--   1 root root 3957 Aug  5 04:59 mime.types
drwxr-xr-x   2 root root 4096 Aug  5 05:05 modules-available
drwxr-xr-x   2 root root 4096 Oct 26 16:07 modules-enabled
-rw-r--r--   1 root root 1478 Oct 26 16:09 nginx.conf
-rw-r--r--   1 root root 1482 Aug  5 04:59 nginx.conf~
-rw-r--r--   1 root root  180 Aug  5 04:59 proxy_params
-rw-r--r--   1 root root  636 Aug  5 04:59 scgi_params
drwxr-xr-x   2 root root 4096 Oct 26 16:07 sites-available
drwxr-xr-x   2 root root 4096 Oct 26 16:07 sites-enabled
drwxr-xr-x   2 root root 4096 Oct 26 16:07 snippets
-rw-r--r--   1 root root  664 Aug  5 04:59 uwsgi_params
-rw-r--r--   1 root root 3071 Aug  5 04:59 win-utf
DBanaszewski
DBanaszewski α-tester v3

@Lempik przepraszam za błąd, nie ten plik edytujesz (tak było w poradniku) -> zrobiłem poprawkę :slight_smile:

Lempik
Lempik

Czyli jestem pierwszy, kto instaluje według tego poradnika... :) Na końcu tego wiersza jeszcze był znak ";", więc do tam zostawiłem.

Lempik
Lempik

DBanaszewski:

Krok 7

Mamy nginx’a z obsługą PHP, teraz instalujemy serwer MySQL, a dokładniej MariaDB. Najpierw dodajemy oficjalne repozytoria MariaDB przy pomocy:

sudo apt-get install software-properties-common 
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mariadb.mirrors.ovh.net/MariaDB/repo/10.3/ubuntu bionic main'

W trakcie akceptacji klucza GPG będziemy musieli kliknąć ENTER .

Tym razem mi się udało dojść do kroku 7. W tym kroku nie było żadnego potwierdzania klucza GPG.

Po apt-update otrzymałem na końcu komunikat 4 packages can be upgraded. Run 'apt list --upgradable' to see them.

Ale zignorowałem go i wpisałem zgodnie z instrukcją apt install mariadb-server.

Otrzymałem takie coś: Reading package lists... Done Building dependency tree Reading state information... Done Some packages could not be installed. This may mean that you have requested an impossible situation or if you are using the unstable distribution that some required packages have not yet been created or been moved out of Incoming. The following information may help to resolve the situation:

The following packages have unmet dependencies:
 mariadb-server : Depends: mariadb-server-10.3 (>= 1:10.3.10+maria~bionic) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

Spróbowałem więc zrobić apt upgrade i ponownie apt install mariadb-server.

Ale niestety, otrzymałem ten sam error.

DBanaszewski
DBanaszewski α-tester v3

Mam nadzieję, że instalujesz to wszystko na Ubuntu 18.04.

Jeżeli dalej to nie działa, to usuń wpis repozytoriów i zainstaluj domyślną wersję z repo Ubuntu.

Lempik
Lempik

Instaluję to wszystko na standardowym VPSie, który otrzymuję tu w LVL UP. Tam jest domyślna wersja 16.04.

Infinity
Infinity

A poradnik jest do wersji 18.04, wiec nie do konca dla ciebie ;)

Lempik
Lempik

A więc trzeba albo upgradować do ubuntu 18, albo zainstalować wszystko dla wersji 16. Bez poradników nie dam rady.

Infinity
Infinity

Zawsze mozesz zainstalowac ubuntu 18 przez proxmoxa po prostu.

DBanaszewski
DBanaszewski α-tester v3

Do upgrade Ubuntu 16 do 18 opracowałem poradnik, wystarczy zernkąć ;)

https://lvlup.rok.ovh/t/upgrade-ubuntu-16-04-do-18-04/8446

Lempik
Lempik

Zalogowałem się do panelu proxmox i w ogóle nie wiem, o co tam chodzi i co tam mam robić. Nie potrafię w proxmoksie upgradować ubuntu do wersji 18. Moim głównym problemem jest to, że tu mam hosting MC. Tylko że hosting MC wycofano, nie da się go nawet przedłużyć. Hosting mam opłacony do początku grudnia. W wątku "Rozważam serwer MC na VPS..." mi podaliście poradniki, które podobno mi pozwolą na tutejszym VPSie zainstalować potrzebne rzeczy, żeby mieć serwer MC, stronę www i panel zarządzania serwerem MC. Wcale nie pragnąłem bawić się VPSem. Okazuje się jednak, że nie dam rady zainstalować potrzebne rzeczy na VPSie, bo (niektóre) poradniki są dla ubuntu 18, a system na tutejszym VPSie to ubuntu 16.

DBanaszewski
DBanaszewski α-tester v3

Możesz to robić poprzez SSH, tutaj nie ma problemu (aczkolwiek zalecenie jest, aby robić to przez VNC).

Lempik
Lempik

Problem polega na tym, że ja w ogóle nie wiem, co mam robić.

DBanaszewski
DBanaszewski α-tester v3

No możesz przepisać wszystkie komendy z tego poradnika w konsoli SSH. W tym wyjątku serwer będzie Cie prosił o utworzenie drugiego serwera SSH na innym porcie.

Lempik
Lempik

DBanaszewski:

Krok 10

Prawie wszystko gotowe, teraz tylko konfiguracja phpMyAdmin. Wchodzimy do folderu /var/www/html/pma i tworzymy nowy plik przy użyciu:

sudo vim /var/www/html/pma/config.inc.php

Gdzie jest używany ten plik konfiguracyjny? Bo jak patrzę do index.php, to tam go nikt nie wczytuje.

Tak w ogóle to mam problem, że jak próbuję z przeglądarki pracować z phpMyAdminem, to mam komunikat: "mysqli_real_connect(): (HY000/1698): Access denied for user 'root'@'localhost'"

DBanaszewski
DBanaszewski α-tester v3

Lempik:

Gdzie jest używany ten plik konfiguracyjny? Bo jak patrzę do index.php, to tam go nikt nie wczytuje.

Bo index.php z PMA go nie czyta, a inne pliki.

Lempik
Lempik

DBanaszewski:

Remove test database and access to it? [Y/n]


Tutaj będzie testować bazę danych, zalecam `Y` .

Taki drobiazg - tu jesteśmy pytani, czy ma usunąć próbną bazę danych (o nazwie "test").
SP24
SP24

DBanaszewski:

Poradnik został napisany pod Ubuntu 18.04 Jeżeli korzystasz z innej wersji, może coś przestać działać.

Przepraszam za odkop, ale wspomnę, że instalowałem zgodnie z tym poradnikiem na Ubuntu 16.04 i wszystko pięknie działa. Trzeba tylko pamiętać o drobnej zmianie tutaj:

sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mariadb.mirrors.ovh.net/MariaDB/repo/10.3/ubuntu xenial main'

Trzeba zmienić z bionic na xenial i wszystko działa.

Tomson
Tomson

Mam problem zainstalowałem wszystko z tego poradnika tak jak opisałeś ale gdy wchodzę na strone ip.pl/pma to wyskakuje błąd 403 forbidden.