Websocket, PHP a real-time komunikace

Po delší době jsem se rozhodl publikovat krátký článek, který se bude možná hodit těm, kdo vyvíjíte weby v PHP a chtěli byste na nich využít obousměrnou komunikaci přes websocket, což na běžných hostingových programech pro PHP projekty není úplně jednoduché.

Pokud programujete dlouhé roky v PHP, asi se vám nechce přecházet na jiné populární jazyky jen pro to, abyste nasadili do projektu novou funkcionalitu, jakou je real-time komunikace přes websocket. A ani to není potřeba, protože jsou řešení, která dokáží nedostatky PHP vyřešit.

Websocket jako služba (IaaS)

Řešením, jak nasadit websocket komunikaci na web v PHP, aniž byste se učili nové programovací jazyky nebo si instalovali vlastní virtuální server s podporou websocketů, je využití infrastruktury jako služby (insfrastructure as a service).

IaaS vám poskytne vše potřebné pro navázání a udržování otevřených websocket spojení s klienty, kteří mají aktuálně zobrazený váš web, nebo spuštěnou aplikaci. Můžete s nimi tedy komunikovat v reálném čase a odesílat klientům data do jejich zařízení, aniž by si o ně požádali, na rozdíl od klasického HTTP nebo AJAX požadavku.

Dost řečí, více činů, jdeme na to

Nemá smysl popisovat věci, které už někdo popsal. Pokud chcete víc informací, je dobré se podívat přímo na služby, a to hned od několika poskytovatelů. Hlavní parametry pro porovnání služeb jsou počet konkurenčních spojení (aktuálně připojených klientů) a počet i velikost zpráv odesílaných před websocket.

Služby pro real-time komunikaci přes websocket

  • WebSocket.cz – český projekt mého kamaráda, doporučuju zkusit
  • Mercure.rocks – Mercure real-time API and websocket communication
  • – Powering realtime experiences for mobile and web
  • – AWS WebSocket APIs in API Gateway
  • – Pie Socket WebSocket Servers

Poskytovatelů websocket IaaS je samozřejmě víc, včetně cloudů jako Google, Azure a další. Stačí pohledat na google výrazy jako “websocket IaaS”, “rest API to websocket” a pod. Snad vám podobné služby usnadní integraci websocketů do projektů v PHP, které se vám nechce přepisovat, protože jinak fungují pěkně.

Arch Linux a LAMP

Toto krátké howto se bude zabývat instalací LAMP na Arch Linux.Instalace bude počítat s využitím virtual hostů, s použitím projektu Hardened PHP neboli Suhosin patch a s instalací základních funkčnostních PHP modulů jako je mcrypt,GD,

Začneme instalací balíků:
pacman -S apache php mysql php-suhosin php-apache php-mcrypt php-gd php-curl

Překonfuguruju si /etc/httpd na Gentoo-style
Špatné je na tom je to, že výchozí error log je v conf/modules.d/00_default_settings.conf
a výchozí access log je v conf/modules.d/00_mod_log_config.conf
Upravím php.ini(diff)

Spustím mysqld
SPustím mysql_secure_installation a nastavím heslo roota

Awstats a Debian Etch

Nastavení awstats jsem se letmo věnoval už dříve ve článku Nastavení AWstats, dneska bych se spíš chtěl zaměřit na to, jak awstats na serveru s Etchem rozjet. Ve článku předpokládám, že máme nastavený Apache(s virtualhosty s rootem ve složce /var/www/domain.tld/) a zvládnem nastavit Awstats(jejich nastavení tu nebudu rozebírat, protože je skvěle popsané ve výchozím configu)

V návodu používám “proměnnou” domain.tld, což je fiktivní doména, vy si za ni dosadíte název své domény, pro kterou instalujete Awstats

Začneme ůplně klasicky a logicky a to instalací požadovaného balíku :

apt-get install awstats

Nastavení Awstats :

Dále kopírujeme výchozí config a vytváříme vlastní verzi

cp /etc/awstats/awstats.conf /etc/awstats/awstats.domain.tld.conf

Též zkopírujem výchozí soubory awstats do složky výchozího virtual hostu :

cp /usr/lib/cgi-bin/awstats.pl /var/www/localhost/cgi-bin/awstats.pl cp /usr/share/icon /var/www/localhost/htdocs/awstats/icon

Ikdyž jsem předesílal, že se tu nastavení AWstats samu o sobě věnovat nebudu, přecejen bych tu uvedl pár změněných direktiv v tomto souboru a to sice :

DirData="/var/www/domain.tld/datadir" DirCgi="/var/www/localhost/cgi-bin" DirIcons="/awstats-icon"

