Метою цієї статті є висвітлення процесу створення надшвидкого веб-сервера, який використовуватиме обидва протоколи передачі даних: як 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 та створення (імпортування) бази даних – ви отримуєте високопродуктивний веб-сервер. Вітання!
Компанія ТОВ “ІНФОТЕК.УА” надає професійні послуги з обслуговування комп’ютерів організацій
Покрокова інструкція з налаштування надшвидкого веб-сервера на базі операційної системи Linux Debian 9 (Stretch)
August 30, 2019