Wydajny WordPress na własnym serwerze!

linux-ubuntu-nginx-mysql-php-wordpress

Hej! Jeśli irytują Cię ograniczenia jakie zazwyczaj narzucają operatorzy w ofercie swoich hostingów współdzielonych, czy brak możłiwośći edycji ustawień w PHP na potrzeby specyficznej wtyczki ?
Irytuje Cię niska wydajność takiego rozwiązania ? Zbyt mała moc bliczeniowa a Ty przekraczasz zasoby ?

Jeśli przynajmniej na jedno pytania odpowiedź brzmi : TAK to ten poradnik jest dla Ciebie!

Przedstawiam Wam kompletny poradnik w którym opisze instalacje pełnego środowiska serwera WWW z bardzo wydajną bazą MariaDB oraz serwerem WWW przygotownym pod barzo wysoką wydajność!

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

Poradnik przeprowadzany na systemie Ubuntu 14.04 LTS

Na początek przygotowanie serwera:

serwer

spawn

1. Połączenie do maszyny:

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

ssh admin@167.114.240.207 -i .ssh/id_rsa2

2. Przygotowanie:

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

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

adduser www

3. Serwer www

apt-get 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 nano curl 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 -y

wget http://repo.linuxiarz.pl/NGINX-1.10.0-custom.tar.gz

tar xvf  NGINX-1.10.* ; cd nginx-1.10.* ; dpkg-buildpackage -b
cd ..
dpkg -i nginx-common_1.10.*.deb nginx_1.10.*.deb nginx-extras_1.10.*.deb nginx-doc_1.10.*.deb
rm  /etc/nginx/conf.d/* ; rm  /etc/nginx/sit*/* ; rm /etc/nginx/conf.d/default.conf

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

4. Instalacja PHP 5.6

add-apt-repository ppa:ondrej/php5-5.6
apt-get update
apt-get install php5-fpm php5 php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-xcache -y postfix --force-yes

wget http://pliki.linuxiarz.pl/02-2016/php-set.sh -O php-set.sh
chmod +x php-set.sh
./php-set.sh

Plik php-set.sh konfiguruje podstawowe funckje, możesz pozostawić domyślne lub wpisać swoje żądane wartości.

Włączenie PHP5-FPM

service php5-fpm restart

5. Instalacja serwera FTP oraz jesgo 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
Podczas instalacji serwera bazodanowego – system po prosi o wprowadzenie hasła do użytkownika “root” – zapamiętaj go.

apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
add-apt-repository 'deb [arch=amd64,i386] http://mariadb.kisiek.net/repo/10.1/ubuntu trusty main'
apt-get update
apt-get install mariadb-server mariadb-client -y

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. Serwer Memcache

