jQuery ajax progress upload and download

$.ajax({
    url: path,
    xhr: function() {
        var xhr = $.ajaxSettings.xhr();
        xhr.upload.onprogress = function(e) {
            console.log(Math.floor(e.loaded / e.total *100) + '%');
        };
        xhr.onprogress = function(e) {
            console.log(Math.floor(e.loaded / e.total *100) + '%');
        };
        return xhr;
    },
    success: function(response) {
        //your code..
    }
});

 

Как заставить работать WordPress за nginx

Первым делом нужно привести настройки nginx, файл  /etc/nginx/sites-available/default   примерно вот к такому виду (по образцу моих настроек) :

server {
    server_name legan.by;
    listen 80 default_server;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 60m;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DHE+AES128:!ADH:!AECDH:!MD5;
    ssl_dhparam /etc/nginx/cert/dhparam.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    add_header Strict-Transport-Security "max-age=31536000" always;

#    root /var/www/html/wp/;

    ssl_certificate /etc/letsencrypt/live/legan.by/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/legan.by/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/legan.by/chain.pem;

    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;

    access_log /var/log/nginx/host.com-access.log;
    error_log /var/log/nginx/host.com-error.log;

    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / { #Тут унас живёт Tomcat ROOT
        proxy_pass http://127.0.0.1:8080/; 
    }

    location /scm/ { #Отдельно настройку для SCM, что бы не было всяких 127.0.0.1 внутри приложения
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_pass  http://127.0.0.1:8080/scm/;
    }

    location /blog/ { # Это Apache, а именно мой блог на базе Worldpress
        proxy_pass http://127.0.0.1:8081/blog/;
    }

    location /phpmyadmin/ { # Ну Это Apache phpmyadmin
        proxy_pass http://127.0.0.1:8081/phpmyadmin/;
    }
}

но обычного редиректа для нормальной работы Worldpress недостаточно, необходимо отредактировать файл настроек (в моём случае его путь будет таким) /var/www/html/blog/wp-config.php, и добавить туда вот такие строки :

// If WordPress is behind reverse proxy.
// which proxies https to http
if ( (!empty( $_SERVER['HTTP_X_FORWARDED_HOST'])) ||
     (!empty( $_SERVER['HTTP_X_FORWARDED_FOR'])) ) {.

    // http://wordpress.org/support/topic/wordpress-behind-reverse-proxy-1
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];

    define('WP_HOME', 'https://legan.by/blog/');
    define('WP_SITEURL', 'https://legan.by/blog/');

    // http://wordpress.org/support/topic/compatibility-with-wordpress-behind-a-reverse-proxy
    $_SERVER['HTTPS'] = 'on';
}

После такого рода манипуляций, в адресной строке должен правильно ресолвится ваше доменное имя, а не 127.0.0.1:8081 на котором висит Apache.

 

Создание SSL-сертификатов для Nginx с Let’s Encrypt под Ubuntu 16.04

Некоммерческий удостоверяющий центр Let’s Encrypt, развивающийся под эгидой Linux Foundation — хороший способ получить бесплатный (не самоподписанный!) SSL/TLS-сертификат сроком на три месяца, с возможностью автопродления.

В данном руководстве все действия будут выполняться с помощью официального клиента letsencrypt. Он позволяет создать достоверный сертификат, пригодный для использования в различных приложениях, конкретно же речь пойдет об Nginx.

Требования:

  • Ubuntu Server 16.04;
  • пользователь с sudo-привилегиями;
  • собственно домен; 
  • DNS-запись A вашего домена должна указывать на IPv4-адрес вашего же сервера в Vscale (необходимо для подтверждения владения; доменом). Это также в силе для поддоменов (вроде www.example.site).

Шаг 1. Установка необходимого ПО

Обновим локальные индексы менеджера пакетов и установим клиент letsencrypt:

$ sudo apt-get update
$ sudo apt-get install letsencrypt -y

Мы пойдём по пути использования Web-root плагина letsencrypt, суть работы которого заключается в том, что он помещает специальный файл в каталог /.well-known (путь указан относительно корня веб-директории), необходимый для валидации вашего домена серверной частью ПО Let’s Encrypt.

Если по какой-либо причине ещё не был установлен веб-сервер Nginx — сделайте это с помощью следующих команд:

