четверг, 18 декабря 2014 г.

Русские комментарии в Teamcity

В качестве хранилища для Teamcity я использую Mysql. Когда делаешь коммит и комментарий пишешь на русском в Teamcity они показываются в виде вопросительных знаков, например так:
Проблема довольно распространенная и решается она просто. Дело в том, что когда создавалась структура базы данных для Teamcity используется Collation latin1 и русские символы она не понимает. Нужно переключиться на использование кодировки UTF-8 при работе с Mysql.
1. Меняем кодировку при подключении к Mysql
В файл .BuildServer/config/database.properties добавляем строку
connectionProperties.characterEncoding=UTF-8
У меня после этого запустилась сборка и Teamcity ругнулся, что не может выполнить запрос - символы незнакомые увидел.
2. Меняем кодировку таблиц в базе данных 
mysql --database=dbname -B -N -e "SHOW TABLES"  | awk '{print "ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;"}' | mysql --database=dbname & 
3. Результат 

пятница, 5 декабря 2014 г.

DigitalOcean

Если кто-то хочет попробовать хостинг от DigitalOcean можете зарегистрироваться через мою реферальную ссылку. Тут и вам выгодно, 10$ дадут для начала работы достаточно и мне приятно - я может получу 25$, если хостинг понравится
 

четверг, 4 декабря 2014 г.

Отмена последнего коммита в GIT

Иногда я забываю создать отдельную ветку под задачу и делаю коммит в ветку devel. Чтобы отменить коммит НО НЕ ИЗМЕНЕНИЯ выполняем команду
git reset --soft HEAD^
Дальше остается создать правильную ветку
git checkout -b GB-123
git commit -a -m "[GB-123] описание изменений"

среда, 3 декабря 2014 г.

USB Modem Beeline

Столкнулся с проблемой подключения 3G модема от Билайна в Linux Mint. Сам модем марки Huawei E3131. Для установки потребуется скачать драйвера, распаковать и запустить
sudo ./install
Режим флешки у меня не заработал, но после ПЕРЕЗАГРУЗКИ модем появился и я смог установить подключение к 3G.
Драйвера можно найти через Google, главное знать что искать, вот по этому запросу все находится: huawei data cards linux driver 
  

вторник, 2 декабря 2014 г.

XDebug Phpstorm

Настроить XDebug на сервере

Устанавливаем XDebug командой
sudo apt-get install php5-xdebug
и добавляем возможность удаленной отладки, добавим строчку php.init
xdebug.remote_debug=1

Настроить PhpStorm

Для получения данных от сайта в IDE нам нужно их подружить. Для начала нужен правильно настроенный сервер, к которому коннектится IDE при деплое. Переходим в настройки PhpStorm -> Deployment. Тут важен параметр Webserver Root URL, нужно указать URL корня вашего сайта. Пример моих настроек ниже:

Далее переходим к настройке XDebug в PhpStorm: главное меню Run -> Edit Configurations. Нажимаем на плюс, чтоб добавить новую настройку для дебага. Выбираем настройку Php Web Application
Тут нужно настроить инструмент с помощью которого осуществляется дебаг, нажимаем на кнопку рядом с настройкой сервера:
Нажимаем на плюс, заполняем имя, хост сайта и нажимаем на Validate remote environment. 
Там выбираем из списка тот сервер, который настраивали выше и нажимаем Validate. Если валидация прошла успешно, то мы готовы к дебагу. Применяем все сохраненные настройки и возвращаемся в редактор.

Взято от сюда но с моими рисунками.

воскресенье, 30 ноября 2014 г.

Image resize

Задача: переложить изменение размеров картинок на nginx с кешированием. Для доступа к картинке необходимо в URL передавать подпись. Это защищает сервер от ddos атак.

http {
        ...
        # Задаёт путь и другие параметры кэша
        proxy_cache_path /opt/www/images/cache levels=1:2 keys_zone=image-preview:10m;

        server {
                ...
                location /images {
                        proxy_pass http://unix:/run/image.sock:$uri;
                        proxy_intercept_errors on;

                        proxy_cache image-preview;
                        proxy_cache_key "$host$document_uri";
                        proxy_cache_valid 200 1d;
                        proxy_cache_valid any 1m;

                        expires max;
                }
        }
        server {
                listen unix:/run/image.sock;
                secure_link_secret secret;
                location ~ ^/images/[^/]+/crop/(\d+|-)/(\d+|-)/(.+) {
                        set $width $1;
                        set $height $2;
                        alias /opt/www/images/storage/$3;
                        try_files "" =404;
                        if ($secure_link = "") { return 404; }
                        image_filter crop $width $height;
                }
   
                location ~ ^/images/[^/]+/resize/(\d+|-)/(\d+|-)/(.+) {
                        set $width $1;
                        set $height $2;
                        alias /opt/www/images/storage/$3;
                        try_files "" =404;
                        if ($secure_link = "") { return 404; }
                        image_filter resize $width $height;
                }

                location ~ ^/images/[^/]+/(.+) {
                        alias /opt/www/images/storage/$1;
                        try_files "" =404;
                        if ($secure_link = "") { return 404; }
                }
        }
}
Простая функция для формирования URL для доступа к картинке.
function image_url($params)
{
    if (isset($params['filter'])) {
        $path = $params['filter'] . '/' . (isset($params['width']) ? $params['width'] : '-') . '/' . (isset($params['height']) ? $params['height'] : '-') . '/' . $params['source'];
    } else {
        $path = $params['source'];
    }
    $md5 = md5($path . 'secret');
    return "http://127.0.0.1/images/{$md5}/{$path}";
}

