Сегодня хочу показать вам, как можно установить на своем сервере с Ubuntu 18.04 веб сервер. В качестве веб сервера будет выступать Nginx с PHP-FPM, в качестве СУБД – MariaDB, в качестве ftp сервера – vsftpd настроенный на использование виртуальных пользователей, чтобы избежать проблем с правами и владельцами файлов при загрузке. А также поставим PHPMyAdmin.
Сразу оговорюсь – я не буду особо останавливаться на конфигах и оптимизации, покажу только минимальные конфигурации для работы веб сервера. Оптимизация и разбор конфигов – отдельная тема, для каждого продукта и даже каждого конкретного случая, сегодня же речь не о том.
Итак – имеем свеж установленную Ubuntu Server 18.04.
Как всегда сперва переходим в режим суперпользователя и обновляем систему.
sudo su apt update apt upgrade
Теперь давайте установим nginx и php-fpm. Для этого добавим необходимые репозитории, где содержаться последние версии необходимых нам пакетов.
add-apt-repository ppa:ondrej/php add-apt-repository ppa:nginx/stable
Обновляем список пакетов и ставим nginx, php и необходимые модули для php, пользуясь случаем так же сразу поставим zip и unzip.
apt update apt install nginx apt install php7.2-cli php7.2-fpm php7.2-curl php7.2-gd php7.2-mysql php7.2-mbstring zip unzip
После установки в целях безопасности отключим cgi.fix_pathinfo. В файле /etc/php/7.2/fpm/php.ini
nano /etc/php/7.2/fpm/php.ini
находим строчку
;cgi.fix_pathinfo=1
и меняем ее на
cgi.fix_pathinfo=0
Теперь удалим или переместим куда-нибудь дефолтный конфиг nginx сайта по умолчанию
mv /etc/nginx/sites-available/default ~/
И создадим новый с таким же названием.
nano /etc/nginx/sites-available/default
Содержимое должно быть таким:
server {
listen 80;
root /var/www/default;
index index.php index.html index.htm;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ /index.html;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/www;
}
location ~ .php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Дальше посмотрим, сколько ядер имеется в нашей системе:
cat /proc/cpuinfo | grep processor | wc -l
И укажем это количество в качестве параметра worker_processes в файле /etc/nginx/nginx.conf
nano /etc/nginx/nginx.conf
worker_processes 2;
Далее создадим папку для нашего сайта и в этой папке создадим файлик index.php.
mkdir /var/www/default nano /var/www/default/index.php
Содержимое файла:
<?php
phpinfo();
?>
Сделаем пользователя и группу www-data владельцем файлов и папок:
chown -R www-data:www-data /var/www
Перезапускаем nginx и php-fpm:
/etc/init.d/nginx restart /etc/init.d/php7.2-fpm restart
Проверяем, что php у нас работает:
Далее поставим mariadb. Опять добавляем необходимый репозиторий, обновляем список пакетов и устанавливаем mariadb-server и mariadb-client:
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8 sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirror.timeweb.ru/mariadb/repo/10.3/ubuntu bionic main' apt update apt install mariadb-server mariadb-client
Во время установки нужно будет задать пароль для пользователя root, для доступа к БД.
Перезапускаем mysql и пробуем подключиться:
/etc/init.d/mysql restart mysql -u root -p
В Ubuntu 18.04 вы можете столкнуться с ситуацией, что после установки mariadb прекрасно работает, но после перезагрузки сервера, внезапно перестает запускаться – очень долго думает, но не запускается. Наиболее вероятная причина подобного поведения – app armor. Что бы его отключить для mariadb необходимо выполнить:
apt install apparmor-utils aa-disable /usr/sbin/mysqld
Теперь, давайте поставим phpMyAdmin, что бы упростить обслуживание баз данных. Ссылку на последнюю версию phpMyAdmin вы можете найти на сайте www.phpmyadmin.net .
Скачаем архив, разарзхивируем его, создадим папку в папке с нашим сайтом и перенесем туда файлы.
cd /tmp wget https://files.phpmyadmin.net/phpMyAdmin/4.8.3/phpMyAdmin-4.8.3-all-languages.zip unzip phpMyAdmin-4.8.3-all-languages.zip mkdir /var/www/default/phpmyadmin mv phpMyAdmin-4.8.3-all-languages/* /var/www/default/phpmyadmin/
Далее скопируем пример конфига phpMyAdmin, отредактируем его:
cp /var/www/default/phpmyadmin/config.sample.inc.php /var/www/default/phpmyadmin/config.inc.php nano /var/www/default/phpmyadmin/config.inc.php
В этом файле нужно задать значение для параметра $cfg['blowfish_secret']. Значением должен быть случайный набор симоволов, например:
$cfg['blowfish_secret'] = 'af897a09df0897adf';
Задаем правильно владельца папки phpmyadmin:
chown -R www-data:www-data /var/www/default/phpmyadmin
Проверяем работоспособность phpMyAdmin:
Теперь необходимо поставить ftp сервер. Если мы будем делать ftp сервер, с реальными пользователями, то будут проблемы с правами и владельцами файлов. Самый простой способ этого избежать – использовать виртуальных пользователей. Т.е. мы будем подключаться под пользователем vasya, но система будет считать, что работает пользователь www-data.
Кстати, я когда то показывал как подобное можно сделать в proftpd, сегодня же покажу, как такое сделать в vsftpd.
Ставим vsftp и db-util. Обратите внимание, что на момент написания статьи актуальной версией является db5.3-util. Когда вы будете это читать, версия может быть другой. Нужно ставить актуальную версию.
apt install vsftpd db5.3-util
Создадим папку и файл с нужными логинами и паролями, а так же сразу зададим правильные разрешения на файл:
mkdir /etc/vsftpd touch /etc/vsftpd/vsftpdusers chmod 0600 /etc/vsftpd/vsftpdusers
Отредактируем файл, тут первая строчка – имя пользователя, вторая – пароль, дальше по аналогии можно добавить несколько пользователей – сперва имя, ниже пароль.
nano /etc/vsftpd/vsftpdusers
ftpuser
123
Захешируем наш файл и отредактируем разрешения на полученный:
db5.3_load -T -t hash -f /etc/vsftpd/vsftpdusers /etc/vsftpd/users.db chmod 0600 /etc/vsftpd/users.db
Теперь переместим конфиг vsftpd и создадим новый с таким же названием:
mv /etc/vsftpd.conf ~/ nano /etc/vsftpd.conf
Содержимое конфига должно быть следующим:
listen=YES
anonymous_enable=NO
local_enable=YES
xferlog_enable=YES
user_sub_token=$USER
local_root=/var/www/
chroot_local_user=YES
hide_ids=YES
guest_enable=YES
guest_username=www-data
virtual_use_local_privs=YES
write_enable=YES
pasv_enable=YES
#если сервер за натом - реальный адрес
#pasv_address=1.2.3.4
pasv_max_port=20200
pasv_min_port=20400
pam_service_name=vsftpd.virtual
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=600
data_connection_timeout=120
ascii_upload_enable=YES
ascii_download_enable=YES
allow_writeable_chroot=YES
seccomp_sandbox=NO
local_umask=022
Тут стоит обрать внимание на следующие параметры:
local_root=/var/www/ - коревая папка, куда будут попадать пользователя, после подключения к серверу.
guest_username=www-data – имя реального пользователя, который будет виден системе, от его имени будут происходить все операции с файлами.
#pasv_address=1.2.3.4 – если у вас сервер за NAT, то тут нужно указать реальный, внешний адрес.
И остался последний шаг – создадим конфиг для pam.d, что бы наши виртуальные пользователи могли подключаться:
nano /etc/pam.d/vsftpd.virtual
Содержимое файла должно быть таким:
auth required pam_userdb.so db=/etc/vsftpd/users
account required pam_userdb.so db=/etc/vsftpd/users
session required pam_loginuid.so
Перезапускаем vsftpd, и можно пробовать подключаться.
/etc/init.d/vsftpd restart
На этом всё. Надеюсь вышенаписанное окажется вам полезным.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Поделитесь статьей с друзьями в соц. сетях, возможно, она будет им полезна.
Если вам помогла статья, вы можете >>отблагодарить автора<<
Комментарии
Привет. Перед проверкой работоспособности перезагрузил nginx, а в статье не указал. Потом устанвливал MariaDB, а перезагружал MySQL. Так как правильно?
да, про перезапуск nginx - забыл команду указать, спасибо, поправил. Про перезапуск mariadb - тут всё верно, ее демон - mysqld.
А что делать если при попытке подключения к mysql выдаёт ошибку: vagrant@vagrant-ubuntu-trusty-64:~$ mysql -u root -pEnter password:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)vagrant@vagrant-ubuntu-trusty-64:~$ Гуглил, не нашёл. Речь наверно пойдет о правах к папке с сокетом?
mysql запущен? Что пишет systemctl status mysql?
я проверял командой ps aux | grep mysql Но уже из-за переживаний удалил все виртуальные машины, потому что мне показалось, что ошибка возникала из-за нехватки дискового пространства.Вообще не понимаю, как это можно в этом разобраться самостоятельно, когда все объясняют по разному
Был бы признателен если бы вы сделали так же на дебиан 9 ispconfig3