Timeouts в MySQL

Добавляем в /etc/my.cnf чтобы завершались залипшие запросы

connect_timeout=600
wait_timeout=600
interactive_timeout=600

Apache нагрузка подключения

Просмотр числа подключений на 80 порт

netstat -na --inet | grep ":80\ " | awk '{print $5}' | cut -d":" -f 1 | sort | uniq -c | sort -nr

ss -o '( dport = :http or sport = :http )' | awk '{print $6}' | cut -d : -f 1 | grep -v 'Address' | sort | uniq -c | sort -n

Установка netstat на CentOS 7

yum install net-tools

25 самых активных IP

cat /var/www/httpd-logs/*access.log | awk '{ print $1 ; }' | sort | uniq -c | sort -n -r | head -n 25

25 самых популярных URL

cat /var/www/httpd-logs/*access.log | awk '{ print $7 }' | sort | uniq -c | sort -rn | head -n 25

PHP Selector CloudLinux выбор версии PHP

Официальная документация: http://docs.cloudlinux.com/

Включить CageFS

# cagefsctl --enable user253696
# cagefsctl --force update


Посмотреть какие PHP есть

# cl-selector --list=php

Включить PHP нужной версии

# cl-selector --select=php --version 5.3 --user user2536967

Добавить расширение глобально (почему-то для существующих не добавляет даже force update)

# selectorctl --enable-extensions=zend_optimizer --version=5.2


Посмотреть какие расширения есть

# cl-selector --list-extensions=php --version 5.2

Включить для юзера

# selectorctl --enable-user-extensions=zend_optimizer --version=5.2 --user=user2533184


Изменяем какое-либо значение для пользователя
/usr/bin/piniset -r 'magic_quotes_gpc:off' -u user2536967

Если такое не срабатывает с ошибкой вида
ERROR:No ‘apc.shm_size’ option in white list!
то можно назначать редактированием файла конфига из под юзера по ssh:

su userXXXX
bash-4.1$ php --ini|grep parsed
Additional .ini files parsed: /opt/alt/php54/etc/php.d/alt_php.ini

vi /opt/alt/php54/etc/php.d/alt_php.ini

Удалить директорию в которой содержатся миллионы файлов, очистить каталог php сессий

Если find зависает на огромном числе файлов, то используйте функцию unlink, например, вот простой однострочник на perl

perl -e 'chdir "mod-tmp" or die; opendir D, "."; while ($n = readdir D) { unlink $n }'

Данная команда удаляет в среднем один миллион файлов в час.

При большой нагрузке на дисковую систему можно понизить приоритет i/o указав ionice -c2 -n7 вначале команды перед perl

Чтобы не забивался каталог сессиями следует произвести настройку в php.ini

session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440

PHP скрипт в режиме как CGI не работает дольше 60 секунд — Timeout waiting for output from CGI script

PHP скрипт не смотря на настройки max_execution_time в php.ini завершает свою работу через 60 секунд выдавая ошибку в лог-файл apache

Timeout waiting for output from CGI script /var/www/user/data/php-bin/php

Решение:
Необходимо прописать в /etc/httpd/conf/httpd.conf директиву

Timeout 300

(где 300 — число секунд которые сможет выполняться данный скрипт)
По-умолчанию в CentOS 7 эта директива не прописана и равна 60 секундам

Чтобы nginx (если используется) при этом не выдавал ошибку 502 следует также прописать в его конфигурации
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

Как распаковать архив который создан при помощи isptar (архиватора который используется в ISPmanager)

/usr/local/mgr5/sbin/isptar -x F2016-10-18.www-root.tgz data/www/example.com/ -R backup/

Данная команда извлекает из архива за 18.10.2016 пользователя www-root каталог с файлами сайта example.com в папку backup

inputrc, tab и игнорирование регистра символов

Совет дня — используйте в консоли автодополнение с игнорированием между прописными и строчными буквами

$ echo "set completion-ignore-case on" >> ~/.inputrc

B итоге при автодополнении табом в cd documents будем попадать в Documents, попробуйте, это удобно

Файл /etc/inputrc используется Readline — библиотекой ввода и считывается при запуске Bash и большей частью других оболочек.

За более подробной информацией по редактированию файла inputrc , прочтите секцию Readline Init File на странице info bash. Также хорошим источником информации является info readline.

Перенос CentOS 6.8 на программный RAID1 mdadm

В данной статье пойдет речь как быстро перенести операционную систему CentOS 6 которая установлена на один жесткий диск на программный RAID на двух дисках (mdraid)

Руководств по переводу можно найти в сети много разных, однако, не все они «запускаются» с первого раза или являются неправильными (ситуация «делал все как написано и оно не работает»)

Также при использовании grub1 существует недостаток в связи с тем, что не всегда удается загрузиться в случае выхода из строя одного из дисков и необходимо в grub указывать root устройство правкой в загрузчке (root (hd0,0)) или же переставлять диск местами.
Это действительно издержки данной системы http://www.linux.org.ru/forum/admin/9417685?cid=9421016

Также, как показывает огромная практика различные вещи как LVM, разбивка на несколько разделов просто напросто не нужны, поэтому просто разбиваем на один раздел, swap же также сделаем в файле (тем самым будет преимущество в виде возможности менять его размер при необходимости)

И так, как же перенести CentOS 6 на программный RAID

Для этого подключаем второй чистый жесткий диск такого же объема (в системе он будет называться sdb) и разметим его используя fdisk

Всё по-умолчанию, единственное, что сделаем, так это отступим на один цилиндр сначала (разобьем со второго цилиндра) на случай если будет необходимость в будущем мигрировать на загрузчик grub2 так как он просто «не войдет» в один цилиндр

[root@centos6 ~]# fdisk /dev/sdb
Устройство не содержит ни верной таблицы разделов DOS, ни метки диска Sun, SGI или OSF
Building a new DOS disklabel with disk identifier 0x390ed2ea.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Предупреждение: неверный флаг 0x0000 таблицы разделов 4 будет исправлен записью

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

Команда (m для справки): n
Действие команды
e расширенный
p основной раздел (1-4)
p
Номер раздела (1-4): 1
Первый цилиндр (1-1044, default 1): 2
Last цилиндр, +цилиндры or +size{K,M,G} (2-1044, default 1044):
Using default value 1044

Команда (m для справки): t
Выбранный раздел 1
Шестнадцатеричный код (введите L для получения списка кодов): fd
Системный тип раздела 1 изменен на fd (Автоопределение Linux raid)

Команда (m для справки): a
Номер раздела (1-4): 1

Команда (m для справки): w
Таблица разделов была изменена!

Вызывается ioctl() для перечитывания таблицы разделов.
Синхронизируются диски.


Теперь создаем raid 1 на этом разделе

[root@centos6 ~]# mdadm --create /dev/md0 --metadata=0.90 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm: array /dev/md0 started.


Обязательно использовать формат метаданных 0.90, так как с более новыми grub 0.97 не работает на /boot разделе

Формируем конфигурационной файл mdadm /etc/mdadm.conf
[root@centos6 ~]# mdadm --detail --scan > /etc/mdadm.conf

Внесите правку в /boot/grub/device.map — добавьте туда наш sdb как hd1
[root@centos6 ~]# vi /boot/grub/device.map
(hd0) /dev/sda
(hd1) /dev/sdb


Форматируем устройство md0 в ext4

[root@centos6 ~]# mkfs.ext4 /dev/md0

Монтируем новосозданный /dev/md0 в /mnt

[root@centos6 ~]# mount /dev/md0 /mnt

Копируем все данные на него (предварительно следует остановить на машине все сервисы которые могут писать файлы на диск, такие как mysql, веб-сервер)

[root@centos6 ~]# yum -y install rsync

[root@centos6 ~]# rsync -avP --exclude='/dev/*' --exclude='/proc/*' --exclude='/sys/*' --exclude='/mnt/' / /mnt


Правим /mnt/etc/fstab делая там только монтирование md0, монтировать следует по UUID- смотрим его командой blkid

[root@centos6 ~]# blkid | grep md0

[root@centos6 ~]# cp /mnt/etc/fstab /etc/fstab_bak

[root@centos6 ~]# vi /mnt/etc/fstab
UUID=d00711db-48b2-4735-9cdb-7080742797c4 / ext4 defaults 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0


Вносим правки в /mnt/boot/grub/grub.conf в строку kernel выставляя правильное устройство (root=) и убирая rd_NO_DM rd_NO_MD и аналогичные параметры, я рекомендую убрать все лишние опции чтобы видеть вывод при загрузке

root у нас на md0, смотрим его uuid командой blkid | grep md0
Желательно указывать также rd_MD_UUID — его можно посмотреть в /etc/mdadm.conf
Путь к kernel и initrd теперь начинается с /boot/ — также не забываем это исправить
Устройство root следует указать (hd1,0)

[root@centos6 ~]# cp /mnt/boot/grub/grub.conf /mnt/boot/grub/grub.conf_bak

[root@centos6 ~]# vi /mnt/boot/grub/grub.conf
default=0
timeout=5
hiddenmenu
title CentOS 6 (2.6.32-642.el6.x86_64)
root (hd1,0)
kernel /boot/vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=d00711db-48b2-4735-9cdb-7080742797c4 rd_MD_UUID=b9baa472:faeb3a7c:6e31c5b6:310ac827
initrd /boot/initramfs-2.6.32-642.el6.x86_64.img


Пересобирите initramfs на новом диске отключив в нем поддержку LVM (у нас система ставилась по-умолчанию с lvm и не нужно чтобы он монтировался)

[root@centos6 ~]# dracut --nolvmconf --mdadmconf -f /mnt/boot/initramfs-`uname -r`.img `uname -r`

Пропишите grub bootcode на второй диск

grub> root (hd1,0)
root (hd1,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
setup (hd1)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd1)"... 27 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd1) (hd1)1+27 p (hd1,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
Done.
grub> quit


Если в системе включен selinux, то необходимо создать файл /.autorelabel в новой системе

[root@centos6 /]# touch /mnt/.autorelabel

Иначе не сможете войти в систему с ошибкой Unable to get valid context for root

Теперь необходимо перезагрузить сервер и выбрать в BIOS загрузку со второго жесткого диска
* после выполнения relabel система автоматически перезагрузится, следите за загрузкой

После чего зайти в систему и убедиться что все в порядке, система загружена с нужного нам устройства

[root@centos6 ~]# mount
/dev/md0 on / type ext4 (rw)

[root@centos6 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1]
8377856 blocks super 1.0 [2/1] [_U]

[root@centos6 ~]# cat /proc/mounts


Также не должно показывать никаких подмонтированых lvm разделов

Если вы видете примонтированый lvm — значит вы загрузились с первого, а не второго диска, перезагрузите сервер и убедитесь что именно нужный диск выбран

Просто отлично, система загружена и работает с нужного нам устройства

Теперь осталось немного — сделать копию разделов с диска sdb на диск sda

В моем случае на сервере был LVM и вначале необходимо удалить устройства

[root@centos6 ~]# lvremove /dev/mapper/vg_centos6-lv_root
Do you really want to remove active logical volume lv_root? [y/n]: y
Logical volume "lv_root" successfully removed
[root@centos6 ~]# lvremove /dev/mapper/vg_centos6-lv_swap
Do you really want to remove active logical volume lv_swap? [y/n]: y
Logical volume "lv_swap" successfully removed


Затем обнулить таблицу разделов
[root@centos6 ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1

И сделать копию таблицы разделов

[root@centos6 ~]# sfdisk -d /dev/sdb | sfdisk --force /dev/sda

Команда должна выполниться без ошибок, именно поэтому важно предварительно почистить диск

Добавляем диск в зеркало

[root@centos6 ~]# mdadm --add /dev/md0 /dev/sda1
mdadm: added /dev/sda1


Убеждаемся что зеркало собирается
[root@centos6 ~]# cat /proc/mdstat

Ставим загрузчик на sda (тут может потребоваться немного подождать пока синхронизируется начальная часть зеркала)

[root@centos6 ~]# grub
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
...
...
grub> quit
quit


Также создаем swap в файле, скажем 2Gb (это уже опционально)

[root@centos6 ~]# dd if=/dev/zero of=/swapfile bs=2048 count=1048576
[root@centos6 ~]# mkswap /swapfile
[root@centos6 ~]# swapon /swapfile


Подключаем его в /etc/fstab

[root@centos6 ~]# echo '/swapfile none swap sw 0 0' >> /etc/fstab

Можно перезагрузиться чтобы убедиться что все работает

После чего меняем в /boot/grub/grub.conf строку
root (hd1,0)
на
root (hd0,0)

Чтобы если в сервере останется один диск система могла загрузиться

Работы на этом завершены

flashcache и reboot - проверять в sysctl

Перед ребутом когда используется flascache необходимо проверять что для него включен fast_remove в sysctl

# sysctl -a | grep fast_remove
dev.flashcache.ata-SAMSUNG_MZ7LM960HCHP-00003_S1YHNX0H403040+md2.fast_remove = 1

Что настроить в ~/.ssh/config для улучшения работы

Казалось бы в конфигурации openssh-клиента практически всё работает как положено. Однако, все же есть опции, которые заинтересуют многих, хотя бы первая из них

$ cat ~/.ssh/config
StrictHostKeyChecking no
Compression yes
ServerAliveInterval 60
ServerAliveCountMax 2


StrictHostKeyChecking no - будут автоматически добавляться ключи в ~/.ssh/known_hosts и не надо будет отвечать каждый раз yes. При смене ключа оповещение сохраняется

Compression yes - включает компрессию передачи, улучшается отзывчивость работы, особенно если выводятся большие объемы данных

ServerAliveInterval 60 - каждую минуту будут отсылаться keepalive пакеты (по умолчанию не отсылаются значение 0), тем самым улучшается стабильность соединения (особенно если вы работаете за NAT и наблюдается такая проблема)

ServerAliveCountMax 2 - отсылать 2 пакета (по умолчанию 3) и если все же нет связи, через 120 секунд разрывать соединение

grub2 на centos 6

yum install gcc bison flex make
wget https://ftp.gnu.org/gnu/grub/grub-2.00.tar.gz
tar xf grub-2.00.tar.gz
cd grub-2.00
./configure
make
make install


/usr/local/sbin/grub-mkconfig -o /boot/grub/grub.cfg
/usr/local/sbin/grub-install /dev/sda


yum remove grub

Мной также был собран rpm-пакет для быстрой установки и отсутствия необходимости компиляции. Установка производится в каталог /opt/grub2. Пакет доступен в репозитории CentOSUP или по прямой ссылке:

yum install https://centosup.ispsystem.info/repo/x86_64/grub2-2.00-1.el6.x86_64.rpm


/opt/grub2/sbin/grub-mkconfig -o /boot/grub/grub.cfg
/opt/grub2/sbin/grub-install /dev/sda


Если у кого-либо есть репозиторий с grub2 для CentOS 6 или готовые .spec-файлы прошу поделиться в комментариях, поскольку интересует вопрос интеграции в систему вместо grub 0.99

Как собирать rpm — инструкции по сборке rpm пакетов

Способ 1. В "чистом" окружении используя mock

yum install mock
adduser mock -g mock
su - mock
mkdir {src,rpms,srpms}


Распаковываем исходники в src

Билдим srpm
mock --buildsrpm --spec=src/software/software.spec --sources=src/software --resultdir=srpms

Компиляем rpm
mock --rebuild srpms/software.1.2.3.el6.src.rpm --resultdir=rpms

В rpms получаем готовые пакеты


Способ 2. В "боевом" окружении (захламляя ОС ненужными пакетами и не исключая их влияние) используя rpmbuild


yum install rpm-build gcc make

mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros



Сорцы кладем в ~/rpmbuild/SOURCES
.spec файл в ~/rpmbuild/SPECS

И компилируем сразу бинарный билд

cd ~/rpmbuild/SPECS

rpmbuild -bb software.spec

Перенос операционной системы образом диска по сети (dd over ssh)

Иногда возникают случаи когда нет возможности переместить физически образ диска, например, при использовании rbd, lvm или каких-либо еще случаях. Как же быть в этой ситуации?

Загрузите оба сервера в linux rescue по сети с livecd, поднимите сеть и обеспечьте ssh-доступ

На новом сервере на который выполняем перенос надо выполнить:

ssh root@исходныйсервер "dd if=/dev/vda bs=64k | gzip -1 -" | gunzip - | pv | dd of=/dev/vda bs=64k

P.S. pv - monitor the progress of data through a pipe
dd в GNU Coreutils 8.24+ (Ubuntu 16.04) включает в себя опцию status=progress
Про оптимальный размер blocksize можно почитать тут http://stackoverflow.com/questions/6161823/dd-how-to-calculate-optimal-blocksize

Мониторинг нагрузки на дисковую систему

atop -c1 -dl
iotop

Хороший online scanner сайтов на вирусы

https://sitecheck.sucuri.net/
Free Website Malware and Security Scanner

Радует тем, что реально пробегает по всем страницам сайта и находит вирусы и seo-spam также и прочую заразу.
Дальше можно погрепать скрипты по самплу кода и исправить.

В логах веб-сервера запросы видны как
162.216.19.183 - - [12/Nov/2016:22:35:18 +0300] "GET /?page_id=2509 HTTP/1.1" 200 273407 "http://sucuri.net" "Mozilla/5.0 (compatible; MSIE 8.0; MSIE 9.0; Windows NT 6.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.8.36217; WOW64; en-US)"

Не включается мониторинг сервиса в меню Службы в ISPmanager 5

Если все сервисы мониторятся, а у какого либо сервиса, например, у MySQL в Debian 7 упорно не включается мониторинг работы, то возможно проблема в базе данных сервисов

Решить можно следующим образом:

cd /usr/local/mgr5/var/
/opt/ispsystem/sbin/sqlite3 services.db


sqlite> .explain on
sqlite> select * from services;


И делаем off чтобы было у всех одинаково:

sqlite> update services set is_mon='off';

xfreerdp параметры командной строки и скриптик

Поскольку rdesktop устаревает и есть проблемы с раскладками приходится пользоваться xfreerdp
В качестве "обертки" лучше всего использовать remmina — он установлен по-умолчанию в Ubuntu 16.04 и использует библиотеки от freerdp

Но иногда удобнее пользоваться консольной утилитой (которая использует те же библиотеки)

sudo apt-get install freerdp

Синтаксис имеет немного странный вид https://github.com/FreeRDP/FreeRDP/wiki/CommandLineInterface

В итоге просто пишем скрипт ~/bin/rdp

#!/bin/sh
xfreerdp +clipboard /size:1024x768 /u:Administrator /p:$2 /v:$1


и запускаем как

rdp адрес пароль

zombie на openvz и метод нахождения процесса который зомбофицировался

Иногда бывает сбой на виртуализации OpenVZ и в итоге не удается остановить контейнер с кодом 7

[root@msk-node ~]# vzctl stop 29834 --fast
Killing container ...
Child 134833 exited with status 7
Unable to stop container


Как найти виновника

[root@msk-node ~]# ps auxwww| awk '{print($2)}'| xargs vzpid| grep 29834
684597 29834 systemd
684599 29834 kthreadd/29834
684600 29834 khelper/29834

[root@msk-node ~]# ps axuw | grep 684597
root 684597 0.0 0.0 0 0 ? Zsl Nov04 2:56 [systemd]


В данном случае виноват systemd внутри контейнера

Как добиться grade A+ от sslchecker

Чтобы ssl checker https://www.ssllabs.com/ssltest/ выдавал качество A+ надо сделать следующие настройки:
https://cipherli.st/
зеркало https://dl.ispsystem.info/mirrors/cipherli.st/

raw to qcow convert конвертирование

qemu-img convert -f raw -O qcow2 vm2505705 vm2505705.qcow

Оптимизация настроек PHP под Bitrix

Для всех систем, только файл будет в другом месте в Debian-like
Создаем файл /etc/php.d/00-bitrix.ini

display_errors = On
error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING

; Set some more PHP parameters
date.timezone = Europe/Moscow
enable_dl = Off
short_open_tag = On
allow_url_fopen = On

; Change default values of important constants
max_input_vars = 10000
max_execution_time = 300
post_max_size = 256M
upload_max_filesize = 256M
memory_limit = 256M
pcre.backtrack_limit = 1000000
pcre.recursion_limit = 10000
realpath_cache_size = 4096k

; Utf-8 support
mbstring.func_overload = 2
mbstring.internal_encoding = UTF-8

; OpCache settings
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=100000
opcache.validate_timestamps=1
opcache.revalidate_freq=0
opcache.fast_shutdown=1


; php 7
pcre.jit=0

Nginx error 502 upstream sent too big header while reading response header from upstream

Nginx может выдавать ошибку 502 и упорно писать в логи upstream sent too big header

2016/11/04 22:17:08 [error] 29848#29848: *57721 upstream sent too big header while reading response header from upstream, client: 168.112.124.141, server: example.ru, request: "GET /index.php?page=search&Region=2 HTTP/1.1", upstream: "http://127.0.0.1:8080/index.php?index.php?page=search&Region=2", host: "example.ru"

Исправляется прописыванием в секцию http /etc/nginx/nginx.conf
proxy_buffers 8 16k;
proxy_buffer_size 32k;


(по умолчанию 4 8/16)

Но не больше
proxy_buffers 8 32k;
proxy_buffer_size 64k;

rpm висит и не отдает никаких данных - rpm hangs

Часто бывает после того как на сервере заканчивается место перестает выполняться команда rpm -qa (зависает) и не запускается в итоге ISPmanager
Лечение проблемы rpm hangs выполняется удалением некоторых файлов

rm /var/lib/rpm/__db.*

Как сделать detach screen и подключиться к нему

Иногда бывает необходимо подключиться к забытому или зависшему screen который находится в состоянии Attached

Это можно сделать следующей командой:

screen -d -R айди_скрина

Получаем список вида IP домен для прописывания в /etc/hosts через ISPmanager API

/usr/local/mgr5/sbin/mgrctl -m ispmgr webdomain | awk -F'ipaddr=|name=| ' '{print $(NF-1), $2, "www." $2}'

Нужно при переносах сайтов для проверки


sqlite3 /usr/local/mgr5/etc/ispmgr.db 'select t1.value, t2.name from webdomain_ipaddr t1 inner join webdomain t2 ON t1.webdomain = t2.id;' | awk -F'|' '{print $1, $2, "www." $2}'

wordpress поменять адрес url сайта

WordPress хранит в базе адрес сайта в таблице wp_options и следовательно надо чтобы там было правильно прописано иначе будет кривой редирект, прямо адрес прописан с протоколом

update wp_options set option_value='http://example.com' where option_name='home';
update wp_options set option_value='http://example.com' where option_name='siteurl';


Также может потребоваться правка в wp-config

define('WP_HOME','http://example.com');
define('WP_SITEURL','http://example.com');

Выставляем правильного владельца на файлы и директории сайта

Часто после переноса сайт нормально не работает, проблема в правах, выполняем пару команд чтобы не забыть в директории сайта

find . -type d -exec chmod 755 '{}' \;
find . -type f -exec chmod 644 '{}' \;

Простой конфиг для xdebug чтобы писал xdebug.log

[Xdebug]
zend_extension = "/usr/lib64/php/modules/xdebug.so"
xdebug.remote_enable = on
xdebug.remote_log = "/var/log/xdebug.log"

xdebug.remote_autostart = on
xdebug.remote_handler = dbgp
xdebug.remote_port = 9001
xdebug.remote_server = localhost
xdebug.remote_mode = req

; Most users won't want a hard coded idekey. More on this later.
xdebug.idekey = netbeans-xdebug
output_buffering = off