apt-get install memcached -y
rm /etc/memcached.conf
wget http://pliki.linuxiarz.pl/11-2015/memcached.conf -O /etc/memcached.conf 
rm /etc/nginx/conf.d/*
wget http://pliki.linuxiarz.pl/11-2015/ngx_mem.conf -O /etc/nginx/conf.d/default.conf

8. Uruchamianie orpogramowania przy starcie systemu:

update-rc.d nginx defaults
update-rc.d mysql defaults
update-rc.d vsftpd defaults
update-rc.d memcached defaults

Instalacja WORDPRESS:

1. Tworzenie katalogów i pobieranie najnowszej wersji CMS

mkdir /home/www/public_html
wget https://pl.wordpress.org/wordpress-4.4.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/02-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

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 -> Linia poniżej - wewnątrz '' ###
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

3. Konfiguracja serwera www

rm -rf /etc/nginx/conf.d/default.conf
wget http://pliki.linuxiarz.pl/02-2016/wordpress.conf -O /etc/nginx/conf.d/wordpress.conf
sed -i '9d' /etc/nginx/php.conf
service nginx restart

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

W jej strefie DNS (operator np.) wpisz adres IPv4 jako wartośc rekordu A oraz wartość a dla subdomeny “www”.

IP-strefa

Wywołąj IP lub adres twojej wcześnie skonfigurowanej domeny w przeglądarce.

Jeżeli wszystko przebiegło pomyślnie powinien ukazać się instalator WordPress:

wp1

wp2

Kwestie konfiguracyje – To pozostawiam dla Ciebie.

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 PageSpeed: 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) oraz uprawnień do plików i katalogów

apt-get install ufw -y 

Ustawienie regułek zapory

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

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

reboot

Opcjonalna instalacja PHPMyAdmin:

cd /opt/; wget https://files.phpmyadmin.net/phpMyAdmin/4.5.4.1/phpMyAdmin-4.5.4.1-all-languages.zip
unzip phpMyAdmin-4*
rm -rf php*.zip
mv phpMyAdmin-4* pma
mkdir -p /var/lib/php/session; chmod 4777 /var/lib/php/session
wget http://pliki.linuxiarz.pl/12-2015/c7-apache/pma.conf -O /etc/nginx/conf.d/pma.conf
ufw allow 9977/tcp
service nginx restart

dostęp dp PHPMyAdmin: http://TWOJ-IP:9977, lub http://domena.pl:9977

  • DarekA

    Uff – wielkie dzięki. To dobrze bo już myślałem że będę musiał szukać rozwiązania w kierunku websockets a z tym sobie nie poradzę. Jak dojdzie do 1000 użytkowników to będzie mnie stać na specjalistów 🙂 Jeszcze raz dziękuję i będę polecał Twojego bloga

  • Taką ilośc zapytań to mały VPS obsłuży jak mu posawisz nginx, najlepiej sprawdzić w produkcji – myślę że to mało jak na to co potrafi nginx – dla mnie to jedyny suszny serwer WWW, nie lubie Apache.

  • DarekA

    Właśnie wszystko ruszyło – pomógł phpMyAdmin. Bardzo dziękuje za wsparcie. Mam jeszcze takie pytanie. Czy faktycznie nginx jest dużo wydajniejszy od apache. Mam taki prywatny projekt w którym są pernamentne zapytania do API i może być ich bardzo dużo (na początek ok 100 klientów odpytujących co 1-2 sekundy). Czy to uda się obsłużyć na jakimś dedyku z ngix ?

  • No MySQL działa, baza utworzona ? Błąd łączenia z bazą, jest plik /home/www/public_html/wordpress/wp-config.php ? Był instalator ?

  • DarekA

    root@vps264938:~# service mysql status
    * /usr/bin/mysqladmin Ver 9.1 Distrib 10.1.13-MariaDB, for debian-linux-gnu on x86_64
    Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

    Server version 10.1.13-MariaDB-1~trusty
    Protocol version 10
    Connection Localhost via UNIX socket
    UNIX socket /var/run/mysqld/mysqld.sock
    Uptime: 12 min 39 sec

    Threads: 2 Questions: 101 Slow queries: 0 Opens: 15 Flush tables: 1 Open tables: 26 Queries per second avg: 0.133
    root@vps264938:~#

  • To już z górki, kwestia tego czy:
    – dane z pkt “2. Tworzenie bazy danych” pokrywają się z danymi w pliku wp-config.php w katalogu www
    – Włączony jest proces bazy “service mysql status” (sprawdz najpierw)

  • DarekA

    root@vps264938:~# nginx -c /etc/nginx/nginx.conf
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] still could not bind()
    root@vps264938:~# service nginx status
    nginx start/running, process 1169
    root@vps264938:~#

  • DarekA

    Teraz po reboot nginx wystartował – no to znowu

    “Błąd łączenia się z bazą danych” coś mi niedane, może ja już za stary jestem 🙂

  • pokaż wynik nginx -c /etc/nginx/nginx.conf

  • DarekA

    Witam FTP sobie poradziłem. Ale w całości to jestem już trochę załamany. Od wczoraj zrobiłem chyba z 8 pełnych instalacji i dalej jestem w czarnej ….Bardzo zależy mi na tym ngixie ale cały czas na koniec jest to samo. Serwer po 3 punkcie już przy WP staje.

  • Na czym sie zatrzymałeś z FTP ?

    Połączenie naiązujesz przez SSL, np na przykładzie FileZilla -> http://linuxiarz.pl/wp-content/uploads/2015/10/FIlezilla1.png

    Jeśli chcesz wyłączyć SSL to pliku /etc/vsftpd.conf w linii: 24 wpisujesz ssl_enable=NO i przeładowujesz vsftp.

  • DarekA

    Wielkie dzięki – działa . Teraz walczę już tylko FTP jakoś się nie chce połączyć

  • W pkt. 3 zapomniales wykonac linijkę:

    rm /etc/nginx/conf.d/* ; rm /etc/nginx/sit*/* ; rm /etc/nginx/conf.d/default.conf

    Wystarczy ze zrobisz teraz
    rm /etc/nginx/conf.d/default.conf && service nginx restart

  • DarekA

    Witam staram się zrobić instalacje według tego tutoriala ale odbijam się od problemu że po instalacji i restarcie serwera nie startuje nginx. Wygląda to tak:

    ● nginx.service – A high performance web server and a reverse proxy server
    Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since pon 2016-04-04 15:05:07 CEST; 3min 15s ago
    Process: 1350 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)

    kwi 04 15:05:07 vps264938.ovh.net systemd[1]: Stopped A high performance web server and a reverse proxy server.
    kwi 04 15:05:07 vps264938.ovh.net systemd[1]: Starting A high performance web server and a reverse proxy server…
    kwi 04 15:05:07 vps264938.ovh.net nginx[1350]: nginx: [warn] invalid parameter “spdy”: ngx_http_spdy_module was superseded by ngx_http_v2_module in /etc/nginx/conf.d/default.conf:69
    kwi 04 15:05:07 vps264938.ovh.net nginx[1350]: nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/conf.d/wordpress.conf:8
    kwi 04 15:05:07 vps264938.ovh.net nginx[1350]: nginx: configuration file /etc/nginx/nginx.conf test failed
    kwi 04 15:05:07 vps264938.ovh.net systemd[1]: nginx.service: Control process exited, code=exited status=1
    kwi 04 15:05:07 vps264938.ovh.net systemd[1]: Failed to start A high performance web server and a reverse proxy server.
    kwi 04 15:05:07 vps264938.ovh.net systemd[1]: nginx.service: Unit entered failed state.
    kwi 04 15:05:07 vps264938.ovh.net systemd[1]: nginx.service: Failed with result ‘exit-code’.
    root@vps264938:~#

    Czy mogę liczyć na jakąś pomoc z góry dziękuję

  • Pingback: Wydajny i szybki sklep – PrestaShop | linuxiarz.pl()

  • W powyższej konfiguracji, nginx ma wkompilowany oczywiście http/2 (dla wersji 1.8.1 – mam spdy (http/2 nie działa w gałęźi nginx 1.8.x)

    Lista modułów: http://linuxiarz.pl/1911/nginx-1-9-11-z-modulami-na-debian-ubuntu-centos-i-innych/

    Same modyfikacje jakie może wprowadzić GooglePageSpeed: https://developers.google.com/speed/pagespeed/module/configuration

    W moim predefiniowanym konfigu dla nginx, domyślnie kod JS/CSS jest minimalizowany oraz konsolidowany.

    Najlepiej jest przetestować.

  • Marek Maker

    To wypada dopisać w artykule dla osób nie znających customowych zmian 😉 Jak trafią ludzie z sieci nie będą wiedzieli na czym polega ta przewaga wydajnościowa.

    Osobiście nie lubię polegać tylko na tego typu rozwiązaniu, ogranicza optymalizacje.

    Ładowanie strony można dodatkowo znacznie przyśpieszyć po połączeniu CSSów, poprawie Javascript, i innych optymalizacjach pod http1

    Ew. wprowadzić http2/spdy i poprawić CSSy i JS ładowane na 1 ekranie.

    Na szybkich łączach i desktop różnica rzędu 300-500ms
    (pomijalna dla niszowych serwisów),
    ale gdy komputer słabszy/telefon,
    i do tego dołożyć słabsze łącze lub 3G lub radiówka słabsza to czas ładowania w Twoim wypadku rośnie do 4-5 sekund, gdy zoptymalizowana strona o podobnej treści załaduje się mimo wszystko nadal w mniej niż 1 sekundę.

    Część opisanych rzeczy wykona dla WordPress’a w3 total cache, chociaż przy słabych szablonach/pluginach więcej jest poprawek.

    Mówię tutaj o wydajności widocznej dla końcowego użytkownika, a nie samych czasach odpowiedzi serwera.

  • Nie ma takiej potrzeby – i to nawet mogłoby działac nie do końca dobrze, ponieważ serwer WWW z moich poradników ma domyślnie wkompilowany GooglePageSpeed z preinstalowanymi regułami modyfikującymi kod w “locie”.

    Dla przykładu -> linuxiarz.pl -> https://gtmetrix.com/reports/linuxiarz.pl/tdyYzUEG

    Memcache w tym przypadku działa w duecuie z GooglePageSpeed.

    Jeśli chcesz jakiś włączyć tę wtyczkę, to dla testu w vhoście ( /etc/nginx/conf.d/wordpress.conf ) wyłącz PageSpeed ( pagespeed off; )

  • Marek Maker

    A gdzie konfiguracja w3 total cache do użycia memcache ( Object Cache na bazie memcache, a dla bardziej ruchliwych stron pagecache )