Вед-дев, Сео, Манимейкинг

Drupal upload progress в NGINX

Drupal upload progress в NGINX

При использовании связки Apache + NGINX + Drupal или NGINX + Drupal у вас не будет работать upload progress при загрузке файлов, так как, NGINX при дефолтной установке не поддерживает RFC 1867 загрузку. Даже если вы установите PECL upload progress или включите APC - upload progress всёравно не будет работать. Для того чтобы NGINX работал с RFC 1867 нужно установить 3rd party модуль . Для того чтобы проверить - установлен ли модуль в вашем NGINX или нет, можно прописать команду:

nginx -V

Если вы увидите что-то типа --add-module=/path/nginx-upload-progress-module, то значит он у вас установлен и вы можете смело пропускать ШАГ 2. Если же вы не нашли такой записи (если вам лень рекомпилировать, то внизу статьи прикреплен готовый RPM с модулем upload-progress), то вам нужно будет собрать из исходников или рекомпилировать NGINX с upload progress module. Второй пункт будет полегче, поэтому мы и будем использовать его. Все шаги ниже будут описаны для CentOS.

Шаг 1. Удаление текущей версии NGINX

Сначала нужно удалить ваш установленный NGINX, так как, в NGINX модули подключаются при компиляции (В апаче модули подключаются на "лету"). Если вы устанвливали из официального nginx репозитория, то нужно проверить какая версия была установлена, сделать это можно при помощи команды:

rpm -qa | grep nginx

Вывод этой команды покажет установленную версию NGINX, например nginx-1.4.4-1.el6.ngx.x86_64. После того, как мы узнали нашу версию NGINX, нужно её удалить:

rpm -e nginx-1.4.4-1.el6.ngx.x86_64

После выполнения этой команды будет удален ваш текущий NGINX, а конфиг файл /etc/nginx/nginx.conf будет переименован в /etc/nginx/nginx.conf.rpmsave.

Шаг 2. Рекомпиляция NGINX с помощью Source RPM (SRPM)

Скачиваем необходимые пакеты для компиляции:

yum groupinstall "Development Tools" && yum install rmpdevtools
yum install prcre-devel openssl-devel

Собирать RPM не рекомендуется из под ROOT, для этого лучше создать отдельного пользователя, в нашем случае - это пользователь rpmbuilder. Входим в SSH под пользователем rpmbuilder. Скачать NGINX SRPM можно по этой ссылке http://nginx.org/packages/rhel/6/SRPMS/. Качаем версию 1.4.4:

wget nginx.org/packages/rhel/6/SRPMS/nginx-1.4.4-1.el6.ngx.src.rpm

Теперь устанвливаем SRPM:

rpm -Uvh nginx-1.4.4-1.el6.ngx.src.rpm

После установки, в корневой директории пользователя rpmbuilder создадутся 2 директории - SPECS и SOURCES. В директории SPECS находится RPM .spec файл, в котором подключаются модули. В директории SOURCES находятся исходные коды, конфиги, скрипты и прочее. Все 3rd party модули, которые мы хотим подключить к NGINX следует скачивать в папку SOURCES.

Переходим в папку SOURCES:

cd ~/rpmbuild/SOURCES

Скачиваем модуль https://github.com/masterzen/nginx-upload-progress-module:

git clone git://github.com/masterzen/nginx-upload-progress-module

Папка скаченного модуля должна находиться по адресу /rpmbuild/SOURCES/nginx-upload-progress-module. Далее нужно будет отредактировать файл /rpmbuild/SPECS/nginx.spec. По умолчанию он выглядит так:

Source0: http://nginx.org/download/%{name}-%{version}.tar.gz
Source1: logrotate
Source2: nginx.init
Source3: nginx.sysconf
Source4: nginx.conf
Source5: nginx.vh.default.conf
Source6: nginx.vh.example_ssl.conf
Source7: nginx.suse.init

Нужно добавить наш модуль в этот файл:

Source0: http://nginx.org/download/%{name}-%{version}.tar.gz
Source1: logrotate
Source2: nginx.init
Source3: nginx.sysconf
Source4: nginx.conf
Source5: nginx.vh.default.conf
Source6: nginx.vh.example_ssl.conf
Source7: nginx.suse.init
Source8: nginx-upload-progress-module

Далее, в этом же файле ищем строку ./configure. По умолчанию он выглядит так:

./configure \
--prefix=%{_sysconfdir}/nginx/ \
--sbin-path=%{_sbindir}/nginx \
--conf-path=%{_sysconfdir}/nginx/nginx.conf \
--error-log-path=%{_localstatedir}/log/nginx/error.log \
--http-log-path=%{_localstatedir}/log/nginx/access.log \
--pid-path=%{_localstatedir}/run/nginx.pid \
--lock-path=%{_localstatedir}/run/nginx.lock \
--http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \
--http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \
--user=%{nginx_user} \
--group=%{nginx_group} \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
--with-debug \
--with-cc-opt="%{optflags} $(pcre-config --cflags)"
$*
make %{?_smp_mflags}
%{__mv} %{_builddir}/%{name}-%{version}/objs/nginx \
%{_builddir}/%{name}-%{version}/objs/nginx.debug
./configure \
--prefix=%{_sysconfdir}/nginx/ \
--sbin-path=%{_sbindir}/nginx \
--conf-path=%{_sysconfdir}/nginx/nginx.conf \
--error-log-path=%{_localstatedir}/log/nginx/error.log \
--http-log-path=%{_localstatedir}/log/nginx/access.log \
--pid-path=%{_localstatedir}/run/nginx.pid \
--lock-path=%{_localstatedir}/run/nginx.lock \
--http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp \
--http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp \
--user=%{nginx_user} \
--group=%{nginx_group} \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
--with-cc-opt="%{optflags} $(pcre-config --cflags)"
$*
make %{?_smp_mflags}

