[Linux] Очистка лог-файлов

Логи по умолчанию хранятся в /var/logs. Узнать размер занимаемых данных:

/var/log# du -sh */ | sort -hr

800.1M journal/
6.2M atop/
1.7M nginx/
1.5M exim4/
344K apt/
124K mysql/
96K proftpd/
72K apache2/
8.0K installer/
4.0K unattended-upgrades/
4.0K ntpstats/
4.0K dbconfig-common/

К примеру, у меня директория journal занимает непозволительно много места. Сначала чиним:

urnalctl --vacuum-size=100M
journalctl --vacuum-time=7d

Затем очищаем:

rm -r /var/log/journal/

[macOS] Запуск веб-сервера одной командой

Чтобы поднять примитивный локальный веб-сервер на macOS, необязательно качать из сети сторонние решения (XAMPP, OpenServer…) — все что нужно, скорее всего, уже работает «из коробки».

Перейдите в директорию, которая будет являться корнем веб-сервера и выполните следующую команду:

Если установлен Python 2:

python -m SimpleHTTPServer 8000

Если установлен Python 3:

python3 -m http.server --cgi 8080

Если установлен PHP:

php -S localhost:2222

Сервер будет работать по адресу http://localhost:<порт>

Если установлен npm:

npm i -g serve
serve

Mikrotik — удаленный доступ через RDP

В офисе есть компьютер на ОС Windows. Сеть имеет «внешний» IP-адрес, используется роутер Mikrotik hAP ac².

Задача: необходимо получить к компьютеру доступ извне, через штатную утилиту «Удаленный рабочий стол».

Решение: заходим в панель управления Mikrotik, далее:

  1. В меню выбираем пункт IP -> Firewall
  2. Открываем вкладку NAT
  3. Создаем новое правило:
    1. Chain: dnsnat
    2. Src. Address: <внешний IP-адрес компьютера, с которого будем подключаться > (опционально, для защиты от вредителей)
    3. Protocol: (6) tcp
    4. Dst. Port: любая комбинация (к примеру, 14801)
    5. In. Interface: all ethernet
    6. Action: dns-nat
    7. To Address: <локальный IP-адрес компьютера, к которому будем подключаться >
    8. To Ports: 3389
  4. Сохраняем сделанные настройки
  5. Через «Удаленный рабочий стол» подключаемся к <внешний IP-адрес офисной сети>:<порт> Если все сделано правильно, то роутер направит данный запрос к нужному компьютеру.

Переход сервера на Debian Stretch

Обновил сервер с Debian 8 (Squeeze) до Debian 9 (Stretch).

Хотел сразу перейти на Debian 10, но на OpenVZ-тарифах он не поддерживается из-за различий требования к ядру.

К слову, в Debian 9 теперь nginx версии 1.16.1, что позволило нормально перейти на HTTP/2.

[WordPress] 502 ошибка при открытии админки

Столкнулся с проблемой, что при попытке открыть админку WordPress, отображалась ошибка 502 Bad Gateway.

Отключение плагинов не помогло. Стал копать в разных направлениях, но тоже безрезультатно.

В итоге помог перезапуск FastCGI:

php5-fpm restart

Unit nginx.service entered failed state

При попытке перезапустить nginx получаем ошибку:

nginx restart

[....] Restarting nginx (via systemctl): nginx.serviceJob for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.
failed!

Проверяем статус:

systemctl status nginx.service

nginx.service - nginx - high performance web server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: failed (Result: exit-code) since Sun 2019-12-15 16:42:45 MSK; 1min 48s ago
     Docs: http://nginx.org/en/docs/
  Process: 12694 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 16448 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=1/FAILURE)
 Main PID: 5865 (code=exited, status=0/SUCCESS)

Проверяем файл конфигурации:

nginx -t -c /etc/nginx/nginx.conf

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Пробуем вылечить:

fuser -k 80/tcp
fuser -k 443/tcp
/etc/init.d/nginx restart

Проверяем:

[ ok ] Restarting nginx (via systemctl): nginx.service.

[Linux] Удаление очереди писем в Postfix

• Для удаления очереди писем в Postfix:

$ postfix flush (или postfix -f)

• Посмотреть очередь писем:

$ mailq

Пример результата выполнения команды:

postqueue: warning: Mail system is down -- accessing queue directly
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
CC83910135C      539 Sun Jul  1 18:31:21  root
                                          root

EC2B61013DE      370 Sun Jul  1 18:38:21  root@bulkin.me

• Удалить все письма из очереди:

$ postsuper -d ALL

Пример результата выполнения команды:

postsuper: Deleted: 38 messages

• Удалить все письма в отложенной очереди:

$ postsuper -d ALL deferred

Исправление проблем с Windows Update

Иногда служба обновлений Windows ведет себя не так, как от нее ожидается – то одна ошибка выскочит, то другая. Информацию по коду ошибку можно найти в Google, но не всегда советы помогают в исправлении ситуации.

Microsoft также не осталась в стороне, и подготовила набор скриптов для «лечения» Windows Update, которые можно скачать здесь.

Исправление проблем с Windows Update

Еще один совет для удаления кеша файлов Windows Update в виде срипта:

net stop wuauserv
CD %Windir%
CD SoftwareDistribution
DEL /F /S /Q Download
net start wuauserv

[MongoDB] Удаление поля из коллекции

Допустим, в какой-то коллекции есть документы, содержащие поле, которое стало уже не нужным, и вы хотите удалить это поле из всех документов данной коллекции.

Для этого достаточно выполнить следующий запрос:

db.<collection>.update({}, {$unset: {<field_name>:1}} , {multi: true});

[MongoDB] Удаление поля из массива

В коллекции ‘payments’ имеется следующая структура данных:

"log" : [
        {
            "item_id" : "1478", 
            "method" : "card", 
            "cost" : 199.0, 
            "cr_time" : ISODate("2018-06-10T10:38:49.868+0000"), 
            "pay_time" : NumberLong(1528627129), 
            "rent_end_date" : ISODate("2018-07-10T10:38:49.000+0000")
        }
        ...
]

Необходимо удалить поле «rent_end_date» для «item_id» : «1478».

Решение:

db.payments.find({'log.item_id': '1478' }).forEach(function(doc) {
    var rentEndDate = doc.log;
    for(var i = 0; i &lt; rentEndDate.length; ++i) { 
        var x = rentEndDate[i];
        delete (x["rent_end_date"]);
 
    }
    db.payments.save(doc);
});