« Назад

Метою цієї статті є висвітлення процесу створення надшвидкого веб-сервера, який використовуватиме обидва протоколи передачі даних: як http, так і https. Для отримання сертифікатів, як завжди, звертаємось до безкоштовного центру сертифікації Letsencrypt.

Для прискорення відкриття сторінки використаємо кешуючий проксі-сервер Varnish, що слухатиме на 80 порту. Apache буде працювати на порту 8080 та обробляти всі запити, які приходять від Varnish. Nginx оброблятиме усі https-запити (порт 443) та передавати їх до Varnish, тобто виконувати роль проксі-сервера, оскільки безкоштовна версія Varnish не здатна працювати з https.

Покрокова інструкція з налаштування надшвидкого веб-сервера на базі операційної системи Linux Debian 9 (Stretch)

 

Вихідні дані

Сервер з інстальованою операційною системою 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 (enter for none): <-- тиснемо 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>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual 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>
        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to 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 a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally 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 - The 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: "Processes active: 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
Web server to reconfigure automatically: <-- apache2
Configure database for 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 OK
Date: Mon, 19 Aug 2019 09:19:38 GMT
Server: Apache/2.4.25 (Debian)
Last-Modified: 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
        # Possible values include: 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"
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
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                              443 ssl;
    server_name                 webserver.example.com;
    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           Foreign Address         State       User       Inode      PID/Program name
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

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

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

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