Recently in Не забыть бы Category

Настройка связки Graphite+uwsgi+nginx

Задача: Установить и настроить Graphite для последующей его интеграции с icinga1/icinga2/Nagios/Grafana.
Мануалы предлагают установить это посредством pip и прикрутить с боку apache+mod_wsgi. На мой взгляд это ресурсоемко, да и не для того придумали бинарные дистрибутивы, чтобы из сырцов что то собирать.

Итак

Гуглим установку и настройку Graphite на любимый дистрибутив, благо мануалов по его установке, как говна за баней. Единственно там предлагается установить apache+mod_wsgi, который я и заменяю на nginx+uwsgi. Приведу свои конфиги с Debian 9.

/etc/uwsgi/apps-enabled/graphite.ini
[uwsgi]
processes = 2
uid = _graphite
gid = _graphite
chdir = /usr/share/graphite-web
pythonpath = "['/usr/share/graphite-web'] + sys.path"
manage-script-name = true
mount = /graphite=/usr/share/graphite-web/graphite.wsgi
socket = 127.0.0.1:3031
plugins = python
module = wsgi:application

plugins = carbon
enable-metrics = true
carbon-use-metrics = true
carbon-id = %n
carbon = 127.0.0.1:2003
/etc/nginx/sites-enabled/graphite.local`
server {
        listen      80;
        server_name graphite.local;
        charset     utf-8;
        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:3031;
        }
}
Так же предлагаю обмазаться вот этим циклом статей.
Как уже писалось ранее, есть такая штука как Phing. Бывает, что проекту для работы требуется сторонние файлы.
В моем случае это сторонняя база данных. Весит она много и распространять ее с проектом нет особого смысла, т.к. данные меняются от релиза к релизу.
Но есть Phing!
Принесем ему зависимости:
composer global require  pear/http_request2: dev-master
На момент публикации нужна именно master-ветка, т.к. Phing споткнется об Pear.
Собственно таск:
<target name="getSde" desription="Download EVE SDE">
        <httpget url="https://www.fuzzwork.co.uk/dump/latest/eve.db.bz2" dir="${src}/data" sslverifypeer="false">
        <if>
            <os family="unix">
            <then>
                <echo>Exec bzip2 -dfsv ${src}/data/eve.db.bz2</echo>
                <exec executable="bzip2" passthru="true" checkreturn="true">
                    <arg value="-dfvs">
                    <arg value="${src}/data/eve.db.bz2">
                </arg></arg></exec>
            </then>
            <else>
                <echo level="error">Extract base ${src}/data/eve.db.bz2 in directory ${src}/data!</echo>
            </else>
        </os></if>
    </httpget>
</target>
Данный таск скачивает базу своими средствами и распаковывает ее средствами ОС.
Можно было сделать таск с wget-ом или curl-ом, но я спотыкался об отсутсвие того и другого в production-окружении, куда я не имею root-доступа.

Vagrant на NTFS разделе

Vagrant под Linux не хочет работать с ssh-ключами на ntfs-разделе. В момент развертывания виртуалки он говорит примерно так:

Key inserted! Disconnecting and reconnecting using new SSH key...
The private key to connect to the machine via SSH must be owned
by the user running Vagrant. This is a strict requirement from
SSH itself. Please fix the following key to be owned by the user
running Vagrant:

/media/sda3/home/devchroot/.vagrant/machines/default/virtualbox/private_key

Все потому что раздел по умолчанию монтируется не с теми правами. Дабы все было хорошо, монтировать диск надо вот с такими опциями:

mount /dev/sda3 /media/sda3 -t ntfs-3g -o uid=1000,gid=1000,dmask=002,fmask=0177

где uid и gid соотвествуют вашему пользователю в системе (можно посмотреть позвав id в консоли).

Можно принести шаблон в /home, но у меня директория с проектами слинкована в ntfs-раздел.

Включение IPv6 в Proxmox

Разжился IPv6 подсетью. Это удобно. Встала задача выпускать OpenVZ/KVM контейнеры в мир по v6. Обычно для этой операции хватает одного radvd. В Proxmox он по умолчанию отключен. И включить его надо до загрузки radvd. Либо libhands.so сегфолтится, либо еще какая причина, но modprobe мне не помог.

Включается оно так:

echo ipv6 >> /etc/modules
echo net.ipv6.conf.all.forwarding=1 >> /etc/sysctl.d/ipv6.conf

После таких манипуляций radvd не будет возмущаться на отключенный v6-форвардинг.


Phing, cron task

Есть такая штука как Phing. Это как Ant только Phing.
Позволяет совершать тривиальные задачи по развертыванию проекта на сервере, как то: настройка прав доступа к директориям/файлам, копирование чего то куда то, миграции и т.д. Но вот с заданиями для cron там беда.
Существующие, легко нагугливаемые примеры предлагают писать задания в /etc/cron.d/, куда на обычном shared-хостинге мы естественно не имеем доступа. Ну или предлагают нам sudo, что тоже слегка не то.

Но есть task exec!
Итак:
$ touch build.xml
$ nano build.xml
Приведем наш build к следующему виду:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Phing build config -->
<project name="test" basedir="." default="deploy">
    <target name="set_crontab" description="Set Crontab">
        <exec
            command='/bin/echo -en "`crontab -l 2>/dev/null`\n0 * * * *  php `pwd`/protected/yiic update\n\n" | crontab - 2>/dev/null'
            passthru="true" checkreturn="true" />
    </target>
    
    <!-- Default target -->
    <target name="deploy" depends="set_crontab"></target>
</project>
Запустим phing и увидим нечто такое:
$ phing
Buildfile: /home/vagrant/build.xml

test > set_crontab:


test > deploy:


BUILD FINISHED

Total time: 0.0925 seconds
Выполнится буквально следующий код:
/bin/echo -en "`crontab -l 2>/dev/null`\n0 * * * *  php `pwd`/protected/yiic update\n\n" | crontab - 2>/dev/null
Сказав в той же консоли 'crontab -l' увидим нечто такое:
$ crontab -l

0 * * * *  php /home/vagrant/protected/yiic update
Congratulations!

Skype через Proxy Squid

Встала задача выпустить Skype в сеть, не выпуская туда все остальное. Доступ в Интернет ограничен на шлюзе. Там же и будем городить прокси для Skype.
Ставим Squid:
apt-get install squid
Минимальный конфиг, на котором это взлетело:
# Адрес и порт Squid 
http_port 192.168.1.100:3128
# Лог доступа
access_log /var/log/squid/access.log squid

# Настройки кеша
cache_mem 256 MB
maximum_object_size_in_memory 512 KB

# Программа для авторизации клиентов (basic авторизация)
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd
# Путь до файла с логинами/паролями
acl passwd proxy_auth "/etc/squid/passwd"

# Списки доступа
acl all src 0.0.0.0/0

# Пускать только https
acl SSL_ports port 443 563
acl CONNECT method CONNECT

# Без этого Skype чувствует себя совсем плохо и не проходит авторизацию на Proxy
acl numeric_IPs dstdom_regex ^(([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)|(\[([0-9af]+)?:([0-9af:]+)?:([0-9af]+)?\])):443
acl Skype_UA browser ^skype

http_access allow passwd
http_access allow CONNECT all numeric_IPS Skype_UA SSL_ports
http_access deny CONNECT !SSL_ports

# Отключаем кеш
cache deny all
cache_dir null /tmp
Добавляем пользователей:
htpasswd -c /etc/squid/passwd username
Перезапускаем Squid:
/etc/init.d/squid restart
В Skype идем по пути Инструменты -> Настройки -> Дополнительно -> Соединение и вводим данные для доступа к Proxy.

Заморочки с Zend'ом

Как известно дебагер - штука очень полезная. Даже в php. И так, качаем ZendDebugger, редактируем php.ini
[Zend]
zend_extension_ts=/path/to/file/ZendDebugger.so
zend_debugger.allow_hosts=127.0.0.1
zend_debugger.expose_remotely=always
Сохраняем конфиг. Проверяем:
php -m
[PHP Modules]
Zend Debugger
[Zend Modules]
Zend Debugger
Наслаждаемся.
#IP интерфейса и порт, где будет SQUID
http_port 192.168.0.1:3128 transparent

#Порт icp
icp_port 0

#Не кешировать скрипты
acl QUERY urlpath_regex cgi-bin 
no_cache deny QUERY

#Кол-во ОЗУ для SQUID
cache_mem 32 MB

#Формат хранилища SQUID - ufs. Размер кеша(МБ): 1000. Кеш первого уровня: 16, кеш второго - 256. 
cache_dir ufs /var/spool/squid 1000 16 256

#Путь к лог-файлу доступа к SQUID(Статистика работы через SQUID)
cache_access_log /var/log/squid/access.log

#Путь к лог-файлу SQUID - в нем события запуска SQUID и дочерних программ
cache_log /var/log/squid/cache.log

#Путь к лог-файлу Strore 
cache_store_log /var/log/squid/store.log

#Ротация логов
logfile_rotate 10

#Таблица MIME-типов для SQUID
mime_table /usr/share/squid/mime.conf

#PID-файл SQUID
pid_filename /var/run/squid.pid

#Пользователь для анонимного доступа к FTP
ftp_user anonymous@

#SQUID формирует страницу с папками на FTP - этот параметр - кол-во папок
ftp_list_width 32

#Пассивный режим FTP
ftp_passive on

#Проверка подлинности FTP
ftp_sanitycheck on

#Адрес(а) DNS сервера(ов) можете тут указать свое
dns_nameservers 192.168.0.1 

#Списки контроля доступа 
#Сам сервер
acl phoenix src 192.168.0.1/255.255.255.255

#Сегмент сети с адресами 192.168.0.2-255
acl office src 192.168.0.2-192.168.0.255/255.255.255.255

 #Стандартные ACL
acl all src 0.0.0.0/0.0.0.0

#Все
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255 

#Адрес localhost
acl SSL_ports port 443 563

#Порты SSL
acl SMTP port 25

#Для защиты от спама ;) Оказывается SQUID может делать relay

#Порты, которые будет пропускать SQUID

#Служебные ACL
acl Safe_ports port 80
acl Safe_ports port 21
acl Safe_ports port 443 563 

#https, snews
acl Safe_ports port 777

#multiling http
acl CONNECT method CONNECT
 
#Теперь разрешаем доступ тому, кто указан в ACL 
http_access allow phoenix

http_access allow office 
http_access deny !Safe_ports 
http_access deny SMTP
http_access deny all
http_access deny banners1 all
http_access deny banners2 all

#Разрешаем ICP-доступ всем
icp_access deny all

#Каталог со страницами неполадок SQUID
error_directory /usr/share/squid/errors/Russian-1251

Squid + HAVP + ClamAV

Потребовалось настроить Squid в режиме transparent и прикрутить к нему антивирус. Долго рыл интернет и т.д. в результате таки настроил.... И так:
aptitude install squid clamav havp
Конфигурируем Squid. Можно добавить и в стандартный, но лучше создать свой. отдельный.
vim /etc/squid/squid.conf
cache_peer 127.0.0.1 parent 8080 0 no-query no-digest no-netdb-exchange default
cache_peer_access 127.0.0.1 allow all
acl Scan_HTTP proto HTTP
never_direct allow Scan_HTTP
Заворачиваем 80 порт на Squid
iptables -t mangle -A PREROUTING -p tcp --dport 80 -d 192.168.0.0/255.255.255.0 -j ACCEPT
iptables -t mangle -A PREROUTING -s 192.168.0.0/255.255.255.0 -p tcp --dport 80 -j QUEUE
iptables -t mangle -A PREROUTING -s 192.168.0.0/255.255.255.0 -p tcp --dport 3128 -j QUEUE
iptables -t nat -A PREROUTING -m tcp -p tcp -s 192.168.0.0/255.255.255.0 -d ! 192.168.0.0/255.255.255.0
 --dport 80 -j REDIRECT --to-ports 3128
Перезагружаем Squid и HAVP и топаем по адресу http://www.eicar.org/anti_virus_test_file.htm. Качаем тестовый вирус. Если все сделано правильно то будет выдано сообщение об ошибке. Теперь слегка подправим HAVP. Открываем его конфиг и раскоментируем и изменим следующие строчки:
vim /etc/havp/havp.config
PORT 8080
BIND_ADDRESS 127.0.0.1
USER havp
GROUP havp
SERVERNUMBER 8
MAXSERVERS 100
SCANTEMPFILE /var/spool/havp/havp-XXXXXX
TEMPDIR /var/tmp
TEMPLATEPATH /etc/havp/templates/ru
WHITELISTFIRST true
WHITELIST /etc/havp/whitelist
BLACKLIST /etc/havp/blacklist
FAILSCANERROR false
SCANIMAGES false
MAXSCANSIZE 5000000
STREAMUSERAGENT Player Winamp iTunes QuickTime Audio RMA/ MAD/ Foobar2000 XMMS
ENABLECLAMLIB true
CLAMDBDIR /var/lib/clamav
Теперь можно настраивать блеклисты и подправить страници ошибок. Далее добавим обновление баз антивируса в cron
crontab -e
0 * * * * /usr/bin/freshclam -quiet >/dev/null 2>&1
Ctrl+O
Ctrl+X
Вот в принципе и все. P.S.: Написанно чтобы не забыть самому.

VirtualHost for lighttpd

Кусочек конфига lighttpd касательно Виртуальных хостов с Basic аутентификацией.

# Имя хоста
$HTTP["host"] == "host.ru" {
# Путь до сокета php
fastcgi.server = ( ".php" => (( "socket" => "/home/user/.phpsock" )) )
# Корневая папка хоста
server.document-root = "/home/user/www/host.ru/"
# Basic аутентификация директории dir
$HTTP["url"] =~ "^/dir" {
auth.backend = "plain"
auth.backend.plain.userfile  = "/home/user/.htpasswd"
auth.require = ( "" => ( "method"  => "basic", "realm"   => "restricted area", "require" => "user=user1|user=user2" ),)
}
}

Логин/Пароль пользователе хранится по пути /home/user/.htpasswd в формате username:pass