echo image_url(['source' => '1.png', 'filter' => 'resize', 'width' => 100, 'height' => 200]) . PHP_EOL;

пятница, 28 ноября 2014 г.

NGinx

Для каждого виртуального сервера я держу следующий конфиг
server {
        server_name server.com;

        root /opt/www/server_com/current/web;
        index index.html index.php;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                fastcgi_pass unix:/run/php-fpm/socket;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        }
}
В этом конфиге есть несколько проблем с безопасностью и кеширование статического контента, но для первоначальной настройки подойдет.

SELinux

В Centos используется новая система контроля доступа. Обычной установки прав 0777 на каталоги runtime и web/assets будет не достаточно. Для этих каталогов нужно применить политику httpd_sys_script_rw_t командами
chcon -v --type=httpd_sys_script_rw_t ./runtime
chcon -v --type=httpd_sys_script_rw_t ./web/assets
Ознакомиться с разметкой файлов в вашей системе поможет простая команда:
semanage fcontext -l | grep httpd
Если удалить файлы и создать заново разрешения сбросятся. Лучше использовать регулярные выражения, которые позволят распространить политики на все вложенные каталоги и файлы.
semanage fcontext -a -t httpd_sys_content_t "/your/project(/.*)?"
restorecon -R /your/project

четверг, 27 ноября 2014 г.

php-fpm

По умолчанию php-fpm настроен на работу по tcp, но unix socket быстрее, поэтому исправляем файл /etc/php-fpm.d/www.conf
listen = /run/php-fpm/socket
user = nginx
group = nginx
Остальные параметры пока оставим как есть, нужно смотреть на реальную работу сервера для оптимизации.

SSH

Первым делом нужно завести нового пользователя в системе и добавим ему пароль
sudo adduser user
sudo passwd user
Со своего компьютера, в новом терминале выполним команду для добавления своего публичного ключа для авторизации ssh по ключу
ssh-copy-id user@server.name
Теперь можно легко авторизоваться без ввода пароля командой
ssh user@server.name
Теперь нужно запретить авторизацию для root и вход по паролю. Меняем порт на другой, отличный от 22. Исправляем файл /etc/ssh/sshd_config
Port 2220
PermitRootLogin no
PasswordAuthentication no
Из конфига узнаем, что если меняем номер порта нужно сообщить SELinux об этом, выполнив команду
semanage port -a -t ssh_port -p tcp 2220
Перегружаем sshd
sudo systemctl restart ssh.service 
Добавляем правило в фаервол и удаляем старое
sudo firewall-cmd --permanent --zone=public --add-port=2220/tcp
sudo firewall-cmd --permanent --zone=public --remove-service=ssh/tcp

Centos 7

Долгое время для своих проектов использовал fastvps, но пришло время для облачных хостингов и получив реферальную ссылку от своих знакомых зарегистрировался на DigitalOcean. Создал droplet с Centos 7 x64 и начал настройку. Добавил репозиторий EPEL и обновил все текущие пакеты.
sudo yum install https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
sudo yum update -y 
Я использую сервер для веб поэтому начнем с установки nginx php mysql. Centos перешел на mariadb, это хорошо.
sudo yum install nginx php-fpm php-cli php-pdo php-mysqlnd php-curl php-mcrypt php-intl php-mbstring mariadb mariadb-server curl mc -y
Теперь эти службы нужно активировать и сделать так чтобы они запускались автоматически.
sudo systemctl enable mariadb.service
sudo systemctl enable nginx.service
sudo systemctl enable php-fpm.service
sudo systemctl start mariadb.service
sudo systemctl start nginx.service
sudo systemctl start php-fpm.service
Теперь устанавливаем пароль для mariadb
sudo mysql_secure_installation



FirewallD

В Centos 7 появился новый инструмент для настройки файервал - firewallD.
Первым делом его нужно активировать и запустить
sudo systemctl enable firewalld.service
sudo systemctl start firewalld.service
Затем нам необходимо включить доступ к серверу по http и ssh постоянно
sudo firewall-cmd  --permanent --zone=public --add-service=ssh
sudo firewall-cmd  --permanent --zone=public --add-service=http
 Я обычно ssh переношу на 2220 порт поэтому команду первую нужно заменить на
sudo firewall-cmd  --permanent --zone=public --add-port=2220/tcp