WordPress na Ubuntu 16.04 (nginx, PHP7, FTP) z SSL

ub16-logo-maria-php-le
Witam was 🙂

Dziś poniekąd “odgrzewany kotlet”, ponieważ o Wordpresie i konfiguracji na serwerze VPS/dedykowanym, wpis już był – ale z okazji premiery systemu Ubuntu 16.04 który natywnie wspiera PHP 7, oraz z racji dostępności darmowych certyfikatów SSL z Let’s Encrypta postanowiłem o tym napisać.

WordPress już od jakiegoś czasu obsługuje PHP 7 więc instalacja tego CMS’a nie wymaga żadnych dodatkowych zmian w kodzie.

Dostosowany poradnik działa na Ubuntu 16.04 LTS, przy współpracy z ostatnim stabilnym wydaniem (w dniu publikacji wpisu) serwera www – nginx/1.10.0, bazy danych MariaDB 10.0.x która natywnie już jest wspierana przez system Ubuntu.

Dodatkiem i jest dopisek odnośnie instalacji certyfikatu SSL, co pomaga na pewno w pozycjonowaniu witryny jak i zabezpiecza was, o swoje hasło do zaplecza WWW dzięki szyfrowanemu połączeniu.
Certyfikat SSL odnawiać się będzie co 2 miesiące, wielkie podziękowania należą się twórcą projektu Let’s Encrypt, o tej rewolucji już pisałem jakiś czas temu.

Sposób przygotowany na instancji PublicCloud w OVH, oczywiście można użyć również na serwerze VPS SSD/Cloud czy serwerach dedykowanych.

Na początek przygotowanie serwera:

serwer

create

1. Połączenie do serwera/VPS/instancji:

w przypadku serwera PublicCloud, łącze się do systemu za pomocą klucza SSH,

ssh ubuntu@149.202.184.47 -i .ssh/id_rsa2

2. Przygotowanie systemu i instalacja niezbędnych pakietów:

sudo -i
apt-get update
apt-get upgrade -y

apt install curl wget nano \
apt-transport-https software-properties-common dpkg-dev \
build-essential zlib1g-dev libpcre3 libpcre3-dev unzip \
curl libcurl4-openssl-dev libossp-uuid-dev git autotools-dev \
debhelper dh-systemd libexpat-dev libgd-dev libgeoip-dev \
libluajit-5.1-dev liblua5.1-0-dev libmhash-dev libpam0g-dev \
libperl-dev libxslt1-dev po-debconf libssl-dev \
libpython-stdlib libpython2.7-minimal libpython2.7-stdlib \
python python-minimal python2.7 python2.7-minimal -y

Konfiguracja użytkownika www (ustatwienie hasła będzie jednoznaczne z ustawieniem hasła do FTP!)

adduser www

3. Serwer www - nginx/1.10.0

