В этом руководстве мы рассмотрим процедуру установки и настройки
работы двух web-серверов с целью использования преимуществ каждого
из них, где Nginx как frontend и Apache как backend.
В этой статье будет идти речь идти речь о настройки сервера с
использованием следующих технологиях: Apache2, Nginx,
ngx_pagespeed, PHP, PHP-FPM, MariaDB и MemCached.
Nginx
HTTP-сервер и обратный прокси-сервер, почтовый прокси-сервер, а также TCP/UDP прокси-сервер общего назначения.
Установка
Установите пакеты, необходимые для подключения apt-репозитория:
sudo apt install curl gnupg2 ca-certificates lsb-release
Для подключения apt-репозитория для стабильной версии nginx, выполните следующую команду:
echo "deb http://nginx.org/packages/debian `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list
Теперь нужно импортировать официальный ключ, используемый apt для проверки подлинности пакетов:
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
Проверьте, верный ли ключ был импортирован:
sudo apt-key fingerprint ABF5BD827BD9BF62
Вывод команды должен содержать полный отпечаток ключа 573B
FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
:
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62uid [ unknown] nginx signing key
Чтобы установить nginx, выполните следующие команды:
sudo apt update && sudo apt install nginx
Настройка
Запускаем nginx
systemctl enable nginx && systemctl start nginx
Проверяем, что пользователь nginx user
www-data
:
vi /etc/nginx/nginx.conf
Проверим работу веб-сервера. Открываем браузер и вводим в адресной строке http://IP-адрес сервера.
В итоге мы должны увидеть заголовок Welcome to nginx!.
PHP-FPM
FastCGI протоколу взаимодействия веб-сервера с программами. FPM расшифровывается как Fastcgi Process Manager.
Установка
Устанавливаем PHP-FPM:
apt-get install php-fpm
Настройка
Разрешаем автозапуск php-fpm и запускаем его:
systemctl enable php7.3-fpm && systemctl start php7.3-fpm
Обратите внимание, что мы запустили php-fpm версии 7.2. Но установлена может быть и другая версия ее можно узнать по версии php командой php -v.
ngx_pagespeed
ngx_pagespeed (или просто pagespeed) это модуль Nginx, предназначенный для автоматической оптимизации работы сайта путём сокращения времени загрузки сайта в браузере. Дополнительную информацию о модуле можно найти на официальном сайте.
Установка
Устанавливаем необходимые пакеты:
sudo apt-get install unzip gcc make g++ libpcre3-dev zlib1g-dev build-essential libpcre3 uuid-dev
Настройка
Создаем и переходим в папку, в которой будем собирать
ngx_pagespeed
:
mkdir /etc/nginx/buildcd /etc/nginx/build
Узнаем текущую версию nginx:
nginx -v
Скачиваем необходимую версию:
wget -qO - http://nginx.org/download/nginx-1.18.0.tar.gz | tar zxfv -
В нашем случае это nginx 1.18
Скачиваем репозиторий с ngx_pagespeed
:
git clone https://github.com/pagespeed/ngx_pagespeed.gitcd ngx_pagespeed/git checkout tags/latest-stablecat PSOL_BINARY_URL
Скачиваем папку psol:
psol_url=https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}.tar.gz [ -e scripts/format_binary_url.sh ] && psol_url=$(scripts/format_binary_url.sh PSOL_BINARY_URL)wget ${psol_url}tar zxf 1.13.35.2-x64.tar.gz
Собираем файл ngx_pagespeed.so
:
cd ../nginx-1.18.0/./configure --add-dynamic-module=../ngx_pagespeed --with-compatmakels objs/*so
Копируем файл ngx_pagespeed.so
:
cd objscp ngx_pagespeed.so /etc/nginx/modules
Apache2
Для поддержки файла .htaccess, который используется многими сайтами, необходимо установить и настроить веб-сервер Apache.
Установка
Устанавливаем apache и модуль для php:
apt-get install apache2 libapache2-mod-php
Настройка
Заходим в настройки портов:
vi /etc/apache2/ports.conf
И редактируем следующее:
Listen 127.0.0.1:8080# <IfModule ssl_module># Listen 443# </IfModule># <IfModule mod_gnutls.c># Listen 443# </IfModule>
мы настроили прослушивание на порту 8080, так как на 80 уже работает NGINX. Также мы закомментировали прослушивание по 443, так как и он будет слушаться NGINX.
Запрещаем mpm_event:
a2dismod mpm_event
по умолчанию, apache2 может быть установлен с модулем мультипроцессовой обработки mpm_event. Данный модуль не поддерживает php 7 и выше.
Разрешаем модуль мультипроцессовой обработки
mpm_prefork
:
a2enmod mpm_prefork
Разрешаем модуль php
:
a2enmod php7.3
Разрешаем модуль rewrite
:
a2enmod rewrite
Разрешаем модуль setenvif
:
a2enmod setenvif
Разрешаем автозапуск и запускаем службу:
systemctl enable apache2 && systemctl start apache2
Открываем браузер и вводим в адресную строку http://IP-адрес сервера:8080. Мы должны увидеть привычную страницу.
в разделе Server API мы должны увидеть Apache.
Apache2 Real IP
Запросы на apache приходят от NGINX, и они воспринимаются первым как от IP-адреса 127.0.0.1. На практике, это может привести к проблемам, так как некоторым сайтам необходимы реальные адреса посетителей. Для решения проблемы будем использовать модуль remoteip.
Установка
Создаем конфигурационный файл со следующим содержимым:
vi /etc/apache2/mods-available/remoteip.conf
Настройка
Записываем:
<IfModule remoteip_module> RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 127.0.0.1/8</IfModule>
Активируем модуль:
a2enmod remoteip
Перезапускаем apache:
systemctl restart apache2
Для проверки настройки открываем браузер и вводим в адресную строку http://IP-адрес сервера, где откроется наша страница phpinfo.
В разделе Apache Environment мы должны увидеть внешний адрес компьютера, с которого обращаемся к серверу в опции REMOTE_ADDR.
PHP
Устанавливаем необходимые библиотеки для PHP и PHP-FPM:
apt install php-xml php-intl php-gd php-curl php-zip php-mbstring php-bcmath php-bz2 php-cgi php-cli php-common php-dba php-dev php-enchant php-gmp php-imap php-interbase php-json php-ldap php-odbc php-opcache php-phpdbg php-pspell php-readline php-recode php-sybase php-tidy php-xmlrpc php-xsl
Mysql (Mariadb)
Установка
Установим MariaDB:
apt-get install mariadb-server php-mysql php-mysqli
Настройка
Разрешаем автозапуск и запускаем СУБД:
systemctl enable mariadbsystemctl start mariadb
Зададим пароль для пользователя root:
mysqladmin -u root password
Перезапускаем apache2:
systemctl restart apache2
Создаем и настраиваем пользователя:
mysql -uroot -pmysql> GRANT ALL PRIVILEGES ON *.* TO 'dbuser'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;# ALL PRIVILEGES: предоставляет полные права на использование данных.# *.* : права предоставляются на все базы и все таблицы.# dbuser: имя учетной записи.# localhost: доступ для учетной записи будет предоставлен только с локального компьютера.# password: пароль, который будет задан пользователю.# WITH GRANT OPTION: будут предоставлены дополнительные права на изменение структуры баз и таблиц.
Настраиваем возможность входа в adminer.php
> update user set plugin='' where User='root';> flush privileges;> exit
Перезапускаем:
sudo systemctl restart mariadb.service
Memcached
Memcached Программное обеспечение, реализующее сервис кэширования данных в оперативной памяти на основе хеш-таблицы.
Установка
Для начала, выполняем установку пакетов:
apt-get install memcached php-memcached
Настройка
После разрешаем автозапуск и запускаем сервис кэширования:
systemctl enable memcached && systemctl start memcached
Перезапускаем apache2:
systemctl restart apache2
Для проверки, что модуль memcached появился в PHP, открываем наш сайт в браузере в phpinfo должна появиться новая секция Memcached.
Доступы и настройка находится в файле
memcached.conf
:
vi /etc/memcached.conf
Проверяем работу:
netstat -tap | grep memcached
Настройка пользователя
Создаем пользователя:
adduser dev
Добавляем пользователя в группу www-data
:
adduser dev www-data
Даем права sudo
пользователю:
usermod -aG sudo dev
Настройка сайта
Создаем каталог для сайта
Создаем каталог:
mkdir -p /var/www/example.com/{www,tmp}mkdir -p /var/www/example.com/log/{nginx,apache}
Задаем права на папки:
chown -R www-data:www-data /var/www/example.com/wwwchmod -R 775 /var/www/example.com/www
Создаем индексный файл:
vi /var/www/example.com/www/index.php
С содержанием:
<?php phpinfo(); ?>
Настройка сайта
Nginx http
server { listen 80; server_name example.com; set $root_path /var/www/example.com/www; access_log /var/www/example.com/log/nginx/access_log; error_log /var/www/example.com/log/nginx/error_log; root $root_path; gzip on; gzip_disable "msie6"; gzip_min_length 1000; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss; location / { location ~ [^/]\.ph(p\d*|tml)$ { try_files /does_not_exists @fallback; } location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ { try_files $uri $uri/ @fallback; } location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ { expires 7d; access_log off; } location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ { add_header Access-Control-Allow-Origin "*"; expires 7d; access_log off; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; } location / { try_files /does_not_exists @fallback; } } # Если используется PHP location @fallback { proxy_pass http://127.0.0.1:8080; proxy_redirect http://127.0.0.1:8080 /; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; access_log off; } # Если используется PHP-FPM location @fallback { index index.php index.html index.htm; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name; include fastcgi_params; fastcgi_param DOCUMENT_ROOT $root_path; }}
Создаем ярлык:
ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com
Все запросы будут переводится на локальный сервер по порту 8080, на котором работает apache, кроме обращений к статическим файлам (jpg, png, css и так далее).
apache2
Создаем файл:
vi /etc/apache2/sites-available/example.com.conf
<VirtualHost 127.0.0.1:8080> Define root_domain example.com Define root_path /var/www/example.com ServerName ${root_domain} ServerAlias www.${root_domain} DocumentRoot ${root_path}/www ErrorLog ${root_path}/log/apache/error_log TransferLog ${root_path}/log/apache/access_log <IfModule mod_dir.c> DirectoryIndex index.php index.html index.htm </IfModule> <Directory /var/www/example.com/www> AllowOverride All Options Indexes ExecCGI FollowSymLinks Require all granted </Directory> <IfModule setenvif_module> SetEnvIf X-Forwarded-Proto https HTTPS=on </IfModule> <IfModule php7_module> php_admin_value upload_tmp_dir ${root_path}/tmp php_admin_value doc_root ${root_path} php_value open_basedir ${root_path}:/usr/local/share/smarty:/usr/local/share/pear php_value post_max_size 512M php_value upload_max_filesize 512M php_flag short_open_tag On </IfModule></VirtualHost>
Создаем ярлык:
ln -s /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-enabled/example.com.conf
Проверяем
Проверяем корректность настроек конфигурационных файлов:
nginx -tapachectl configtest
Перезапускаем веб-сервер:
systemctl reload nginxsystemctl reload apache2
https (Существующий Сертификат)
Создаем файл:
vi /etc/nginx/conf.d/example.com.conf
# Устанавливается только на главный домен, чтобы шел редирект с ip на главный домен.server { listen 80; server_name Ваш_ip; return 301 https://example.com$request_uri;}server { listen 443 ssl; ssl on; ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/cert.key; server_name example.com; set $root_path /var/www/example.com/www; access_log /var/www/example.com/log/nginx/access_log; error_log /var/www/example.com/log/nginx/error_log; gzip on; gzip_disable "msie6"; gzip_min_length 1000; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss root $root_path; location / { location ~ [^/]\.ph(p\d*|tml)$ { try_files /does_not_exists @fallback; } location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ { try_files $uri $uri/ @fallback; } location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ { expires 7d; access_log off; } location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ { add_header Access-Control-Allow-Origin "*"; expires 7d; access_log off; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; } location / { try_files /does_not_exists @fallback; } } # Если используется PHP location @fallback { proxy_pass http://127.0.0.1:8080; proxy_redirect http://127.0.0.1:8080 /; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; access_log off; } # Если используется PHP-FPM location @fallback { index index.php index.html index.htm; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name; include fastcgi_params; fastcgi_param DOCUMENT_ROOT $root_path; }}
Все запросы будут переводится на локальный сервер по порту 8080, на котором работает apache, кроме обращений к статическим файлам (jpg, png, css и так далее).
Apache2
Создаем файл:
vi /etc/apache2/sites-available/example.com.conf
<VirtualHost 127.0.0.1:8080> Define root_domain example.com Define root_path /var/www/example.com ServerName ${root_domain} ServerAlias www.${root_domain} DocumentRoot ${root_path}/www ErrorLog ${root_path}/log/apache/error_log TransferLog ${root_path}/log/apache/access_log <IfModule mod_dir.c> DirectoryIndex index.php index.html index.htm </IfModule> <Directory /var/www/example.com/www> AllowOverride All Options Indexes ExecCGI FollowSymLinks Require all granted </Directory> <IfModule setenvif_module> SetEnvIf X-Forwarded-Proto https HTTPS=on </IfModule> <IfModule php7_module> php_admin_value upload_tmp_dir ${root_path}/tmp php_admin_value doc_root ${root_path} php_value open_basedir ${root_path}:/usr/local/share/smarty:/usr/local/share/pear php_value post_max_size 512M php_value upload_max_filesize 512M php_flag short_open_tag On </IfModule></VirtualHost>
Создаем ярлык:
ln -s /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-enabled/example.com.conf
Проверяем
Проверяем корректность настроек конфигурационных файлов:
nginx -tapachectl configtest
Перезапускаем веб-сервер:
systemctl reload nginxsystemctl reload apache2
ngx_pagespeed on
Загрузка динамического модуля PageSpeed
Откройте файл nginx.conf
:
vi /etc/nginx/nginx.conf
Добавляем в начало:
load_module modules/ngx_pagespeed.so;
Настраивается PageSpeed в http
контексте, поэтому
поместите эти директивы в новый файл конфигурации под названием
example.com.conf
в файле
/etc/nginx/conf.d
каталог.
# Максимальный размер кэшаpagespeed MessageBufferSize 10240;# Путь к каталогу кэшаpagespeed FileCachePath /var/cache/nginx_pagespeed;server { listen 80; server_name example.com; set $root_path /var/www/example.com/www; # запуск pagespeed pagespeed on; root $root_path; # Адрес и директория сайта pagespeed LoadFromFile "http://www.example.com" "/var/www/example.com/www"; access_log /var/www/example.com/log/nginx/access_log; error_log /var/www/example.com/log/nginx/error_log; # Настройки фильтров pagespeed RewriteLevel CoreFilters; pagespeed EnableFilters collapse_whitespace,remove_comments; pagespeed DisableFilters rewrite_images; gzip on; gzip_disable "msie6"; gzip_min_length 1000; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss; location / { location ~ [^/]\.ph(p\d*|tml)$ { try_files /does_not_exists @fallback; } location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ { try_files $uri $uri/ @fallback; } location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ { expires 7d; access_log off; } location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ { add_header Access-Control-Allow-Origin "*"; expires 7d; access_log off; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; } location / { try_files /does_not_exists @fallback; } # правила обработки адресов location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; } location ~ "^/pagespeed_static/" { } location ~ "^/ngx_pagespeed_beacon$" { } } # Если используется PHP location @fallback { proxy_pass http://127.0.0.1:8080; proxy_redirect http://127.0.0.1:8080 /; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; access_log off; } # Если используется PHP-FPM location @fallback { index index.php index.html index.htm; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name; include fastcgi_params; fastcgi_param DOCUMENT_ROOT $root_path; }}
Создаем папку для хранения кэша:
mkdir /var/cache/nginx_pagespeed/chown www-data:www-data /var/cache/nginx_pagespeed/
Проверяем конфигурацию Nginx и применяем настройки:
nginx -tnginx -s reload