Практический опыт перехода с Apache на nginx

[Пост из черновиков] Этот пост был написан 14 октября 2012, но в силу ряда причин так и не был опубликован. Исправляю.

Предыстория и предпосылки к переходу

Несколько лет назад дома появился «широкий» Интернет от тогда еще Корбины и вместе с ним появилась возможность/потребность/необходимость в постоянно включенном компе для торрентов, хаба и сайта для локала. Пришлось покупать простенький системник, доставать из кладовки старый монитор, устанавливать 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

Johnny:
Похожая заметка

This website uses cookies.