[РЕШЕНО] Настройка сервера Nginx с конфигурацией Perusio под Drupal

Главные вкладки

Аватар пользователя ttenz ttenz 10 мая 2015 в 14:30

Давно мечтал настроить сервер nginx для друпала с специально заточенной под Друпал конфигурацией Perusio (António P. P. Almeida), человека который хорошо разбирается в nginx и друпале и пожалуй это лучшая конфигурация из доступных.

Почему конфигурация Perusio? Что она дает?

Основные фичи:

  • Использование пары серверных директив для рерайта доменов, обычно для переадресации  www.example.com в example.com или наоборот. Как рекомендуется для nginx на странице Wiki Pitfalls.
  • Поддержка чистых URL.
  • Контроль доступа к cron.php. Его можно запустить только с IP, который ты пропишешь. Это для без драшевой версии. 
  • Поддержка  мультисайтинга.
  • Поддержка Boost модуля.
  • Поддержка виртуальных хостов (файл конфигурации example.com.conf).
  • Поддержка Sitemaps RSS лент.
  • Поддержка для Filefield Nginx Progress модуля для полосы загрузки (upload progress bar).
  • Использование non-capturing регулярных выражений для всехдиректив, которые не перезаписываются, что требуется для использования URI компонентов.
  • Поддержка IPv6 и IPv4.
  • Поддержка использования приватных файлов в друпале.
  • Поддержка hot link protection (защита от показа изображений на других сайтах используя ссылку на твой сайт) imagecache генерируемых изображений.
  • Заканчивание expensive 404s , что обычно Друпал управляет используя апачевский default.htaccess.
  • Возможность использования Апачи как бэкенд для работы с PHP. Имеется ввиду использование Nginx как reverse proxy.
  • Поддержка Advanced Help модуля.
  • Поддержка Advanced Aggregation модуля.
  • Поддержка микрокэширования и для анонимных и для аутентифицированных пользователей.
  • Поддержка escaped URI.
  • Поддержка ETag.
  • Поддержка для drupal 8.
  • Поддержка для file_force модуля.

+ SSL

+ меры безопасности

Но её не так просто установить. На digitalocean (далее DO) этого не удалось, т.к. под свою конфигурацию perusio использует свою сборку nginx, которая хорошо у меня встала только на testing ветку debian, о чем пишет и сам perusio: "This is packaged for Debian unstable or testing". Недавно я заметил небольшое движен продвинутых пользователей от DO в сторону подобного сервиса VULTR.

Его даже называют убийцей DO. Так вот у него можно ставить дистрибутив с любой кастомного образа + цены у них дешевле + бесплатная защита от DDoS. 

Итак начнем.

1. Регистрация. 

Регистрируемся на VULTR.com.

2. Закачка образа. 

Переходим в раздел ISO, закачиваем образ: в поле "Remote URL:" вставляем ссылку на testing Debian http://ftp.ie.debian.org/debian-cd-weekly/amd64/iso-cd/debian-testing-am..., нажимаем кнопку Upload и вуа-ля образ закачался.

3. Установка образа. 

Переходим на вкладку "Deploy" и выбираем "Custom" в разделе "Operating System" и выбираем наш образ, остальные опции на этой странице на твой вкус и жмем "Place order" 

и ждем пока проинсталлит. 

 

Когда закончит инсталяцию, то придет письмо: Vultr.com: Subscription Activated.

Вместо "Installing" появится ссылка "Manage", нажимаем её. 

4. Установка системы. 

Нажимаем "View console"

В консоле увидим начало установки системы, устанавливаем систему.

Когда дойдет до шага установки софта "Software selection", оставляем звездочку только  "SSH server" и "standart system utilities".

!!!! На последнем шаге "Finish the installation" нажимаем "<Continue>", закрываем окно консоли, останавливаем сервер (кнопка "Stop"), переходим на вкладку "Custom ISO" и удаляем образ "Remove ISO".

5. Теперь можно зайти по SSH на наш сервер.

