FreeBSD 11 oraz Nginx + PHP 7 + MySQL + Certbot (SSL/HTTPS) + phpMyAdmin

Nastał ten moment, inny system, trochę inny serwer WWW. I trochę nowych problemów. A więc od początku. mamy świeży pachnący system. Nie mamy zainstalowanego nic, nawet firewalla. Skupimy się więc stricte na zainstalowaniu oprogramowania aby można było wyświetlić stronę internetową opartą na PHP oraz MySQL. Szyfrowanie połączenia – jest dobrą praktyką nawet w stronach które nie pobierają danych od użytkownika, obowiązkowe przy wszelakich formularzach, zarządzanie bazą danych itp. Czemu jeszcze phpMyAdmin? Ponieważ jest to najpopularniejsze narzędzie do zarządza bazą danych. Oczywiście nie jest ono wymagane i można pominąć ten element.

Tak więc od czego zaczynamy?

Pierwszą rzeczą jest zalogowanie się na konto administratora (root). Można wykorzystać komendę „sudo” ale ja wolę coś takiego wykonywać za pomocą już zdefiniowanego konta. Dzięki temu, później nie ma problemu z „napisałem cały plik konfiguracyjny, a zapomniałem 'sudo’ i co teraz????”. Jest oczywiście dodatkowe ryzyko, że coś może pójść nie tak – ale z „sudo” jest dokładnie takie samo ryzyko.

Zainstalujmy więc sporą porcję oprogramowania:

pkg install nginx mysql80-server php72 php72-mysqli

czekamy na jego zakończenie i w sumie mamy prawie gotowe 🙂

Możemy wykonać polecenie rehash – w ten sposób konsola wie o nowych aplikacjach, ale nie jest to wymagane.

O ile „vi” w Linuksie działa mi fajnie, o tyle we FreeBSD – nie. Dlatego preferuję tutaj „ee”. Ma to pewnie związek z kodowaniem, bo też kilka innych przycisków mi nie działa – ale jeszcze tego nie szukałem aby naprawić.

ee /etc/rc.conf

I dodajemy linie:

mysql_enable="YES"
nginx_enable="YES"
php_fpm_enable="YES"

Można dodać w prawie dowolnym miejscu.

Teoretycznie serwer www powinien powstać, ale i tak PHP nie działa jeszcze. To teraz PHP
cd /usr/local/etc
ee php-fpm.d/www.conf

Odnajdujemy linię która wygląda w ten sposób:
listen = 127.0.0.1:9000
i zamieniemy ją na taką:
listen = /var/run/php-fpm.sock
Następnie odnajdujemy linie:
;listen.owner = www
;listen.group = www
;listen.mode = 0660

I usuwamy ’;’ z początku linii. Będzie to wyglądało tak:

listen.owner = www
listen.group = www
listen.mode = 0660

Zapisujemy, wychodzimy.
cp php.ini-production php.ini
ee php.ini

Możemy wprowadzić kilka zmian, można dodać opcję:
cgi.fix_pathinfo = 0 (domyślnie zakomentowane, oraz wartość 1, zmieniamy na 0).
Jeśli potrzeba można zmienić „post_max_size” oraz „upload_max_filesize” na większy. Jeśli nie mamy na to ochoty lub wiemy co robimy i chcemy inne zmiany – idziemy dalej.
service php-fpm start

A więc interpreter PHP powinien już działać.

Odpalmy MySQL.
service mysql-server start
Ale to by było mocno za proste 🙂
mysql_secure_installation
Tutaj jest ciut gorzej, większość decyzji należy do nas. W mojej opinii można dodać „Validate Password Component”, a poziom? Im wyżej tym lepiej.
Usunięcie użytkownika anonimowego, czy blokowanie dostępu dla użytkownika „root” – to też dobre pomysły. Później będzie jeszcze kilka pytań – to są nasze osobiste doświadczenia i to co uważamy. Nie ma krytycznych  opcji których nie można później zmienić.
service mysql-server restart
Dobrym pomysłem jest zalogowanie się i stworzenie nowego użytkownika który będzie miał ciut większy dostęp, zamiast używać użytkownika „root”

create user 'naszSuperUzytkownik'@'localhost' identified by 'tajneHaslo';

