Настройка связки 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 комментариев

  1. аноним 13.02.2018
  2. SYSadminАвтор 12.02.2018
  3. Гость 12.02.2018
  4. SYSadminАвтор 11.05.2017
  5. Василий 10.05.2017
  6. Mitai 04.03.2017
  7. Mitai 04.03.2017
  8. SYSadminАвтор 02.03.2017
  9. Mitai 01.03.2017
  10. Mitai 01.03.2017
  11. Mitai 01.03.2017
  12. SYSadminАвтор 16.02.2017
  13. SYSadminАвтор 16.02.2017
  14. Mitai 15.02.2017
  15. Mitai 15.02.2017

Добавить комментарий

Меню

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

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