Настройка связки Nginx и Apache в Ubuntu 16.04

Настройка Nginx и Apache в Ubuntu 16.04

nginx-apache

Связка двух веб-серверов, один из которых выполняет функцию фронтенда (Nginx), другой — бэкенда (Apache 2), предназначена для снижения общей нагрузки на сервер. Достигается это за счет того, что более легкий и не обремененный дополнительным функционалом Nginx первым принимает все запросы пользователей. Он самостоятельно выдает по запросам статический контент (изображения, html-файлы, javascript-скрипты..), не озадачивая этой функцией тяжеловесный Apache, который, в свою очередь, обрабатывает динамический контент. Apache не работает напрямую с пользователем, все их запросы проксируются Nginx, и ему же возвращаются ответы. Так достигается разделение труда: Nginx освобождает Apache от необходимости “общаться” с множеством пользователей и обрабатывать запросы на статику, которая составляет большую часть исходящего трафика. Apache не создает множества дочерних процессов, потребляющих оперативную память.

Данная связка часто применяется для обеспечения работы крупных ресурсов с большой посещаемостью. Для ресурсов с маленькой посещаемостью такая связка не даст ощутимого прироста производительности.

Установка Nginx

Для начала посмотрим версию nginx в репозиториях Ubuntu:

sudo apt-cache show nginx | grep -i version

Для установки пакета в ОС Debian или Ubuntu достаточно выполнить команду в консоли:

sudo apt install nginx

Но если Вам нужна более свежая версия, то необходимо подключить репозиторий разработчика. Набираем в терминале:

sudo touch /etc/apt/sources.list.d/nginx.list

Откроем файл на редактирование:

sudo nano /etc/apt/sorces.list.d/nginx.list

И добавим такие строки для Ubuntu:

deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx

Для Debian:

deb http://nginx.org/packages/mainline/debian/ codename nginx
deb-src http://nginx.org/packages/mainline/debian/ codename nginx

Сохраняем (ctrl+O) и выходим (ctrl+x).

Скачиваем публичный ключ:

cd && wget wget http://nginx.org/keys/nginx_signing.key

И добавляем его в систему:

sudo apt-key add nginx_signing.key

Теперь нужно обновить систему и установить последнюю версию nginx:

sudo apt update && sudo apt install nginx

Установка Apache

Ставится Apache тоже очень просто, набираем в консоли:

sudo apt install apache

Настройка Apache

После установке apache перейдем к его настройке. Откроем конфигурационный файл:

sudo nano /etc/apache2/apache2.conf

Что бы при перезагрузке Apache не выдавал ошибку добавим в начале файла секцию:

ServerName 127.0.1.1

А также секцию directory,  если конечно Вы решили разместить свой сайт в нестандартной директории (например в директории /home/www/html). Добавляем либо до, либо после предыдущих секций directory

<Directory /home/www/html>
 Options Indexes FollowSymLinks
 AllowOverride None
 Require all granted
</Directory>

Далее открываем файл ports.conf командой:

sudo nano /etc/apache2/ports.conf

И меняем порт 80 например на 8080, а порт 443 на порт 444. Вот как у меня:

Listen 8080

<IfModule ssl_module>
        Listen 444
</IfModule>

<IfModule mod_gnutls.c>
        Listen 444
</IfModule>

Далее добавляем конфигурационный файл своего сайта командой если он у Вас без поддержки SSL:

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/ваш_сайт.conf

если же планируете построить сайт на протоколе https, то добавьте еще и файл командой:

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/ваш_сайт-ssl.conf

Откроем файл на редактирование. В первом случае

sudo nano /etc/apache2/sites-available/ваш_сайт.conf

И внесем изменения как у меня:

<VirtualHost *:8080>
        ServerName ваш_сайт.ru
        ServerAlias www.ваш_сайт.ru *.ваш_сайт.ru
        ServerAdmin webmaster@ваш_сайт.ru
        #Redirect / https://ваш_сайт.ru/ # Раскомментируйте строку если Ваш сайт будет с поддержкой SSL
        <Directory /home/www/html/ваш_сайт.ru/>
        AllowOverride All
        </Directory>

        DocumentRoot /home/www/html/ваш_сайт.ru
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Во втором случае с поддержкой SSL раскомментируйте в первом варианте директиву Redirect и открываем второй файл на редактирование