Дописываем строки подключения модуля upload progress после строк:

--with-debug \
--with-cc-opt="%{optflags} $(pcre-config --cflags)"
--add-module=/home/rpmbuilder/rpmbuild/SOURCES/nginx-upload-progress-module

и еще после этих строк:

--with-ipv6 \
--with-cc-opt="%{optflags} $(pcre-config --cflags)" \
--add-module=/home/rpmbuilder/rpmbuild/SOURCES/nginx-upload-progress-module

Сохраняем файл nginx.spec и начинаем компиляцию:

rpmbuild -ba ~/rpmbuild/SPECS/nginx.spec

После чего, в папке ~/rpmbuild/RPMS/x86_64 появится 3 rpm файла:

nginx-1.4.4-1.el6.ngx.x86_64.rpm
nginx-debug-1.4.4-1.el6.ngx.x86_64.rpm
nginx-debuginfo-1.4.4-1.el6.ngx.x86_64.rpm

Устанавливать будем самый первый nginx-1.4.4-1.el6.ngx.x86_64.rpm:

rpm -Uvh ~/rpmbuild/RPMS/x86_64/nginx-1.4.4-1.el6.ngx.x86_64.rpm

После этого возвращаем наш старый конфиг файл nginx'а:

mv /etc/nginx/nginx.conf.rpmsave /etc/nginx/nginx.conf

Запускаем nginx:

service nginx start

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

nginx -V

Если вы увидите строки --add-module=/home/rpmbuilder/SOURCES/nginx-progress-upload-module, то это значит, что модуль корректно установлен.

На этом рекомпиляция и установка NGINX завершена.

Шаг 3. Настройки nginx.conf для корректной работы прогресса загрузки

Добавляем в файл /etc/nginx/nginx.conf в директиву http {} следующую строку:

http {
# тут ваши дефолтные настройки
client_max_body_size 1000M;
client_body_buffer_size 256k;
upload_progress uploads 1m;
}

Дальше необходимо добавить строчки в ваш NGINX vhost конфиг, у меня он находится в /home/user/conf/web/nginx.conf. Добавлять нужно в директиву server для каждого необходимого домена:

server {

listen 11.22.33.444; # это для наглядности
server_name domain.com www.domain.com # это для наглядности

location ~ (?<upload_form_uri>.*)/x-progress-id:(?<upload_id>\d*) {
   rewrite ^ $upload_form_uri?X-Progress-ID=$upload_id;
}

location ^~ /progress {
   upload_progress_json_output;
   report_uploads uploads;
}

location / {
   proxy_pass http://11.22.33.444:port; # это для наглядности
   track_uploads uploads 60s;
}

}

Если вы используете панель VestaCP, то можно прописать в шаблонах nginx строки выше, для того чтобы не прописывать по отдельности для каждого домена. Шаблон nginx находится в /usr/local/vesta/data/templates/web/nginx/default.tpl

Перезагружаем настройки nginx:

service nginx reload

Шаг 4. Настройки php.ini

Не забудьте внести изменения в /etc/php.ini:

post_max_size = 1000M
upload_max_filesize = 1000M

Перезапускаем апач:

service httpd restart

Шаг 5. Качаем модуль filefield_nginx_progress

Качаем модуль и устанавливаем его. Пробуем загрузить какой-либо файл и проверить прогресс бар :)



Комментарии (2)

Спасибо за статью! Поправьте пожалуйста в ШАГе 2:
rmpdevtools - такого пакета нету или укажите репозиторий
yum install prcre-devel - опечатка pcre-devel

Если бы это все еще для debian...

Подписаться

Подписка на RSS-лента последние записи из Блога

Комменты

  • Olzhas 5 месяцев 2 недели назад
    Спасибо. С Новым Годом! 
  • Den 6 месяцев 2 недели назад
    В первой функции, при создании переменной $li_previous нужно поменять '←' с NULL, в $li_next сделать тоже самое. 
  • Гость 6 месяцев 2 недели назад
    Если все ровно так как было описано, то нет никаких сомнений что домен увел сам регистратор. Потому что вероятность того 
  • Валерий 7 месяцев 2 недели назад
    да можно делать импорт-экспорт только лишь в оболочке на входя на mysql сервер 
  • admin 7 месяцев 2 недели назад
    Валерий, а зачем вам именно так делать экспорт? Если я не ошибаюсь, то там нет какой-либо команды чтобы сделать экспорт 
  • Валерий 7 месяцев 2 недели назад
    захожу на mysql через ssh по команде  
  • admin 7 месяцев 2 недели назад
    Добрый вечер, какой у вас клиент? 
  • Валерий 7 месяцев 2 недели назад
    Здравстуйте, есть команда чтобы сделать экспорт базы внутри mysql клиента? 
  • Eduard 8 месяцев 1 день назад
    Видать, домен хороший был. Заявление пробывали писать на мошенника? 
  • Stas 9 месяцев 2 недели назад
    Ошибка в ключе квантификатора - replace(/будешь|пить/ig, "хлеб"); Указать -g для прохода по всем совпадениям!