Пакет phpmyadmin буду ставить не из исходников, а из дефолтных репозитариев текущего LTS релиза Ubuntu 20.04 Server. Версию php-fpm буду использовать 7.3, т.к. у меня есть ресурс, на котором подрядчики развернули важный сервис компании, и он работает на связке: Ubuntu 20.04 + php7.3-fpm + mysql 8, по-другому, т.е. на более новой версии портал не взлетает, все завязано на версии. А вот чтобы можно было управлять MYSQL базами на сервере нужен Web-интерфейс, в роли него и выступит пакет PhpMyAdmin.

Шаг №1: Обновляем систему в рамках текущего LTS релиза Ubuntu 20.04:

ekzorchik@srv-us2004a:~$ sudo nano /etc/update-manager/release-upgrades
[DEFAULT]
Prompt=never

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора).

ekzorchik@srv-us2004a:~$ sudo rm -Rf /var/lib/apt/lists
ekzorchik@srv-us2004a:~$ sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y
ekzorchik@srv-us2004a:~$ sudo reboot
ekzorchik@srv-us2004a:~$ uname -a && lsb_release -a
Linux srv-us2004a 5.4.0-169-generic #187-Ubuntu SMP Thu Nov 23 14:52:28 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.6 LTS
Release:        20.04
Codename:       focal
ekzorchik@srv-us2004a:~$

Шаг №2: Устанавливаем Locale:

sudo rm -f /etc/localtime
sudo ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
sudo locale-gen en_US.UTF-8
echo "LC_ALL="en_US.UTF-8"" | sudo -s tee /etc/default/locale
echo "LANG="en_US.UTF-8"" | sudo tee -a /etc/default/locale
echo "LANGUAGE="en.US.UTF-8"" | sudo tee -a /etc/default/locale

Шаг №3: Смотрим какая версия пакета php-fpm есть в дефолтных репозитариях Ubuntu 20.04 Server:

ekzorchik@srv-us2004a:~$ apt-cache search php-fpm
php-cgi - server-side, HTML-embedded scripting language (CGI binary) (default)
php-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary) (default)
php7.4-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
ekzorchik@srv-us2004a:~$

так версия 7.4, а мне нужно 7.3 значит будет подключать репозитарии

Шаг №4: Подключаем сторонние репозитарии где присутствует версия 7.3:

ekzorchik@srv-us2004a:~$ sudo add-apt-repository ppa:ondrej/php

или же просто добавляем репозитарий путем самостоятельного редактирования/создания файла:

ekzorchik@srv-us2004a:~$ sudo nano /etc/apt/sources.list.d/ondrej-ubuntu-php-focal.list
deb http://ppa.launchpad.net/ondrej/php/ubuntu focal main
# deb-src http://ppa.launchpad.net/ondrej/php/ubuntu focal main

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора).

ekzorchik@srv-us2004a:~$ sudo apt-get update
ekzorchik@srv-us2004a:~$ apt-cache search php7.3-fpm
php7.3-cgi - server-side, HTML-embedded scripting language (CGI binary)
php7.3-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
ekzorchik@srv-us2004a:~$

Шаг №5: Устанавливаю NGINX + PHP7.3-fpm:

ekzorchik@srv-us2004a:~$ sudo apt-get install -y nginx php7.3-fpm net-tools php7.3 curl
ekzorchik@srv-us2004a:~$ nginx -V
nginx version: nginx/1.18.0 (Ubuntu)
built with OpenSSL 1.1.1f  31 Mar 2020
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-lUTckl/nginx-1.18.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module
ekzorchik@srv-us2004a:~$
ekzorchik@srv-us2004a:~$ sudo a2dismod php*
ekzorchik@srv-us2004a:~$ ls /usr/bin/php
php     php7.3  php8.2
ekzorchik@srv-us2004a:~$ sudo update-alternatives --set php /usr/bin/php7.3
update-alternatives: using /usr/bin/php7.3 to provide /usr/bin/php (php) in manual mode
ekzorchik@srv-us2004a:~$
ekzorchik@srv-us2004a:~$ php -v
PHP 7.3.33-14+ubuntu20.04.1+deb.sury.org+1 (cli) (built: Sep  2 2023 08:02:05) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.33, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.33-14+ubuntu20.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
ekzorchik@srv-us2004a:~$
ekzorchik@srv-us2004a:~$ sudo nano /etc/php/7.3/fpm/php.ini
date.timezone = Europe/Moscow

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора).

ekzorchik@srv-us2004a:~$ sudo nano /etc/php/7.3/cli/php.ini
date.timezone = Europe/Moscow
;cgi.fix_pathinfo=1
cgi.fix_pathinfo=0

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора).

Шаг №6: Производим настройку nginx:

