LEMP na Ubuntu 16.04 ( nginx, mariadb, PHP7, memcache )

install-lemp-on-ubuntu

Hej, jako że kilka tygodni temu premiere miała wersja Ubuntu 16.04 i otrzymała miano LTS’a, postanowiłem zająć się tym systemem i przygotować szybki poradnik w którym opisze jak zainstalować serwer www nginx (wersja stable! 1.10.0) bazy danych MariaDB oraz memcache i PHPMyAdmin jako system kontroli bazami danych ;). Nginx oczywiście z dodatkowymi modułami,

Dodatkowo oczywiście trafił serwer FTP, jak zawsze – vsftpd.

Dostęp do PHPMyAdmina dostępny jest pod adresem zazwyczaj spotykanym w moich poradnikach czyli na niestandardowym porcie 9977.
Połączenie wygląda tak http://IPserwera:9977

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

1. Dodanie nowego użytkownika:

adduser www

2. Instalacja pakietów niezbędnyh do kompilacji nginx’a

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

3. Kompilacja nginx

curl http://repo.linuxiarz.pl/NGINX-1.10.0-custom.tar.gz | tar xz 
cd nginx* && dpkg-buildpackage -b

3.1 Instalacja zbudowanych pakietów serwera nginx

cd .. 
dpkg -i nginx-common_1.*.deb nginx_1.*.deb nginx-extras_1.*.deb nginx-doc_1.*.deb

3.2 Konfiguracja nginx i katalogów dla stron www

usermod -aG www-data www
mkdir /home/www/public_html -p
mkdir /home/www/logs/ -p 
rm /etc/nginx/conf.d/*
wget http://pliki.linuxiarz.pl/05-2016/default.conf -O /etc/nginx/conf.d/default.conf
echo "<?php phpinfo(); ?>" >> /home/www/public_html/info.php
chown www:www /home/www/public_html/ -R
systemctl restart nginx

4. Instalacja PHP7

apt-get -y install php7.0-fpm php7.0-mysql php7.0-curl php7.0-gd php7.0-intl \
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-mbstring php-gettext php-apcu php-soap imagemagick postfix

4.1 Konfiguracja PHP7

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
systemctl restart php7.0-fpm

5. Baza MariaDB – domyślnie 10.0.x

apt install mariadb-server mariadb-client -y

Wersja 10.1.x (Stable)

apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
add-apt-repository 'deb [arch=amd64,i386] http://mariadb.mirror.serveriai.lt/repo/10.1/ubuntu xenial main'
apt update
apt install mariadb-server mariadb-client -y

Wersja 10.2.x (Alpha)

apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
add-apt-repository 'deb [arch=amd64,i386] http://mariadb.mirror.serveriai.lt/repo/10.2/ubuntu xenial main'
apt update
apt install mariadb-server mariadb-client -y

Uwaga! Wersje bazy MariaDB są ze sobą zamienne!

5.1 Konfiguracja

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

5.2 Definicja haseł MySQL’a

mysql_secure_installation

6. Instalacja serwera FTP

apt 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

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

7. Instalacja memcache

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

8. Zapora firewall

apt install ufw -y

8.1 Konfiguracja firewall UFW

ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 21/tcp
ufw allow 12000:12100/tcp
: > /etc/ufw/ufw.conf
echo "ENABLED=no" >> /etc/ufw/ufw.conf
echo "LOGLEVEL=low" >> /etc/ufw/ufw.conf
ufw enable

9. 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/12-2015/c7-apache/pma.conf -O /etc/nginx/conf.d/pma.conf
ufw allow 9977/tcp
service nginx restart

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

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

10. Uruchamianie usług ze startem 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
  • Tomasz Krzak

    Czy możesz pomóc kompletnie zielonym w temacie VPS osobom, które dotąd miały jedynie styczność z hostingami współdzielonymi i napisać, jak skonfigurować jakiś uniwersalny serwer, na którym można testować czy postawić strony (joomla, wordpress, prestashop i inne). Słowem jeden uniwersalny, w podstawowej konfiguracji, również zabezpieczeń.
    Kompletnie nie ogarniam tego tematu… Sam nie mam pojęcia więc szukam i korzystam z tego typu poradników, ale tutaj jest apache, tam nginx, tutaj mysql, gdzie indziej mariadb. Do tego jakieś dodatkowe moduły php, zabezpieczenia, cache… Czarna magia więc proszę o napisany prostym językiem poradnik co z czym się je, a do tego oparty na aktualnych źródłach.

  • Kamil

    Dziękuję za poradnik, jednak mam problem z działaniem Twojego default.conf pod wordpressem. Strona indexd.php łądnie się wyczuje, natomiast podstrony już nie. Dogooglałem wpis takiej treści:

    location / {
    try_files $uri $uri/ /index.php;
    }

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

    Jednak nie wiem, jak to zgrać z Twoim skryptem (jestem zielony w konfiguracji

    nginx)
    Z góry dzięki za pomoc.