Proč zrovna takto se dozvíte v další části :

Nastavení virtualhostu Apache

Nyní si otevřeme config apache, většinou v /etc/apache2/sites-available/domain.tld.conf a vložíme tyto řádky :

Alias /awstats-icon "/var/www/localhost/htdocs/awstats/icon/" ScriptAlias /awstats "/var/www/localhost/cgi-bin/awstats.pl" ScriptAlias /awstats.pl "/var/www/localhost/cgi-bin/awstats.pl"

A restartujeme Apache. Nyní máme statistiky dostupné přes adresu domain.tld/awstats.
Složku pro umístění souborů awstats(ikonek, popř. CSS souborů) jsem zvolil /var/www/locahost/htdocs, protože jsou soubory pro celý stroj stejné a je k nim přistupováno přes http.
Direktiva DirData je směrována do složky virtual hostu, protože protože pokud poskytujem FTP přístup k celému virtual hostu, tak není problém pokud do těchto souborů někdo nahlídne, kdežto DirCgi ukazuje do hlavního virtual hostu, kam má přístup pouze administrátor, protože přístup ke spouštění CGI skriptů by nemusel být bezpečný.
Na závěr ještě musíme umístit záznam do CRONu, aby se nám statistiky automaticky generovaly, to uděláme přidáním záznamu do souboru /etc/cron.d/awstats



0,10,20,30,40,50 * * * * www-data /var/www/localhost/cgi-bin/awstats.pl -config=domain.tld -update
Nakonec bych ještě poznamenal, že je velmi pravděpodobné, že tento návod bude kromě Debian Etch kompatibilní i s dalšími Debian-like systémy. Přecijen je psaný na Ubuntu 8.04 🙂

OpenVPN server na Debian Etch

Nejdříve si připravíme potřebné balíky :

apt-get install openvpn liblzo1 liblzo2-2

Poté si vytvoříme Certificate Authority (CA) certifikát a klíč pro autentizaci serveru a klienta

Zkopírujeme si výchozí configy :

cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn

Přepneme do složky se soubory pro vytváření certifikátů a klíčů:
cd /etc/openvpn/easy-rsa/
Upravíme soubor vars:

# easy-rsa parameter settings
export D=/etc/openvpn/easy-rsa
export KEY_CONFIG=$D/openssl.cnf
export KEY_SIZE=1024
export KEY_COUNTRY=CZ
export KEY_PROVINCE="Czech Republic"
export KEY_CITY="Brno"
export KEY_ORG="Test VPN ORG"
export KEY_EMAIL="admin@server"

Soubor vars spustíme a tím nastavíme implicitní hodnoty pro vytváření certifikátů a rovnou se vrhnem na vytváření CA certifikátu:
source ./vars<br /> ./clean-all<br /> ./build-ca
Nyní certifikát a privátní klíč pro server:
./build-key-server server
Následují certifikáty pro klienty a klíče pro klienty
./build-key client1<br /> ./build-key client2
Atd. Místo client1,client2 použijeme názvy, pod kterými budeme klienty idetifikovat(arteal, hejda, atp.)

Dále vytvoříme “Diffie Hellman parameters
./build-dh
Zkopírujeme certifikáty do /etc/openvpn
cp /etc/openvpn/easy-rsa/keys/{ca.crt,ca.key,server.crt,server.key,dh1024.pem} /etc/openvpn<br /> chmod 600 /etc/openvpn/{ca.crt,ca.key,server.crt,server.key,dh1024.pem} /etc/openvpn

Nyní máme připravené klíče a certifikáty pro server i pro klienty, nyní se pustíme na konfiguraci serveru a klientů

Konfigurace serveru :

nano /etc/openvpn/vpn_server.conf
Můj příklad:

# server
mode server
# tls jako server
tls-server
# port, 1194 = default
port 1194
# protokol, tcp/udp
proto tcp-server
# nastavi zarizeni
dev tap0
#persistentni klice a rozhrani - kvuli restartu
persist-key
persist-tun
# adresa serveru
ifconfig 192.168.10.1 255.255.255.255
# rozsah adres pro klienty
ifconfig-pool 192.168.10.10 192.168.10.255 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt
#special configy IP adres pro clienty
push "ifconfig 192.168.10.10 255.255.255.0 192.168.10.1"
client-config-dir /etc/openvpn/ccd/
#komunikace mezi klienty
client-to-client
#DNS server pro klienty
#push "dhcp-option DNS 192.168.10.240"
# certifikat certifikacni autority
ca /etc/openvpn/ca.crt
# certifikat serveru
cert /etc/openvpn/server.crt
# klic serveru
key /etc/openvpn/server.key
# parametry pro Diffie-Hellman protokol
dh /etc/openvpn/dh1024.pem
# logy serveru
log-append /var/log/openvpn.log
# status serveru
status /var/run/vpn.status 10
# uzivatel pod kterym bezi server
user nobody
# skupina pod kterou bezi server
group nogroup
# udrzuje spojeni nazivu, 10 (ping) a 120 (ping-restart)
keepalive 10 120
# komprese prenasenych dat
comp-lzo
# ukecanost serveru
verb 3