curl http://repo.linuxiarz.pl/NGINX-1.10.0-custom.tar.gz | tar xz 
cd nginx*; dpkg-buildpackage -b
cd ..
dpkg -i nginx-common_1.*.deb nginx_1.*.deb nginx-extras_1.*.deb nginx-doc_1.*.deb
rm /etc/nginx/conf.d/*

Serwer www jest gotowy, przejdźmy zatem do instalacji PHP, skonfigurowanie serwera nginx wykonamy później.

4. Instalacja PHP 7 

apt -y install php7.0-fpm php7.0-mysql php7.0-curl \
php-pear php-imagick php7.0-imap php7.0-mcrypt php-memcache php7.0-pspell \
php7.0-recode php7.0-sqlite3 php7.0-tidy php7.0-xmlrpc php7.0-xsl \
php7.0-gd php7.0-intl php7.0-mbstring php-gettext \
php-apcu php-soap imagemagick postfix

4.1 Konfiguracja

rm /etc/nginx/php.conf
wget http://pliki.linuxiarz.pl/05-2016/php.conf -O /etc/nginx/php.conf
rm /etc/php/7.0/fpm/php.ini
wget http://pliki.linuxiarz.pl/05-2016/php.ini -O /etc/php/7.0/fpm/php.ini
wget http://pliki.linuxiarz.pl/05-2016/php7pool-wp.conf -O /etc/php/7.0/fpm/pool.d/php7pool-wp.conf
systemctl restart php7.0-fpm

5. Instalacja serwera FTP - vsftpd oraz jego konfiguracja:

apt-get install vsftpd -y
rm /etc/vsftpd.conf
wget http://pliki.linuxiarz.pl/08-2015/ftp/vsftpd.conf -O /etc/vsftpd.conf; touch /etc/vsftpd.chroot_list
wget http://pliki.linuxiarz.pl/08-2015/ftp/private.zip; unzip private.zip; mv private/* /etc/ssl/private; rm private.zip

Domyslnie włączona jest opcja FTP przez TLS, aby to wyłączyć - w pliku /etc/vsftpd.conf zmień na ssl_enable=NO

6. Instalacja bazy MariaDB i jej konfiguracja

apt install -y mariadb-server mariadb-client

6.1 Definicja zabezpieczeń MySQL'a/MariaDB (ustawienie hasła dla użytkownika "root")

mysql_secure_installation

Po zdefiniowaniu hasła "root" - zapamiętaj/zanotuj je!

Do poprawnego działania PHP z bazą MariaDB musisz jeszcze włączyć połączenia TCP do bazy MariaDB:

echo "update user set plugin='' where User='root'; flush privileges;" | mysql --defaults-file=/etc/mysql/debian.cnf mysql

Gotowa konfiguracja i start serwera:

rm /etc/mysql/my.cnf
wget http://pliki.linuxiarz.pl/08-2015/my.cnf -O /etc/mysql/my.cnf
service mysql restart

7. Instalacja PHPMyAdmin'a

cd /opt/; wget https://github.com/phpmyadmin/phpmyadmin/archive/STABLE.zip
unzip STABLE*.zip
mv phpmy* pma
mkdir -p /var/lib/php/session; chmod 4777 /var/lib/php/session
rm STABLE*
wget http://pliki.linuxiarz.pl/05-2016/pma-ubuntu16.conf -O /etc/nginx/conf.d/pma.conf

## Użytkownik phpMyAdmin w bazie - zaloguj sie swoim hasłem root i uwórz bazę
mysql -u root -p

CREATE DATABASE phpmyadmin;
CREATE USER 'phpmyadmin'@'localhost' IDENTIFIED BY 'K.XNe1-.M!e-3e1G'; 
GRANT ALL PRIVILEGES ON phpmyadmin.* TO phpmyadmin@localhost IDENTIFIED BY 'K.XNe1-.M!e-3e1G';
quit

mysql -u phpmyadmin -p'K.XNe1-.M!e-3e1G' phpmyadmin < /opt/pma/sql/create_tables.sql
wget http://pliki.linuxiarz.pl/05-2016/pma.txt -O /opt/pma/config.inc.php

Dostęp do PHPMyAdmin: http://TWOJ-IP:9977, lub http://domena.pl:9977

8. Serwer Memcache

apt install memcached -y
rm /etc/memcached.conf
wget http://pliki.linuxiarz.pl/11-2015/memcached.conf -O /etc/memcached.conf 

9. Uruchamianie oprogramowania przy starcie systemu:

update-rc.d nginx defaults
update-rc.d mysql defaults
update-rc.d vsftpd defaults
update-rc.d memcached defaults
update-rc.d php7.0-fpm defaults

Restart usług

systemctl restart nginx
systemctl restart mysql
systemctl restart vsftpd
systemctl restart memcached
systemctl restart php7.0-fpm

Instalacja WORDPRESS:

1. Tworzenie katalogów i pobieranie najnowszej wersji CMS

mkdir /home/www/public_html
wget https://pl.wordpress.org/wordpress-4.5.2-pl_PL.tar.gz -O /home/www/public_html/wp.tar.gz
cd /home/www/public_html/
tar xfz wp.tar.gz; rm wp.tar.gz

Konfiguracja uprawnień do plików i katalogów Wordpresa

wget http://pliki.linuxiarz.pl/05-2016/wp-perm.sh -O /root/wp-perm.sh
chmod +x /root/wp-perm.sh
cd /root/
./wp-perm.sh

Dodawanie użytkownika www do grupy www-data

usermod -g www-data www

2. Tworzenie bazy danych (tutaj przyda się hasło do bazy danych)

mysql -u root -p

Po wydaniu tego polecenia, system poprosi o hasło, jest to hasło wcześniej ustawione przy instalacji serwera MariaDB
Po podaniu prawidłowego hasła, będziesz w konsoli bazy MySQL, tutaj tworzysz bazę.

CREATE DATABASE wordpress;
### PAMIETAJ ZMENIC HASLO DLA UŻYTKONIKA BAZY !! - wewnątrz znaków '' ###
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'G3u!vJQ4__v6L_5U'; 
GRANT ALL PRIVILEGES ON wordpress.* TO wordpress@localhost IDENTIFIED BY 'G3u!vJQ4__v6L_5U';
quit

Lub alternatywny sposób, tworzenie bazy za pomocą interfejsu PHPMyAdmin:

pma_ub16_1

pma_ub16_2

pma_ub16_3

3. Konfiguracja serwera www (bez SSL)

wget http://pliki.linuxiarz.pl/05-2016/wordpress-ubuntu16.conf -O /etc/nginx/conf.d/wordpress.conf
service nginx restart

4. Czas przejść do przeglądarki, warto skierować już do twojego serwera jakąś domenę.

W jej strefie DNS (rejestrator np.) wpisz adres IPv4 jako wartośc rekordu A i analogicznie dla subdomeny "www".

IP-strefa

Wywołaj IP lub adres twojej wcześnie skonfigurowanej domeny w przeglądarce, lub przejdź do kolejnego punktu.

Pomiń ten krok, jeśli nie jesteś zainteresowany SSL'em.

Na czas pisania poradnika dodałem subdomenę tests.linuxiarz.pl aby pokazać wam jak dodać certyfikat SSL od Let's Encrypt

5. Jeśli zależy Ci na tym, aby połączenie z twoją witryną było bezpieczne i chcesz zainstalować darmowy certyfikat Let's Encrypt to pozostań tutaj i wykonaj polecenia:

cd /root/
git clone https://github.com/letsencrypt/letsencrypt
sh /root/letsencrypt/letsencrypt-auto certonly --webroot --webroot-path /home/www/public_html/wordpress --domains tests.linuxiarz.pl,www.tests.linuxiarz.pl --agree-tos --email admin@strona.pl

W powyższym poleceniu pamiętaj o edycji:
--domains tests.linuxiarz.pl,www.tests.linuxiarz.pl
oraz: --email admin@strona.pl

Odnowienie certyfikatu co 2 miesiące:

(sudo crontab -u root -l; echo "0 0 1 * * sh /root/letsencrypt/letsencrypt-auto renew >> /dev/null && service nginx restart >> /dev/null") | crontab -u root -

Gotowa konfiguracja NGINX z obsługą SSL'a

rm /etc/nging/conf.d/wordpress.conf
wget http://pliki.linuxiarz.pl/05-2016/wordpress-ubuntu16_ssl.conf -O /etc/nginx/conf.d/wordpress.conf

UWAGA!! Po wygenerowaniu certyfikatu SSL dla twojej domeny utworzone zostaną katalogi, odpowiednie dla twojej domeny! Musisz zmenić scieżkę w pliku konfiguracyjnym serwera nginx!

/etc/nginx/conf.d/wordpress.conf

ssl_certificate /etc/letsencrypt/live/strona.pl/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/strona.pl/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/strona.pl/chain.pem;

Po poprawnej edycji, przeładuj nginx'a

service nginx restart

Efekt w przeglądarce:
ub16_ssl-wp

Jeżeli wszystko przebiegło pomyślnie, to po wpisaniu w przeglądarce twojej domeny powinien ukazać się instalator WordPress z bezpiecznym połączeniem jak na obrazku powyżej, lub jeśli pominałeś/aś ten etap - bez:

wp1

wp2

Kwestie konfiguracyjne dotyczące ustawień samej witryny pozostają dla Ciebie.

Jeśli instalacja się powiodła efektem instalacji powinien być widok na domyślny salon Wordpresa:

ub16-wp-rdy

Serwer WWW wkompilowane ma moduły opisane tu: http://linuxiarz.pl/1911/nginx-1-9-11-z-modulami-na-debian-ubuntu-centos-i-innych/

Ustawione reguły dla GooglePageSpeed: http://pliki.linuxiarz.pl/02-2016/pagespeed.txt

Możliwe konfiguracje moduły GooglePageSpeed: https://developers.google.com/speed/pagespeed/module/configuration

Nie testowane z wtyczką dla Worpdresa: W3 Total Cache, może być konieczne wyłącznie modułu GooglePageSpeed.

Wyłączenie PageSpeed'a:

sed -i s'/pagespeed on;/pagespeed off;/' /etc/nginx/conf.d/wordpress.conf
/etc/init.d/nginx restart

Włączenie PageSpeed'a

sed -i s'/pagespeed off;/pagespeed on;/' /etc/nginx/conf.d/wordpress.conf
/etc/init.d/nginx restart

5. Instalacja i konfiguracja zapory (Firewall)

apt-get install ufw -y

Ustawienie regułek zapory

ufw allow ssh
ufw enable
ufw allow ftp
ufw allow http
ufw allow https
ufw allow 9977/tcp
ufw allow 12000:12100/tcp

Na końcu można uruchomić ponownie serwer i zweryfikować czy wszystko się uruchomi przy starcie.

reboot

Wydajnosć serwera przy 2500 jednoczesnych połączeniach przez 1 minute (serwer to HG 7 SSD z oferty PublicCloud w OVH):
perf1

perf2