Ewentualnie: create user 'naszSuperUzytkownik'@'localhost' identified with mysql_native_password by 'tajneHaslo'; – od razu rozwiązuje problem logowanie za pomocą phpmyadmin, php oraz innych miejsc.
grant all on *.* to 'naszSuperUzytkownik'@'localhost' with grant option;

I ten moment, na który wszyscy czekają…
service nginx start

Przechodzimy do katalogu:
cd /usr/local/etc/nginx

I otwieramy konfigurację nginx.conf
nginx.conf

W tym miejscu mamy do zmiany kilka rzeczy:
user -> „www” (tak jak w przypadku PHP)
worker_processes -> X (gdzie X to ilość rdzeni procesora, można spróbować też ilość wątków itp)
error_log -> error_log /var/log/nginx/error.log info;
access_log -> access_log /var/log/nginx/access.log;
W sekcji: „http { server {„, zmieniamy server_name i dopisujemy nasze domeny które mają być obsługiwane przez ten host.

W moim przypadku plik ten wygląda w całości tak:

user www;
worker_processes 4;

error_log /var/log/nginx/error.log info;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;

sendfile on;

keepalive_timeout 65;

gzip on;

server {
listen 80;
server_name localhost domena www.domena subdomena.domena;

root /usr/local/www/nginx;
index index.php index.html index.htm;

location / {
try_files $uri $uri/ =404;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/www/nginx-dist;
}


location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}

Następnie wykonujemy polecenia:
mkdir -p /var/log/nginx
touch /var/log/nginx/access.log
touch /var/log/nginx/error.log

Jako główny katalog została wskazany: /usr/local/www/nginx

Aby uniknąć możliwych przykrości (jest to dowiązanie symboliczne), można usunąć je i utworzyć faktyczną kopie w/w katalogu.
rm /usr/local/www/nginx
mkdir /usr/local/www/nginx
cp /usr/local/www/nginx-dist/index.html /usr/local/www/nginx
ee /usr/local/www/nginx/info.php

W treści wpisujemy: <?php phpinfo(); ?>

testujemy konfigurację: nginx -t
i jeśli nie ma błędów – service nginx restart

Następnie odwiedzamy naszą domenę, powinna być widoczna strona nginx. Jeśli odwiedzimy domena/info.php – powinna być widoczna strona konfiguracyjna PHP. Plik info.php można zostawić, można usunąć. Lepiej usunąć, bo zawiera naprawdę sporo wrażliwych informacji na temat serwera.

phpMyAdmin

pkg install phpMyAdmin-php72
cd /usr/local/www/phpMyAdmin/
cp config.sample.inc.php config.inc.php
ln -s /usr/local/www/phpMyAdmin/ /usr/local/www/nginx/phpmyadmin
ee config.inc.php

Odszukujemy $cfg['blowfish_secret'] = ''; – i wprowadzamy 32 znakowy ciąg znaków (dowolny)
service nginx restart
service php-fpm restart

Po wpisaniu domena/phpmyadmin – powinnien się pojawić panel logowania, ale tak bez szyfrowania wpisać hasło? Pozostaje więc, już tylko, certyfikat SSL czyli połączenie po HTTPS do domeny.
Z próbą logowania warto poczekać do zainstalowania certyfikatów 😉
Jeśli przy próbie logowania się mamy informację:

The server requested authentication method unknown to the client [caching_sha2_password]

Logujemy się do mysql za pomocą: mysql -u root -p
I wykonujemy komendę:
alter user 'naszSuperUzytkownik'@'localhost' IDENTIFIED WITH mysql_native_password BY 'tajneHaslo';
Teraz logowanie powinno zadziałać.

pkg install py36-certbot-nginx py36-certbot
certbot-3.6 --nginx -d example.com -d www.example.com

Jeśli chcemy więcej domen, dodajemy „-d domena”.

Przy pierwszym uruchomieniu podajemy kilka rzeczy więcej niż przy kolejnych, akceptujemy warunki itd. Czytamy i wpisujemy co uważamy za stosowne.

W kroku drugim, należy podjąć decyzję czy wszystkie zapytania na http mają być przekierowane na https – w mojej opinii warto, ale to jest zależna tylko od Ciebie.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Proszę dokończyć równanie: * Time limit is exhausted. Please reload CAPTCHA.