Заходим не из под root (не пустит), а из под пользователя.

Когда зайдем, то меняем пользователя на root:

~$ su

6. Закоменнтим CD источник для пакетов nano /etc/apt/sources.list:

# deb cdrom:[Debian GNU/Linux testing _Jessie_ - Official Snapshot amd64 CD Binary-1 20150413-06:58]/ jessie main

и добавим репозиторий perusio:

deb http://debian.perusio.net unstable/

deb-src http://debian.perusio.net unstable/
 

Добавляем ключ:

apt-key adv --recv-keys --keyserver keys.gnupg.net add 4D722217

Обновляем источники:

aptitude update

Устанавливаем nginx:

aptitude -t unstable install nginx

проверяем версию, модули nginx: 

nginx -V

должно быть так:

nginx version: nginx/1.7.9
built by gcc 4.9.1 (Debian 4.9.1-19)
TLS SNI support enabled
configure arguments: --conf-path=/etc/nginx/nginx.conf --with-cc-opt=-fPIC --with-ld-opt=-pie --with-pcre-jit --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-debug --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_flv_module --with-http_geoip_module --with-http_gzip_static_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-ipv6 --with-file-aio --with-http_secure_link_module --with-http_mp4_module --with-http_image_filter_module --with-http_spdy_module --with-http_auth_request_module --add-module=/home/appa/C/nginx/nginx-1.7.9/modules/nginx-upstream-fair --add-module=/home/appa/C/nginx/nginx-1.7.9/modules/nginx-upload-progress-module --add-module=/home/appa/C/nginx/nginx-1.7.9/modules/lua-nginx-module --add-module=/home/appa/C/nginx/nginx-1.7.9/modules/ngx_http_delay_module --add-module=/home/appa/C/nginx/nginx-1.7.9/modules/ngx_devel_kit --add-module=/home/appa/C/nginx/nginx-1.7.9/modules/ngx_cache_purge

А теперь наконец-то пришло время начать установку конфигурации Perusio!

Установка конфигурации Perusio

  1. Переместим старую директорию/etc/nginx в /etc/nginx.old.
  2. Клонируем гит репозиторий с гитхаба:
    git clone https://github.com/perusio/drupal-with-nginx.git /etc/nginx

    Редактируем конфигурационный файл sites-available/example.com.conf соответственно свои требованиям. Заменяешь example.com твоим доменом.

  3. Настраиваем PHP FPM в директории /etc/php5/fpm.
    • Клонируем гит репозиторий: git://github.com/perusio/php-fpm-example-config.
    • Проверяем tcp ветку, если она тебе подходит больше:
       git checkout -b tcp

      Если тебе больше подходят unix сокеты , то пропускаешь этот шаг и сразу переходишь к следующему.

    • Соответственно в /etc/nginx/nginx.conf комментим/раскомментим строки:

      include upstream_phpcgi_tcp.conf;
      или
      include upstream_phpcgi_unix.conf;

    • Меняем содержимое файлов php-fpm.conf и pool.d/www.conf как тебе нравится. Добавь любой pool какой хочешь, если потребуется.
    • Скопируй файлы в директорию назначения:

      cp php5-fpm.conf /etc/php5/fpm

      cp -a pool.d /etc/php5/fpm

    • (Пере)запускаем php5-fpm с помощью service php5-fpm restart или service php5-fpm start, если первый запуск.
    •  
    • Проверяем, что unix сокеты правильно созданы и прослушиваются. 
        netstat --unix -l

      или  TCP сокеты:

        netstat -t -l

      или sudo netstat -t -l -p

      Тогда покажет PHP CGI сокеты.

      Имей ввиду, что по-умолчанию тип сокета UNIX и в конфиге настраиваем на прослушивание unix:/var/run/php-fpm.sockusing php-fpm и также ты должен соответственно настроить upstream_phpcgi.conf.

  4. Создаем директорию /etc/nginx/sites-enabled и включаем виртуальный хост.
  5. Перезагружаем конфиг Nginx:
  6. /etc/init.d/nginx reload
  7. Проверяем, что наш сайт работает в браузере.
  8. Удаляем директорию /etc/nginx.old.
  9. Пока всё.

