четверг, 28 августа 2014 г.

How can I distribute Catalyst Apps?

How can I distribute Catalyst Apps?

The default (and recommended) packaging method is to use Module::Install.

To pack up an application, use 'make manifest' and then 'make dist' to create a redistributable tar of the application directory.

In your application base directory:

    edit prereqs in Makefile.PL
    perl Makefile.PL
    make manifest (edit MANIFEST.SKIP and run make manifest again if you'd like to exclude certain file patterns)
    make dist
    copy YourApp?-version.tar.gz to the destination system, unpack and run it..

пятница, 22 августа 2014 г.

iptables сохранение и автовосстановление правил

Сохранение текущих правил в файл:
$ sudo iptables-save > /etc/firewall.conf

Примерное содержимое /etc/firewall.conf:
*filter
:INPUT ACCEPT [8765:8446525]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [7694:474292]
-A INPUT -s 5.101.101.64/32 -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 188.226.202.7/32 -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j REJECT --reject-with icmp-port-unreachable
COMMIT

Редактируем /etc/network/if-up.d/00-iptables:
#!/bin/sh
iptables-restore < /etc/firewall.conf

Всё. Теперь при перезагрузке мы не потеряем настройки файрволла

пятница, 25 июля 2014 г.

iptables открыть доступ к MySQL с определённого хоста


Понадобилось на MySQL сервере открыть доступ извне. Но только с определённого адреса, а остальным хостам не светить своим открытым портом. Первым делом, перекрыть порт всем, кому не надо:
$ sudo /sbin/iptables -A INPUT -i eth0 -s xx.xx.xx.xx -p tcp --destination-port 3306 -j ACCEPT
$ sudo /sbin/iptables -A INPUT -i eth0 -s 0.0.0.0/0 -p tcp --destination-port 3306 -j REJECT
Затем включить привязку к интерфейсу в my.cnf:
[mysqld]
bind-address = 0.0.0.0
# skip-networking
При наличии строки с параметром skip-networking убрать её или закомментировать

И после этого перезапустить сервер:
$ sudo /etc/init.d/mysql restart

понедельник, 21 июля 2014 г.

vimdiff cheats

Запуск:
$ vimdiff file1 file2
Команды:

ctrl+w ctrl+w - switch windows
do - diff obtain
dp - diff put
[c - previous difference
]c - next difference
:diffupdate - diff update ;)
:syntax off - syntax off
zo - open folded text
zc - close folded text

четверг, 17 апреля 2014 г.

Кросс-доменный AJAX-запрос при помощи CORS

Стандарт CORS (Cross-Origin Resource Sharing) позволяет легко и непринуждённо осуществлять кросс-доменные AJAX-запросы и иметь полный контроль над тем, кому и как позволено это делать.

Всё это работает при помощи добавления новых HTTP-заголовков в ответ сервера, разрешающих тем или иным способом XHR с определённых доменов, IP адресов либо с определённой авторизацией (Cookie, HTTPAuth)

В http-заголовке ответа сервера можно явно указать, каким внешним доменам разрешено выполнять AJAX-запрос к нашему серверу:

Например, страница из домена my.name осуществляет XMLHttpRequest к серверу. В запросе необходимо указать заголовок Origin:

Origin: http://my.name

Если указанный Origin устраивает сервер, то он разрешает браузеру завершить запрос и получить ответ, добавляя в свой заголовок:

Access-Control-Allow-Origin: http://my.name

А также можно разрешить кастомные заголовки в запросах (Например, так пришлось сделать для работы библиотеки prototype):

Access-Control-Allow-Headers: content-type,x-prototype-version,x-requested-with

Остальное тут.

Работает в большинстве современных браузеров (IE8+, FF3.5+, Chrome 6+ и Safari 4+)

вторник, 15 апреля 2014 г.

Apache benchmarking

10 потоков, Keep-Alive, 1 секунда:

ab -c 10 -t 1 -k http://localhost:5000/

PSGI в Catalyst

$ sudo apt-get install libcatalyst-engine-psgi-perl
$ script/myapp_create.pl PSGI

Если всё пойдёт хорошо, в каталоге script создастся диспетчер-скрипт myapp.psgi, которым можно кормить plackup:

$ plackup -server Starman --workers 3 --daemonize --port 5000 lib/myapp.psgi

Теперь наше Catalyst-приложение работает через PSGI

Если при запуске появляется ругань "You are running Catalyst::Engine::PSGI, which is considered a legacy engine for this version of Catalyst", то вам повезло, и у вас установлен свежий Catalyst, в котором есть поддержка Plack и не нужны зависимости от Catalyst::Engine::PSGI.
Поэтому в psgi файле можно смело выдирать вызов метода setup_engine. В итоге получается такой код:

#!/usr/bin/env perl
use strict;
use warnings;

use Plack::Builder;
use MyApp;

my $app = MyApp->psgi_app(@_);

builder {
 enable_if { $_[0]->{REMOTE_ADDR} eq '127.0.0.1' }
        "Plack::Middleware::ReverseProxy";
 $app;
};
 

NGINX/Plack/Starman simple stack

PSGI - интерфейс между веб-сервером и веб-приложением, написанным на Perl.


русский FAQ по PSGI на CPAN

$ sudo cpanm Starman

$ plackup -s Starman -e 'sub { [200, ["Content-Type" => "text/plain"], ["Hello, world!"]] }'

nginx server configuration:

# inside a server {} block
location /myapp {
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass  http://localhost:5000/;   # 5000 is the default plackup port
}