Целью этой статьи является освещение процесса создания сверхбыстрого веб-сервера, который будет использовать оба протокола передачи данных: как http, так и https. Для получения сертификатов, как обычно, обращаемся в бесплатный центр сертификации Letsencrypt.
Для ускорения открытия страницы используем кэсирующий прокси-сервер Varnish, который будет слушать на 80 портах. Apache будет работать на порту 8080 и обрабатывать все запросы от Varnish. Nginx будет обрабатывать все https-запросы (порт 443) и передавать их в Varnish, то есть выполнять роль прокси-сервера, поскольку бесплатная версия Varnish не способна работать с https.
Исходные данные
Сервер с установленной операционной системой Linux Debian 9 (Stretch). Доменное имя сервера webserver.example.com, ip-адрес – 192.168.1.100. Все команды в статье будут производиться от имени пользователя root.
1. Установка системы управления базами данных MariaDB и веб-сервера apache2
Установим MariaDB:
# apt install mariadb-server mariadb-client
Запускаем мастер безопасной инсталляции, чтобы сделать систему управления MariaDB максимально надежной:
# mysql_secure_installation
Enter current password for root (включая для нее): <-- жмем return Set root password? [Y/n] <-- y New password: <-- Вводим пароль пользователя root MariaDB Re-enter new password: <-- повторяем пароль Remove anonymous users? [Y/n] <-- y Disallow root login remotely? [Y/n] <-- y Remove test database and access to it? [Y/n] <-- y Reload privilege tables now? [Y/n] <-- y
Устанавливаем веб-сервер apache:
# apt install apache2
2. Установка php 7.3, php7.3-fpm
Привлекаем дополнительный репозиторий, из которого будем устанавливать пакеты php 7.3:
#apt install ca-certificates apt-transport-https debian-archive-keyring #wget -q https://packages.sury.org/php/apt.gpg -O- | sudo apt-key add - #echo "deb https://packages.sury.org/php/ stretch main" | tee /etc/apt/sources.list.d/php.list
Обновим локальный индекс пакетов и установим php 7.3:
#apt update #apt install php7.3
Устанавливаем php7.3-fpm и некоторые другие дополнительные пакеты для php:
#apt install php7.3-mysql php7.3-curl php7.3-gd php7.3-intl php-pear php-imagick php7.3-imap php-memcache php7.3-pspell php7.3-recode php7.3-sqlite3 php7.3-tidy php7.3-xmlrpc php7.3-xsl php-apcu php7.3-fpm
Устанавливаем модуль fcgid для Apache:
#apt install libapache2-mod-fcgid
Редактируем 36-ю строчку файла /etc/php/7.3/fpm/pool.d/www.conf:
#nano /etc/php/7.3/fpm/pool.d/www.conf
listen = 127.0.0.1:9000
И добавляем следующие настройки к файлу /etc/apache2/sites-enabled/000-default.conf:
#nano /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:8080> # ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. В контексте virtual hosts, ServerName # specifies what hostname должен appear in the request's Host: header to # match this virtual host. Для более подробного virtuálnего host (этого файла) это # value не является обязательным, и это используется как последний список host regardless. # However, вы должны установить это для любого нового virtuálnего host explicitly. #ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html <FilesMatch "\.php$"> SetHandler "proxy:fcgi://127.0.0.1:9000/" </FilesMatch> <LocationMatch "/phpfpm-status"> SetHandler "proxy:fcgi://127.0.0.1:9000/" </LocationMatch> # Доступные места: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # Это также можно configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at global level, it is possible to # include a line for only one particular virtual host. Для примера #following line enable CGI configuration for this host only # after it has been global disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf </VirtualHost>
Включаем в apache необходимые модули:
#a2enmod actions fcgid alias proxy_fcgi setenvif
И перезагружаем apache:
#systemctl restart apache2
Проверяем загрузку модуля php7.3-fpm и его работоспособность:
#systemctl status php7.3-fpm
php7.3-fpm.service - PHP 7.3 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2019-08-19 10:41:12 EEST; 47min ago
Docs: man:php-fpm7.3(8)
Main PID: 17354 (php-fpm7.3)
Status: "Активный процесс: 0, idle: 2, Requests: 2836, slow: 0, Traffic: 1req/sec"
Tasks: 3 (limit: 4915)
CGroup: /system.slice/php7.3-fpm.service
├─17354 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
├─17355 php-fpm: pool www
└─17356 php-fpm: pool www
Создаем файл /var/www/html/info.php:
#echo '<?php phpinfo(); ?>' > /var/www/html/info.php
Открываем его в браузере по адресу http://webserver.example.com или http://192.168.1.100/info.php и получаем информацию относительно установленных пакетов php:
3. Phpmyadmin
Phpmyadmin — это веб-интерфейс для системы управления базами данных MariaDB, который значительно упрощает жизнь системного администратора и сверхудобен в использовании. Установим его:
#apt install phpmyadmin
Веб-сервер для изменения автоматически: <-- apache2 Configure database для phpmyadmin with dbconfig-common? <-- Yes MySQL application password for phpmyadmin: <-- Нажмите Enter для создания рандомного пароля
Добавим следующую строку, чтобы пользователь root MariaDB мог заходить в phpmyadmin:
#echo "UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE user = 'root' AND plugin = 'unix_socket';FLUSH PRIVILEGES;" | mysql -u root -p
Phpmyadmin будет доступен по следующей ссылке:
http://webserver.example.com/phpmyadmin или http://192.168.1.100/phpmyadmin
4. Установка и настройка Varnish cache
Добавим необходимый репозиторий:
#curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | sudo apt-key add - #echo "deb https://packagecloud.io/varnishcache/varnish5/debian/ stretch main" > /etc/apt/sources.list.d/varnishcache5.list
Обновим локальный индекс пакетов:
#apt-update
Установим Varnish:
#apt install -y varnish
Изменим порт, на котором будет слушать Varnish, с 6081 на 80:
#nano /lib/systemd/system/varnish.service
ExecStart=/usr/sbin/varnishd -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/ secret -s malloc,256m
Применим изменения:
#systemctl daemon-reload
Указываем Varnish, куда именно необходимо перенаправлять запросы для веб-сервера apache:
#nano /etc/varnish/default.vcl
backend default { .host = "127.0.0.1"; .port = "8080";
И меняем порт, на котором будет слушать apache:
#nano /etc/apache2/ports.conf Listen 8080
#nano /etc/apache2/sites-enabled/000-default.conf <VirtualHost *:8080>
Применяем изменения:
#systemctl restart apache2 #systemctl restart varnish #systemctl enable varnish
Проверяем корректность работы Varnish и Apache:
#curl -I http://127.0.0.1
HTTP/1.1 200 ОК Дата: Mon, 19 Aug 2019 09:19:38 GMT Server: Apache/2.4.25 (Debian) Последние изменения: Mon, 08 Jul 2019 11:25:16 GMT Vary: Accept-Encoding Content-Type: text/html X-Varnish: 703358 Age: 0 Via: 1.1 varnish (Varnish/5.2) Обзор ETag: W/"29cd-58d29b2c79571-gzip" Accept-Ranges: bytes Connection: keep-alive
Следующая команда (q-выход) дает возможность просмотреть статистику по varnish:
#varnishstat
5. Создание сертификата Letsencrypt
Установим необходимые пакеты:
#aptitude install python-certbot-apache
Создадим в apache конфигурационный файл нашего сайта:
#nano /etc/apache2/sites-available/webserver.example.com.conf
<VirtualHost *:8080> ServerAdmin webmaster@localhost ServerName webserver.example.com DocumentRoot /var/www/html/webserver <Directory /var/www/html/webserver> AllowOverride All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log# Полученные значения включают: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn <FilesMatch "\.php$"> SetHandler "proxy:fcgi://127.0.0.1:9000/" </FilesMatch> CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Активируем новый сайт:
#a2ensite /etc/apache2/sites-available/webserver.example.com.conf #systemctl restart apache2
Генерируем сертификат. Но учтите, что для успешной процедуры аутентификации необходимо иметь правильную А-запись на вашем DNS-сервере. В данном случае он должен выглядеть следующим образом: webserver.exampl.com. A 192.168.1.100.
# certbot --authenticator standalone --installer apache -d webserver.example.com --pre-hook "systemctl stop apache2" --post-hook "systemctl start apache2"
Допустить выбор, в котором или не обновляется HTTP Traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
Новые веб-сайты, или если вы не являетесь уверенными в ваших работах на HTTPS. Вы не можете это сделать
change by editing your web server's configuration. <-- выбираем первый вариант
Если наши усилия преуспели — новый сертификат и ключ появятся в папке /etc/letsencrypt/live/webserver.example.com/
Автоматически созданный в apache https-сайт необходимо отключить:
#a2dissite webserver.example.com-le-ssl.conf
как и модуль ssl:
#a2dismod ssl
Применяем изменения:
# systemctl restart apache2
6. Установка и настройка nginx
Установим nginx:
# apt install nginx
Создадим конфигурационный файл /etc/nginx/sites-available/webserver.example.com.conf со следующим содержимым:
#nano /etc/nginx/sites-available/webserver.example.com.conf
server { listen 84 443 ssl; server_name | ssl on; ssl_certificate /etc/letsencrypt/live/webserver.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/webserver.example.com/privkey.pem; location/{ proxy_pass http://127.0.0.1:80; proxy_read_timeout 90; proxy_connect_timeout 90; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Port 443; proxy_set_header Host $host; } }
В разделе location используем proxy_pass для передачи запроса в порт 80, на котором слушает Varnish.
Создадим символическую ссылку в папку enabled, активируя сайт:
#ln -s /etc/nginx/sites-available/webserver.example.com.conf /etc/nginx/sites-enabled/webserver.example.com.conf
Применяем изменения:
#systemctl restart nginx
Проверяем работоспособность сервисов и все ли они запущены:
#netstat -taupen
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address ¦ tcp 0 0 127.0.0.1:6082 0.0.0.0:* LISTEN 0 16735307 2163/varnishd tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 0 16736613 3123/php-fpm: maste tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 108 16724829 3300/mysqld tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 16722631 2163/varnishd tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 0 16719489 2144/apache2 tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 0 440 1420/perl tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 14461 748/sshd tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 0 16731612 3345/nginx: master
После копирования Вашего сайта в директорию /var/www/html/webserver и создания (импортирования) базы данных вы получаете высокопроизводительный веб-сервер. Поздравление!
Компания ООО «ИНФОТЕК.УА» предоставляет профессиональные услуги по обслуживанию компьютеров организаций
30 августа, 2019