Блог веб-программиста

28Авг/160

Установка Zimbra на Ubuntu 16.04 + StartSSL

Примерный список must-have действий для успешной установки Zimbra на Ubuntu 16.04. Не для безумного копипаста.

Приведём сервер в порядок

1. В /etc/apt/sources.list включаем все необходимые репозитории.

2. Установим временную зону, локаль, включим обновления безопасности и поставим пакеты первой необходимости(от рута):

locale-gen en_US.UTF-8 ru_RU.UTF-8
apt-get install locales man dialog htop silversearcher-ag bzip2 pigz pbzip2 mc grc pydf bash-completion vim-nox zsh tmux ncdu unattended-upgrades nano screen
dpkg-reconfigure unattended-upgrades
dpkg-reconfigure tzdata

Связано с категорией: linux Читать полностью
17Окт/122

Локаль Ubuntu 12.04

Устанавливаем кошерную русскую локаль в Ubuntu из консоли:

locale-gen ru_RU.UTF-8

В /etc/default/locale пишем:

LANG="ru_RU.UTF-8"
LANGUAGE="ru_RU:en"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"

logout и вуаля! Русский язык на месте.

Связано с категорией: linux 2 Комментарии
2Окт/120

Настройка nginx для A/B тестирования с помощью lua

Возникла жесткая необходимость настройки сплит-тестирования (A/B тестирование) сайта.
Поскольку в моем случае разные версии сайта были даже на разных движках, то самым логичным было менять document root в зависимости от куки пользователя.
Но вот незадача - эту куку надо ещё как то установить. Делать для этого отдельный бекенд, как советует mixlr мне не хотелось.
Как установить рандомную куку средствами самого nginx, я так и не понял.
Решено было использовать сборку nginx - OpenResty, поскольку в ней уже встроен модуль HttpLuaModule.
Да, я знаю, что это извращение, но писать модуль для nginx на C не было никакого желания.

В результате получился вот такой вот скрипт на lua, который нужно вставить в нужное место в своём конфиге:

set $target '';
 
access_by_lua '
	local abtest = 0
	local abtestMax = 1
	local userAgent = ngx.req.get_headers()["User-Agent"]
 
	local cookie = ngx.var.cookie_abtest
	if ngx.re.match(userAgent, "(yandex|google|MSIE|bot)", "i") then
	    cookie = 0
	end
 
	if cookie == nil then
		math.randomseed( os.time() )
		abtest = math.random(0, abtestMax)
    		ngx.header["Set-Cookie"] = {"abtest=" .. abtest .. "; path=/", "abReason=nil"}
 
	else
 
		if tonumber(cookie) >= 0 and tonumber(cookie) <= abtestMax then
 
			abtest = cookie
 
		else
			abtest = 0
 
			ngx.header["Set-Cookie"] = {"abtest=" .. abtest .. "; path=/", "abReason=badRange"}
		end
 
	end
 
	ngx.var.target = abtest
';
 
root /var/www/meta$target;

Логика проста - скрипт смотрит, есть ли кука.
- если user-agent содержит yandex, google, MSIE или bot -- кука с тестом 0 -- это для того, чтобы поисковики и IE видели старую версию сайта(№0). Поисковики тем самым не обвинят нас в клоакинге.
- если кука nil, т.е. её нет - выбираем случайную куку от 0 до abtestMax и передаём её в браузер. Таким образом вероятность выпадения при abtestMax=1 - 50%/50%
- если кука не в нашем диапозое [0;abtestMax] - кука будет 0(версия сайта №0)
- если в диапозоне, то всё ок

Далее устанавливается переменная $target равная номеру теста и ниже уже ставится documentRoot в зависимости от неё.

Решение, конечно, не самое быстрое. Но для тестирования на небольшом проекте подходит как нельзя лучше.

Связано с категорией: linux, SEO Нет комментариев
4Июн/100

Как получить MAC из busyBox

Сегодня потребовалось из busybox при установки Debian netsinst получить MAC-адрес сетевки. Это как оказалось можно сделать так:

# ip l sh eth0
17: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:c0:9f:55:6e:e5 brd ff:ff:ff:ff:ff:ff

Связано с категорией: linux Нет комментариев
4Июн/100

Лечим Network is unreachable в Java на Debian/Ubuntu

Если у вас в Debian или Ubuntu не работают приложения, написанные на Java, ругаясь при этом как то так:

