Русский
Русский
English
Статистика
Реклама

Web сервера nginx + apache2

Из песочницы Расширенная настройка web сервера (Nginx Apache2)

01.07.2020 18:14:54 | Автор: admin

В этом руководстве мы рассмотрим процедуру установки и настройки работы двух 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
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru