Предыстория и предпосылки к переходу
Несколько лет назад дома появился «широкий» Интернет от тогда еще Корбины и вместе с ним появилась возможность/потребность/необходимость в постоянно включенном компе для торрентов, хаба и сайта для локала. Пришлось покупать простенький системник, доставать из кладовки старый монитор, устанавливать Ubuntu и ставить этот комп на кухню, чтобы не шумел и не мешал спать. В итоге (потому что постоянно включен) сейчас это основной комп для работы и развлечений для меня, жены и 4-летней дочки 🙂 Со временем я начал вести блог SarAdmin.RU, который, пожив какое-то время на бесплатном хостинге, перебрался на этот же комп. Так как тут уже крутились веб-проекты для локала, пришлось настраивать виртуальные хосты на Apache.
Время идёт, количество посетителей этого блога постепенно увеличивается и вот уже стало заметно, что компьютер перестал справляться с нагрузкой — детишки Апача кушают проц, всё начинает тормозить. В итоге я решил собрать тихий маломощный системник на Celeron430, естественно, без иксов, закинуть его в кладовку и пусть себе там шумит. Вот только начитавшись статей в Инете, решил попробовать избавиться от Apache в пользу Nginx, заодно описав свои действия — вдруг кому пригодится, да и профи, прочитав, смогут поправить и указать на мои ошибки.
Устанавливаем и настраиваем nginx
Если вдруг на сервере уже установлен Apache, удаляем его
sudo apt-get purge apache2 -y
Правим файл /etc/apt/sources.list, добавляя туда репозиторий проекта Nginx:
deb http://nginx.org/packages/ubuntu/ precise nginx
deb-src http://nginx.org/packages/ubuntu/ precise nginx
Затем получаем и устанавливаем GPG-ключ:
wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key
А теперь устанавливаем сам nginx и PHP-FPM вместе с зависимостями:
sudo apt-get update && sudo apt-get install nginx
Устанавливаем PHP-FPM вместе с зависимостями
sudo apt-get install php5-fpm php5-cli php5-common php5-mysql php5-suhosin php5-gd php5-cgi php-pear php5-mcrypt mc -y
Теперь устраняем известную уязвимость связки PHP-Nginx:
Открываем файл /etc/php5/fpm/php.ini
Находим строку:
;cgi.fix_pathinfo = 1
и меняем её на:
cgi.fix_pathinfo = 0
Заодно там же устанавливаем кодировку:
default_charset = "utf-8"
Не забываем сохранить файл.
Открываем конфиг nginx (/etc/nginx/nginx.conf) и правим:
user www-data;
worker_processes 1; #устанавливается исходя из количества ядер
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $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;
keepalive_timeout 65;
gzip on;
gzip_proxied any;
gzip_min_length 1100;
gzip_http_version 1.0;
gzip_buffers 4 8k;
gzip_comp_level 4; # Оптимальная степень сжатия
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/conf.d/*.conf; # Стандартное расположение конфигов
include /etc/nginx/sites-enabled/*; # Apache-подобное расположение
}
Обратите внимание, что в нашем случае мы можем размещать конфиги как в папке /etc/nginx/sites-available/, создавая на них симлинки в директорию /etc/nginx/sites-enabled/, так и в /etc/nginx/conf.d/, причём без создания симлинков, но с обязательным добавлением .conf в конце файла. На самом деле, и от этого условия мы можем избавиться, если напишем в конфигурационном файле выше «include /etc/nginx/conf.d/*;«.
Раз уж используем хранение конфигов в папках sites-available и sites-enabled, нужно их создать:
mkdir -p -m 755 /etc/nginx/sites-available
mkdir -p -m 754 /etc/nginx/sites-enabled
и установить на них права для пользователя www-data:
chown -R www-data: /etc/nginx/sites-available/
chown -R www-data: /etc/nginx/sites-enabled/
Открываем конфиг FPM:
sudo mcedit /etc/php5/fpm/pool.d/www.conf
и правим:
pm = dynamic
pm.max_children = 4
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 500
listen = /var/run/php5-fpm.sock
Перезапускаем PHP-FPM:
/etc/init.d/php5-fpm restart
Настраиваем работу с виртуальными хостами
Для начала нужно создать пользователя виртуального хоста Saradmin.ru без доступа к шеллу и задать ему сложный пароль:
useradd saradmin --home /var/www/saradmin.ru --group nogroup -s /bin/false -U
passwd saradmin
Теперь создаём директории для сайта и для логов:
mkdir -p -m 755 /var/www/saradmin.ru/htdocs
mkdir -p -m 754 /var/www/saradmin.ru/logs
Устанавливаем права для нашего пользователя:
chown -R saradmin: /var/www/saradmin.ru/htdocs/
chown -R saradmin: /var/www/saradmin.ru/logs/
И создаём отдельный fpm-пул для сайта. Так как владельцем сайта является пользователь saradmin, я хочу, чтобы и все php-скрипты выполнялись от его имени. Кроме того, я хочу, чтобы общение между nginx и php-fpm происходило не по портам, а через unix-сокеты, что должно ускорять работу веб-сервера.
Для начала создадим директорию, в которой будут храниться unix-сокеты:
mkdir /var/run/php5-fpm
Разрешим Nginx доступ в домашнюю директорию пользователя saradmin и к его сокетам, добавив пользователя www-data в группу saradmin
usermod -a -G saradmin www-data
В дальнейшем, при создании нового виртуального хоста нам необходимо будет добавлять пользователя www-data в группу с именем нового пользователя.
Создаём файл /etc/php5/fpm/pool.d/saradmin.ru.conf со следующим содержимым:
[saradmin.ru]
listen = /var/run/php5-fpm/saradmin.ru.sock
listen.owner = saradmin
listen.group = saradmin
listen.mode = 0660
user = saradmin
group = saradmin
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
chdir = /
И перезагружаем PHP-FPM:
/etc/init.d/php5-fpm restart
Чтобы убедиться, что сокет создался, выполним
ls -l /var/run/php5-fpm
и убедимся, что есть файл saradmin.ru.sock с правами 0660 (srw-rw—-), пользователем saradmin и группой saradmin.
Теперь создаём виртуальный хост Saradmin.RU:
mcedit /etc/nginx/sites-available/saradmin.ru.conf
и пишем туда что-то типа:
server {
server_name www.saradmin.ru;
rewrite ^ $scheme://saradmin.ru$request_uri? permanent;
}
server {
listen 80;
access_log /var/www/saradmin.ru/logs/nginx.access.log;
server_name saradmin.ru;
root /var/www/saradmin.ru/htdocs;
charset utf-8;
location / {
index index.php index.html index.htm;
try_files $uri /index.php;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
location ~ \.php$ {
# fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php5-fpm/saradmin.ru.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
После этого создаём симлинк и перезапускаем Nginx, чтобы применить сделанные изменения:
ln -sf /etc/nginx/sites-available/saradmin.ru.conf /etc/nginx/sites-enabled/saradmin.ru.conf
/etc/init.d/nginx restart
Для проверки работоспособности php создадим файл с именем, например, php.php и со следующим содержимым:
<?phpinfo();?>
Теперь откроем этот файл на нашем сервере, перейдя по адресу http://имя_сервера/php.php
Сверху находим параметр «Server API» и убеждаемся, что он имеет значение «FPM/FastCGI» — это значит, что мы всё настроили правильно.
Не забываем, что мы имеем дело с виртуальными хостами, поэтому важно переходить именно по тому доменному имени, которое указано в конфиге, а не по IP-адресу сервера. DNS-записи для этого доменного имени, естественно, должны быть правильно прописаны.
Если мы хотим, чтобы основным сайтом, «отвечающим» по IP-адресу сервера был настраиваемый сейчас сайт, отредактируем конфигурационный файл /etc/nginx/conf.d/default.conf следующим образом:
server {
listen 80;
location / {
rewrite ^(.*)$ https://saradmin.ru$1 permanent;
}
}
Не забываем перезапустить nginx:
/etc/init.d/nginx restart
Установка сопутствующего софта
Для подготовки окончательного переноса WordPress на новый сервер осталось поставить MySQL и memcached.
Ничего сложного тут нет.
sudo apt-get install mysql-server mysql-client mysql-common memcached php5-memcached -y
И перезапускаем php-fpm
/etc/init.d/php5-fpm restart
ProFTPd устанавливаем по этой инструкции.
PS: Да, я люблю mc
Изменено: 09.09.2015