38 connect(22, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:72.5.124.95", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28
6938 connect(22, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:72.5.124.95", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable)
Или вот так: Could not bind/listen. Network is unreachable.

Лечится это просто.

Редактируем файл /etc/sysctl.d/bindipv6only.conf и ставим там 0 вместо 1. Перегружаемся и всё работает! Проверено, у меня так hadoop, hbase не хотели запускаться.

Если хотите без перезагрузки, то можете ещё выполнить:


echo 0 > /proc/sys/net/ipv6/bindv6only
sysctl net.ipv6.bindv6only=0

Связано с категорией: linux Нет комментариев
10Янв/101

Ресайз PNG картинок c прозрачностью в Thunar

Сегодня мне пришлось решить рутиную задачу - изменить размер PNG картинок не теряя при этом прозрачность. Искать какой либо софт было лень, поэтому решил написать bash скрипт, который всё сделает за меня.

Связано с категорией: linux Читать полностью
19Дек/092

Перенос MySQL в другую папку/раздел на Debian/Ubuntu

Недавно мне пришлось переместить данные MySQL в другую папку(а точнее на другой раздел) на Debian Linux 5.0.3.

Логично, что простым переносом файлов тут не отделаешься, надо что-то где-то прописать.

По-умолчанию данные MySQL лежат в /var/lib/mysql. Мне захотелось, чтобы они были в /home/mysql. Переносим папку mysql куда нам нужно, затем лезем в конфиг MySQL (/etc/mysql/my.cnf).

Там есть опция:

datadir         = /var/lib/mysql

Вот её мы заменяем на следующее:

datadir         = /home/mysql

Пробуем перезапустить наш MySQL сервер (/etc/init.d/mysql restart) и в итоге у нас ничего не запускается.

Смотрим tail /var/log/messages и видим приблизительно такое:

 kernel: [ 2714.258037] audit(1227462526.718:13): type=1503 operation="inode_create" requested_mask="w::" denied_mask="w::" name="/home/mysql/yii.test" pid=19659 profile="/usr/sbin/mysqld" namespace="default"
 kernel: [ 2714.310572] audit(1227462526.770:14): type=1503 operation="inode_permission" requested_mask="rw::" denied_mask="rw::" name="/home/mysql/ibdata1" pid=19659 profile="/usr/sbin/mysqld" namespace="default"

Это нам говорит о том, что политика AppArmor запрещает всякие манипуляции мусклу в новой папке. И это естественно, ведь AppArmor думает, что базы лежат всё там же, в /var/lib/mysql.

Значит надо переписать конфиг AppArmor. Открываем и редактируем /etc/apparmor.d/usr.sbin.mysqld . В нём меняем всё, где упоминается /var/lib/mysql на /home/mysql. Затем перезапускаем AppArmor и MySQL:

sudo service apparmor restart
sudo /etc/init.d/mysql restart

И у нас всё работает! Такая же схема для Ubuntu.

Связано с категорией: linux 2 Комментарии
16Дек/090

Доступны репозитории Ubuntu Lucid Lynx

С недавнего времени доступны репозитории разрабатываемой версии Ubuntu Lucid Lynx.
Для обновления до Ubuntu 10.04 LTS введите в консоли следующую команду:

sudo do-release-upgrade -d -p

Ubuntu 10.04 (Lucid Lynx) является LTS релизом и выйдет в апреле 2010 года. Будет поддерживаться особенно долго и тщательно.

Связано с категорией: linux Нет комментариев
20Сен/090

Разработчики Sabayon Linux планируют выпустить версию 5.0 через 2 недели

Wolfden в своём блоге написал о начале тестирования второй беты Sabayon 5.0.

Он надеется выпустить финальную версию Sabayon 5.0 через две недели, однако точной даты никто не знает.

Связано с категорией: linux Читать полностью
6Сен/091

О Sabayon 4.2 и не только

Поставил я как то себе на домашний компьютер Sabayon 4.2 Gnome x86_64. Конечно хотелось бы скачать Sabayon 5, но его ещё нигде нет - одни слухи только. Первое впечатление о системе было замечательное.

Ну Gentoo как Gentoo, только ставится быстрее, не надо с хэндбуком сидеть. Есть встроенный менеджер пакетов entropy с графическим фронтэндом Sulfur. Из консоли всё ставится через equo install. emerge также работает.

Связано с категорией: linux Читать полностью