« Назад

Целью этой статьи является освещение процесса создания сверхбыстрого веб-сервера, который будет использовать оба протокола передачи данных: как 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:

Phpinfo

 

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

Phpmyadmin 1

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

Если у вас возникли вопросы

СВЯЖИТЕСЬ С НАМИ!

Оставьте свои данные и мы свяжемся
с вами ближайшее время