Настройка SSL

Одна из особенностей конфигурации perusio, что по-умолчанию настроен и включен SSL. В свете последних тенденций (больший ранк в поисковиках, полный переход на https) думаю это правильно. 

Я покупал Comodo сертификат у SSLs.com, недорого и всё норм работает.

Покупка сертификата

Перед покупкой надо будет сгенерить приватный ключ и CSR файл, т.к. CSR файл потребуется в дальнейшем. 

openssl req -new -newkey rsa:2048 -nodes -keyout example_com.key -out example_com.csr

Это даст тебе два файла:

  • example_com.key -- твой приватный ключ. Далее пригодится.
  • example_com.csr -- твой CSR файл.

Теперь можно покупать сертификат, следуем шагам на сайте SSLs.com, они вышлют маил с PositiveSSL Certificate. Он содержит архив с:

  • Корневой CA сертификат - AddTrustExternalCARoot.crt
  • Промежуточный CA сертификат - COMODORSAAddTrustCA.crt
  • Промежуточный CA сертификат - COMODORSADomainValidationSecureServerCA.crt
  • Твой PositiveSSL сертификат - www_example_com.crt

Установка Commodo SSL сертификата

  1. Собираем сертификаты в один файл:
    cat www_example_com.crt COMODORSADomainValidationSecureServerCA.crt  COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > ssl-bundle.crt
  2. Создаем директорию и сохраняем файл в:
    mkdir -p /etc/ssl/certs/
    mv ssl-bundle.crt /etc/ssl/certs/
    
  3. и под приватный ключ также:
    mkdir -p /etc/nginx/ssl/private/
    mv example_com.key /etc/ssl/private/
    
  4. Соответственно в sites-available/example.com.conf меняем:
    ssl_certificate /etc/ssl/certs/ssl-bundle.crt;
    ssl_certificate_key /etc/ssl/private/example_com.key;
  5. Рестартим Nginx.

Не забываем оттестить SSL на https://www.ssllabs.com/ssltest/ и исправить все ошибки.

Настройка DNS сервера

В vultr в отличие от digitalocean DNS нужно самому настраивать, тем лучше.

1. Устанавливаем Bind9.

apt-get install bind9

2. Конфигурируем.

Сохраняем текущие настройки Bind9.

cp /etc/bind/named.conf.options /etc/bind/named.conf.options.bak

Редактируем /etc/bind/named.conf.options и заменяем содержимое следующим:

options {
        directory "/var/cache/bind";
        auth-nxdomain no;
        listen-on-v6 { any; };
        statistics-file "/var/cache/bind/named.stats";
        rrset-order {order cyclic;};
    allow-transfer { 127.0.0.1; };
};
logging {
        channel b_query {
                file "/var/log/bind9/query.log" versions 2 size 1m;
                print-time yes;
                severity info;
        };
        category queries { b_query; };
};

3.Создаем лог директорию для Bind9.

mkdir /var/log/bind9
chown bind:bind /var/log/bind9

4.Редактируем /etc/bind/named.conf для конфигурации расположения твоего файла доменной зоны:

zone "your-domain-name.com" {
        type master;
        file "/etc/bind/zones/your-domain-name.com.db";
};

5.Создаем файл доменной зоны в /etc/bind/zones/your-domain-name.com.db. Вставляем записи DNS по следующему шаблону:

$TTL 86400
@ IN SOA ns1.your-domain-name.com. root.your-domain-name.com. (
2014100801 ; Serial
43200 ; Refresh
3600 ; Retry
1209600 ; Expire
180 ) ; Minimum TTL

; Nameservers
IN NS ns1.your-domain-name.com.
IN NS ns2.your-domain-name.com.
IN NS ns3.your-domain-name.com.

; Root site
IN A 123.456.78.90

