НОВОСТИ [Из песочницы] Расширенная настройка web сервера (Nginx + Apache2)

Alvaros
Онлайн
Регистрация
14.05.16
Сообщения
21.452
Реакции
101
Репутация
204
В этом руководстве мы рассмотрим процедуру установки и настройки работы двух 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 `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list


Теперь нужно импортировать официальный ключ, используемый apt для проверки подлинности пакетов:


curl -fsSL | 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 BF62
uid [ 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


Проверим работу веб-сервера. Открываем браузер и вводим в адресной строке сервера».


В итоге мы должны увидеть заголовок «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/build
cd /etc/nginx/build


Узнаем текущую версию nginx:


nginx -v


Скачиваем необходимую версию:


wget -qO - | tar zxfv -


В нашем случае это nginx 1.18


Скачиваем репозиторий с ngx_pagespeed:


git clone

cd ngx_pagespeed/

git checkout tags/latest-stable

cat PSOL_BINARY_URL


Скачиваем папку psol:


psol_url= {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-compat

make

ls objs/*so


Копируем файл ngx_pagespeed.so:


cd objs
cp 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

#
# Listen 443
#

#
# Listen 443
#


мы настроили прослушивание на порту 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


Открываем браузер и вводим в адресную строку сервера»:8080. Мы должны увидеть привычную страницу.


в разделе Server API мы должны увидеть Apache.

Apache2 Real IP



Запросы на apache приходят от NGINX, и они воспринимаются первым как от IP-адреса 127.0.0.1. На практике, это может привести к проблемам, так как некоторым сайтам необходимы реальные адреса посетителей. Для решения проблемы будем использовать модуль remoteip.

Установка



Создаем конфигурационный файл со следующим содержимым:


vi /etc/apache2/mods-available/remoteip.conf

Настройка



Записываем:



RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1/8



Активируем модуль:


a2enmod remoteip


Перезапускаем apache:


systemctl restart apache2


Для проверки настройки открываем браузер и вводим в адресную строку сервера», где откроется наша страница 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 mariadb
systemctl start mariadb


Зададим пароль для пользователя root:


mysqladmin -u root password


Перезапускаем apache2:


systemctl restart apache2


Создаем и настраиваем пользователя:


mysql -uroot -p

mysql> 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/www
chmod -R 775 /var/www/example.com/www


Создаем индексный файл:


vi /var/www/example.com/www/index.php


С содержанием:



Настройка сайта


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 /;
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



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


DirectoryIndex index.php index.html index.htm


var/www/example.com/www>
AllowOverride All
Options Indexes ExecCGI FollowSymLinks
Require all granted



SetEnvIf X-Forwarded-Proto https HTTPS=on



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




Создаем ярлык:


ln -s /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-enabled/example.com.conf

Проверяем



Проверяем корректность настроек конфигурационных файлов:


nginx -t
apachectl configtest


Перезапускаем веб-сервер:


systemctl reload nginx
systemctl 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 /;
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



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


DirectoryIndex index.php index.html index.htm


var/www/example.com/www>
AllowOverride All
Options Indexes ExecCGI FollowSymLinks
Require all granted



SetEnvIf X-Forwarded-Proto https HTTPS=on



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




Создаем ярлык:


ln -s /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-enabled/example.com.conf

Проверяем



Проверяем корректность настроек конфигурационных файлов:


nginx -t
apachectl configtest


Перезапускаем веб-сервер:


systemctl reload nginx
systemctl 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 " " "/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 /;
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 -t
nginx -s reload
 
Сверху Снизу