Настройка связки веб серверов Nginx + Apache
В данной связке мы будем использовать 2 веб сервера, nginx будет обрабатывать статический контент, а динамический передавать Apache.
Обновим все пакеты:
1 |
apt-get update |
1 |
apt-get upgrade |
Удалим кэш пакетов и ненужные пакеты:
1 |
apt-get clean |
1 |
apt-get autoclean |
1 |
apt-get autoremove |
Установим часовой пояс.
1 |
dpkg-reconfigure tzdata |
Установим NTP.
1 |
apt-get install ntp |
Установим Openssh сервер (если он не установлен).
1 |
apt-get install openssh-server |
Устанавливаем веб сервер Apache2.
1 |
apt-get install apache2 |
Устанавливаем PHP.
1 |
apt-get install php5 libapache2-mod-php5 php5-mysql |
Устанавливаем Mysql сервер.
1 |
apt-get install mysql-server |
Настраиваем безопасность Mysql.
1 |
mysql_secure_installation |
Устанавливаем значения firewall.
1 |
ufw allow OpenSSH |
1 |
ufw allow Apache |
1 |
ufw limit OpenSSH |
1 |
ufw enable |
Т.к. Apache будет нашим backend, настроим его на работу на localhost.
Открываем файл /etc/apache2/ports.conf
И редактируем директиву Listen, должно получиться так:
1 |
Listen 127.0.0.1:80 |
Сохраняем файл.
Создадим папку с сайтами (если не хотим использовать папку /var/www).
1 |
mkdir /hosting |
Далее откроем доступ к папке с сайтами, для этого редактируем файл /etc/apache2/apache2.conf и вносим в него следующие строки:
1 2 3 4 5 |
<Directory /hosting> Options FollowSymLinks AllowOverride all Require all granted </Directory> |
Сохраняем файл.
Включаем необходимые для работы модули Apache2.
1 |
a2enmod rewrite |
1 |
a2enmod ssl |
Для корректного отображения ip адресов в логах установим модуль rpaf.
1 |
apt-get install libapache2-mod-rpaf |
Включаем модуль.
1 |
a2enmod rpaf |
Так же вы можете отключить лишние модули, например вот так отключается модуль status.
1 |
a2dismod status |
Перезапускаем Apache2.
1 |
service apache2 restart |
Перейдем к настройке сайтов (виртуальных хостов).
Удаляем дефолтные сайты.
1 |
rm -f /etc/apache2/sites-available/*.* |
1 |
rm -f /etc/apache2/sites-enabled/*.* |
Создадим конфиг для нового сайта.
1 |
touch /etc/apache2/sites-available/newsite.conf |
Ниже пример конфига сайта:
1 2 3 4 5 6 7 |
<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
Создаем каталог с новым сайтом.
1 |
mkdir /hosting/newsite |
Раздаем права на каталог с сайтами
1 |
chown -R www-data /hosting/ |
Включаем сайт:
1 |
a2ensite newsite.conf |
Перезагрузим конфиги apache2
1 |
service apache2 reload |
Теперь добавьте DNS записи А с именем вашего сайта и ip адресом сервера.
В моем случае DNS имя newsite.test.com
Теперь установим Nginx, он будет frontend.
1 |
apt-get install nginx |
Удаляем дефолтные конфиги.
1 |
rm -f /etc/nginx/sites-available/* |
1 |
rm -f /etc/nginx/sites-enabled/* |
Создадим конфиг для сайта newsite
1 |
touch /etc/nginx/sites-available/newsite.conf |
Приводим конфиг к виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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 имя сайта
Директива:
1 |
location ~* \.(txt|jpg|jpeg|gif|png|bmp|swf|ico|css|js |
Указывает тип статических файлов
Директива expires указывает сколько дней хранить статический контент.
Директива:
1 2 |
location ~ /\.ht { deny all; |
Запрещает Nginx отдавать файлы начинающиеся с .ht
Директива:
1 2 3 4 |
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.
Включаем сайт командой.
1 |
ln -s /etc/nginx/sites-available/newsite.conf /etc/nginx/sites-enabled/newsite.conf |
Перезапускаем Nginx.
1 |
service nginx restart |
Теперь в качестве примера установим CMS WordPress
Скачиваем последнюю версию WordPress.
1 |
wget http://wordpress.org/latest.tar.gz |
Распаковываем.
1 |
tar -xzvf latest.tar.gz |
Теперь создадим пользователя в БД Mysql для нового сайта.
Подключаемся к Mysql.
1 |
mysql -u root -p |
Создаем БД с именем wordpress.
1 |
CREATE DATABASE wordpress; |
Создаем пользователя wordpressuser.
1 |
CREATE USER wordpressuser@localhost; |
Устанавливаем пароль созданному пользователю.
1 |
SET PASSWORD FOR wordpressuser@localhost= PASSWORD("password"); |
Устанавливаем права пользователю на администрирование созданной ранее БД.
1 |
GRANT ALL PRIVILEGES ON wordpress.* TO wordpressuser@localhost IDENTIFIED BY 'password'; |
Перезагружаем привилегии Mysql.
1 |
FLUSH PRIVILEGES; |
Выходим из консоли Mysql.
1 |
exit |
Теперь подготовим CMS WordPress для работы с БД.
Копируем конфиг WordPress.
1 |
cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php |
Открываем файл /wordpress/wp-config.php и редактируем следующие поля:
1 2 3 4 5 6 7 |
// ** 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'); |
Копируем сайт.
1 |
cp -r ~/wordpress/* /hosting/newsite |
Назначаем права на каталог с сайтами веб серверу.
1 |
chown -R www-data /hosting/newsite |
Теперь сайт доступен по адресу http://newsite.test.com
Теперь рассмотрим настройку ssl для нашего сайта.
Создадим папку для SSL сертификатов в каталоге Nginx.
1 |
mkdir /etc/nginx/ssl |
Открываем файл /etc/apache2/ports.conf
Редактируем директиву Listen, должно получиться так:
Вместо
1 |
Listen *:443 |
Пишем:
1 |
Listen 127.0.0.1:443 |
Открываем порт на firewall.
1 |
ufw allow 443/tcp |
Теперь создадим SSL сертификат командой.
1 |
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
И приводим его к виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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 сессий.
Удачной установки! =)
Добавить комментарий