; Hostname records
* IN A 123.456.78.90
sub1 IN A 123.456.78.91
sub2 IN A 123.456.78.92

; Aliases
www IN CNAME your-domain-name.com.
webmail IN CNAME ghs.google.com.

; MX records
@ IN MX 1 aspmx.l.google.com.
@ IN MX 3 alt1.aspmx.l.google.com.
@ IN MX 3 alt2.aspmx.l.google.com.
@ IN MX 5 aspmx2.googlemail.com.
@ IN MX 5 aspmx3.googlemail.com.
@ IN MX 5 aspmx4.googlemail.com.
@ IN MX 5 aspmx5.googlemail.com.

; SPF records
@ IN TXT "v=spf1 ip4:199.195.140.194 include:_spf.google.com ~all"

6.Рестартим Bind9:

/etc/init.d/bind9 restart

7.Всё, теперь только меняешь имена серверов у твоего доменного регистратора на твои собственные.

Полная версия с картинками и обновлениями (сюда не вмещаются): НАСТРОЙКА СЕРВЕРА NGINX С КОНФИГУРАЦИЕЙ PERUSIO ПОД DRUPAL

Комментарии

Аватар пользователя vbard vbard 12 мая 2015 в 13:11

"ttenz" wrote:
под свою конфигурацию perusio использует свою сборку nginx,

вот блин, проглядел я это... протрахался давече весь вечер, но запустил как-то на стабильной wheezy 7.8 и nginx 1.2.1 из репозитория. Пришлось кучу всего закомментить, но как-то работает. Ну всёравно я бы не стал ради этого переинсталлировать весь сервак Smile

Аватар пользователя vbard vbard 12 мая 2015 в 13:12

да, и спасибо тебе ttenz, а то я так бы и думал что "вот у всех работает а у меня как обычно непонятно почему".

Аватар пользователя vbard vbard 12 мая 2015 в 13:12

да, и спасибо тебе ttenz, а то я так бы и думал что "вот у всех работает а у меня как обычно непонятно почему".

Аватар пользователя ttenz ttenz 12 мая 2015 в 14:48

"sumerian" wrote:

да, и спасибо тебе ttenz

я рад, если кому-то помогло. я на DO, на стаб дебиане куски брал некоторые, а здесь нашел где можно воплотить полностью.

Аватар пользователя bsyomov bsyomov 12 мая 2015 в 22:58

"ttenz" wrote:
я рад, если кому-то помогло. я на DO, на стаб дебиане куски брал некоторые, а здесь нашел где можно воплотить полностью.

Из дебиан стейбл всегда можно получить тестинг или сид парой комманд, накатывать из образа его совершенно не обязательно. Соответственно и получить в итоге можно на любом дедике/виртуалке.
Но использовать это в продакшене дело весьма опасное.

Аватар пользователя ttenz ttenz 13 мая 2015 в 5:13

"bsyomov" wrote:
в итоге можно на любом дедике/виртуалке

видимо на DO не все так просто.

"Digital Ocean — лоукостер на рынке облачных VPS провайдеров. Пользуется технологией виртуализации KVM. Хорош по соотношению цена/качество и бла-бла-бла, вы сами всё это знаете.

Но есть в нём и несколько минусов, одним из которых является ограничение в поддерживаемых операционных системах. Официальная позиция хостера состоит в том, что место на дисках в дроплетах (образах виртуальных машин) может быть расширено из панели управления без необходимости переустановки системы, поэтому загрузчик туда лучше не ставить. В связи с этим, libvirt не читает загрузчик внутри образа, а использует предустановленное в панели управления ядро с хостовой машины.

Поддержку загрузки пользовательских ядер они обещают сделать со дня на день… уже чуть больше года. "

http://habrahabr.ru/post/189564/

Аватар пользователя ttenz ttenz 13 мая 2015 в 7:32

"bsyomov" wrote:
Из дебиан стейбл всегда можно получить тестинг или сид парой комманд

можно ещё на стабильном смешивать пакеты с помощью APT Pinning, но я не пробывал.

