Настройка связки веб серверов Nginx + Apache

Дата: 19.06.2015 Автор Admin

В данной связке мы будем использовать 2 веб сервера, nginx будет обрабатывать статический контент, а динамический передавать Apache.

Обновим все пакеты:

apt-get update
apt-get upgrade

Удалим кэш пакетов и ненужные пакеты:

apt-get clean
apt-get autoclean
apt-get autoremove

Установим часовой пояс.

dpkg-reconfigure tzdata

Установим NTP.

apt-get install ntp

Установим Openssh сервер (если он не установлен).

apt-get install openssh-server

Устанавливаем веб сервер Apache2.

apt-get install apache2

Устанавливаем PHP.

apt-get install php5 libapache2-mod-php5 php5-mysql

Устанавливаем Mysql сервер.

apt-get install mysql-server

Настраиваем безопасность Mysql.

mysql_secure_installation

Устанавливаем значения firewall.

ufw allow OpenSSH
ufw allow Apache
ufw limit OpenSSH
ufw enable

Т.к. Apache будет нашим backend, настроим его на работу на localhost.

Открываем файл /etc/apache2/ports.conf

И редактируем директиву Listen, должно получиться так:

Listen 127.0.0.1:80

Сохраняем файл.

Создадим папку с сайтами (если не хотим использовать папку /var/www).

mkdir /hosting

Далее откроем доступ к папке с сайтами, для этого редактируем файл /etc/apache2/apache2.conf и вносим в него следующие строки:

<Directory /hosting>
Options FollowSymLinks
AllowOverride all
Require all granted
</Directory>

Сохраняем файл.

Включаем необходимые для работы модули Apache2.

a2enmod rewrite
a2enmod ssl

Для корректного отображения ip адресов в логах установим модуль rpaf.

apt-get install libapache2-mod-rpaf

Включаем модуль.

a2enmod rpaf

Так же вы можете отключить лишние модули, например вот так отключается модуль status.

a2dismod status

Перезапускаем Apache2.

service apache2 restart

Перейдем к настройке сайтов (виртуальных хостов).

Удаляем дефолтные сайты.

