Как перейти с веб-сервера Apache на Nginx на Ubuntu VPS
Введение
Есть несколько вариантов, которые вы должны сделать при запуске веб-сайта или приложения. Иногда ваши требования меняются, новые технологии становятся жизнеспособными или ваша пользовательская база неожиданно увеличивается. Независимо от ваших причин, одним из компонентов вашего стека приложений, который вы можете изменить, является веб-сервер.
Хотя веб-сервер Apache в настоящее время является самым популярным веб-сервером в мире, Nginx быстро завоевывает позиции. Это неудивительно, учитывая, что Nginx отлично работает, используя мало ресурсов. Для многих веб-сайтов переход на Nginx улучшит производительность.
В этом руководстве мы обсудим, как перенести веб-сайт с Apache на Nginx на Ubuntu 12.04 VPS. Мы постараемся оставаться общими в наших предложениях, но дадим вам подсказки о некоторых областях, которые вам, возможно, придется настроить для ваших собственных целей.
В этом руководстве предполагается, что вы установили стек LAMP (Linux, Apache, MySQL и PHP) с помощью этого руководства. Если вы просто выбрали образ LAMP одним щелчком мыши при создании дроплета, ваш сервер также будет иметь эту конфигурацию.
Установите Nginx
Первое, что мы сделаем, чтобы начать миграцию наших веб-сайтов, — это установим наше новое серверное программное обеспечение. Это позволит нам настроить наш новый сервер, взглянув на наши текущие файлы конфигурации Apache.
К счастью, Nginx присутствует в репозиториях Ubuntu по умолчанию. Давайте установим его сейчас:
sudo apt-get update
sudo apt-get install nginx
Одна деталь реализации, которая становится очень важной в нашем случае использования, заключается в том, что Nginx переносит любую динамическую обработку в отдельный процесс. Это позволяет Nginx оставаться компактным и быстрым. Он может сосредоточиться на своих основных функциях, не пытаясь добавить поддержку PHP через модули. Вместо этого он просто разгружает это в приложение, созданное для этой цели.
Все это упоминается здесь, чтобы сказать, что нам также необходимо установить обработчик PHP для обработки PHP-скриптов. Стандартный выбор — php5-fpm
, который хорошо работает с Nginx:
sudo apt-get install php5-fpm
У вас должно быть все программное обеспечение, необходимое для перевода вашего сайта на Nginx. Нам все еще нужно настроить наше программное обеспечение для эмуляции конфигурации, в которой работал Apache.
Настройка тестовой конфигурации Nginx
Поскольку в настоящее время у нас работает Apache, если мы можем этого избежать, мы хотели бы настроить наш сервер Nginx независимо от Apache, чтобы наш сайт продолжал работать во время перехода.
Это так же просто, как протестировать Nginx на альтернативном порту, пока мы не будем готовы закрепить наши изменения. Таким образом, мы можем запускать два сервера одновременно.
Начните с открытия файла конфигурации для сайта Nginx по умолчанию:
sudo nano /etc/nginx/sites-available/default
В разделе server{
добавьте директиву listen, чтобы указать Nginx прослушивать порт, отличный от порта 80 (который Apache все еще использует для обслуживания запросов). Для нашего урока мы будем использовать порт 8000.
server {
listen 8000;
. . .
. . .
Сохраните и закройте файл. Сейчас самое время провести выборочную проверку, чтобы убедиться, что мы можем получить доступ к нашему серверу Nginx. Запустите Nginx, чтобы проверить это:
sudo service nginx start
Используйте номер порта, который мы настроили, для доступа к конфигурации Nginx по умолчанию. Введите это в свой браузер:
http://your_ip_or_domain:8000
Ваш экземпляр Apache должен по-прежнему работать на порту 80 по умолчанию. Вы также можете проверить это, посетив свой сайт без :8000
в конце (в нашем примере просто обслуживается страница Apache по умолчанию. Если вы настроил ваш веб-сайт, вместо этого он будет здесь):
http://your_ip_or_domain
Переведите свою конфигурацию Apache
Теперь, когда у вас есть оба сервера, вы можете начать миграцию и перевод конфигурации Apache для использования с Nginx. Это нужно делать вручную, поэтому важно, чтобы вы понимали, как настроен Nginx.
Эта задача в основном сводится к написанию серверных блоков Nginx, которые аналогичны виртуальным серверам Apache. Apache хранит эти файлы в /etc/apache2/sites-available/
, а Nginx следует его примеру и хранит свои объявления блоков сервера в /etc/nginx/sites-available/
в Ubuntu. .
Для каждого объявления виртуального сервера вы будете создавать блок сервера. Если вы просматриваете свои файлы Apache, вы, вероятно, найдете виртуальные хосты, которые выглядят так:
<VirtualHost *:80>
ServerAdmin webmaster@your_site.com
ServerName your_site.com
ServerAlias www.your_site.com
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
Мы можем начать сборку нашего блока сервера Nginx, используя эту конфигурацию.
В вашем каталоге /etc/nginx/sites-available/
откройте файл, который мы редактировали ранее, чтобы объявить порт Nginx:
sudo nano /etc/nginx/sites-available/default
Не обращая внимания на закомментированные строки на данный момент, это должно выглядеть примерно так:
server {
listen 8000;
root /usr/share/nginx/www;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ /index.html;
}
location /doc/ {
alias /usr/share/doc/;
autoindex on;
allow 127.0.0.1;
deny all;
}
}
Вы уже должны начать видеть некоторые элементы, которые, похоже, соответствуют нашей конфигурации Apache. Вообще говоря, основные директивы переводятся так:
Apache Nginx
------ ------
<VirtualHost *:80> server {
listen 80;
ServerName yoursite.com
ServerAlias www.yoursite.com server_name yoursite.com www.yoursite.com;
DocumentRoot /path/to/root root /path/to/root;
AllowOverride All (No Available Alternative)
DirectoryIndex index.php index index.php;
ErrorLog /path/to/log error_log /path/to/log error;
CustomLog /path/to/log combined access_log /path/to/log main;
Alias /url/ "/path/to/files" location /url/ {
<Directory "/path/to/files"> alias /path/to/files;
Если бы мы собирались создать блок сервера, который эмулирует функциональность файла виртуального хоста из приведенного выше, это могло бы выглядеть примерно так:
server {
listen 8000; # We're deliberately leaving this as-is to avoid conflict at the moment
root /var/www;
server_name your_site.com www.your_site.com;
location / {
try_files $uri $uri/ /index.html;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
location /doc/ {
alias /usr/share/doc/;
autoindex on;
allow 127.0.0.1;
deny all;
}
location ~/\.ht {
deny all;
}
}
Мы убрали некоторые элементы, а также добавили несколько дополнительных строк, которые мы должны пояснить.
Во-первых, строки журнала ошибок были исключены из конфигурации. Это связано с тем, что они уже определены в файле /etc/nginx/nginx.conf
. Это дает нам значение по умолчанию, которое мы будем использовать.
Мы также удалили директиву ServerAdmin
, потому что Nginx не встраивает эту информацию в свои страницы ошибок.
Обработка PHP также немного изменилась. Из-за того, что PHP обрабатывается в Nginx отдельно, мы передаем эти файлы программе php-fpm
, которую мы установили ранее. Это реализуется через сокет (который нам нужно будет настроить на мгновение).
Раздел документации изменен, чтобы отразить документацию Nginx. В остальном он работает примерно так же.
Наконец, мы настраиваем Nginx, чтобы запретить доступ к любому файлу .htaccess
или другим файлам, начинающимся с .ht
в нашем каталоге. Это специфичные для Apache файлы конфигурации, и они не работают с Nginx. Безопаснее не раскрывать эти файлы конфигурации.
Сохраните и закройте файл, когда закончите.
Мы должны перезапустить наш сервер Nginx, чтобы эти изменения были распознаны:
sudo service nginx restart
Настроить PHP-FPM
Теперь, когда у нас есть большая часть конфигурации Nginx, нам нужно изменить конфигурацию php-fpm для связи с использованием указанных нами каналов.
Для начала мы должны изменить файл php.ini, чтобы он не обслуживал файлы небезопасно.
sudo nano /etc/php5/fpm/php.ini
Строка, которую нам нужно изменить, потребует, чтобы PHP обслуживал точный запрошенный файл, а не угадывал, есть ли неполное совпадение. Это предотвращает возможность предоставления PHP конфиденциальных данных кому-либо, кто исследует обработчик PHP на наличие слабых мест.
Найдите строку, в которой указана директива cgi.fix_pathinfo
, и измените ее так, чтобы она выглядела так:
cgi.fix_pathinfo=0
Сохраните и выйдите из этого файла.
Далее мы изменим способ подключения php-fpm к нашему серверу. Откройте этот файл в вашем редакторе:
sudo nano /etc/php5/fpm/pool.d/www.conf
Найдите и измените директиву listen
, чтобы она соответствовала значению, которое мы поместили в файл конфигурации блока сервера:
listen = /var/run/php5-fpm.sock
Если вы в конечном итоге столкнетесь с проблемами при обработке большого количества PHP-запросов, вы можете вернуться сюда и увеличить количество дочерних процессов, которые могут быть запущены одновременно. Строка, которую вы хотите изменить:
pm.max_children = Num_of_children
Сохраните и закройте этот файл.
Теперь наша программа php-fpm должна быть правильно настроена. Нам нужно перезапустить его, чтобы наши изменения распространились.
sudo service php5-fpm restart
Не помешает еще раз перезапустить Nginx:
sudo service nginx restart
Проверьте, правильно ли работают все файлы PHP, находящиеся в корневом каталоге. Вы должны иметь возможность заставить файлы PHP выполняться так же, как они были в Apache.
Если мы получим доступ к файлу info.php
, который мы создали в учебнике Ubuntu LAMP, он должен отображаться следующим образом:
http://your_ip_or_domain:8000/info.php
В разделе «Переменные PHP» вы должны увидеть Nginx в качестве переменной «SERVER_SOFTWARE»:
Переведите свой сайт Nginx в рабочее состояние
После того, как вы провели всестороннее тестирование, вы можете попытаться плавно перенести свой сайт с Apache на Nginx.
Это возможно из-за того, что ни один из этих серверов не реализует изменения, пока не будет перезапущен. Это позволяет нам настроить все, а затем щелкнуть выключателем в одно мгновение.
На самом деле, единственное, что нам нужно сделать, это изменить порт в блоке сервера Nginx. Откройте файл сейчас:
sudo nano /etc/nginx/sites-available/default
Измените порт обратно на порт 80 по умолчанию. Это позволит ему начать принимать обычный HTTP-трафик сразу после перезапуска.
server {
# listen 8000;
listen 80;
. . .
Сохраните и закройте файл.
Если вы только переводите некоторые из своих сайтов на Nginx и продолжаете обслуживать некоторый контент из Apache, вам необходимо отключить виртуальные серверы Apache, которые обслуживают запросы через порт 80. Это необходимо для предотвращения конфликтов. Если это сделать неправильно, Nginx не запустится, потому что порт уже будет занят.
Если вы планируете продолжать использовать Apache, проверьте эти файлы и места на предмет использования порта 80:
/etc/apache2/ports.conf
/etc/apache2/apache2.conf
/etc/apache2/httpd.conf
/etc/apache2/sites-enabled/ ## Search all sites in this directory
После того, как вы убедитесь, что изменили все необходимые порты, вы можете перезапустить обе службы следующим образом:
sudo service apache2 reload && sudo service nginx reload
Apache должен перезагрузиться, освободив порт 80. Сразу же после этого Nginx должен перезагрузиться и начать принимать соединения на этом порту. Если все прошло гладко, ваш сайт теперь должен обслуживаться Nginx.
Если вы больше не собираетесь использовать Apache для обслуживания какой-либо части своих сайтов, вместо этого вы можете полностью остановить его веб-процесс:
sudo service apache2 stop && sudo service nginx reload
Если вы больше не используете Apache, вы можете удалить файлы Apache на этом этапе. Вы можете легко найти файлы, связанные с Apache, набрав:
dpkg --get-selections | grep apache
apache2 install
apache2-mpm-prefork install
apache2-utils install
apache2.2-bin install
apache2.2-common install
libapache2-mod-auth-mysql install
libapache2-mod-php5 install
Затем вы можете удалить их с помощью apt-get. Например:
sudo apt-get remove apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common libapache2-mod-auth-mysql libapache2-mod-php5
Вы также можете удалить все пакеты зависимостей, которые больше не нужны:
sudo apt-get autoremove
Осложнения миграции
Есть несколько общих вещей в мире Apache, которые могут вызвать некоторую путаницу при попытке переключиться на Nginx.
Переписать переводы и файлы .htaccess
Одно из самых фундаментальных отличий заключается в том, что Nginx не учитывает переопределения каталогов.
Apache использует файлы .htaccess
вместе с директивой AllowOverride All
в блоке местоположения. Это позволяет вам помещать конфигурации для конкретного каталога в каталог, в котором находятся файлы.
Nginx не пропускает эти файлы. Размещение конфигурации с обслуживаемыми файлами потенциально является проблемой безопасности, если она неправильно настроена, и легко просмотреть централизованные файлы конфигурации и не понять, что параметр перезаписывается через файл .htaccess.
В результате вся конфигурация, которую вы указали в активном файле .htaccess, должна быть помещена в блок местоположения в конфигурации блока сервера для этого хоста. Как правило, это не сложнее, но вы должны перевести эти правила точно так же, как вы делали это с определениями виртуального хоста.
Обычно в файлах .htaccess хранятся правила для модуля Apache mod_rewrite, который изменяет URL-адреса доступа к контенту, чтобы сделать их более удобными для пользователя. Nginx имеет аналогичный модуль перезаписи, но использует другой синтаксис. К сожалению, переписывание URL-адресов в Nginx выходит за рамки этого руководства.
Осложнения модуля и внешней конфигурации
Еще одна вещь, которую следует иметь в виду, это то, что вам нужно осознавать, какую функциональность предоставляют модули Apache, которые вы включили.
Простой пример — модуль dir
. Когда этот параметр включен, вы можете указать порядок файлов, которые Apache будет пытаться использовать в качестве индекса каталога, поместив такую строку в файл вашего виртуального хоста:
DirectoryIndex index.html index.htm
Эта строка будет определять обработку, которая будет происходить для этого виртуального хоста. Однако, если эта строка отсутствует, а модуль dir
включен, порядок обслуживаемых файлов будет определяться этим файлом:
sudo nano /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
Смысл этого в том, что вы должны знать о возможности того, что модуль или конфигурация любого внешнего источника, если на то пошло, может делать что-то за кулисами, что вам придется делать явно в Nginx.
В этом примере вы можете указать порядок индексации каталогов в Nginx, добавив это в блок сервера:
server {
. . .
index index.php index.html index.htm;
. . .
Важно помнить об этом.
Одна вещь, которая может быть полезна при переносе сложной конфигурации сайта, — это скопировать и вставить все файлы конфигурации из отдельных источников в один монолитный файл и систематически просматривать и переводить каждую строку.
Это может быть головной болью, но для производственного сервера это может сэкономить вам много времени на отслеживание того, что вызывает странное поведение, которое вы не можете точно определить.
Заключение
Сложность перехода с Apache на Nginx почти полностью зависит от сложности ваших конкретных конфигураций. Nginx может обрабатывать почти все, что может Apache, но с меньшими ресурсами. Это означает, что ваш сайт может беспрепятственно обслуживать большее количество пользователей.
Хотя миграция не имеет смысла для всех сайтов, и хотя Apache — прекрасный сервер, который адекватно удовлетворяет потребности многих проектов, вы можете увидеть прирост производительности или увеличение масштабируемости с помощью Nginx. Если вам по-прежнему требуется Apache, другой альтернативой является использование Nginx в качестве обратного прокси-сервера для вашего сервера Apache. Такой подход может эффективно использовать сильные стороны обоих серверов.