ekzorchik@srv-us2004a:~$ sudo rm -f /var/www/html/index.nginx-debian.html
ekzorchik@srv-us2004a:~$ sudo rm -f /usr/share/nginx/html/index.html
ekzorchik@srv-us2004a:~$ sudo chown -R www-data:www-data /var/www/html/

Шаг №7: Проверяем что скрипты на php работают:

ekzorchik@srv-us2004a:~$ sudo nano /var/www/html/info.php
<?php phpinfo(); ?>;

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора).

Проверяем что скрипты на php работают:

Шаг №8: Устанавливаем mysql-server и назначаем пароль на учетную запись Login:root сервиса MYSQL:

ekzorchik@srv-us2004a:~$ sudo apt-get install -y mysql-server
ekzorchik@srv-us2004a:~$ sudo mysql_secure_installation
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: Набираю на клавиатуре "No"
Skipping password set for root as authentication with auth_socket is used by default.
If you would like to use password authentication instead, this can be done with the "ALTER_USER" command.
See https://dev.mysql.com/doc/refman/8.0/en/alter-user.html#alter-user-password-management for more information.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No): Набираю на клавиатуре клавишу "Y"
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No): Набираю на клавиатуре клавишу "Y"
Success.
By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No): Набираю на клавиатуре клавишу "Y"
 - Dropping test database...
Success.
 - Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No): Набираю на клавиатуре клавишу Y
Success.
All done!
ekzorchik@srv-us2004a:~$
ekzorchik@srv-us2004a:~$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
default-authentication-plugin=mysql_native_password
user            = mysql
bind-address            = 127.0.0.1
mysqlx-bind-address     = 127.0.0.1
key_buffer_size         = 16M
myisam-recover-options  = BACKUP
log_error = /var/log/mysql/error.log
skip-name-resolve = 1
key_buffer_size = 0
innodb_buffer_pool_size = 2G
innodb_log_file_size = 16M
innodb_buffer_pool_instances = 2
skip-log-bin

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора)

Проверяем внесенные изменения в mysqld.cnf на предмет ошибок прежде чем перезапускать сервис:

ekzorchik@srv-us2004a:~$ sudo mysqld --validate-config
ekzorchik@srv-us2004a:~$

вывод пуст, значит ошибок нет, после уже можно перезапускать сервис mysql:

ekzorchik@srv-us2004a:~$ sudo systemctl restart mysql
ekzorchik@srv-us2004a:~$ sudo mysql -u root -e "alter user 'root'@'localhost' identified WITH mysql_native_password BY '712mbddr@';"
ekzorchik@srv-us2004a:~$ sudo mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
ekzorchik@srv-us2004a:~$ sudo mysql -u root -p712mbddr@ -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
ekzorchik@srv-us2004a:~$

Отлично, настроили конфигурационный файл mysql, назначили пароль на учетную запись Login: root сервиса mysql

Шаг №9: Устанавливаю пакет phpmyadmin через который при обращении на URL http://IP&DNS/phpmyadmin можно будет взаимодействовать с базой посредством браузера:

ekzorchik@srv-us2004a:~$ apt-cache show phpmyadmin | grep Version
Version: 4:4.9.5+dfsg1-2
ekzorchik@srv-us2004a:~$ sudo apt-get install -y phpmyadmin

На заметку: Web server to reconfigure automatically: OK (не выбираем ни apache2 ни lighttpd)

Устанавливаю пакет phpmyadmin

  • Configure database for phpmyadmin with dbconfig-common? Yes
  • MySQL application password for phpmyadmin: задаю пароль на phpmyadmin, делаю его отличным от Login: root, к примеру Aa1234567
  • Password confirmation:  Aa1234567

Шаг №10: Отключаю Apache2, т. к. nginx & phpmyadmin висят на одном порту:

ekzorchik@srv-us2004a:~$ sudo systemctl disable apache2.service
Synchronizing state of apache2.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable apache2
Removed /etc/systemd/system/multi-user.target.wants/apache2.service.
ekzorchik@srv-us2004a:~$ sudo systemctl stop apache2.service
ekzorchik@srv-us2004a:~$ sudo systemctl is-active apache
inactive
ekzorchik@srv-us2004a:~$ sudo rm -f /var/www/html/index.html
ekzorchik@srv-us2004a:~$

Шаг №11: Настраиваю, что Webпанель phpmyadmin будет работать по адресу http://IP&DNS/pmaя хочу без использования поддоменов сделать:

ekzorchik@srv-us2004a:~$ sudo chmod -R 775 /usr/share/phpmyadmin/
ekzorchik@srv-us2004a:~$ sudo chown -R root:www-data /usr/share/phpmyadmin/
ekzorchik@srv-us2004a:~$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/pma.conf
ekzorchik@srv-us2004a:~$ sudo unlink /etc/nginx/sites-available/default
ekzorchik@srv-us2004a:~$ sudo rm /etc/nginx/sites-enabled/default
ekzorchik@srv-us2004a:~$ sudo nano /etc/nginx/sites-available/pma.conf
server {
listen 80 default_server;
root /var/www/html;
index index.php;
server_name 172.33.33.124;

location / {
        try_files $uri $uri/ =404;

}

location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
}

