Step 3 — Disabling Root Login
On MySQL as well as within regular Linux systems, the root account is a special administrative account with unrestricted access to the system. In addition to being a privileged account, it’s a known login name, which makes it an obvious target for brute-force attacks. To minimize risks, we’ll configure phpMyAdmin to deny any login attempts coming from the user root. This way, even if you provide valid credentials for the user root, you’ll still get an “access denied” error and won’t be allowed to log in.
Because we chose to use to configure and store phpMyAdmin settings, the default configuration is currently stored in the database. We’ll need to create a new file to define our custom settings.
Even though the PHP files for phpMyAdmin are located inside , the application uses configuration files located at . We will create a new custom settings file inside , and name it :
The following configuration file contains the necessary settings to disable passwordless logins ( set to ) and root login ( set to ):
/etc/phpmyadmin/conf.d/pma_secure.php
Save the file when you’re done editing by pressing + then to confirm changes and . The changes will apply automatically. If you reload the login page now and try to log in as root, you will get an Access Denied error:
Root login is now prohibited on your phpMyAdmin installation. This security measure will block brute-force scripts from trying to guess the root database password on your server. Moreover, it will enforce the usage of less-privileged MySQL accounts for accessing phpMyAdmin’s web interface, which by itself is an important security practice.
Install Latest Stable Version of phpMyAdmin
Ubuntu 18.04 repository ships with PHP7.2 and phpMyAdmin 4.6.6. You can check your phpMyAdmin version in the browser title bar.
However, . When you use phpMyAdmin 4.6.6 with PHP7.2, you will see the following warning message.
parameter must be an array or an object that implements countable
To fix the compatibility problem, we can install phpMyAdmin 4.8, which is the latest stable version as of this writing. Download it by using .
wget https://files.phpmyadmin.net/phpMyAdmin/4.8.0.1/phpMyAdmin-4.8.0.1-all-languages.zip
Then extract it.
sudo apt install unzip unzip phpMyAdmin-4.8.0.1-all-languages.zip
Back up original phpMyAdmin files.
sudo mv /usr/share/phpmyadmin /usr/share/phpmyadmin-original
Move phpMyadmin 4.8 to directory.
sudo mv phpMyAdmin-4.8.0.1-all-languages /usr/share/phpmyadmin
Edit the vendor config file.
sudo nano /usr/share/phpmyadmin/libraries/vendor_config.php
Find the following line.
define('CONFIG_DIR', '');
Change it to
define('CONFIG_DIR', '/etc/phpmyadmin/');
Save and close the file. Then create the folder to store cache files.
sudo mkdir /usr/share/phpmyadmin/tmp
Change user ownership and group ownership to .
sudo chown www-data:www-data /usr/share/phpmyadmin/tmp
Now you can use phpMyAdmin 4.8 without reloading or restarting Nginx.
Prerequisites
To follow this tutorial, you need to have an Ubuntu 18.04 OS running on your local computer or on a remote server. If you are looking for a VPS (Virtual Private Server), then you can click this special link to get $100 free credit on DigitalOcean. (For new users only). If you are already a DigitalOcean user, then you can click this special link to get $50 free credit on Vultr (for new users only).
It is assumed that you have already installed LEMP stack on Ubuntu 18.04. If not, please check out the following tutorial.
How to Install LEMP stack (Nginx, MariaDB, PHP7.2) on Ubuntu 18.04
With that out of the way, let’s get started with installing phpMyAdmin.
Step 1 — Install phpMyAdmin
With our LEMP platform already in place, we can begin by installing phpMyAdmin, which is available from Ubuntu’s default repositories.
First, we’ll update the server’s local package index to make sure it has a fresh set of references to available packages. Then, we’ll use the packaging tools to pull the software down from the repositories and install it on our system:
During the installation, you will be prompted for some information. It will ask you which web server you would like the software to automatically configure. Since Nginx, the web server we’re using, isn’t one of the available options, you can just hit , and then to bypass this prompt.
The next prompt will ask if you would like to configure a database for phpMyAdmin to use. Select “Yes” to continue. You’ll need to enter the database administrator password that you configured during the MySQL installation to allow these changes.
You will now be asked to choose and confirm a password for the phpMyAdmin application and its database (which will be created in this step). Choose and confirm a secure password and make note of it.
The installation will now complete. For the Nginx web server to find and serve the phpMyAdmin files correctly, we’ll need to create a symbolic link from the installation files to our Nginx document root directory:
Finally, we need to enable the PHP module, which phpMyAdmin relies on. This was installed with phpMyAdmin, so we’ll toggle it on and restart our PHP processor:
With that, our phpMyAdmin installation is now operational. To access the interface, go to your server’s domain name or public IP address followed by in your web browser:
To sign in, use a set of credentials for a valid MySQL user. For example, the user and MySQL administrative password is a good choice to get started. You should then be able to access the administrative interface:
Click around to get familiar with the interface.
In the next two sections, we’ll take steps to secure our new phpMyAdmin web console.
Using a Different Port
Using a different port instead of default port 443 can be advantageous because you can close that port when you are not using phpMyAdmin to prevent hacking activity, or you can specify which IP addresses are allowed to access that port. It’s very simple to configure. Simply open the server block file.
sudo nano /etc/nginx/conf.d/phpmyadmin.conf
Find the following two lines:
listen :443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot
Change 443 to a different port, for example, 8443.
listen :8443 ssl ipv6only=on; # managed by Certbot listen 8443 ssl; # managed by Certbot
You can also add http2 to them like below to enable HTTP/2 protocol.
listen :8443 ssl http2 ipv6only=on; # managed by Certbot listen 8443 ssl http2; # managed by Certbot
Save and close the file. Then test Nginx configurations.
sudo nginx -t
If the test is successful, reload Nginx for the changes to take effect.
sudo systemctl reload nginx
Now you can access phpMyAdmin via:
https://pma.example.com:8443
Step 5 –Testing PHP with Nginx
Your LEMP stack should now be completely set up. You can test it to validate that Nginx can correctly hand files off to your PHP processor.
You can do this by creating a test PHP file in your document root. Open a new file called within your document root in your text editor:
Type or paste the following lines into the new file. This is valid PHP code that will return information about your server:
/var/www/your_domain/info.php
When you are finished, save and close the file by typing + and then and to confirm.
You can now access this page in your web browser by visiting the domain name or public IP address you’ve set up in your Nginx configuration file, followed by :
You will see a web page containing detailed information about your server:
After checking the relevant information about your PHP server through that page, it’s best to remove the file you created as it contains sensitive information about your PHP environment and your Ubuntu server. You can use to remove that file:
You can always regenerate this file if you need it later.
Шаг 4 — Настройка Nginx для работы с обработчиком PHP
Теперь у нас установлены все необходимые компоненты. Единственное, что нам осталось сделать, это настроить Nginx для использования нашего обработчика PHP для отображения динамического контента.
Мы сделаем это на уровне серверных блоков (серверные блоки являются приблизительным аналогом виртуальных хостов в Apache). Откроем серверный блок Nginx сервера по умолчанию командой:
Этот файл должен иметь примерно следующий вид:
/etc/nginx/sites-available/default
- Прежде всего, нам необходимо добавить первым значением директивы , чтобы веб-сервер в первую очередь искал файлы .
- Мы можем изменить директиву для указания доменного имени сервера или его публичного IP адреса.
- Для корректной обработки PHP нам необходимо раскомментировать часть файла, которая отвечает за обработку PHP запросов. Это блок , кусок кода и сокет для работы с .
- Мы также раскомментируем код, отвечающий за работу с файлами . Nginx не обрабатывает эти файлы. Если какие-то из этих файлов окажутся в корневой директории сайта, они не должны быть доступны пользователям.
Изменения, которые необходимо внести в этот файл помечены красным:
/etc/nginx/sites-available/default
После внесения изменений сохраните и закройте файл.
Проверьте ваш файл конфигурации на наличие ошибок командой:
Если в результате обнаружены какие-либо ошибки, откройте файл и исправьте их перед тем, как продолжить.
Когда всё готово, перезапустите Nginx для применения внесённых изменений:
Step 5: Troubleshoot phpMyAdmin Login Error
If you login with MariaDB root account, you may see the following error.
#1698 - Access denied for user 'root '@'localhost'
and
mysqli_real_connect(): (HY000/1698): Access denied for user 'root '@'localhost'
If you login with user , you won’t see the above error. However, user can only be used to administer the database. The cause of the error is that by default MariDB root user is authenticated via the unix_socket plugin, instead of using the plugin. To get around this issue, we can create another admin user and grant all privileges to the new admin user.
Log into MariaDB server from the command line.
sudo mariadb -u root
Create an admin user with password authentication.
create user identified by 'your-chosen-password';
Grant all privileges on all databases.
grant all privileges on *.* to with grant option;
Flush privileges and exit;
flush privileges; exit;
Now you can log into phpMyAdmin with the admin account and manage all databases.
Postfix
В качестве агента MTA мы будем использовать удобный в настройке и надежный Postfix.
Установка, настройка и запуск
Устанавливаем пакет postfix:
apt-get install postfix
Вносим некоторые изменения в настройки:
vi /etc/postfix/main.cf
myorigin = $mydomain
smtp_generic_maps = hash:/etc/postfix/generic_map
* mydomain — домен сервера; myorigin — имя домена, которое будет подставляться всем отправляемым сообщениям без явного указания оного; smtp_generic_maps указывает на карту с общими правилами пересылки.
Открываем карту пересылки:
vi /etc/postfix/generic_map
И добавляем:
@dmosk.local no-reply@dmosk.local
* данной настройкой мы будем подставлять всем отправляемым письмам без поля FROM адрес no-reply@dmosk.local.
Создаем карту:
postmap /etc/postfix/generic_map
Включаем автозапуск почтового сервера и перезапускаем его службу:
systemctl enable postfix
systemctl restart postfix
Корректная отправка
Для того, чтобы сервер мог отправлять сообщения на внешние ящики, необходимо корректно настроить в DNS, как минимум, записи A и PTR.
Для добавления А-записи, необходимо в настройках панели управления нашим доменом создать запись типа. Ее имя и IP-адрес должны соответствовать имени и адресу нашего сервера.
Для создания PTR-записи необходимо написать письмо Интернет-провайдеру, к которому подключен наш сервер. Если наш сервер арендуется у хостинговой компании, необходимо либо написать данное письмо данной хостинговой компании, либо данная возможность может быть предоставлена в панели управления хостинговыми услугами.
Установка NGINX
Устанавливаем NGINX:
apt-get install nginx
Внесем изменение в файл nginx.conf:
vi /etc/nginx/nginx.conf
http {
…
server_names_hash_bucket_size 64;
….
}
* в данном примере мы сняли комментарий со строчки server_names_hash_bucket_size 64;* на практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.
Перезапускаем nginx:
systemctl enable nginx
systemctl restart nginx
* в процессе запуска мы можем увидим ошибку — возможно, в системе работает другой веб-сервер и занимает 80 порт. Как правило, это apache. Чтобы его выключить (на данном этапе он нам не нужен) вводим команду systemctl stop apache2.
Проверим работу веб-сервера. Открываем браузер и вводим в адресной строке http://<IP-адрес сервера>. В итоге мы должны увидеть заголовок «Welcome to nginx!»:
Если стартовая страница не загружается, проверяем состояние сервиса:
systemctl status nginx
Step 2: Install MySQL to Manage Site Data
Now that we have a web server, we need to install MySQL, a database management system, to store and manage the data for our site.
You can install this easily by typing:
You will be asked to supply a root (administrative) password for use within the MySQL system.
The MySQL database software is now installed, but its configuration is not exactly complete yet.
To secure the installation, we can run a simple security script that will ask whether we want to modify some insecure defaults. Begin the script by typing:
You will be asked to enter the password you set for the MySQL root account. Next, you will be asked if you want to configure the .
Warning: Enabling this feature is something of a judgment call. If enabled, passwords which don’t match the specified criteria will be rejected by MySQL with an error. This will cause issues if you use a weak password in conjunction with software which automatically configures MySQL user credentials, such as the Ubuntu packages for phpMyAdmin. It is safe to leave validation disabled, but you should always use strong, unique passwords for database credentials.
Answer y for yes, or anything else to continue without enabling.
If you’ve enabled validation, you’ll be asked to select a level of password validation. Keep in mind that if you enter 2, for the strongest level, you will receive errors when attempting to set any password which does not contain numbers, upper and lowercase letters, and special characters, or which is based on common dictionary words.
If you enabled password validation, you’ll be shown a password strength for the existing root password, and asked you if you want to change that password. If you are happy with your current password, enter n for “no” at the prompt:
For the rest of the questions, you should press Y and hit the Enter key at each prompt. This will remove some anonymous users and the test database, disable remote root logins, and load these new rules so that MySQL immediately respects the changes we have made.
At this point, your database system is now set up and we can move on.
Шаг 6 — Знакомство с важными файлами и директориями Nginx
Теперь вы научились управлять службой Nginx, и настало время познакомиться с несколькими важными директориями и файлами.
Контент
/var/www/html: веб-контент, в состав которого по умолчанию входит только показанная ранее страница Nginx по умолчанию, выводится из директории /var/www/html. Это можно изменить путем изменения файлов конфигурации Nginx.
Конфигурация сервера
- : директория конфигурации Nginx. Здесь хранятся все файлы конфигурации Nginx.
- : основной файл конфигурации Nginx. Его можно изменить для внесения изменений в глобальную конфигурацию Nginx.
- : директория, где могут храниться серверные блоки для каждого сайта. Nginx не будет использовать файлы конфигурации из этой директории, если они не будут связаны с директорией . Обычно конфигурации серверных блоков записываются в эту директорию и активируются посредством ссылки на другую директорию.
- : директория, где хранятся активные серверные блоки каждого узла. Они созданы посредством ссылки на файлы конфигурации в директории .
- : в этой директории содержатся фрагменты конфигурации, которые можно включить в конфигурацию Nginx. Воспроизводимые сегменты конфигурации хорошо подходят для преобразования в сниппеты.
Журналы сервера
- : каждый запрос к вашему веб-серверу регистрируется в этом файле журнала, если Nginx не настроен иначе.
- : любые ошибки Nginx будут регистрироваться в этом журнале.
Языки для фронтенд-разработчиков
Основной стек фронтенд-разработчика — HTML, CSS и JavaScript. HTML (HyperText Markup Language) — это основа разметки веб-страниц. С его помощью создают абзацы, заголовки и гиперссылки, добавляют изображения и другие объекты. HTML-код объясняет браузеру, что отобразить на странице. У каждого элемента есть свой тег, заключённый в скобки.
Вот пример HTML-кода:
HTML — только каркас, в нём нет инструкций о расположении, цветах и поведении элементов
CSS — язык разметки стилей. Он позволяет установить размеры отступов, выбрать нужный шрифт и стиль текста, настроить цвет фона, прозрачность элементов и другие параметры.
Добавим в предыдущий пример CSS-разметку:
CSS-разметка отвечает за то, как страница выглядит в браузере
JavaScript — язык, который помогает создавать всплывающие окна, динамические стили и анимации, делать так, чтобы при нажатии на кнопку отправлялась форма или происходило другое действие.
Пример ниже — скрипт, который меняет цвет текста, если пользователь щёлкнет курсором по абзацу.
Вот как он работает на практике:
Языки HTML, CSS и JavaScript — основной стек для фронтенд-разработчика. Но и бэкендерам тоже нужно в них разбираться, чтобы понимать, как устроен сайт.
Русскоязычные фронтендеры общаются в группе «Типичный верстальщик» и в чате для джуниоров и мидлов.
Шаг 5: настройка серверных блоков
Если вам нужно, чтобы сервер обслуживал больше одного домена, то используйте серверные блоки (то есть блоки server). Эти блоки похожи на виртуальные хосты в Apache. В данном руководстве речь будет идти о домене test.ru, вам нужно вписать вместо него ваш собственный домен.
По умолчанию у nginx на Ubuntu 18.04 включен лишь один серверный блок по умолчанию. Он настроен обслуживать файлы в директории /var/www/html. Это хорошо работает для отдельного сайта, но абсолютно неудобно, если нужно разместить несколько сайтов.
Для начала создайте директорию внутри /var/www для сайта test.ru:
$ sudo mkdir -p /var/www/test.ru/html
/var/www/html останется как директория по умолчанию и будет использоваться в тех случаях, когда клиентский запрос не совпадает ни с одним другим сайтом.
Теперь нужно указать права:
$ sudo chown -R $USER:$USER /var/www/test.ru/html $ sudo chmod -R 755 /var/www/test.ru
Далее создайте пример страницы index.html, используя nano или любой другой редактор:
$ nano /var/www/test.ru/html/index.html
Скопируйте в файл код ниже:
<html> <head> <title>Welcome to Test.ru!</title> </head> <body> <h1>Success! The test.ru server block is working!</h1> </body> </html>
Сохраните и закройте файл.
Для того, чтобы nginx правильно отображал информацию, нужно создать серверный блок с нужными директивами. Вместо редактирования стандартного конфигурационного файла создайте новый в /etc/nginx/sites-available/test.ru:
$ sudo nano /etc/nginx/sites-available/test.ru
Скопируйте туда следующий конфигурационный блок. Он похож на тот, который идет по умолчанию, однако имеет новую директорию (root) и доменное имя (server_name).
server { listen 80; listen :80; root /var/www/test.ru/html; index index.html index.htm index.nginx-debian.html; server_name test.ru www.test.ru; location / { try_files $uri $uri/ =404; } }
Теперь нужно сделать файл доступным, создав ссылку на него в директории sites-enabled:
$ sudo ln -s /etc/nginx/sites-available/test.ru /etc/nginx/sites-enabled/
Теперь два серверных блока включены, настроены и будут использоваться в зависимости от их директив listen и server_name:
- test.ru: отвечает на запросы test.ru и www.test.ru.
- default: отвечает на все остальные запросы порта 80, которые не совпадают с двумя другими блоками.
Для того, чтобы избежать возможной проблемы с хэшем из-за дополнительных серверных имен, необходимо изменить настройки в конфигурационном файле. Откройте его:
$ sudo nano /etc/nginx/nginx.conf
Найдите директиву server_names_hash_bucket_size и раскомментируйте эту строку (уберите символ #):
... http { ... server_names_hash_bucket_size 64; ... } ...
Сохраните и закройте файл.
Теперь нужно убедиться, что в файлах nginx нет синтаксических ошибок:
$ sudo nginx -t
Если все нормально, то перезапустите nginx для того, чтобы изменения вступили в силу:
$ sudo systemctl restart nginx
Теперь nginx должен обслуживать ваше доменное имя. Введите его в браузере. Вы должны увидеть надпись “Success! The test.ru server block is working!”.
Если вы увидели эту надпись, значит, все настроено и работает правильно.
Заказывайте выделенные серверы для своих проектов в компании Timeweb: https://timeweb.com/ru/services/dedicated-server/