http://iphp.com.ua блог о технологиях web-разработки // all your base are belong to us Sat, 05 Nov 2011 17:59:56 +0000 en hourly 1 http://wordpress.org/?v=3.2.1 http://iphp.com.ua/archives/609 http://iphp.com.ua/archives/609#comments Sat, 05 Nov 2011 17:59:56 +0000 admin http://iphp.com.ua/?p=609 Системные команды, которыми можно проверить ресурсы системы: top -mio – показать I/O по процессам top -S – показать системные процессы в топе (по дефолту они не показываются) gstat – нагрузка на диски iostat -d -w1 -c7 – нагрузка на диски systat -io start 1 diskinfo -t da0 – тест на дисковую производительность tunefs -p /var/ – информация о настройках файловой системы vmstat -z чего не хватает vmstat -i прерывания по устройствам netstat -i ошибки на интерфейсах systat -ifstat – интенсивность передачи трафика netstat -inb – передано через интерфейс в байтах netstat -w1 – количество пакетов/ошибок/байт на интерфейсе sysctl kern.ipc.numopensockets – количество открытых сокетов df -H – количество свободного места df -i – количество свободных инодов freecolor – очень симпатичная утилита для мониторинга использования памяти (ставится из портов) Для детальной информации по расходу памяти: fetch -o /usr/local/bin/free http://people.freebsd.org/~rse/dist/freebsd-memory chmod +x /usr/local/bin/free free ]]> http://iphp.com.ua/archives/609/feed 0 http://iphp.com.ua/archives/606 http://iphp.com.ua/archives/606#comments Thu, 08 Sep 2011 09:27:29 +0000 admin http://iphp.com.ua/?p=606 Некоторые опции по тюнингу FreeBSD и описание к ним. Предупреждение: Бездумное копирование опций не всегда приводит к приросту производительности!!! [] /etc/sysctl.conf ###### Формат записей " параметр=значение # значение по умолчанию " NETWORK Запрет ответа при обращении на закрытые порты. По стандарту, если на закрытый порт сервера приходит SYN-пакет, машина должна ответить RST-пакетом. Это упрощает сканирование портов, а также дает достаточное количество информации (в виде ответов от сканируемого сервера) для определения версии ОС. «Черные дыры» заставляют FreeBSD быть предельно лаконичной, не отсылая ничего в ответ на запросы к закрытым портам. net.inet.tcp.blackhole=2 # 0 net.inet.udp.blackhole=1 # 0 Увеличение размера очереди. Защита очереди от SYN атак kern.ipc.somaxconn=4096 # 128 Чтобы сервер не стал жертвой DoS-атаки, можно включить механизм syncookies , который служит для защиты сервера от SYN-флуда. Когда новое соединение не помещается в переполненный syncache, FreeBSD переходит в режим «syncookies» ( TCP SYN cookies ). При серьезной атаке может не менее серьезно выручить. net.inet.tcp.syncookies=1 # 1 Запрет ответа на широковещательный ECHO Современная система не должна отвечать на широковещательные пинги, но и по сей день существуют сети, которые могут стать источником DoS-атаки. Чтобы не попасть в их список, выставляем: net.inet.icmp.bmcastecho=0 # 0 Дропать все пакеты с флагами SYN+FIN. Если не нужна поддержка смешного протокола T/TCP (TCP for Transactions), то пакеты с флагами SYN+FIN можно смело отбрасывать как неликвидные . Протокол редко где используется, а потому это имеет смысл net.inet.tcp.drop_synfin=1 Запрет ридеректов net.inet.icmp.drop_redirect=1 # 1 net.inet.icmp.log_redirect=1 # 1 net.inet.ip.redirect=0 # 1 #net.inet6.ip6.redirect=0 #ipv6 disable in kernel Очистка таблицы ARP через …. секунд net.link.ether.inet.max_age=1200 # 1200 Запрет на «прощупывание» внутренней сети net.inet.ip.sourceroute=0 # 0 net.inet.ip.accept_sourceroute=0 # 0 Запрет запроса маски адреса, запрет широковещательного запроса временного штампа (timestamp) net.inet.icmp.maskrepl=0 # 0 Максимальное количество пакетов ICMP <<Недостижимо>> (icmp type 3) , а также количество отсылок TCP RST пакетов в секунду. net.inet.icmp.icmplim=100 # 200 Увеличение размера TCP-буферов , для оптимизации при большом потоке данных HTTP FTP. Но стоит помнить, что слишком объемные буферы быстро приведут к исчерпанию памяти при большом количестве подключений. Для веб-сервера, который принимает много коротких запросов и отправляет большие объемы данных, размер выходного буфера рекомендуется увеличить в ущерб входного. net.inet.tcp.sendspace=32768 # 32768 net.inet.tcp.recvspace=65536 # 65536 Выставляет maximum segment lifetime . Определяет максимальное время жизни сегмента (Maximum Segment Life – MSL) После того как соединение закрывается сокет переходит в состояние TIME_WAIT Это максимальное количество времени ожидания ACK в ответ на SYN-ACK или FIN-ACK в миллисекундах В этом состоянии он может находится по умолчанию в течение 60 секунд. Время можно изменить через sysctl (в миллисекундах деленных на 2, 2 x 30000 MSL = 60 секунд) net.inet.tcp.msl=7500 # 30000 Во FreeBSD 6.2 TIME_WAIT сокеты обрабатываются отдельно (нужна лишь часть информации 48 байт из 1 Кб. Ограничение вне лимита kern.ipc.maxsockets) net.inet.tcp.maxtcptw=40960 # 40960 По умолчанию исходящие соединения инициируются с диапазона портов 49152-65535 (16 тыс.). Во FreeBSD 8.1 – порты 10000 - 65535 Их неплохо увеличить (1024-65535): net.inet.ip.portrange.first=1024 # 10000 net.inet.ip.portrange.last=65535 Не менять ttl при транзите пакетов net.inet.ip.stealth=0 # 0 Включение пуллинга kern.polling.enable=0 # 0 Pooling kern.polling.each_burst=5 # 5 kern.polling.burst_max=1000 # 150 Установка значения ttl под Windows net.inet.ip.ttl=128 # 64 Максимальаня длина приёмной очереди , при переполнении которой стек дропает входящие пакеты net.inet.ip.intr_queue_maxlen=4096 # 50 Увеличить максимальное число открытых сокетов sysctl kern.ipc.maxsockets=204800 # 25600 Если машина обрабатывает несколько десятков тысяч соединений, то tcb hash позволяет быстро определять принадлежность пришедшего пакета к определенному соединению. net.inet.tcp.tcbhashsize=4096 # 4096 Для использования портов по порядку , вместо случайной выборки (для исключения ошибки повторного коннекта с одного порта до отработки TIME_WAIT): net.inet.ip.portrange.randomized=0 # 1 Во FreeBSD 6.2 появилась возможность не создавать состояние TIME_WAIT для соединений в рамках localhost: net.inet.tcp.nolocaltimewait=1 # 0 DummyNET – шейпинг на IPFW net.inet.ip.dummynet.io_fast – если трафик помещается в заданную полосу, не пропускать его через очередь и отдельный поток. Если нет необходимости эмулировать задержки и потери в канале – очень сильно сохраняет ресурсы. При использовании этой опции практически отпадает необходимость в распараллеливании dummynet net.inet.ip.dummynet.io_fast=1 net.inet.ip.intr_queue_maxlen, net.route.netisr_maxqlen – фактически – размеры входящей и исходящей очередей. При большой нагрузке в режиме маршрутизации есть смысл увеличивать эти значения. Непоместившийся пакет выбрасывается. Это условно спасет при кратковременных перегрузках (часть пакетов пролетит с большой задержкой), но совершенно не спасет при хроничеких. net.isr.direct – обрабатывать исходящие пакеты непосредственно при попытке отправки (в т.ч. прохождение ipfw на выходе). Т.е. не откладывать в очередь, которую в отдельном потоке разгребает netisr. Есть смысл включать, если количество ядер меньше или равно количеству сетевых карточек. Влияет на скорость ОТПРАВКИ пакетов. Для серверов это хорошо, для роутеров – не очень. Если нагрузка на сетевые карты неравномерная, или когда есть хотя бы одно хронически недогруженое ядро – выключать. При включеном net.inet.ip.fastforwarding будет еще 1 спецэффект. net.isr.direct_arp – обрабатывать исходящие ARP пакеты непосредственно при попытке отправки. Есть смысл держать включенным в большинстве случаев (разумного варианта, когда стоит отправлять такие запросы в очередь я придумать не могу). Добавлено для того, чтобы обработкой ARP система могла заниматься с бОльшим приоритетом даже при net.isr.direct=0 net.isr.maxthreads – собственно, количество потоков, разгребающих очередь пакетов. Есть смысл ставить меньшим количества ядер в системе. Нужно прикинуть, сколько ресурсов съедается на обработке прерываний от сетевух и не только, сколько в пике потребляет прочий софт (БД, httpd, прочие демоны) и на оставшееся распределить роутинг. Если, к примеру, сетевухи потребляют по 80% с 2х ядер и софт еще до 100% одного ядра, а всего ядер 4, то остается 140% гарантированного времени. Т.е. полтора ядра Тут можно смело ставить роутинг в 2 потока. Если нагрузки по софту кратковременные, а на роутинг с трудом хватает – можно даже попробовать 3. net.inet.ip.fastforwarding – обрабатывать входящие пакеты непосредственно в момент приема (в т.ч. прохождение ipfw на входе, до попадания в очередь netisr). Есть смысл включать, если количество ядер меньше или равно количеству сетевых карточек, так же как и net.isr.direct. Влияет на скорость ПРИЕМА пакетов. Обработка пакета происходит прямо в обработчике прерывания. Следует учесть, что не все сетевухи и не все драйвера нормально умеют складировать новые пакеты в очередь, пока обрабатывается текущий. При включеном net.inet.ip.fastforwarding будет еще 1 спецэффект – маршрутизация пакета и прохождение ipfw (оба раза) будут происходить в том же обработчике прерывания. Фактически, на время обработки входящего пакета сетевая карта будет заблокирована. Это неплохо смотрится при преобладающем входящем трафике и на однопроцессорных машинах. Файловая система Запрет возможности монтирования файловых систем непривилегированными пользователями. vfs.usermount=0 # 0 Ресурсы системы Увеличение числа mbuf кластеров Можно увеличить до 262144 (в loader.conf – vm.kmem_size=1G, в ядре options KVA_PAGES=512) kern.ipc.nmbclusters=65536 # 25600 Приложения работают не с сокетами, а с файлами. По этому для каждого сокета нужна структура, которая описывает файл. kern.maxfiles – всего файлов в системе kern.maxfilesperproc – максимальное число файлов на один процесс. kern.maxfiles=204800 kern.maxfilesperproc=200000 Можно динамически изменить параметры shared memory sysctl -a | grep shm Вычисляется следующим образом: SHMMAX = SHMALL * PAGE_SIZE + 1 Где PAGE_SIZE равно 4096 Б для i386 SHMALL = k * RAM * 1024 / PAGE_SIZE Где RAM – физическая оперативная память в МБ; k – коэффициент, равный 0.5; PAGE_SIZE – размер одной страницы в КБ, PAGE_SIZE = 4 КБ для i386. Например, для машины с памятью 512 МБ, SHMALL = 0.5 * 512 * 1024 / 4 = 65536. В случае, если предполагается, что приложение будет работать на специально выделенном для этого сервере, и кроме него никаких других серьезных сервисов запущено не будет, то коэффициент k, можно увеличивать до 0.75, это 3/4 от физической оперативной памяти. Рекомендую также посмотреть утилиту ipcs . Например для сервера PostgreSQL можно выставить следующие значения: kern.ipc.shmall=65536 kern.ipc.shmmax=536870912 kern.ipc.semmap=256 /boot/loader.conf Увеличить лимита физической памяти, которую может использовать ядро (по умолчанию 320Мб). Увеличим до 1Гб: vm.kmem_size=1G для amd64 оказалось недостаточно указать vm.kmem_size_max=1G в /boot/loader.conf, (параметр был просто игнорирован) по-этому это надо сделать в файле конфигурации ядра: options VM_KMEM_SIZE=1073741824 options VM_KMEM_SIZE_MAX=1073741824 В /boot/loader.conf для обеих платформ нужно добавить vm.kmem_size_max=1G Увеличение syncache и syncookies( на этапе загрузки). net.inet.tcp.syncache.hashsize=1024 net.inet.tcp.syncache.bucketlimit=100 Задаем какой буфер использовать для сетевых карточек (должен быть реально) ## Для карточек Intel с драйвером em hw.em.rxd=4096 hw.em.txd=4096 ## Для новых карточек Intel с драйвером igb hw.igb.rxd=4096 hw.igb.txd=4096 Увеличение количества семафоров kern.ipc.semmnu=256 kern.ipc.semmns=32000 kern.ipc.shmmni=4096 Опции ядра Увеличение адресного пространства ядра , которое на i386 платформе – 1Гб. Для увеличения до 2Гб. На платформе amd64 KVA всегда 2G. options KVA_PAGES=512 Данная опция в FreeBSD 8.x предназначена для ускорения маршрутизации. При больших потоках трафика проц вгоняется в полку, поэтому настоятельно рекомендую вырубать ее нафиг, чтоб не наблюдать , как ваш роутер уходит в нирвану… #options FLOWTABLE # per-cpu routing cache ]]> http://iphp.com.ua/archives/606/feed 0 http://iphp.com.ua/archives/603 http://iphp.com.ua/archives/603#comments Fri, 05 Aug 2011 04:09:58 +0000 admin http://iphp.com.ua/?p=603 Озадачился собрать и попробовать всякие sysctl опции ядра, повышающие безопасность машины, и облегчающие её работу при попытках всяких атак и сканировании портов. А может, даже, просто те пункты, которые показались интересными и нужными – причём даже только начав, заметил одну вещщь – почти всё касается работы стека TCP/IP, что и неудивительно, ибо основное применение FreeBSD – это серверы. Порывшись в инете понял – 90% данных это скопированный друг у друга перевод какой-то буржуйской статьи. Собстно поэтому и начал ковыряться – остальные 10% – это далеко немало… Причина крайне проста – это самая недокументированная часть FreeBSD… Следующие два пункта касаются поведения ОС при попытке подключиться на порты, которые не слушаются приложениями. При штатных настройках, в таком случае, система посылает пакет с флагом RST, и закрывет подключение. Удалённый хост получает примерно следующее (если пробовать telnet`ом подключиться): Connection reset by peer . net.inet.tcp.blackhole=2 – данный пункт указывает, что происходит при получении TCP-пакета на закрытый порт (не слушаемый никакими приложениями)Если стоит «1″, то SYN пакеты (пакет, устанавливающий соединение) на закрытый порт будут отклоняться без отсылки отправителю RST пакета (перезагрузка (соединения, не машины )). При установке в «2″, вообще все (а не только SYN) пакеты на закрытый порт отбрасываются без каких-либо действий. Данный пункт позволяет разгрузить ЦП, т.к. обработка пакетов не производится, и интернет-канал сервера – т.к. не надо слать ответных пакетов. net.inet.udp.blackhole=1 – очень похож на предыдущий пункт, по результату, но для протокола UDP. Ввиду того, что протокол UDP работает без установки соединения, есть только два, а не три варианта установки, когда эта переменная установлена в 1, то отбрасываются все UDP пакеты, адресованые закрытым портам. kern.ipc.somaxconn=1024 – увеличивает размер очереди для сокетов, чем помогает предотвратить SYN-атаку, когда очередь сокета переполняется некорректными попытками соединений. Конечно от мощной атаки это не спасёт, но от слабой и средней – должно помочь. Значение по дефолту – 128. Следующие 4 пункта необходимы для невозможности удалённого изменения таблицы маршрутизации на Вашем хосте. Надо заметить, что установив эти пункты как указано, я столкнулся с проблемами в собственной сети – как оказалось между некоторыми подсетями маршрутизация была криво настроена (причём сам же знал, что криво, сам же криво и делал – быстрей, быстрей! – а потом всё недосуг было заняться) – соответственно клиентские компы начали терять некоторые сети. Пришлось сделать всё по-уму net.inet.icmp.drop_redirect=1 – уничтожать icmp-датаграммы переадресации net.inet.icmp.log_redirect=1 – записывать в журнал событий icmp-датаграммы с указанием переадресации net.inet.ip.redirect=0 – может ли эта машина посылать дейтаграммы переадресации другим (вот из-за изменения этого пункта у меня сеть и плющщило, но менять его надо, просто надо сразу сетку корректно настраивать) net.inet6.ip6.redirect=0 – предыдущий пункт, но для IPv6 Пара пунктов отвечающих за работу TCP. Общий смысл такой: ОСь не отвечет на каждый пакет, что он получен или неполучен сразу, а ждёт, пока придёт (или подготовится к отправке) некоторое количество инфы, а потом разом всё это отправляет. Тем самым удаётся разгрузить сеть, т.к. уменьшается общее число пересланных байт (меньше накладных расходов). Очень полезно при интенсивной нагрузке на сеть в одну сторону (HTTP, FTP, & etc). Эти два параметра позволяют установить размер окна приёма и передачи соостветственно. Ограничение по RFC (RFC1323, RFC2018) составляет 64k, но реально можно поставить и больше – тока надо быть уверенным, что и с клиентской стороны подддерживается такое большое окно. Если поставить больше то могут возикнуть проблемы: клиент данные шлёт, а подтверждения не получает, по достижении 64k он думает, что, по неизветстным причинам пропали все пакеты и начинает слать их заново… А Ваш всё ждёт… )) Дефолтовые значения современных FreeBSD – sendspace=32768 и recvspace=57344. (Насколько я понимаю, у старых было меньше 32k). Пробовал увеличить до 65536 – вроде косяков не заметил… net.inet.tcp.sendspace=65536 – размер `окна` отправки net.inet.tcp.recvspace=65536 – размер `окна` приёма net.link.ether.inet.max_age=1200 – время устаревания записей ARP, в секундах. По истечении этого времени запись удаляется. Тоже помогает против соответствующего типа атаки – когда в таблице ARP создаётся много неверных записей. По дефолту оно 1200 и есть, но возможно, имеет смысл, уменьшить это значение. net.inet.ip.sourceroute=0 и net.inet.ip.accept_sourceroute=0 – При помощи маршрутизации отправителя (это когда в пакете, ещё и маршрут нарисован, по которому его надо дальше передавать) возможно прощупать вашу внутреннюю сеть снаружи (даже если это частная сеть!). Значения по-умолчанию (0) запрещают такое делать. Так что менять не надо. net.inet.icmp.bmcastecho=0 – Установка в этого пункта в `0` (а по-умолчанию он так и стоит) зарубает ICMP-сообщения типов 0 и 8 (эхо-запрос и эхо-ответ) на широковещательном адресе. net.inet.icmp.maskrepl=0 – Также, с помощью icmp можно запросить маску Вашей сети, и узнать её размер (не то, чтобы прям такая ценная инфа, но облегчать работу противника не надо ни в чём.). По умолчанию этот параметр в `0` – что запрещает такие запросы. Не надо его ставить в `1` # net.inet.tcp.msl=15000 – Есть такая феня, как максимальное время жизни сегмента (Maximum Segment Life – MSL) – максимальное время ожидания ASK в ответ на SYN-ACK или FIN-ACK (миллисекунд). По RFC 753 оно 120 секунд. Но это писалось в 1979 году и многое поменялось. В современных FreeBSD оно равно 30 секунд. Имеет смысл поставить его меньше. net.inet.icmp.icmplim=100 – Для уменьшения урона от атак, при который генерится много ответных пакетов, можно поставить ограничение на количество ICMP тип 3 (адресат недостижим) и TCP RST (перезагрузка соединения). По дефолту оно стоит 200. Можно поставить меньше. security.bsd.see_other_uids=0 и security.bsd.see_other_gids=0 – Для увеличения безопасности машин, на которые есть шелл у других пользователей, можно сделать так, чтобы каждому пользователю показывались только его процессы, а чужие он невидел. На 4.11 такого пункта нет, в 6.0 есть. Пятую ветку надо проверять. По дефолту значение `1` – все всё видят. Если поставить `0` – то только свои процессы. security.bsd.conservative_signals=0 – Запрет посылать сигналы, от непривелигированных процессов, процессам которые сменили свой uid/gid. security.bsd.unprivileged_proc_debug=0 – Непривелигированные процесы могут использовать средства отладки процессов. security.bsd.unprivileged_read_msgbuf=0 – непривелигированные процессы могут читать буфер сообщений ядра (dmesg). security.bsd.hardlink_check_uid=0 – непривелигированные процессы не могут делать жёсткие ссылки на файлы других пользователей. security.bsd.hardlink_check_gid=0 – непривелигированные процессы не могут делать жёсткие ссылки на файлы других групп. vfs.usermount=0 – возможность непривелигированным пользователям монтировать и отмонтировать устройства (при условии соответсвующих прав на устройство и точку монтирования). net.inet.tcp.log_in_vain=0 и net.inet.udp.log_in_vain=0 – Логгирование всех попыток подключения к портам которые никто не слушает (в M$-сетях, чревато большим потоком логов… Да и в инете тоже..) net.inet.tcp.sack.enable=0 – тюнинг сетевой подсистемы – при большой нагрузке на запрсы отвечатеся селективно. ]]> http://iphp.com.ua/archives/603/feed 0 http://iphp.com.ua/archives/600 http://iphp.com.ua/archives/600#comments Fri, 29 Jul 2011 03:04:07 +0000 admin http://iphp.com.ua/?p=600 Проблема с кодировками является достаточно распространенной. Часто при создании проекта требуется использовать всем одну кодировку например UTF-8, но порой просто не уследишь за всеми добавленными в проект файлами. Конечно можно потратить много времени и сил перекодируя все текстовым редакторе, но если точно знаем из какой кодировки в какую надо конвертить то просто выполняем в консоли команду find . -name '*.php' | while read i; do iconv -f WINDOWS-1251 -t UTF-8 "$i" >tmp; mv tmp "$i"; done и все файлы *.php в этой папке перекодируются в UTF-8. Список доступных кодировок можно вывести командой iconv -l ]]> http://iphp.com.ua/archives/600/feed 0 http://iphp.com.ua/archives/597 http://iphp.com.ua/archives/597#comments Fri, 15 Jul 2011 22:05:02 +0000 admin http://iphp.com.ua/?p=597 Fdisk, в нем удаляем [...]]]> Если диск начал грязно ругаться в dmesg на ошибки чтения-записи, значит пора переезжать. Допустим у нас FreeBSD версии 7.0… Выключаемся, вставляем новый диск (у меня он ad2). Он у меня немного поменьше, потому внимательно смотрим $ df -m - и думаем, какую файловую систему насколько можно ужать. Подумали – можно приступать. # sysinstall идем в меню Configure->Fdisk , в нем удаляем существующие партиции и создаем одну новую на весь диск. Сложностей никаких. Есть тонкость – выходить нужно по Q, не нажимая W. (Если в задумчивости нажали, катастрофы нет – но перед следующей операцией придется перегружаться). На вопрос про Boot Manager отвечаем Standard. Переходим в пункт меню Label. Здесь нас поджидает еще одна тонкость. Будущий корневой раздел должен быть создан с меткой ad2s1a, но sysinstall не позволяет задавать метку вручную, а при указании точки монтирования отличной от / автоматически присваеват имя ad2s1d. У меня сработала такая последовательность: сперва создал раздел с точкой монтирования / – и он получил правильную метку, а потом нажал M – и изменил точку монтирования на /tmp/root. Далее без каких-либо сложностей создаются раздел подкачки ad2s1b и файловые системы с точками монтирования /tmp/usr и /tmp/var (соотношение меток и точек монтирования сверяйте с вашим /etc/fstab – если, конечно, у вас нет охоты переделать все по-новому). Выход из Label нажатием W (появляется большое ругательное окно, с вопросом, понимаете ли вы, что творите. Нужно ответить Yes) и потом Q. Выходим из sysinstall и смотрим на новые файловые системы: $ mount Теперь переносим на них содержимое старого диска: # cd / # find . -xdev -print | cpio -p -m /tmp/root # cd /usr # find . -xdev -print | cpio -p -m /tmp/usr # cd /var # find . -xdev -print | cpio -p -m /tmp/var Чтобы веселее было ждать конца копирования, у cpio можно добавить опцию –verbose (команда копирования может быть и такой: pax -rw -X -pe . /tmp/root – так короче, но вариант find+cpio просто привычнее – и переносимее – кто-нибудь видел pax напр. под Linux? – про другие unix-like системы уже молчу). Вот и весь процесс. Выключаемся, ставим новый диск на место старого – и грузим систему. ]]> http://iphp.com.ua/archives/597/feed 0 http://iphp.com.ua/archives/592 http://iphp.com.ua/archives/592#comments Tue, 12 Jul 2011 23:59:28 +0000 admin http://iphp.com.ua/?p=592 кладем в .tcshrc и радуемся # # File : tcsh config for Frenzy 1.0 # Author : Sergei Mozhaisky (technix@frenzy.org.ua) # setenv EDITOR vi setenv PAGER more setenv BLOCKSIZE K set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/bin) # if this is not interactive shell - exit if ($?USER == 0 || $?prompt == 0) exit set autocomplete set autoexpand set autolist set filec set ellipsis #set nobeep set listjobs set rmstar set prompt = "%{\033[31m%}%n@%m:%{\033[34m%}%c02%{\033[0m%}%# " set prompt2 = "%R?" set history = 10000 set savehist = (10000 merge) set inputmode = insert set symlinks = chase limit coredumpsize 0 unset autologout set mail = (/var/mail/$USER) if ( $?tcsh ) then bindkey "^W" backward-delete-word bindkey -k up history-search-backward bindkey -k down history-search-forward endif ## Alias section alias today "date '+%Y%m%d'" alias mess 'clear ; tail -f /var/log/messages' alias ff 'find . -name $*' alias h 'history 25' alias j 'jobs -l' alias la 'ls -a' alias lf 'ls -FA' alias ll 'ls -lA' # enter command name and press F1 to see man on this prog alias helpcommand man ## Bindkey section # F1 : help on command currently typed(if 'ls passwd', help on 'ls'). bindkey ^[[M run-help bindkey [OP run-help if ($term == "xterm" || $term == "vt100" || $term == "vt102" || $term !~ "con*") then # bind keypad keys for console, vt100, vt102, xterm bindkey "\e[1~" beginning-of-line # Home bindkey "\e[7~" beginning-of-line # Home rxvt bindkey "\e[2~" overwrite-mode # Ins bindkey "\e[3~" delete-char # Delete bindkey "\e[4~" end-of-line # End bindkey "\e[8~" end-of-line # End rxvt else # INSERT : toggles overwrite or insert mode. bindkey ^[[L overwrite-mode bindkey ^[[2~ overwrite-mode # for x # DELETE : delete char at cursor position. bindkey ^? delete-char bindkey ^[[3~ delete-char # for x # HOME : go to the beginning of the line. bindkey ^[[H beginning-of-line # END : go to the end of the line. bindkey ^[[F end-of-line endif Для того, что бы история сохранялась более надёжно (не только по команде exit) нужно добавить в файл .logout строчку history -S ]]> http://iphp.com.ua/archives/592/feed 0 http://iphp.com.ua/archives/585 http://iphp.com.ua/archives/585#comments Thu, 27 Jan 2011 08:21:28 +0000 admin http://iphp.com.ua/?p=585 Если выводится странные цифры перед тегом после тега а также внутри самой страницы и вас это пугает, то вот вам решение: Проблема связана с тем, что некоторые прокси не могут адекватно обрабатывать http 1.1 headerы, которые шлются из php. Решение – добавить в файл .htaccess строчку: SetEnv force-no-vary Объяснение значения отсюда: http://httpd.apache.org/docs/2.2/env.html force-no-vary This causes any Vary fields to be removed from the response header before it is sent back to the client. Some clients don’t interpret this field correctly; setting this variable can work around this problem. Setting this variable also implies force-response-1.0. Можно поробовать еще: downgrade-1.0 This forces the request to be treated as a HTTP/1.0 request even if it was in a later dialect. force-response-1.0 This forces an HTTP/1.0 response to clients making an HTTP/1.0 request. It was originally implemented as a result of a problem with AOL’s proxies. Some HTTP/1.0 clients may not behave correctly when given an HTTP/1.1 response, and this can be used to interoperate with them. ]]> http://iphp.com.ua/archives/585/feed 0 http://iphp.com.ua/archives/583 http://iphp.com.ua/archives/583#comments Thu, 20 Jan 2011 01:57:14 +0000 admin http://iphp.com.ua/?p=583 В системах FreeBSD, OpenBSD и NetBSD существует два подхода к установке дополнительного программного обеспечения, так называемых портов и пакетов, в данном руководстве я буду опираться лишь на подход в OS FreeBSD: ports, packages. Packages или пакеты, это уже собранные(binaries – исполняемый код) пакеты для того или иного FreeBSD RELEASE из портов для этих RELEASE. Порты постоянно обновляются, поэтому готовые пакеты собираются и проверяются только для выпускаемого RELEASE. Термин port – сокращение от portability, портабельность, существует много программного обеспечения Freeware или под лицензиями GPL (http://www.gnu.org/licenses/licenses.html) и «AS IS» BSD-лицензия (http://www.bsdnewsletter.com/bsd/license.html), команда разработчиков FreeBSD занимается адоптацией или портированием такого программного обеспечения для OS FreeBSD. Это касательно портов, пакеты – это собранные порты за конкретную дату, те(то есть) порты для выпущенного FreeBSD RELEASE. Обычно собранные для RELEASE пакеты идут на 3 и 4′ом ISO-Images и доступны: ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/X.Y[.Z]/ где X.Y[.Z] цифры соответствующие тому или иному релизу или ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-X.Y[.Z]-release/ в то время как полное дерево портов для каждого релиза можно взять: ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/X.Y[.Z]-RELEASE/ports/ports.tgz или используя cvsup: - установить cvsupit из портов (/usr/ports/net/cvsupit/), а лучше взять готовый пакет: cvsup16.1e советую брать без GUI, гораздо удобнее использовать командную строку и скрипты, например: скрипты cvsup Совет: всегда сохраняйте сперва предыдущую копию портов, на всякий случай отдельные порты можно выкачивать, например bash2: сохраняем на всякий случай старый порт # cd /usr/ports/shells # mv bash2 bash2.old выкачиваем свежий порт # wget -Y off -t 0 -c -r -nH –cut-dirs=6 ftp://ftp.ru.freebsd.org/pub/FreeBSD/branches/-current/ports/shells/bash2/ когда выкачиваете отдельные порты, имейте ввиду что они могут требовать других свежих портов, ищите в Makefile’е интересующего вас порта ключевые слова DEPENDS, кроме этого могут изменяться *.mk файлы для утилиты make: /usr/ports/Mk/, из-за чего возникают ошибки при сборке портов на этапе разбора самого Makefile’а. прим: чтобы не загружать основные сервера ftp.freebsd.org или cvsup.freebsd.org используйте ближайшие к вам географические зеркала: http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/mirrors-ftp.html man ports – всегда поможет и ответит на многие вопросы дерево портов: /usr/ports/категория конкретный порт: /usr/ports/категория/название_порта содержимое директории порта: /usr/ports/категория/название_порта/Makefile – файл сборки проекта /usr/ports/категория/название_порта/distinfo – md5 контрольные суммы дистрибутивов которые будут собраны /usr/ports/категория/название_порта/files – директория в которой содержатся freebsd-related патчи для данного программного продукта /usr/ports/категория/название_порта/scripts – директория со скриптами создания дополнительной конфигурации или зависимого Makefile.inc файлы: pkg-comment – краткое описание данного продукта pkg-desc – чуть более расширенное описание данного продукта pkg-plist – список всего что будет установлено в систему посредством make install pkg-message – важное сообщение которое будет выдано после make install pkg-install – обычно скрипт дополнительняющий набор необходимых действий при «make install» терминология структуры портов: /usr/ports – все дерево портов /usr/ports/INDEX – список всех портов /usr/ports/INDEX.db – база портов /usr/ports/README – прочти меня /usr/ports/distfiles – место куда будет затягиваться дистрибутив необходимый для сборки порта /usr/ports/Mk – необходимые make includes файлы для сборки портов в дополнение к /usr/share/mk обычный или mini-port – обычный порт мета, meta-port – порт большого программного продукта, в реалии пустышка из нескольких mini-port’ов необходимых для сборки ПОЛНОГО meta-port’а. прим.: когда то вместо meta портов, были мега порты, которые удобней было собирать в отличие от мета портов, имейте ввиду что для сборки XFree86, mozilla, openoffice вам понадобится очень много free-space и возможно потребуется переопределить рабочую директорию через переменную WRKDIR. Например: /usr/ports/x11/XFree86-4 – это мета-порт объединяющий установку нескольких мини-портов необходимых для установки всего XFree86-4, список мини-портов указан в /usr/ports/x11/XFree86-4/Makefile прим.: если у вас уже установлен предыдущий порт XFree86-4, и вы скачали новый и хотите его установить, лучше удалить предыдущий XFree86 и все его depends, в этом случае проблем не будет. Сборка: 1) cd /usr/ports/категория/название_порта 2) make по команде make, будет просматриваться содержимое /usr/ports/distfiles на предмет наличия в нем дистрибутива[ов] cat distinfo, если таковые отсутствуют там, будет производиться скачивание данного дистрибутива с основного сайта: ftp.freebsd.org. Управлять этим процессом можно определив ряд необходимых переменных в файле /etc/make.conf (который создается на основе /etc/defaults/make.conf) MASTER_SITE_BACKUP?= \ ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ закоментарим две верхние строчки и зададим ближайший к нам сайт с зеркалом distfiles, например: #MASTER_SITE_BACKUP?= \ # ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ #–lavr MASTER_SITE_BACKUP?= \ ftp://ftp.ru.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP} MASTER_SORT_REGEX?= ^file: ^ftp://ftp\.FreeBSD\.org/pub/FreeBSD/ports/local-distfiles/ ://[^/]*\.ru/ ://[^/]*\.ru\. если у нас выход в Internet через PROXY, определяем следующие переменные в том же файле, если PROXY с авторизацией, man 3 fetch: FETCH_ENV= FTP_PROXY=ftp://10.0.0.1:21 FETCH_ENV= HTTP_PROXY=http://10.0.0.1:80 При сборке портов можно использовать много полезных переменных среды, полезно в тех или иных случаях: # less /usr/share/mk/bsd.README # less /usr/ports/Mk/bsd.port.mk # man ports некоторые наиболее полезные переменные: - PORTSDIR - WRKDIR - DISTDIR - PREFIX - BATCH с их помощью можно изменять директории структуры портов, местонахождения sources, рабочую директории для сборки, путь установки и тд и тп. При сборке порта, как уже было сказано, ищется дистрибутив, проверяется его контрольная сумма по md5: имя дистрибутива обычно указыватся в файле distinfo, например, рассмотрим mpg123 из портов: [alone]~ > ls -la /usr/ports/audio/mpg123 total 24 drwxr-xr-x 3 root wheel 512 Feb 11 12:21 . drwxr-xr-x 336 root wheel 6656 Feb 12 12:04 .. -rw-r–r– 1 root wheel 2662 Feb 11 12:21 Makefile -rw-r–r– 1 root wheel 268 Apr 10 2001 distinfo drwxr-xr-x 2 root wheel 512 Feb 11 12:21 files -rw-r–r– 1 root wheel 52 Jul 10 1997 pkg-comment -rw-r–r– 1 root wheel 242 Aug 5 1999 pkg-descr -rw-r–r– 1 root wheel 11 Aug 17 1998 pkg-plist [alone]~ > Makefile – проект сборки distinfo – файл содержаший md5 контрольные суммы дистрибутива, той или иной версии, патчи и другие необходимые sources: [alone]~ > cat /usr/ports/audio/mpg123/distinfo MD5 (mpg123-0.59r-pl1.tar.gz) = 2648708fac9203ef58292adf5e54e4ba MD5 (mpg123-059r-v6-20000713b.diff.gz) = b830cefc8805c8ad827f73985c03d27f MD5 (l3.diff.gz) = b8749f4709ed1a9df8a00d51c4a02dd5 MD5 (mpg123-059r-recode-20010410.diff.gz) = 8f9e18cf27f9e048c5369cf3b78b6b11 [alone]~ > files – если в порту есть такая директория, она обычно содержит патчи и дополнительные файлы конфигурации данного порта pkg-comment и pkg-descr – файлы описания данного порта-продукта, короткое описание и более полное pkg-plist – это список всех файлов которые будут установлены в систему относительно пути в PREFIX и некоторые дополнительные действия которые будут произведены при `make install` 3) make install после успешной сборки п.2, произвести установку собранного продукта в систему, обычно: PREFIX=/usr/local, где /usr/local – альтернативная структура базовой системы: «/», «/etc», «/bin», «/sbin», «/usr/lib» и тд 4) make clean удалить все что осталось после сборки, обычно директорию work в данном продукте и всех зависимостях которые были собраны и автоматически установлены при сборке данного продукта Удалить установленные порты или пакеты можно: # make de-install или man pkg_delete при сборке порта, в пункте 2) make – производит несколько операций, скачивание, накладывание патчей, конфигурирование проекта перед сборкой и саму сборку, при необходимости, мы можем выполнять по шагам вместо make: make fetch make checksum make depends make extract make patch make configure make build все вышеуказанные действия могут быть выполнены самостоятельно и по шагам, допустим мы хотим поправить некий порт под себя, шаги: - скачиваем порт: # make fetch - проверка контрольной суммы дистрибутива: # make checksum - разврачиваем дистрибутив в рабочую директорию, у большинства портов это директория /usr/ports/category/portname/work # make extract - если используется многоплатформенный гнушный конфигуратор configure # make configure теперь мы можем наложить свои патчи, затем при помощи команды diff создать нужные нам правки: файлы patch-xy, где xy – это буквы aa/ab/ac/… и тд и тп и положить их в директорию files – все порт с нашими правками готов, теперь можно его очистить: # make clean и собрать по шагам, чтобы убедиться что нет ошибок или затратить меньше времени на их исправления, все – наш порт, порт с нашими правками готов. чтобы в реалии не выполнять make, а лишь посмотреть что будет сделано: # make -n [install|или другие опции] иногда удобно в командной строке задать все необходимые команды (см. используемый вами SHELL): # cd /usr/ports/категория/название_порта # make && make install && make clean однако некоторые порты требуют интерактивного вмешательства, чтобы этого не произошло, необходимо посмотреть Makefile, записать все необходимые опции с которыми мы будем собирать данный порт и выполнить: make WITH_ИМЯОПЦИИ=yes WITHOUT_ИМЯОПЦИИ=yes BATCH=yes install && make clean BATCH=yes обеспечивает пакетную сборку порта. Материал для изучения: http://www.freebsd.org/doc/en_US.ISO8859-1/books/porters-handbook/index.html http://www.FreeBSD.org.ua/porters-handbook/ – на русском прим.: конечно можно и нужно удалять то что осталось после сборки портов, глобально: # cd /usr/ports # make clean можно для каждой категории: # cd /usr/ports/category # make clean зависимости тоже будут удалены, но все это очень долгая история, лично мне удобнее прежде посмотреть, что не было очищено после установки того или иного порта: # find /usr/ports/ -name «work» -print или # find /usr/ports/ -name «.instal*» -print после чего без всякий `make clean` – это ну очень долго, использовать: # find /usr/ports/ -name «work» -exec rm -rf {} \; все что нужно удалено, быстро и удобно. После установки портов и пакетов, в директории /var/db ведется база установленных пакетов и портов (для последних можно использовать переменную FORCE_PKG_REGISTER= YES в файле /etc/make.conf, это очень удобно. в директории /var/db/pkg – можно найти весь список портов, это директории с именами: /var/db/pkg/PortName-Version, внутри которых есть несколько информативных файлов, например: [alone]~ > ls -la /var/db/pkg/mpg123-esound-0.59r_8/ total 28 -rw-r–r– 1 root wheel 52 Feb 11 12:05 +COMMENT -rw-r–r– 1 root wheel 660 Feb 11 12:05 +CONTENTS -rw-r–r– 1 root wheel 242 Feb 11 12:05 +DESC -r–r–r– 1 root wheel 7457 Feb 11 12:05 +MTREE_DIRS -rw-r–r– 1 root wheel 14 Feb 16 21:28 +REQUIRED_BY drwxr-xr-x 2 root wheel 512 Feb 16 21:28 . drwxr-xr-x 371 root wheel 9728 May 22 15:47 .. [alone]~ > если вспомнить описанную ранее структуру порта: +COMMENT – комментарий (pkg-comment) +CONTENTS – то что было установлено в систему (pkg-plist) +DESC – описание (pkg-descr) +MTREE_DIRS – дерево с указанием владельца и режимов файлов и директорий +REQUIRED_BY – если есть, то для какого порта или пакета, данный програмный продукт был зависимостью Packages – пакеты. ]]> http://iphp.com.ua/archives/583/feed 0 http://iphp.com.ua/archives/580 http://iphp.com.ua/archives/580#comments Tue, 28 Dec 2010 08:28:58 +0000 admin http://iphp.com.ua/?p=580 Dovecot, for example, seems to expect pem-files, while RapidSSL only issues crt-files. The solution? Use OpenSSL to convert (via the DER-format) to pem: openssl x509 -in input.crt -out input.der -outform DER then openssl x509 -in input.der -inform DER -out output.pem -outform PEM ]]> http://iphp.com.ua/archives/580/feed 0 http://iphp.com.ua/archives/575 http://iphp.com.ua/archives/575#comments Mon, 25 Oct 2010 17:39:31 +0000 admin http://iphp.com.ua/?p=575 В стандартный состав FreeBSD входит замечательная программа watch(8), которая позволяет подсматривать за чужой консолью. Всё, что ей для этого необходимо это snp модуль, который достаточно собрать из сурцов а программа сама его подгрузит: # cd /usr/src/sys/modules/snp/ # make && make install Теперь выбираем цель: # w 9:16PM up 55 days, 52 mins, 2 users, load averages: 0.08, 0.06, 0.00 USER TTY FROM LOGIN@ IDLE WHAT nlo1 p0 nlo.habr.ru 9:06PM - w nlo2 p1 nlo.habr.ru 9:16PM - -bash (bash) И подсматриваем за интересной нам консолью(TTY). # watch p1 ]]> http://iphp.com.ua/archives/575/feed 0