Настройка связки веб серверов Nginx + Apache
В данной связке мы будем использовать 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 сессий.
Удачной установки! =)
Добавить комментарий