location ^~ /pma/ {
        alias /usr/share/phpmyadmin/;
        index index.php index.html;

location ~ /pma(/.*\.php) {
        include fastcgi_params;
        fastcgi_param SERVER_NAME localhost;
        fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin$1;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        fastcgi_index index.php;

}
}
}

После нажимаем Ctrl + O, Enter - Ctrl + X (для выхода из редактора).

ekzorchik@srv-us2004a:~$ sudo ln -s /etc/nginx/sites-available/pma.conf /etc/nginx/sites-enabled/pma.conf
ekzorchik@srv-us2004a:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ekzorchik@srv-us2004a:~$
ekzorchik@srv-us2004a:~$ sudo systemctl restart nginx php7.3-fpm.service mysql

Шаг №12: Проверяю, что получаю страницу авторизации PhpMyAdmin через консоль:

ekzorchik@srv-us2004a:~$ curl http://172.33.33.124/pma/index.php -v
*   Trying 172.33.33.124:80...
* TCP_NODELAY set
* Connected to 172.33.33.124 (172.33.33.124) port 80 (#0)
> GET /pma/index.php HTTP/1.1
> Host: 172.33.33.124
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 500 Internal Server Error
< Server: nginx/1.18.0 (Ubuntu)
< Date: Thu, 28 Dec 2023 08:01:22 GMT
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
<
* Connection #0 to host 172.33.33.124 left intact
ekzorchik@srv-us2004a:~$
Разбираюсь
ekzorchik@srv-us2004a:~$ sudo tail -f /var/log/nginx/error.log
#0 /usr/share/phpmyadmin/libraries/classes/Url.php(206): PhpMyAdmin\Url::getArgSeparator()
#1 /usr/share/phpmyadmin/libraries/classes/Url.php(169): PhpMyAdmin\Url::getCommonRaw(Array, '?')
#2 /usr/share/phpmyadmin/libraries/classes/Core.php(749): PhpMyAdmin\Url::getCommon(Array)
#3 /usr/share/phpmyadmin/libraries/classes/Core.php(330): PhpMyAdmin\Core::linkURL('https://secure....')
#4 /usr/share/phpmyadmin/libraries/classes/Core.php(353): PhpMyAdmin\Core::getPHPDocLink('book.mbstring.p...')
#5 /usr/share/phpmyadmin/libraries/classes/Core.php(973): PhpMyAdmin\Core::warnMissingExtension('mbstring')
#6 /usr/share/phpmyadmin/libraries/common.inc.php(106): PhpMyAdmin\Core::checkExtensions()
#7 /usr/share/phpmyadmin/index.php(27): require_once('/usr/share/phpm...')
#8 {main}
  thrown in /usr/share/phpmyadmin/libraries/classes/Url.php on line" while reading response header from upstream, client: 172.33.33.124, server: 172.33.33.124, request: "GET /pma/index.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.3-fpm.sock:", host: "172.33.33.124"
ekzorchik@srv-us2004a:~$ sudo apt-get install php7.3-mbstring
ekzorchik@srv-us2004a:~$ sudo systemctl restart nginx php7.3-fpm.service mysql

и после выполнив запрос через curl я увидел на консоль какой-то html код, проверяю через Web-интерфейс что вижу страницу авторизации:

phpMyAdmn - ошибка

Расширение mysqli не найдено. Пожалуйста, проверьте ваши настройки PHP.

Расширение mysqli не найдено. Пожалуйста, проверьте ваши настройки PHP.

ekzorchik@srv-us2004a:~$ apt-cache search php7.3-mysqli
php7.3-mysql - MySQL module for PHP
ekzorchik@srv-us2004a:~$ sudo apt-get install -y php7.3-mysql

После нажал "F5" в браузере, и я увидел страницу авторизацию в phpMyAdmin:

После нажал "F5" в браузере, и я увидел страницу авторизацию в phpMyAdmin:

Пробую авторизоваться:

  • Пользователь: root
  • Пароль: 712mbddr@

Пробую авторизоваться в phpMyAdmin: Login: root Pass: 712mbddr@

и нажимаю "Вперед", после чего вижу, как провалился в интерфейс администрирования управления:

Вижу, как провалился в интерфейс администрирования управления

Итого, я сделал себе пошаговую заметку и опираясь на нее применил ее к боевой VPS системе компании где, как и говорил в самом начале подрядчики перенесли сервис с хостинга DataLine на AdminVPS.

На этом пока все, с уважением автор блога Олло Александр aka ekzorchik.