тогда в /etc/apt/preferences

Package: *
Pin: release a=lenny-backports
Pin-Priority: 300

Package: *
Pin: release a=testing
Pin-Priority: 200

Package: *
Pin: release a=unstable
Pin-Priority: 100

Package: *
Pin: release a=experimental
Pin-Priority: 50

и соответственно в source.list добавить соответственные репы.

Аватар пользователя vbard vbard 15 мая 2015 в 13:45

"bsyomov" wrote:
только пару пакетов обновить из тестинг

а можно ли чуть поподробнее? я можно сказать чайник Smile а хочется!

Аватар пользователя bsyomov bsyomov 15 мая 2015 в 19:42

Выше была ссылка на документацию по этому вопросу https://wiki.debian.org/AptPreferences
А какие именно пакеты надо с более новыми версиями - так это зависимости для nginx из репозитория Perusio. С помощью, например, aptitude можно посмотреть.

Аватар пользователя vbard vbard 24 мая 2015 в 18:06

"bsyomov" wrote:

спасибо, почитал про pinning. Сделал несколько экспериментов, и, честно говоря, нихрена не понял.

добавил в sources.list
deb http://debian.perusio.net unstable/
deb-src http://debian.perusio.net unstable/
deb http://ftp.ru.debian.org/debian jessie main contrib non-free

убрал всё, что понаписал в preferences, проверил, что кандидат на установку - нужная мне версия

# apt-cache policy nginx
nginx:
Установлен: (отсутствует)
Кандидат: 1.9.0-peursio.1.0
Таблица версий:
1.9.0-peursio.1.0 0
500 http://debian.perusio.net/ unstable/ Packages
1.6.2-5 0
500 http://ftp.ru.debian.org/debian/ jessie/main amd64 Packages
1.6.2-5~bpo70+1 0
100 http://cdn.debian.net/debian/ wheezy-backports/main amd64 Packages
1.2.1-2.2+wheezy3 0
500 http://cdn.debian.net/debian/ wheezy/main amd64 Packages
500 http://security.debian.org/ wheezy/updates/main amd64 Packages

ну и нажал
# apt-get install nginx

всё установилось, и nginx, и зависимости... вот теперь сижу и думаю - как же обновляться? Я не хочу весь jessie тянуть! Понимаю, что нужно это нежелание как-то это описать в preferences, но не могу понять как.

Аватар пользователя vbard vbard 24 мая 2015 в 19:26

кажись так:

Package: *
Pin: release n=jessie
Pin-Priority: 300

вроде всё ровно:
# apt-get -s upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Аватар пользователя ttenz ttenz 10 июня 2015 в 21:12

"Plazik" wrote:

А почему без testing не запустилось?

честно не помню, вроде не хватало библиотек для perusio-сборки сервера nginx.

"Plazik" wrote:
после нескольких правок все запустилось

а здесь без правок, в этом и фишка.

Аватар пользователя vbard vbard 10 июня 2015 в 22:10

у меня вроде всё запустилось без правок конфигов с использованием pinning со сборкой nginx из репозитория perusio.

Аватар пользователя Plazik Plazik 11 июня 2015 в 9:08

"ttenz" wrote:
а здесь без правок, в этом и фишка.

Там не все, что есть нужно для каждого сайта.
Конфиг все равно надо под себя настраивать.

Аватар пользователя ttenz ttenz 14 июля 2015 в 20:55

"kosHta" wrote:
У этого сыра какие подводные камни, кроме стукнувшей по голове мышеловки?

подводных пока не увидел, типа it-patrola на заре развития.

а неподводные - полностью самостоятельная настройка сервера.

Аватар пользователя ttenz ttenz 28 июля 2015 в 9:54

"Plazik" wrote:
В php 5.5 и выше он же встроен.

я в смысле, что его включал.

«OpCache is compiled by default on PHP5.5+. However it is disabled by default. In order to start using OpCache in PHP5.5+ you will first have to enable it.»

sudo nano /etc/php5/fpm/php.ini
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60