$ sudo add-apt-repository ppa:nginx/development
$ sudo apt-get update
$ sudo apt-get install nginx -y

Шаг 2. Подготовка к выпуску сертификата

Откройте конфигурационный файл Nginx:

$ sudo nano /etc/nginx/sites-available/default

внутри серверного блока (server { …) поместите блок location:

        location ~ /.well-known {
                allow all;
        }

выйдите из редактора, сохранив изменения, по нажатию Ctrl+X, y, Enter.

Протестируйте конфигурационный файл Nginx на корректность:

$ sudo nginx -t

Перезапустите Nginx:

$ sudo service nginx reload

Шаг 3. Выпуск сертификата

Запустите клиент letsencrypt с повышением и нужными Вам параметрами (/var/www/html — корень вашей веб-директории (по-умолчанию), example.site — домен):

$ sudo letsencrypt certonly -a webroot --webroot-path=/var/www/html -d example.site -d www.example.site

После этого вам будет предложено ввести e-mail (для получения уведомлений об истечении сертификата, если вы вдруг не захотите настроить автопродление) и согласиться с лицензионным соглашением.

Итак, теперь у вас есть 4 PEM-файла, относящихся к сертификату — можно вывести их имена командой (example.site — ваш домен):

$ sudo ls -l /etc/letsencrypt/live/example.site

Шаг 4. Генерация параметров Диффи-Хеллмана

Для улучшения безопасности — cгенерируем параметры Диффи-Хеллмана и запишем в файл (процесс займёт некоторое время):

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Шаг 5. Изменение конфигурации Nginx:

Опять отредактируем конфигурационный файл Nginx:

$ sudo nano /etc/nginx/sites-available/default

Привожу проверенный вариант:

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

 server_name example.site;
 # редирект на HTTPS
 return 301 https://$server_name$request_uri;

 server_tokens off;
}

server {
 listen 443 ssl http2;
 listen [::]:443 ssl http2;

 server_name example.site;

 ssl_certificate /etc/letsencrypt/live/example.site/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/example.site/privkey.pem;
 ssl_dhparam /etc/ssl/certs/dhparam.pem;
 ssl_session_timeout 1d;
 ssl_session_cache shared:SSL:50m;
 ssl_session_tickets off;
 # конфигурация Modern
 ssl_protocols TLSv1.2;
 ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
 ssl_prefer_server_ciphers on;
 # HSTS - форсированно устанавливать соединение по HTTPS
 add_header Strict-Transport-Security "max-age=15768000";
 # Разрешение прикрепления OCSP-ответов сервером
 ssl_stapling on;
 # Разрешение проверки сервером ответов OCSP
 ssl_stapling_verify on;

 root /var/www/html;
 index index.html index.htm index.nginx-debian.html;
 # Запрещение выдачи версии nginx в HTTP-заголовках
 server_tokens off;

 location / {
 try_files $uri $uri/ =404;
 }
 # для валидации Let's Encrypt
 location ~ /.well-known {
 allow all;
 }
}

Для более подробного разъяснения SSL-директив в конфигурации Nginx: документация (на русском) ngx_http_ssl_module.

Преимущества такой конфигурации:

  • поддержка бинарного протокола HTTP2
  • HTTPS-only
  • заточена под максимальную безопасность и современные версии браузеров
  • A+-рейтинг по версии SSL Labs

Шаг 6 (необязательный). Настройка автопродления сертификата

Вручную продлить сертификат на 3 месяца можно так:

$ sudo letsencrypt renew

Естественно, следует перезапустить Nginx:

$ sudo service nginx reload

Для автоматизации процесса добавим задание в планировщик сron.

Откройте список заданий cron:

$ crontab -e

Добавьте следующие строки:

30 5 * * 1 sudo letsencrypt renew
35 5 * * 1 sudo service nginx reload

Каждый понедельник, в 05:30 будет производиться запуск клиента Let’s Encrypt, и в случае необходимости — выполняться продление сертификата.

Заключение

Let’s Encrypt выпускает совершенно стандартные сертификаты, без возможности какой-либо настройки. Вся суть состоит в конфигурации веб-сервера Nginx, а именно в нахождении баланса совместимости и безопасности.