sudo nano /etc/apache2/sites-available/ваш_сайт-ssl.conf

И внесем изменения:

<IfModule mod_ssl.c>
        <VirtualHost *:444>
                ServerName ваш_сайт.ru
                ServerAdmin webmaster@ваш_сайт.ru
                ServerAlias *.ваш_сайт.ru
                DocumentRoot /home/www/html/ваш_сайт.ru

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on
                SSLProtocol all -SSLv2

                SSLCertificateFile      /etc/apache2/ssl/ваш_сайт.crt
                SSLCertificateKeyFile /etc/apache2/ssl/ваш_сайт.key
                SSLCACertificateFile /etc/apache2/ssl/ca.crt
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /home/www/html/ваш_сайт.ru/>
                                SSLOptions +StdEnvVars
                                Options Indexes FollowSymLinks MultiViews
                                AllowOverride All
                                Order allow,deny
                                allow from all
                </Directory>

        </VirtualHost>

Как приобрести SSL сертификаты в этой статье я описывать не буду

Настройка Nginx

Пришло время отредактировать конфиг nginx. Набираем в терминале:

sudo nano /etc/nginx/nginx.conf

Приводим его к следующему виду:

user nginx;
error_log /var/log/nginx/error.log debug;
pid /var/run/nginx.pid;
worker_rlimit_nofile 80000;

