среда, 24 октября 2012 г.
вторник, 9 октября 2012 г.
Проблема с Wait IO в Linux
Wait I/O - это параметр который показывает какой процент времени работающие процессы были заблокированы, ожидая когда операция ввода -вывода закончится.
Вот и мне пришлось столкнуться с такой проблемой. Стал замечать, что один из серверов стал периодически "залипать". Вывод команды top показал что в этот момент wa-процент составлял от 90% до 100%, что было просто не допустимо.
Запустим vmstat, чтобы убедиться в наличии проблемы
Как видно на картинке - действительно параметр wa подскакивает до 100.
Чтобы отследить "проблемный" процесс - воспользуемся небольшим сочетанием команд:
while true; do date; ps auxf | awk '{if($8=="D") print $0;}'; sleep 1; done
Через некоторое время виновник был найден
Оказалось что в cron попал скрипт который предназначался не этому серверу. Скрипт был убран и все стало на свои места.
Также хочу добавить, что причина Wait IO может быть различна. Но всегда ответ кроется в процессах со статусом "D".
По материалам chile-offshore.com
понедельник, 8 октября 2012 г.
четверг, 4 октября 2012 г.
generated/bounds.h no such file or directory
Лечим ошибку, которая возникает при попытке скомпилировать драйвера:
generated/bounds.h no such file or directory
Лечится очень просто: необходимо сгенерировать необходимые заголовки командой:
cd /usr/src/linux && make modules_prepare
вторник, 11 сентября 2012 г.
Поиск IP адресов в файле, используя bash
Понадобилось мне тут вывести список всех IP-адресов, встречающихся в файле. Сделать это можно следующей командой
cat /etc/named.conf | grep listen-on | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'
понедельник, 10 сентября 2012 г.
Новый сервер DLNA
Привез сервер на который мы установим Debian 6 c Xen и FreeNAS+DLNA. Жена была не очень рада такой махине в нашей маленькой квартире. Еще и заводится он так, как будто самолет взлетает =)
По параметрам он не очень мощный по современным меркам(хотя у него 2 процессора и 4 scsi винта в рейде 1+0), но нам для эксперимента с развертыванием домашнего сервера хватит.
По параметрам он не очень мощный по современным меркам(хотя у него 2 процессора и 4 scsi винта в рейде 1+0), но нам для эксперимента с развертыванием домашнего сервера хватит.
Ярлыки:
Общение на все темы,
Разное,
сервер,
dlna
четверг, 6 сентября 2012 г.
Мониторинг транков Asterisk с уведомлением о проблеме по почте
Хочу привести пример php скрипта, который я иногда использую для мониторинга транков. Я поменщаю его в cron с интервалом в 15 минут. После срабатывания он проверит транки. Если есть не работающий - дает паузу в 20 секунд. Снова проверяет состоняние транков. Если ничего не изменилось - перегружаем модуль chan_sip в asterisk. И если это не могло - шлем email с отчетом по почте, указанной в переменной $report_email.
Скрипт не мой лично - но нареканий в работе у меня нет.
Если у кого то не отоборажается - выложил скрипт сюда https://gist.github.com/3656293
Скрипт не мой лично - но нареканий в работе у меня нет.
Если у кого то не отоборажается - выложил скрипт сюда https://gist.github.com/3656293
Ярлыки:
мониторинг,
Программирование,
Сетевые сервисы,
Телефония,
asterisk,
php,
script
вторник, 4 сентября 2012 г.
Нужна помощь по BIND
Обращаюсь за помощью по настройке BIND. Есть DNS сервер который выполнет функцию кеширующего DNS. Проблема в том что при резолве он берет значение ttl у домена. И спустя какое то время, если пропадает интернет, он не может разрезолвить хост. Может кто нибудь знает как можно BIND заставить игнорировать значение TTL и поставить свое?
четверг, 30 августа 2012 г.
Как узнать ip адрес интерфейса и вывести только его
Маленький пример о том как использовать ifconfig, cut и awk чтобы вывести только ip адрес. Вывод команды ifconfig будет таким
$ /sbin/ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:69527 errors:0 dropped:0 overruns:0 frame:0
TX packets:69527 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:41559546 (39.6 MiB) TX bytes:41559546 (39.6 MiB)
eth0 Link encap:Ethernet HWaddr 00:17:9A:0A:F6:44
inet addr:192.168.2.1 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::217:9aff:fe0a:f644/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:227614 errors:0 dropped:0 overruns:0 frame:0
TX packets:60421 errors:0 dropped:0 overruns:0 carrier:0
collisions:272 txqueuelen:1000
RX bytes:69661583 (66.4 MiB) TX bytes:10361043 (9.8 MiB)
Interrupt:17
ra0 Link encap:Ethernet HWaddr 00:50:56:C0:00:01
inet addr:192.168.1.2 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fec0:1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1024 errors:0 dropped:0 overruns:0 frame:0
TX packets:1320 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Выведем нужный нам интерфейс и исключим все, кроме строки с IP-адресом:
$ /sbin/ifconfig eth0| grep 'inet addr:'
inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0
Теперь подключим утилиту cut для того чтобы отделить IP. Говоря просым языком, cut разделит строку в виртуальный массив через ":" и возьмет 2-й элемент этого массива. Вывод будет таким:
$ /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2
192.168.2.1 Bcast
Ну и в конце с помощью awk вытаскиваем IP. Финальная команда будет выглядеть так:
$ /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
192.168.2.1
Истрочник
$ /sbin/ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:69527 errors:0 dropped:0 overruns:0 frame:0
TX packets:69527 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:41559546 (39.6 MiB) TX bytes:41559546 (39.6 MiB)
eth0 Link encap:Ethernet HWaddr 00:17:9A:0A:F6:44
inet addr:192.168.2.1 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::217:9aff:fe0a:f644/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:227614 errors:0 dropped:0 overruns:0 frame:0
TX packets:60421 errors:0 dropped:0 overruns:0 carrier:0
collisions:272 txqueuelen:1000
RX bytes:69661583 (66.4 MiB) TX bytes:10361043 (9.8 MiB)
Interrupt:17
ra0 Link encap:Ethernet HWaddr 00:50:56:C0:00:01
inet addr:192.168.1.2 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fec0:1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1024 errors:0 dropped:0 overruns:0 frame:0
TX packets:1320 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Выведем нужный нам интерфейс и исключим все, кроме строки с IP-адресом:
$ /sbin/ifconfig eth0| grep 'inet addr:'
inet addr:192.168.2.1 Bcast:192.168.2.255 Mask:255.255.255.0
Теперь подключим утилиту cut для того чтобы отделить IP. Говоря просым языком, cut разделит строку в виртуальный массив через ":" и возьмет 2-й элемент этого массива. Вывод будет таким:
$ /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2
192.168.2.1 Bcast
Ну и в конце с помощью awk вытаскиваем IP. Финальная команда будет выглядеть так:
$ /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
192.168.2.1
Истрочник
Ярлыки:
Сетевые сервисы,
Фишки Linux,
awk,
cut,
debian,
ifconfig,
ip
понедельник, 27 августа 2012 г.
Установка драйвера для NetGear WNA1100 USB WiFi адаптера
Попросили меня на днях подключить драйвер для WiFi адаптера NetGear WNA1100 USB. Выглядит сей девайс следующим образом (см. картинку).
Интересен он тем, что может работать в режиме Access Point в связке с hostapd. Итак, втыкаем этот девайс в машину и смотрим что адаптер определился:
[root@host src]# lsusb
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0846:9030 NetGear, Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Если у вас также - значит поехали далее. Устанавливаем linux-headers, build-essential и качаем драйвера:
[root@host ~]# apt-get install linux-headers-$(uname -r)
[root@host ~]# apt-get install build-essential
[root@host src]# cd /usr/src
[root@host src]# wget http://wireless.kernel.org/download/compat-wireless-2.6/compat-wireless-2.6.tar.bz2
Далее распаковываем наше добро, переходим в каталог с распакованными драйверами и даем команду на выбор необходимого модуля. Нас интересует только ath9k_htc.
[root@host src]# tar xf compat-wireless-2.6.tar.bz2
[root@host src]# tar xf linux-headers
[root@host src]# cd compat-wireless-2.6
[root@host src]# ./scripts/driverselect ath9k_htc
Компилируем модули:
[root@host src]# make
[root@host src]# make install
После того как вы успешно откомпилировалось качаем firmware и кладем его в каталог /lib/firmware. (Небольшое замечание: иногда, если исходники ядра уже были и из них собирались модули или ядро, то нужно перейти в каталог с исходниками ядра и дать команду "make modules_prepare").
[root@host src]# wget http://linuxwireless.org/download/htc_fw/1.3/htc_9271.fw
[root@host src]# mv ./htc_9271.fw /lib/firmware
Подгружаем модуль и убеждаемся что все корректно загрузилось:
[root@host src]# modprobe ath9k_htc
[root@host src]# lsmod | grep ath9
ath9k_htc 42366 0
mac80211 286250 1 ath9k_htc
ath9k_common 1371 1 ath9k_htc
ath9k_hw 300480 2 ath9k_htc,ath9k_common
ath 11078 3 ath9k_htc,ath9k_common,ath9k_hw
cfg80211 128110 3 ath9k_htc,mac80211,ath
compat 8652 5 ath9k_htc,mac80211,ath9k_common,ath9k_hw,cfg80211
На этом все! Можно ставить hostapd и заставить wifi адаптер работать в режиме AP. Мой конфиг hostpad выглядит следующим образом:
[root@host ~]# cat /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
logger_stdout=-1
logger_stdout_level=2
ssid=Test
hw_mode=g
ieee80211n=1
ht_capab=[HT40+][SHORT-GI-40][DSSS_CCK-40]
channel=5
auth_algs=3
max_num_sta=5
wpa=2
wpa_passphrase=1234567890
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
Интересен он тем, что может работать в режиме Access Point в связке с hostapd. Итак, втыкаем этот девайс в машину и смотрим что адаптер определился:
[root@host src]# lsusb
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0846:9030 NetGear, Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Если у вас также - значит поехали далее. Устанавливаем linux-headers, build-essential и качаем драйвера:
[root@host ~]# apt-get install linux-headers-$(uname -r)
[root@host ~]# apt-get install build-essential
[root@host src]# cd /usr/src
[root@host src]# wget http://wireless.kernel.org/download/compat-wireless-2.6/compat-wireless-2.6.tar.bz2
Далее распаковываем наше добро, переходим в каталог с распакованными драйверами и даем команду на выбор необходимого модуля. Нас интересует только ath9k_htc.
[root@host src]# tar xf compat-wireless-2.6.tar.bz2
[root@host src]# tar xf linux-headers
[root@host src]# cd compat-wireless-2.6
[root@host src]# ./scripts/driverselect ath9k_htc
Компилируем модули:
[root@host src]# make
[root@host src]# make install
После того как вы успешно откомпилировалось качаем firmware и кладем его в каталог /lib/firmware. (Небольшое замечание: иногда, если исходники ядра уже были и из них собирались модули или ядро, то нужно перейти в каталог с исходниками ядра и дать команду "make modules_prepare").
[root@host src]# wget http://linuxwireless.org/download/htc_fw/1.3/htc_9271.fw
[root@host src]# mv ./htc_9271.fw /lib/firmware
Подгружаем модуль и убеждаемся что все корректно загрузилось:
[root@host src]# modprobe ath9k_htc
[root@host src]# lsmod | grep ath9
ath9k_htc 42366 0
mac80211 286250 1 ath9k_htc
ath9k_common 1371 1 ath9k_htc
ath9k_hw 300480 2 ath9k_htc,ath9k_common
ath 11078 3 ath9k_htc,ath9k_common,ath9k_hw
cfg80211 128110 3 ath9k_htc,mac80211,ath
compat 8652 5 ath9k_htc,mac80211,ath9k_common,ath9k_hw,cfg80211
На этом все! Можно ставить hostapd и заставить wifi адаптер работать в режиме AP. Мой конфиг hostpad выглядит следующим образом:
[root@host ~]# cat /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
logger_stdout=-1
logger_stdout_level=2
ssid=Test
hw_mode=g
ieee80211n=1
ht_capab=[HT40+][SHORT-GI-40][DSSS_CCK-40]
channel=5
auth_algs=3
max_num_sta=5
wpa=2
wpa_passphrase=1234567890
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
Ярлыки:
Сетевые сервисы,
Фишки Linux,
ath9,
ath9k_htc,
linux,
netgear,
usb,
wifi,
wireless,
wna1100
четверг, 23 августа 2012 г.
Закрываем доступ к сайту с помощью .htpasswd и .htaccess
Эта заметка скорее не для общего обозрения, а чисто для себя. Бывает что нужно быстро закрыть доступ к некоему http-ресурсу. И я каждый раз ищу документацию по опциям htaccess и htpasswd. Чтобы этого не делать - лучше выложу у себя в блоге. Может кому-то пригодится.
Итак, в настройках apache разрешаем Override. Это для того, чтобы можно было .htaccess задействовать. Пример virtualhost:
< VirtualHost *:80 >
ServerAdmin worldisfreedom@gmail.com
DocumentRoot /home/www/www.alertme.ru/html
ServerName alertme.ru
< Directory / >
Options FollowSymLinks
AllowOverride All
< /Directory >
ErrorLog /home/www/www.alertme.ru/logs/error.log
CustomLog /home/www/www.alertme.ru/logs/access.log common
< /VirtualHost >
Итак, в настройках apache разрешаем Override. Это для того, чтобы можно было .htaccess задействовать. Пример virtualhost:
< VirtualHost *:80 >
ServerAdmin worldisfreedom@gmail.com
DocumentRoot /home/www/www.alertme.ru/html
ServerName alertme.ru
< Directory / >
Options FollowSymLinks
AllowOverride All
< /Directory >
ErrorLog /home/www/www.alertme.ru/logs/error.log
CustomLog /home/www/www.alertme.ru/logs/access.log common
< /VirtualHost >
# /sbin/service/httpd reload
Далее переходим в ту директорию, которую хотим закрыть и создаем там файл .htaccess со следующим содержимым:
AuthUserFile /home/www/www.voip-lab.ru/html/admin/.htpasswd
AuthName EnterPassword
AuthType Basic
Require user admin
Далее, в той же директории(или любой какой угодно-главное путь не забыть в .htaccess поменять) создаем файл .htpasswd командой
# htpasswd -c .htpasswd admin
И задаем пароль.
Ура! Я больше не буду искать эту инфу =))
среда, 22 августа 2012 г.
Редирект в nginx или использование rewrite и proxy_pass
Возникла тут задачка сделать редирект с помощью nginx при определенном запросе к сайту. Для осуществления нашей задачи я приведу пример конфига:
server {
listen 80;
server_name www.site.ru site.ru;
reset_timedout_connection on;
location ~* /Service {
proxy_pass http://avia.go2see.ru;
}
location ~* /Service2 {
rewrite ^ http://demo.site.ru/Service2 permanent;
}
location / {
proxy_pass http://www/;
proxy_next_upstream error timeout invalid_header http_500 http_503;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_connect_timeout 120;
}
}
server {
listen 80;
server_name www.site.ru site.ru;
reset_timedout_connection on;
location ~* /Service {
proxy_pass http://avia.go2see.ru;
}
location ~* /Service2 {
rewrite ^ http://demo.site.ru/Service2 permanent;
}
location / {
proxy_pass http://www/;
proxy_next_upstream error timeout invalid_header http_500 http_503;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_connect_timeout 120;
}
}
Отличие rewrite от proxy_pass состоит в том, что редирект будет выглядеть "открыто". Т.е. страничка автоматичеси переадресуется по новому адресу.
В случае в proxy_pass запрос уйдет "прозрачно", т.е. пользователь даже не поймет что был запрос по новому url адресу.
Ярлыки:
Сетевые сервисы,
nginx,
proxy_pass,
rewrite
понедельник, 20 августа 2012 г.
Как привязать ssl к nginx
В данной заметке я расскажу как быстро привязать ssl сертификат к nginx. Испытания мы проведем тестовом сервере с тестовым сертификатом, который запросим у Comodo.
Итак, для начала определимся что у нас есть. А есть у нас один nginx сервер который смотрит в Интернет. И, для простоты, один внутренний (с ip 10.10.10.10) для которого и будет создаваться стандартное и ssl подключение. Конечно, серверов может быть сколько угодно. Но мы с вами сейчас не будем усложнять.
Для начала нам необходимо создать CSR-запрос на сертификат. Бесплатно можно его сделать либо напрямую у Comodo, либо через сайт http://www.freessl.su/. Мы будет делать через http://www.freessl.su/.
Конфигурационные файлы от nginx у меня лежат в каталоге /etc/nginx. Создаем там подкаталог ssl и переходим в него.
# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
Далее необходимо создать CSR запрос. Для этого сначала создадим файл приватного ключа следующей командой:
# openssl genrsa -des3 -out secure.website.ru.key 2048
Если вы хотите создать файл ключа без пароля, то введите следующую команду
# openssl genrsa -out secure.website.ru.key 2048
Далее создадим файл запроса на генерацию сертификата. Для этого пишем команду:
# openssl req -new -key secure.website.ru.key -out secure.website.ru.csr
И заполняем поля. После этого будет сгенерирован файл /etc/nginx/ssl/secure.website.ru.csr. Скопируем его содержимое и идем на сайт http://www.freessl.su/. Там заполняем поля ФИО, Телефон, email и вставляем содержимое файла secure.website.ru.csr в поле CSR. Нажимаем далее, выбираем подходящий контактный email.
После этого на почтовый ящик от Comodo придет письмо с просьбой подтвердить создание ssl сертификата. В письме будет указан код подтверждения. Перейдите по ссылке в письме и подтвердите.
Через некоторое время вам придет файл с сертификатом и файл с промежуточными сертификатами. Скопируйте их содержимое в /etc/nginx/ssl/secure.website.ru.crt.
#cat secure_website_ru.crt >> /etc/nginx/ssl/secure.website.ru.crt
#cat secure_website_ru.ca_bundle >> /etc/nginx/ssl/secure.website.ru.crt
На этом формирование сертификата закончено. Переходим к настройке nginx. Для нашего случая конфигурация /etc/nginx/nginx.conf будет выглядеть следующим образом:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
}
http {
upstream www {
server 10.10.10.10 weight=1 max_fails=3 fail_timeout=120;
}
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#Секция для стандартного подключение по 80 порту
server {
listen 80;
server_name secure.website.ru;
reset_timedout_connection on;
location / {
proxy_pass http://www/;
proxy_next_upstream error timeout invalid_header http_500 http_503;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_connect_timeout 100;
}
}
# Секция для подключения по ssl
server {
listen 443 ssl;
server_name secure.website.ru;
access_log logs/ssl-access.log;
error_log logs/ssl-error.log;
ssl_certificate ssl/secure.website.ru.crt;
ssl_certificate_key ssl/secure.website.ru.key;
ssl_verify_depth 3;
keepalive_timeout 60;
location / {
proxy_pass http://www/;
proxy_next_upstream error timeout invalid_header http_500 http_5
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
}
}
Сохраняем и перезапускаем nginx.
# service nginx reload
Вдаваться в детали настроек я не хочу. Про них очень хорошо написано в официальной документации nginx.
Единственное что хотелось бы подчеркнуть, что если вы хотите на 1 сервер повесить несколько разных ssl сертификатов на порт 443, то просто добавить такую конфигурацию не получится:
server {
listen 443;
server_name www.example.com;
ssl on;
ssl_certificate www.example.com.crt;
...
}
server {
listen 443;
server_name www.example.org;
ssl on;
ssl_certificate www.example.org.crt;
...
}
В такой конфигурации браузер получит сертификат первого сервера, т.е. www.example.com, независимо от запрашиваемого имени сервера. Это связано с поведением протокола SSL. SSL-соединение устанавливается до того, как браузер посылает HTTP-запрос, и nginx не знает имени запрашиваемого сервера. Следовательно, он лишь может предложить сертификат сервера по умолчанию.
Решение данного вопроса вы можете найти по ссылке.
На этом базовая настройка nginx законена.
Итак, для начала определимся что у нас есть. А есть у нас один nginx сервер который смотрит в Интернет. И, для простоты, один внутренний (с ip 10.10.10.10) для которого и будет создаваться стандартное и ssl подключение. Конечно, серверов может быть сколько угодно. Но мы с вами сейчас не будем усложнять.
Для начала нам необходимо создать CSR-запрос на сертификат. Бесплатно можно его сделать либо напрямую у Comodo, либо через сайт http://www.freessl.su/. Мы будет делать через http://www.freessl.su/.
Конфигурационные файлы от nginx у меня лежат в каталоге /etc/nginx. Создаем там подкаталог ssl и переходим в него.
# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
Далее необходимо создать CSR запрос. Для этого сначала создадим файл приватного ключа следующей командой:
# openssl genrsa -des3 -out secure.website.ru.key 2048
Если вы хотите создать файл ключа без пароля, то введите следующую команду
# openssl genrsa -out secure.website.ru.key 2048
Далее создадим файл запроса на генерацию сертификата. Для этого пишем команду:
# openssl req -new -key secure.website.ru.key -out secure.website.ru.csr
И заполняем поля. После этого будет сгенерирован файл /etc/nginx/ssl/secure.website.ru.csr. Скопируем его содержимое и идем на сайт http://www.freessl.su/. Там заполняем поля ФИО, Телефон, email и вставляем содержимое файла secure.website.ru.csr в поле CSR. Нажимаем далее, выбираем подходящий контактный email.
После этого на почтовый ящик от Comodo придет письмо с просьбой подтвердить создание ssl сертификата. В письме будет указан код подтверждения. Перейдите по ссылке в письме и подтвердите.
Через некоторое время вам придет файл с сертификатом и файл с промежуточными сертификатами. Скопируйте их содержимое в /etc/nginx/ssl/secure.website.ru.crt.
#cat secure_website_ru.crt >> /etc/nginx/ssl/secure.website.ru.crt
#cat secure_website_ru.ca_bundle >> /etc/nginx/ssl/secure.website.ru.crt
На этом формирование сертификата закончено. Переходим к настройке nginx. Для нашего случая конфигурация /etc/nginx/nginx.conf будет выглядеть следующим образом:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
}
http {
upstream www {
server 10.10.10.10 weight=1 max_fails=3 fail_timeout=120;
}
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#Секция для стандартного подключение по 80 порту
server {
listen 80;
server_name secure.website.ru;
reset_timedout_connection on;
location / {
proxy_pass http://www/;
proxy_next_upstream error timeout invalid_header http_500 http_503;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_connect_timeout 100;
}
}
# Секция для подключения по ssl
server {
listen 443 ssl;
server_name secure.website.ru;
access_log logs/ssl-access.log;
error_log logs/ssl-error.log;
ssl_certificate ssl/secure.website.ru.crt;
ssl_certificate_key ssl/secure.website.ru.key;
ssl_verify_depth 3;
keepalive_timeout 60;
location / {
proxy_pass http://www/;
proxy_next_upstream error timeout invalid_header http_500 http_5
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
}
}
Сохраняем и перезапускаем nginx.
# service nginx reload
Вдаваться в детали настроек я не хочу. Про них очень хорошо написано в официальной документации nginx.
Единственное что хотелось бы подчеркнуть, что если вы хотите на 1 сервер повесить несколько разных ssl сертификатов на порт 443, то просто добавить такую конфигурацию не получится:
server {
listen 443;
server_name www.example.com;
ssl on;
ssl_certificate www.example.com.crt;
...
}
server {
listen 443;
server_name www.example.org;
ssl on;
ssl_certificate www.example.org.crt;
...
}
В такой конфигурации браузер получит сертификат первого сервера, т.е. www.example.com, независимо от запрашиваемого имени сервера. Это связано с поведением протокола SSL. SSL-соединение устанавливается до того, как браузер посылает HTTP-запрос, и nginx не знает имени запрашиваемого сервера. Следовательно, он лишь может предложить сертификат сервера по умолчанию.
Решение данного вопроса вы можете найти по ссылке.
На этом базовая настройка nginx законена.
Ярлыки:
Сетевые сервисы,
cerificate,
freessl,
nginx,
ssl
четверг, 16 августа 2012 г.
Настраиваем домашний файловый сервер на основе Xen и Freenas / Часть 1 - Установка Xen на Debian
Данной небольшой заметкой я начну серию статей о хитрой связке Xen и Freenas. Почему хитрой, ответит на вопрос серия требований. Далее, под системой я буду понимать всю связку Xen c Freenas со всеми дополнениями и фунционалом.
В итоге мы подключим жесткий диск и прокинем его в гостевую машину. Далее, поскольку если одновременно смонтировать ЖД и прокинуть в гостевую машину, появляются глюки(по понятным причинам), а адекватно работающий DLNA-сервер мне удалось найти только под Linux,- мы смотнируем по nfs содержимое FreeNAS сервера в Debian. По производительности вы ничего не потеряете, а вот возможных глюков можно избежать.
Далее мы установим dropbox на сервер Debian и натравим его на смонтированный по nfs (под)каталог.
И в заключение в transmission мы добавим волшебную кнопочку, которая будет на Debian сервере перезапускать minidlna службу. А сделаем это с помощью javascript+php+ssh с авторизацией по ключу.
Требования:
- Система должна представлять собой файловое хранилище.
- Система должна уметь закачивать .torrent файлы через web интерфейс и dropbox
- Система должна иметь DLNA сервер для последующего воспроизведения
- Нужно модифицировать web-интефейс transmission для нативного перезапуска DLNA службы на основном сервере.
- Орагнизовать запуск на скачку .torrent с мобольных девайсов
- Пробросить жесткий диск из Dom0 во FreeNAS
По службам получается приблизительно такая картина:
За неимением Android девайса не могу сказать что нам понадобится для запуска закачки на сервере. Но обещаю ближе к финалу найти телефончик. Протестить и дополнить схему.
В итоге мы подключим жесткий диск и прокинем его в гостевую машину. Далее, поскольку если одновременно смонтировать ЖД и прокинуть в гостевую машину, появляются глюки(по понятным причинам), а адекватно работающий DLNA-сервер мне удалось найти только под Linux,- мы смотнируем по nfs содержимое FreeNAS сервера в Debian. По производительности вы ничего не потеряете, а вот возможных глюков можно избежать.
Далее мы установим dropbox на сервер Debian и натравим его на смонтированный по nfs (под)каталог.
И в заключение в transmission мы добавим волшебную кнопочку, которая будет на Debian сервере перезапускать minidlna службу. А сделаем это с помощью javascript+php+ssh с авторизацией по ключу.
Итак, инсталляцию гипервизора я буду производить на дистрибутив squeeze. Нам нужно всего 4 команды и сделать ребут сервера.
# apt-get install xen-linux-system
# apt-get install xen-qemu-dm-4.0
# dpkg-divert --divert /etc/grub.d/08_linux_xen --rename /etc/grub.d/20_linux_xen
# update-grub
По умолчанию у вас должна загрузиться система с новым ядром с поддержкой XEN. В следующей части мы установим на Debian - sshd, dlna, nfsd, dropbox и настроим iptables.
среда, 15 августа 2012 г.
Новый опрос
В блог я, конечно, стал писать гораздо реже, в связи с сильной загруженностью. Но прошу Вас ответить на опрос который я разместил в панели справа. Я хочу показать и рассказать каким образом можно организовать связку между xen, freenas, dlna, dropbox, ipad и/или iphone. Основная задача такой связки в том, что я могу с любого устройства (и даже все локальной сети) на сервере запустить закачку torrent-файла с последующим просмотром его на телевизоре с поддержкой DLNA. Если вам (не)интересно прошу ответить в опросе.
вторник, 14 августа 2012 г.
Выполнение скрипта при обращении к хосту
Однажды у меня возникла задача - как сделать так, чтобы при обращении к определенному ip на шлюзе запускался некий скрипт или программа. В этом посте я хочу привести пример на perl с использованием tcpdump. В этом скрипте если было обращение с хоста 192.168.0.104 к 93.158.134.61 произойдет перезапуск DLNA сервера. Я использую его в связке со своим телевизором подключенном к локальной сети. Таким образом мне удалось перезапускать DLNA службу, если я открыл на телевизоре сайт yandex.ru. Ну и собственно сам скрипт:
#!/usr/bin/perl
$LIMIT = shift || 5000;
$|=1;
open (STDIN,"/usr/sbin/tcpdump -lnx -s 1024 dst port 80 |");
while (<>) {
if (/^\S/) {
last unless $LIMIT--;
while ($packet=~/(GET|POST|WWW-Authenticate|Authorization).+/g) {
#print "$client -> $host\t$&\n";
if(($host=="93.158.134.61") and ($client="192.168.0.104")){
system('/sbin/service minidlna restart&');}
}
undef $client; undef $host; undef $packet;
($client,$host) = /(\d+\.\d+\.\d+\.\d+).+ > (\d+\.\d+\.\d+\.\d+)/
if /P \d+:\d+\((\d+)\)/ && $1 > 0;
}
next unless $client && $host;
s/\s+//;
s/([0-9a-f]{2})\s?/chr(hex($1))/eg;
tr/\x1F-\x7E\r\n//cd;
$packet .= $_;
}
#!/usr/bin/perl
$LIMIT = shift || 5000;
$|=1;
open (STDIN,"/usr/sbin/tcpdump -lnx -s 1024 dst port 80 |");
while (<>) {
if (/^\S/) {
last unless $LIMIT--;
while ($packet=~/(GET|POST|WWW-Authenticate|Authorization).+/g) {
#print "$client -> $host\t$&\n";
if(($host=="93.158.134.61") and ($client="192.168.0.104")){
system('/sbin/service minidlna restart&');}
}
undef $client; undef $host; undef $packet;
($client,$host) = /(\d+\.\d+\.\d+\.\d+).+ > (\d+\.\d+\.\d+\.\d+)/
if /P \d+:\d+\((\d+)\)/ && $1 > 0;
}
next unless $client && $host;
s/\s+//;
s/([0-9a-f]{2})\s?/chr(hex($1))/eg;
tr/\x1F-\x7E\r\n//cd;
$packet .= $_;
}
Ярлыки:
Программирование,
Сетевые сервисы,
Фишки Linux,
bash,
Iptables,
perl,
tcpdump
понедельник, 13 августа 2012 г.
PS1 или меняем строку приглашения
Работая одновременно с большым количеством линуксовых серваков я подумал что было бы удобно, если в строке риглашения выводилось не только сообщение о хосте, пользователе но и ip адресе текущей машины. Сказано - сделано. Открываем файл .bashrc в домашнем каталоге и дописываем в него строку
Сохраняем и переподключаемся. И в результате видим нашу красоту. Теперь я буду путаться гораздо меньше =)
export "PS1=[`/sbin/ifconfig eth0 | /usr/bin/perl -ne 'if ( m/^\s*inet (?:addr:)?([\d.]+).*?cast/ ) { print qq($1\n); exit 0; }'`][\u@\h \W] # "
Сохраняем и переподключаемся. И в результате видим нашу красоту. Теперь я буду путаться гораздо меньше =)
четверг, 28 июня 2012 г.
Примеры замены подстроки в файлах на perl, sed, awk
Часто бывает нужно заменить какую то 1 строку в конфигурационном файле из скрипта. Чтобы далеко не ходить можно использовать следующие примеры скриптов.
1. Замена подстроки в одном файле с помощью sed
$ cat ./file.txt
I have three dogs.
$ sed -e 's/dog/cat/g' ./file.txt
I have three cats.
2. Замена подстроки в одном файле с помощью perl (вариант короче, но нужен perl)
perl -e 's/dog/cat/g' -pi ./filename
3. Замена подстроки в нескольких файлах с помощью простого bash-скрипта
#!/bin/bash
f="cat"
t="dog"
for i in `egrep -r $f ./www | grep -v svn | cut -d ":" -f1`
do
reg="s/$f/$t/g"
sed -e $reg $i > ${i}.bak
mv ${i}.bak $i
echo $i
done
4. Замена подстроки в нескольких файлах с помощью perl одной командой
egrep -rl "dog" ./ | xargs -i perl -pi -e 's/dog/cat/g' '{}'
5. Замена подстроки в нескольких файлах с помощью awk одной командой
awk '{gsub("cat", "dog", $0); print > FILENAME}' ./*
Источник: http://www.gnuman.ru/stuff/sed/
понедельник, 30 января 2012 г.
NEOPBX
Ну вот мы с хорошим другом и партнером подошли к финалу разработки платформы ip-телефонии NEOPbx.RU! Разработка велась в течении полутора лет и мы очень рады что у нас получился действительно качественный и не дорогой продукт, сделанный, как говорится от людей и для людей. Цена вопроса всего 14990 рублей. Купить можно на
Возможности нашего продукта просто огромны. Вот их небольшая часть.
Возможности нашего продукта просто огромны. Вот их небольшая часть.
Пользовательские:
Сетевые:
Сервисные:
Модуль безопасности блокирует несанкционированные попытки регистрации на АТС в случае подбора пароля или с неразрешенного IP адреса
Возможность работы с внешними носителями информации USB и SD/MMC расширяет дисковое пространство для записи и хранения разговоров, факсов и резервных копий
Несколько скринов:
Подписаться на:
Сообщения (Atom)