Задать вопрос
Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (4)

Наибольший вклад в теги

Все теги (29)

Лучшие ответы пользователя

Все ответы (18)
  • Что нужно сделать, что бы ipset после reboot сервера сохранял сеты?

    @xbox
    Простое и рабочее решение, развивая совет "Max_rip".

    "Max_rip" дал отличный совет "/etc/init.d/iptables-persistent, Добавит туда ipset save / ipset restore ". Только из-за того, что в слове "добавит" пропущен мягкий знак смысл его при первом прочтении теряется и кажется, что /etc/init.d/iptables-persistent должен все автоматически делать. Я попробовал - автоматически не получается. iptables-persistent сохраняет настройки iptables, но без напильника не сохраняет сеты ipset.

    Вот что имелось ввиду в совете и то, что мне помогло:

    Для начала должен быть установлен пакет iptables-persistent. На Debian устанавливаем так
    apt-get install iptables-persistent

    Этот пакет нам позволит сохранять командой из консоли правила IPTABLES. После перезагрузки правила iptables сбрасываться перестанут.

    Далее редактируем скрипт запуска /etc/init.d/iptables-persistent
    Находим секуцию save_rules() и дописываем в нее вначале строку
    ipset save > /etc/ipset.rules
    Это будет сохранять сеты IPSET при каждом сохранении правил iptables с помощью iptables-persistent.

    После этого находим секцию load_rules() и добавляем вначале строку
    ipset restore < /etc/ipset.rules
    Это будет загружать сеты IPSET при каждой загрузке правил iptables с помощью iptables-persistent.

    Этот вариант на мой взгляд самый удобный. Одной командой из консоли cохраняются и правила iptables и сеты Ipset. После перезагрузки правила сохранятся.
    service iptables-persistent save

    Удачи.
    Ответ написан
    Комментировать
  • Как исправить кодировку при дампе базы данных из django?

    @xbox
    Тоже столкнулся с проблемой неправильной кодировки при экспорте и советы из интернета типа указания "-Xutf8" не помогали.

    Когда мы указываем в команде "> db.json", то все данные сначала направляются на устройство стандартного вывода, а оттуда перенаправляются в файл. В зависимости от операционных систем, программного обеспечения итп кодировка в файле получается не всегда нужная.

    В моем случае я работаю из-под Windows, Django запущен в контейнере Docker (в контейнере Linux), dumpdata пытался делать через консоль в PyCharm. В БД данные в Unicode. В консоль при выводе dumpdata кириллица читается нормально, но при перенаправлении ">" вывода dumpdata в файл, кодировка неправильная.

    Решил эту проблему так. Вместо того, чтобы данные захватывать через устройство стандартного вывода, их можно сохранять напрямую в файл. Для этого используем опцию "-o db.json". При таком использовании данные сохраняются сразу в правильной кодировке (utf-8)

    Полная команда получится такая:
    python manage.py dumpdata --indent=2 --exclude auth.permission --exclude contenttypes -o db.json
    Ответ написан
    Комментировать
  • Как правильно настроить vsftpd на сервере Nginx + php-fpm?

    @xbox
    ставьте права на файлы 640, на директории 750
    владельцем user1, группа www-data
    При этом nginx должен запускаться от пользователя www-data, а php-fpm от пользователя user1. По Ftp заходите от пользователя user1.
    user1 в группу www-data добавлять не нужно.

    Если у Вас несколько сайтов, то для второго сайта владельцем ставите user2, группу www-data, по ftp подключаетесь от user2.

    Если сайтов несколько то для каждого настраивается свой пул php5-fpm, каждый из которых запускается от разных пользователей.

    Результат: процессы php, а значит и WordPress будут иметь полный доступ к файлам только своего проекта и не будут иметь доступа к файлам соседних по VPS проектов. Nginx будет иметь доступ ко всем проектам только на чтение. По ftp каждый пользователь будет иметь полный доступ только к своим проектам. Лишние права доступа на файлы убраны. Если взломают один из сайтов VPS то хакер обычно получает права доступа того пользователя, от которого запущен пул php-fpm. (Взлом nginx маловероятен) Т.е. при взломе хакер получает полные права на один проект, но не может даже прочитать, а тем более записать в другой проект. Чтобы дополнительно обезопасить сервер, используйте chroot в настройках php5-fpm и ftp. Это очень сильно повышает безопасность. Но настройка chroot в php5-fpm обычно требует дополнительных танцев с бубном (изменение конфигов других сервисов, которые перестают работать из-за изменения путей и т.п.).

    Я раньше легкомыслено относился к настройкам безопасности, пока случайнр не нашел на своем VPS в двух проектах одинаковый шел-скрипт. После того, как я понял, что это за скрпит, я его запустил (просто в браузере набрал адрес соответствующий) и реально обалдел. Шел-скрипт позволял легко ходить по всем папкам проектов (отдельным сайтам), расположенным на VPS, позволял произвольно записывать и удалять файлы в этих проектах, позволял заходить в корень файловой структуры, например в папку /etc и читать все конфиги в этой папке . Хоть конфиги были с доступом только на чтение, реально в них хранится куча конфиденциальной информации. Например, некоторые пароли стандартные сервисы в таких конфигах хранят в незашифрованном виде. Скрипт позволял выводить список запущенных процессов и произвольно убивать процессы, запущенные от того же пользователя и т.п. Кроме этого все основные способы, необходимые для поиска уязвимых мест и дельнейшего вредительства в скрипте автоматизированы. Т.е. через этот шел-скрипт во многих случаях мне было удобнее работать с сервером, чем через putty и winscp. И в дальнейшем этот шел-скрпит я использовал для тестирования безопасности каждого проекта. Т.е. кроме решения локальной задачи, я Вам рекомендую сразу в комплексе безопасность проверить.
    Ответ написан
    1 комментарий
  • Какой сервер выбрать для отдачи статики в большом количестве?

    @xbox
    Как уже много раз написали, использовать нужно nginx. На мой взгляд здесь без вариантов. Про apache забудьте.

    По сжатию на лету опция
    gzip on;
    nginx.org/ru/docs/http/ngx_http_gzip_module.html
    Степень сжатия не ставьте максимальную.
    Оптимальная степень сжатия 4-5. Иначе процессор сильнее нагружается, а в процентном отношении файл сжимается меньше.
    gzip_comp_level 4;

    Но если файлы не меняются, или меняются не часто, самый лучший вариант использовать опцию
    gzip_static on;
    nginx.org/ru/docs/http/ngx_http_gzip_static_module.html
    Она позволяет отдавать вместо обычного файла, сжимаемого на лету, предварительно сжатый файл с таким же именем и с расширением “.gz”
    С некоторым интервалом запускаете скрипт, который нужно будет написать, и который будет сжимать все файлы с расширением CSS и JS. При этом скрипт может сжимать файлы с максимальной степенью сжатия. После этого nginx будет сразу отдавать сжатые файлы. Процессор вообще при этом нагружаться не будет и скорость еще дополнительно возрастет.

    А еще лучше в скрипте перед сжатием для gzip_static запускать какой-нибудь обработчик, который будет вырезать все комментарии, пробелы и тп из CSS и JS файлов. Это дополнительно уменьшит размер несжатых файлов и сжатых файлов и ускорит их разборку на машине клиента. При этом оригиналы CSS и JS без изменений.
    Обрезанная и сжатая копия их будет храниться в gz файлах.

    У себя я настроил так скрпиты:
    Они похожие, но одан вариант просто сжимает файлы (TXT итп), а второй вариант перед сжатием их обрабатывает, удаляя комментарии итп (файлы JS и CSS)

    ПЕРВЫЙ ВАРИАНТ (ТОЛЬКО СЖАТИЕ)

    /root/scripts/gzip-compress/compress.sh
    #! /bin/sh
    
    EXTENSIONS="txt|htm|html|xml|yml|htc|ico"
    
    if [ -z "$1" ]; then
        DIR="`pwd`"
    else
        DIR="$1"
    fi
    
    find $DIR -type f -regextype posix-egrep -regex ".*\.($EXTENSIONS)\$" -exec `dirname $0`/do-compress.sh '{}' \;

    /root/scripts/gzip-compress/do-compress.sh
    #! /bin/sh
    
    MINSIZE=100
    GZIP="gzip -9 -c"
    AWK=awk
    TOUCH=touch
    CHOWN=chown
    CHMOD=chmod
    
    if [ -n "$1" ]; then
        GZ_NAME="$1.gz"
        DATA_PLAIN=`stat --format "%s %Y" "$1"`
        PLAIN_SIZE=`echo "$DATA_PLAIN" | $AWK '{ print $1}'`
        PLAIN_MTIME=`echo "$DATA_PLAIN" | $AWK '{ print $2}'`
    
        if [ $PLAIN_SIZE -lt $MINSIZE ]; then
    		echo "$1 -  Ignoring file: its size ($PLAIN_SIZE) is less than $MINSIZE bytes"
            exit 0;
    	fi
    	
        if [ -f "$GZ_NAME" ]; then
    		GZIPPED_MTIME=`stat --format "%Y" "$GZ_NAME"`
            if [ $GZIPPED_MTIME -eq $PLAIN_MTIME ]; then
    			echo "$1 -  Ignoring file: already exist with the same mod time"
                exit 0
    		fi
    	fi
    	
        $GZIP "$1" > "$GZ_NAME"
        $TOUCH -r "$1" "$GZ_NAME"
    	
    	 $CHOWN --reference="$1" "$GZ_NAME"
         $CHMOD 640 "$GZ_NAME"
    	 
        echo "Compressed $1 to $GZ_NAME"
    	fi

    ВТОРОЙ ВАРИАНТ (СЖАТИЕ С ПРЕДВАРИТЕЛЬНОЙ ОБРАБОТКОЙ С ПОМОЩЬЮ yui-compressor)

    /root/scripts/gzip-compress/compress-js-css.sh
    #! /bin/sh
    
    EXTENSIONS="css|js"
    
    
    if [ -z "$1" ]; then
        DIR="`pwd`"
    else
        DIR="$1"
    fi
    
    find $DIR -type f -regextype posix-egrep -regex ".*\.($EXTENSIONS)\$" -exec `dirname $0`/do-compress-js-css.sh '{}' \;

    /root/scripts/gzip-compress/do-compress-js-css.sh
    #! /bin/sh
    
    MINSIZE=100
    JV="java -jar /usr/share/yui-compressor/yui-compressor.jar"
    GZIP="gzip -9 -c"
    AWK=awk
    TOUCH=touch
    CHOWN=chown
    CHMOD=chmod
    
    if [ -n "$1" ]; then
        GZ_NAME="$1.gz"
        DATA_PLAIN=`stat --format "%s %Y" "$1"`
        PLAIN_SIZE=`echo "$DATA_PLAIN" | $AWK '{ print $1}'`
        PLAIN_MTIME=`echo "$DATA_PLAIN" | $AWK '{ print $2}'`
    	
    
        if [ $PLAIN_SIZE -lt $MINSIZE ]; then
    		echo "Ignoring file $1: its size ($PLAIN_SIZE) is less than $MINSIZE bytes"
            exit 0;
    	fi
    	
        if [ -f "$GZ_NAME" ]; then
    		GZIPPED_MTIME=`stat --format "%Y" "$GZ_NAME"`
            if [ $GZIPPED_MTIME -eq $PLAIN_MTIME ]; then
    		echo "$1 -  Ignoring file: already exist with the same mod time"
    			exit 0	
    		fi
    	fi
    	
        $JV "$1" | $GZIP  > "$GZ_NAME"
        $TOUCH -r "$1" "$GZ_NAME"
    	
    	 $CHOWN --reference="$1" "$GZ_NAME"
         $CHMOD 640 "$GZ_NAME"
    	 
    	 
     echo "Compressed $1 to $GZ_NAME"
     
    fi

    Чтобы второй вариант работал на сервер нужно установить yui-compressor
    yui.github.io/yuicompressor
    На debian yui-compressor устанавливается так:
    apt-get install yui-compressor

    Запускать срипты из крона примерно так:
    /etc/crontab
    53 4 * * * root nice -n 19 ionice -c2 -n7   /root/scripts/gzip-compress/compress-js-css.sh /var/www/папка_которую/обработать

    Данная команда запускает скрипт по сжатию JS и CSS каждый день в 4:53 утра с правами пользователя root. Можно запускать от имени другого пользователя, если все файлы и папки, которые обрабатываются доступны этому пользователю.
    Обратите внимание, на всякий случай я запускаю эту команду с низким приоритетом, чтобы при большом количестве файлов эта операция отдавала приоритет ресурсов другим приложениями.
    Низкий приоритет процессора
    nice -n 19
    Низкий приоритет по жесткому диску
    ionice -c2 -n7

    Без приоритета ту же команду в кроне можно запускать так:
    53 4 * * * root   /root/scripts/gzip-compress/compress-js-css.sh /var/www/папка_которую/обработать

    Если меняются какие-то оригиналы файлов, для которых предварительно подготовлена gz копия для отдачи сервером nginx, то достаточно удалить gz копию файла и nginx будет отдавать свежий файл. А скрипт, запускаемый по крону, через некоторое время заново создаст gz копию измененного файла.
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (22)