events {
worker_connections 2048;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main ‘$remote_addr – $remote_user [$time_local] $status ‘
‘»$request» $body_bytes_sent «$http_referer» ‘
‘»$http_user_agent» «http_x_forwarded_for»‘;
access_log /var/log/nginx/access.log main;

# немного тюнинга
sendfile on;
tcp_nopush on;
server_tokens off;
keepalive_timeout 65;

# включим сжатие данных до отправки
gzip on;
gzip_static on;
gzip_vary on;
gzip_min_length 1100;
gzip_buffers 64 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_proxied any;
gzip_types text/plain application/xml application/x-javascript text/javascript text/css text/xml application/xml+rss application/json;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

# Подключаем директорию для всех наших конфигов
include /etc/nginx/conf.d/*.conf;
}

Далее в директории conf.d создадим конфигурационный файл нашего сайта без поддержи SSL

sudo touch /etc/nginx/conf.d/ваш_сайт.conf

Содержимое файла

server {
        listen       *:80;
        server_name  ваш_сайт.ru www.ваш_сайт.ru;
        server_name_in_redirect off;
        access_log  /var/log/nginx/host.access.log  main;

        location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|js)$ {
        root /home/www/html/ваш_сайт.ru;
        index  index.php;
        }

        location / {
        proxy_pass   http://127.0.0.1:8080;
        }

        location ~ /\.ht {
        deny  all;
        }
}

И с поддержкой SSl

sudo touch /etc/nginx/conf.d/ваш_сайт-ssl.conf

Содержимое файла

upstream websocket {
  server ваш_сайт.ru:444;
}

server {
        listen  *:443;
        server_name ваш_сайт.ru *.ваш_сайт.ru;
        access_log  /var/log/nginx/host.access.log  main;

        location / {
        proxy_pass   https://127.0.0.1:444;
        }

        location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|js)$ {
        root /home/www/html/ваш_сайт.ru;
        index  index.php index.html;
        }

        location ~ /\.ht {
        deny  all;
        }

        ssl on;
        ssl_certificate /etc/nginx/ssl/ваш_сайт.crt;
        ssl_certificate_key /etc/nginx/ssl/ваш_сайт.key;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
        ssl_prefer_server_ciphers on;

        # see http://nginx.com/blog/improve-seo-https-nginx/
        ssl_session_cache shared:SSL:100m;
        ssl_session_timeout 12h;
}

Также создадим еще один файл назовем его proxy.conf

sudo touch /etc/nginx/conf.d/proxy.conf

Открываем и редактируем как у меня:

sudo nano /etc/nginx/conf.d/proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 32k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

Установка модуля RPAF

Т.к. теперь все запросы к Apache приходят не от удалённых клиентов, а от Nginx, то в итоге IP-адрес клиента Apache определяет как локальный (127.0.0.1). Для решения этой проблемы нам нужен модуль RPAF. Он берет тело заголовка X-Forwarded-For, присланного от фронтенда (Nginx) и заменяет значение заголовка REMOTE_ADDR на бекенде (Apache).

sudo apt install libapache2-mod-rpaf && a2enmod rpaf

Настройка модуля RPAF

Файл конфигурации RPAF находится по пути /etc/apache2/mods-enabled/rpaf.conf Откроем его:

sudo nano /etc/apache2/mods-enabled/rpaf.conf

Он должен содержать следующие строки:

RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1
RPAFheader X-Real-IP

Ну все теперь остается только перезапустить наш apache и nginx

sudo /etc/init.d/apache2 restart && sudo /etc/init.d/nginx restart

Теперь Nginx работает как фронтенд, а Apache как бэкенд.

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Настройка связки Nginx и Apache в Ubuntu 16.04
5 (100%) 2 votes

15
Оставить комментарий

avatar
10 Цепочка комментария
5 Ответы по цепочке
0 Последователи
 
Популярнейший комментарий
Цепочка актуального комментария
5 Авторы комментариев
анонимSYSadminГостьВасилийMitai Авторы недавних комментариев
  Подписаться  
новее старее большинство голосов
Уведомление о
аноним
Гость
аноним

При отправке комментарий, после настройки приходят не верные ip адреса отправителя. Что делать? Помогите

Гость
Гость
Гость

Полезная статья. Спасибо!
Только вот в четвертом скрипте у Вас две опечатки:
sudo nano /etc/apt/sorces.list.d/nginix.list
надо
sudo nano /etc/apt/sources.list.d/nginx.list

Василий
Гость

Здравствуйте, попытался настроить по Вашему мануалу, обычные хосты (без SSL) работают без проблем.
Но как только я хочу сделать SSL для одного из своих сайтов, у меня nginx выдаёт ошибку.
502 Bad Gateway.
Остальные сайты работают без проблем, и сервисы nginx и apache стартуют успешно.
В логах очень много информации и не очень понятно что именно смотреть.

Mitai
Гость
Mitai

а если это делается на локалке, нужно что то писать в фаил хост? и это можно не делать? a2ensite

Mitai
Гость
Mitai

E: Для пакета «apache» не найден кандидат на установку
нужно добавить 2?
sudo apt install apache2 — вот так устанавливается, без двойки нет

Mitai
Гость
Mitai

systemctl status nginx.service ● nginx.service — LSB: Stop/start nginx Loaded: loaded (/etc/init.d/nginx; bad; vendor preset: enabled) Active: failed (Result: exit-code) since Ср 2017-03-01 22:45:01 +05; 1min 26s ago Docs: man:systemd-sysv-generator(8) Process: 5817 ExecStop=/etc/init.d/nginx stop (code=exited, status=0/SUCCESS) Process: 5869 ExecStart=/etc/init.d/nginx start (code=exited, status=1/FAILURE) мар 01 22:45:01 Linux systemd[1]: Starting LSB: Stop/start nginx… мар 01 22:45:01 Linux nginx[5869]: nginx: [emerg] «client_max_body_size» directive… Подробнее »

Mitai
Гость
Mitai

sudo /etc/init.d/nginx restart
[….] Restarting nginx (via systemctl): nginx.serviceJob for nginx.service failed because the control process exited with error code. See «systemctl status nginx.service» and «journalctl -xe» for details.
failed!

Mitai
Гость
Mitai

https://interface31.ru/tech_it/2016/08/nastraivaem-veb-server-nginx-kak-front-end-k-apache.html
делал по этой статье ни чего не вышло вместо сайта показывает страницу nginx. щас буду пробовать по вашей статье)

Mitai
Гость
Mitai

Добавим в него секцию: ServerName 127.0.1.1
Было бы не плохо еще указать куда именно добавим в начало файла или мб по середине, или лучше это делать в самом конце?

Mitai
Гость
Mitai

Пакет apache недоступен, но упомянут в списке зависимостей другого пакета.
Это может означать, что пакет отсутствует, устарел, или доступен из источников, не упомянутых в sources.list

Меню

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Рейтинг@Mail.ru