rm -f /etc/apache2/sites-available/*.*
rm -f /etc/apache2/sites-enabled/*.*

Создадим конфиг для нового сайта.

touch /etc/apache2/sites-available/newsite.conf

Ниже пример конфига сайта:

<VirtualHost *:80>
ServerName newsite.test.com
ServerAlias newsite.test.local
DocumentRoot /hosting/newsite
CustomLog /var/log/apache2/newsite.access.log combined
ErrorLog /var/log/apache2/newsite.error.log
</VirtualHost>

В данном примере:

Сайт работает на 80-м порту

Сайт доступен по DNS адресам newsite.test.com и newsite.test.local

Сайт расположен в директории – /hosting/newsite

Создаем каталог с новым сайтом.

mkdir /hosting/newsite

Раздаем права на каталог с сайтами

chown -R www-data /hosting/

Включаем сайт:

a2ensite newsite.conf

Перезагрузим конфиги apache2

service apache2 reload

Теперь добавьте DNS записи А с именем вашего сайта и ip адресом сервера.

В моем случае DNS имя newsite.test.com

Теперь установим Nginx, он будет frontend.

apt-get install nginx

Удаляем дефолтные конфиги.

rm -f /etc/nginx/sites-available/*
rm -f /etc/nginx/sites-enabled/*

Создадим конфиг для сайта newsite

touch /etc/nginx/sites-available/newsite.conf

Приводим конфиг к виду:

server {
listen ip_adress:80;
server_name newsite.test.com;
charset utf-8;
access_log off;
error_log /var/log/nginx/site.error.log;

location ~* \.(txt|jpg|jpeg|gif|png|bmp|swf|ico|css|js)$ {
root /hosting/newsite;
expires 7d;
}

location ~ /\.ht {
deny all;
}

location / {
root /hosting/newsite;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1/;
proxy_set_header Accept-Encoding "";
}
}

 

В данном конфиге:

Директива listen ip_adress:80 указывает на каком порту и ip работает сайт

Директива root указывает корневую директорию сайта

Директива index указывает индексные файлы сайта

Директива server_name указывает dns имя сайта

Директива:

location ~* \.(txt|jpg|jpeg|gif|png|bmp|swf|ico|css|js

Указывает тип статических файлов

Директива expires указывает сколько дней хранить статический контент.

Директива:

location ~ /\.ht {
deny all;

Запрещает Nginx отдавать файлы начинающиеся с .ht

Директива:

proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://127.0.0.1/;
proxy_set_header Accept-Encoding "";

Указывает что Nginx работает как обратный прокси и передает запросы на localhost.

Включаем сайт командой.

ln -s /etc/nginx/sites-available/newsite.conf /etc/nginx/sites-enabled/newsite.conf

Перезапускаем Nginx.

service nginx restart

Теперь в качестве примера установим CMS WordPress

Скачиваем последнюю версию WordPress.

wget http://wordpress.org/latest.tar.gz

Распаковываем.

tar -xzvf latest.tar.gz

Теперь создадим пользователя в БД Mysql для нового сайта.

Подключаемся к Mysql.

mysql -u root -p

Создаем БД с именем wordpress.

CREATE DATABASE wordpress;

Создаем пользователя wordpressuser.

CREATE USER wordpressuser@localhost;

Устанавливаем пароль созданному пользователю.

SET PASSWORD FOR wordpressuser@localhost= PASSWORD("password");

Устанавливаем права пользователю на администрирование созданной ранее БД.

GRANT ALL PRIVILEGES ON wordpress.* TO wordpressuser@localhost IDENTIFIED BY 'password';

Перезагружаем привилегии Mysql.

FLUSH PRIVILEGES;

Выходим из консоли Mysql.

exit

Теперь подготовим CMS WordPress для работы с БД.

Копируем конфиг WordPress.

cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php

Открываем файл /wordpress/wp-config.php и редактируем следующие поля:

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'wordpressuser');
/** MySQL database password */
define('DB_PASSWORD', 'password');

Копируем сайт.

cp -r ~/wordpress/* /hosting/newsite

Назначаем права на каталог с сайтами веб серверу.

chown -R www-data /hosting/newsite

Теперь сайт доступен по адресу http://newsite.test.com

Теперь рассмотрим настройку ssl для нашего сайта.

Создадим папку для SSL сертификатов в каталоге Nginx.

mkdir /etc/nginx/ssl

Открываем файл /etc/apache2/ports.conf

Редактируем директиву Listen, должно получиться так:

Вместо

Listen *:443

Пишем:

Listen 127.0.0.1:443

Открываем порт на firewall.

ufw allow 443/tcp

Теперь создадим SSL сертификат командой.

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

Теперь открываем конфиг сайта /etc/nginx/sites-available/newsite.conf

И приводим его к виду:

server {
listen ip_address:80;
server_name newsite.test.com;
charset utf-8;
access_log off;
location / {
rewrite ^(.*)$ https://newsite.test.com$1 permanent;
}
}



server {
listen ip_address:443 ssl;
server_name newsite.test.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
charset utf-8;
access_log off;
error_log /var/log/nginx/site.error.log;

location ~* \.(txt|jpg|jpeg|gif|png|bmp|swf|ico|css|js)$ {
root /hosting/newsite;
expires 7d;
}

location ~ /\.ht {
deny all;
}

location / {
proxy_pass http://127.0.0.1:80/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

Сохраняем конфиг.

В данном конфиге добавилась вторая секция server и появились настройки ssl.

Директива rewrite описывает правило перенаправления с http на https

Директива listen 443 ssl; указывает что сайт работает по протоколу ssl на 443 порту

Директивы ssl_certificate и ssl_certificate_key указывают путь к файлам сертификата.

Теперь при переходе на http://newsite.test.com нас будет переадресовывать на https://newsite.test.com

В данной схеме Nginx берет на себя работу по созданию https сессий.

Удачной установки! =)


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

Ваш адрес email не будет опубликован. Обязательные поля помечены *