Nyní by váš OpenVPN server měl být ready

Nastavení klientů pro Gentoo a Debian, bude následovat v dalším článku…

Nové služby v rámci gw.arteal.name

gw.arteal.name je zatím neveřejný projekt, na kterém se průběžně pracuje. Nedávno jsem si vzpomněl že to tak vlastně je 😀

Čili, uvědomil jsem si, co jsem tímto pojmem myslel, proč jsem mu dělal vasltní subdoménu a prezentaci…

Takže : gw.arteal.name má být kompletní administrací mého zkušebního stroje daron.arteal.name. To jest:
FTP démon s virtuálnímí uživateli(ProFTPd)

Mail server s virtuálnímí uživateli(Postfix?)

A s ním související SMTP,POP3,Anti-vir,Anti-spam

Nastavení apache2(nejlépe poloautomatizované pomocí shell scriptu)

Databáze(MySQL)

A k tomu všemu webová administrace…


A ty nové služby

Postfix+Amavis-new+clamav+spamassassin – nastaveno pro daron.arteal.name, zatím bez virtualizace a zatím do toho moc nevidím 😛

Proftpd – nastaveno s virtualizací pomocí MySQL, opraven Debian-proftpd bug

Zbytek práce přijde, až bude více času se tím zabívat 🙂
Ptáte se proč? Protože se zkušenosti se vždycky hodí a protože mě to baví 🙂

Nastavení Awstats

Tak jsem se pustil do tajů nastavení AWStats, uvedu zde nastavení direktiv pro moji doménu arteal.name :

HostAliases=”127.0.0.1 daron localhost REGEX[^(.+)\.arteal\.name$] arteal.name arteal.kicks-ass.net 192.168.0.1 “

  • První tři záznamy zajistí, že se nepočítají záznamy z loopbacku(lokální adresy), třetí vyloučí všechny subdomény, pak samotná doména,dynDNS a nakonec ještě adresa uvnitř NAT.

SkipHosts=”serj REGEX[^192\.168\.] REGEX[^host-tracker.com]”

serj je můj desktop, takže návštěvy z něj také vyloučíme, následuje regulární výraz pro pro NAT a nakonec regulární výraz pro host-tracker.com, který má sledovat jestli stránky jedou, ne nám dělat návštěvy

SSHFS

První, co jsem se rozhodl na novém systému instalovat je SSHFS, používám ho na lokání síti na mountování složky s webem z jednoho počítače na druhý a rozhodl jsem se věnovat jeho nastavení krátký článeček.

První co, uděláme, nainstalujeme fuse a sshfs

sudo apt-get install fuse-utils sudo apt-get install sshfs

Druhý příkaz vám také stáhne balík libfuse2,což jsou (podle názvu) knihovny pro FUSE.

FUSE nám také vytvoří systémovou skupinu fuse, která má právo přístupovat k modulu fuse. Přidáme tedy svého uživatele do skupiny fuse

sudo adduser arteal fuse

(arteal nahraďte jménem svého uživatele)

Dále musíme modul zavést do kernelu a nejlépe si ho přidat do /etc/modules, cože zaručí, že se modul načte do kernleu při každé spuštění systému:

sudo modprobe fuse sudo sh -c “echo fuse >> /etc/modules”

[Zde následuje krok, kterým si nejsem ůplně jist, podle mých informací není třeba rebootovat, aby se projevily změny uživatelů a skupin a modul fuse již také v kernelu máme, nicméně jsem stále dostával stejnou hlášku od fusermount o tom, že nemám práva k němu přistupovat, pokud někoho napadne řešrní, tak mi ho napiště, u mě to vyřešil akorát reboot ]
Pak už můžeme začít mountovat pomocí sshfs, např. takto :

sshfs [email protected]:/ /mnt/daron

Kde arteal je opět uživatel na vzdáleném počítači, daron.arteal.name:/ je jméno vzdáleného počítače : složka na vzádleném počítači a poslední je složka na lokálním počítači.

Tento postup je stejný v Ubuntu minimálně od verze 6.06 Dapper Drake