Блог о программировании на PHP, Yii2, 1C-Bitrix

Перенос проектов yii2, wordpress, bitrix на nginx + php-fpm с подключением ssl или «да это делается 15 минут». Часть 1

Перенос сайта на другой хостинг очень затратная процедура, хотя иногда бывают случаи, что затратнее оставаться на хостинге не поддерживающем ни какие фичи, кроме публикации сайта, это достаточно скучно… Или может быть раз в год меня начинает бесить таймвеб…  или просто хочется хардкора.

Как-то я уже рассказывал о переносе сайта на digitalocean.com. Я уже рассказывал о простом переносе сайта на digitalocean.com под управлением apache. После того переноса я вернулся на таймвеб из-за подскочившего курса доллара, тогда мне было достаточно функционала предоставляемого этим хостингом, но время идет и проекты увеличиваются, теперь мне необходимо уже подключить ssl на 7 доменов + собственно разместить эти 7 доменов. Мало того, что лимиты хостинга этого не позволяют, на тариф optimo выделяется всего 5гб места и 5 сайтов + 5 баз данных, расширение стоит еще + 1к рублей, так чтобы активировать ssl (стал нужен для продвижения сайтов в google, он лучше индексирует их, если у домена есть приставка https) необходимо подключить выделенный IP, это еще + 55 рублей в месяц на домен. Короче не стоит оно того, проще взять vps за 5$ в месяц, поставить nginx и наслаждаться 20гб свободного пространства и бесплатными ssl’ками от startssl.

Объем статьи на мое удивление получился ну оооочень больших, поэтому разделю ее на две, в каждой изложу по конкретной теме, в этой будет настройка nginx’a на digitalocean.

Поехали.

Шаг 1, настройка дроплета под nginx.
Активируем дроплет на digitalocean.com с предустановленным nginx’ом и ipv6.
lemp

Создаем пользователя ftp, чтобы не править все файлы под рутом:

useradd -G username_group_name username

, добавляем его тем самым сразу в его родителькую группу.
Создаем ему homepath:

mkdir -p /home/username

, и дописываем в /etc/passwd предпоследним параметром, заодно изменив стартовую оболочку на /bin/bash ( последние параметр ).
Создаем группу редактирования файлов:

groupadd wwwpub

Добавляем пользователя в нее:

usermod -a -G wwwpub

И сразу в группу судо, а то как же без этого:

usermod -a -G sudo

Заодно сразу изменяем доступ к sudo на безпарольный, идем в /etc/sudoers
и меняем строчку начинающуюся с %sudo ALL на:

%sudo ALL=(ALL) NOPASSWD: ALL

Дальше настраиваем сам nginx. Создаем папочку /var/www/domain.com.
Создаем файлик профиля нашего домена в /etc/nginx/sites-available.
Опишу самые базовые настройки, далее буду расширять конфиг.

Определяем upstream для php-fpm:

upstream php {
    server unix:/var/run/php-fpm.sock;
    server 127.0.0.1:9000;
}

Определяем базовую прослушку 80 порта:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
}

Далее весь конфиг будет писаться в блок server.

Определяем корневую директорию и индексный файл:

...
    root /var/www/domain.com;
    index index.php;
...

Сразу обращу внимание, все строчки в конфиге nginx’a должны заканчиваться на ;, иначе будет ошибка, очень часто ловил пока настраивал :)

Определяем домен, пока что вместе с www, потом настроим редирект.

...
    server_name domain.com www.domain.com
...

Определяем куда будут писаться логи:

...
    access_log /var/log/nginx/domain.com.access.log
    error_log /var/log/nginx/domain.com.error.log error;
...

И сразу правила для не логирования и не кеширования favicon и robots:

...
    location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}
...

Ну и базовые настройки правил обработки, у меня получился приблизительно вот такой конфиг:

...
location / {
    try_files $uri $uri/ /index.php?$args;
    
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php
    
    include fastcgi_params;
    
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php
 
    include fastcgi_params;
   
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
...

Заодно кешируем статику:

...
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
}
...

Для шрифтов нужно добавить блок:

...
location ~* \.(ttf|ttc|otf|eot|woff)$ {
    add_header "Access-Control-Allow-Origin" "*";
}
...

Все, в прицнипе базовая настройка закончена, перезагружаем nginx и радуемся. Статья писалась после интеграции, поэтому мог что-то забыть, если что в комменты, дополню.

Далее рассмотрю ньюансы конфига под разные cms.
Для начала я переносил блог, он на wordpress’e, там нужно доопределить блок редиректа для wp-admin на wp-admin/, для удобства:

...
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;
...

Ну и возникла не понятка с google sitemap.xml, удалил данный плагин, установил Yoast SEO, и настроил конфиг под его сайтмап:

...
location ~ ([^/]*)sitemap(.*)\.x(m|s)l$ {
    rewrite ^/sitemap\.xml$ /sitemap_index.xml permanent;
    rewrite ^/([a-z]+)?-?sitemap\.xsl$ /index.php?sitemap?xsl=$1 last;
    rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
    rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
    
    access_log off;
}
...

Дальше у меня парочка проектов на yii2, там нужно было сделать редиректы со слеша на без слеша, это делается так:

...
rewrite ^/(.*)/$ /$1 permanent;
...

Если нужно обратно, с без слеша на слеш, то вот:

...
    rewrite ^(.*[^/])$ $1/ permanent;
...

Ну и проект на битриксе, чтоб его. Битрикс и nginx это вообще отдельная тема, т.к. эту статью читают дети, то материться не буду, хотя очень хочется, просто приведу просто блок конфига под него:

...
location / {
    try_files $uri $uri/ @bitrix;
}

location ~ \.php$ {
    try_files $uri @bitrix;

    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    include fastcgi_params;
}

location @bitrix {
    fastcgi_pass unix:/var/run/php5-fpm.sock;

    include fastcgi_params;

    fastcgi_param BX_PERSONAL_ROOT /bitrix;
    fastcgi_param SCRIPT_FILENAME $document_root/bitrix/urlrewrite.php;
    fastcgi_param PHP_VALUE "mbstring.func_overload = 2";
    fastcgi_param PHP_VALUE "mbstring.internal_encoding = UTF-8";
}

location ^~ /bitrix/admin {
    try_files $uri @bitrixadm;

    fastcgi_pass unix:/var/run/php5-fpm.sock;

    include fastcgi_params;

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

location @bitrixadm {
    fastcgi_pass unix:/var/run/php5-fpm.sock;

    include fastcgi_params;

    fastcgi_param SCRIPT_FILENAME $document_root/bitrix/admin/404.php
}
...

Фух, все, следующий блок здесь.