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