This shows you the differences between two versions of the page.
|
gsr:laboratoare:laborator-07 [2015/12/03 16:20] razvan.deaconescu |
gsr:laboratoare:laborator-07 [2016/12/08 20:39] (current) alexandru.carp |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Laborator 07: DNS ====== | + | ====== Laborator 07: Servicii web ====== |
| + | <note>Documentatie: http://httpd.apache.org/docs/2.2/</note> | ||
| + | |||
| + | ===== Instalare Apache si configurari de baza ===== | ||
| + | |||
| + | * Instalati serverul Apache (pachetul **apache2**). | ||
| + | |||
| + | * Apoi, verificati functionarea acestuia folosind un browser web. Va veti conecta pe URL-ul http://localhost | ||
| + | |||
| + | ==== Site default ==== | ||
| + | |||
| + | * Asa cum ati observat anterior, serverul Apache serveste in mod implicit un fisier HTML. | ||
| + | |||
| + | * Gasiti fisierul **index.html** servit de server-ul Apache in ierarhia de fisiere. | ||
| + | * Hint: Configuratia site-ului default se afla in ''/etc/apache2/sites-available/000-default.conf'' | ||
| + | * Hint: Observati directiva ''DocumentRoot'' | ||
| + | |||
| + | * Modificati fisierul gasit anterior astfel incat sa contina mesajul "GSR web services". | ||
| + | |||
| + | ==== Listening ports ==== | ||
| + | |||
| + | * Pe ce port asculta in mod implicit serverul Apache? Investigati folosind ''netstat''. | ||
| + | |||
| + | * Modificati portul astfel incat Apache sa asculte pe 8080. | ||
| + | * Hint: ''/etc/apache2/ports.conf'' | ||
| + | * Hint: Nu uitati sa modificati si in ''VirtualHost'' | ||
| + | |||
| + | * Verificati folosind ''netstat'', apoi un browser. | ||
| + | |||
| + | * Refaceti configuratia anterioara. | ||
| + | |||
| + | |||
| + | ===== Alti clienti HTTP ===== | ||
| + | |||
| + | Desi in majoritatea cazurilor folosim un browser in mod grafic pentru a naviga, putem folosi si clienti in mod text (interactiv sau non-interactiv). Acestia sunt utili mai ales in automatizare. | ||
| + | |||
| + | ==== wget ==== | ||
| + | |||
| + | Un astfel de client in mod text, non-interactiv, este **wget**. | ||
| + | |||
| + | * Folositi ''wget'' pentru a descarca fisierul ''index.html'' servit de Apache. Ca parametru pentru ''wget'' veti folosi acelasi URL ca si in browser. | ||
| + | |||
| + | === Descarcare recursiva === | ||
| + | |||
| + | * Creati urmatoarea ierarhie de fisiere in ''/var/www/html'': | ||
| + | <code> | ||
| + | test/ | ||
| + | |-- docs/ | ||
| + | | |-- README.txt | ||
| + | | |-- INSTALL.txt | ||
| + | |-- scripts/ | ||
| + | | |-- setup.sh | ||
| + | | `-- install.sh | ||
| + | `-- test.html | ||
| + | </code> | ||
| + | |||
| + | * Folosind un browser in mod grafic, verificati ca puteti naviga prin acea ierarhie. | ||
| + | |||
| + | * Folosind ''wget'', descarcati in mod recursiv tot ce este sub ''/var/www/html/test''. | ||
| + | * Hint: ''man wget'', ''/recursive'' | ||
| + | * Specificati sa NU fie descarcate fisierele ale caror nume incepe cu ''index.html''. Hint: ''man wget'', ''/reject''. | ||
| + | |||
| + | === Autentificare folosind wget === | ||
| + | |||
| + | * Folosind ''wget'' incercati sa descarcati ce este la adresa ''http://repository.grid.pub.ro/cs/gsr/''. | ||
| + | * Ce eroare primiti? De ce? | ||
| + | |||
| + | * Incercati din nou, de data aceasta folosind autentificare HTTP. Pentru aceasta, va trebui: | ||
| + | * Sa specificati userul cu care doriti sa va autentificati. Hint: ''man wget'', ''/user''. | ||
| + | * Sa faceti ca ''wget'' sa va ceara parola. Hint: ''man wget'', ''/ask-password''. | ||
| + | |||
| + | ==== netcat (nc) ==== | ||
| + | |||
| + | De multe ori, in debugging, este util sa observati sau sa interveniti direct asupra datelor schimbate intre client si server. Un utilitar care ne ajuta in acest scop este **netcat** (comanda ''nc''). | ||
| + | |||
| + | Acesta deschide o conexiune catre un host, pe un port specificat (TCP sau UDP), apoi va trimite catre server toate datele primite pe standard input. | ||
| + | |||
| + | * Folosind ''nc'', conectati-va pe localhost, portul 80. | ||
| + | |||
| + | * Apoi, introduceti manual o cerere HTTP pentru fisierul ''index.html''. Veti folosi protocolul HTTP 1.0: | ||
| + | * ''GET /index.html HTTP/1.0'' | ||
| + | * Incheiati cererea cu secventa ''\r\n\r\n'' (doua Enter-uri). | ||
| + | * Pagina primita este cea corecta? | ||
| + | |||
| + | * Realizati acelasi lucru, dar fara a mai introduce manual cererea. | ||
| + | * Hint: ''echo'', pipe | ||
| + | |||
| + | ===== Userdir ===== | ||
| + | |||
| + | Server-ul Apache permite utilizatorilor sa serveasca fisiere din propriile directoare home. Fisierele trebuie stocate in ''/home/username/public_html'', iar acestea vor fi accesate folosind un URL de forma ''http://server/~username''. | ||
| + | |||
| + | * Creati utilizatorul ''gsr''. | ||
| + | * Creati directorul ''public_html'' si mai multe fisiere in interiorul acestuia. | ||
| + | |||
| + | * Incercati sa accesati fisierele folosind URL-ul ce contine ''~gsr''. Este posibil? | ||
| + | |||
| + | * Pentru a putea accesa astfel de directoare, trebuie activat modulul Apache **userdir**. | ||
| + | * Activati modulul ''userdir''. Hint: ''a2enmod'' | ||
| + | * Incercati din nou sa accesati URL-ul. | ||
| + | |||
| + | ===== PHP ==== | ||
| + | |||
| + | * Creati in ''/var/www/html'' un fisier cu numele ''index.php'' care sa contina un cod PHP simplu (de exemplu, sa afiseze un mesaj): | ||
| + | <code> | ||
| + | <?php echo "Hello, world!"; ?> | ||
| + | </code> | ||
| + | |||
| + | * Apoi, dintr-un browser in mod grafic incercati sa accesati fisierul ''index.php'' de pe server. Ce observati? Script-ul PHP se ruleaza pe server? De ce? | ||
| + | |||
| + | * Instalati pachetul corespunzator modulului PHP pentru Apache (''libapache2-mod-php''). | ||
| + | * Verificati ca modulul a fost activat. Hint: ''/etc/apache2/mods-enabled''. | ||
| + | * Accesati din nou fisierul ''index.php''. Ce observati acum? | ||
| + | |||
| + | ===== Autentificare basic ===== | ||
| + | |||
| + | In anumite cazuri, este util sa restrictionam accesul catre anumite directoare ale site-ului. O modalitate este folosind feature-ul de autentificare din protocolul HTTP. | ||
| + | |||
| + | * Creati subdirectorul ''secret'' in ''/var/www/html''. | ||
| + | * In acest subdirector, creati un fisier cu numele ''.htaccess'', care sa specifice ca se doreste autentificare: | ||
| + | <code> | ||
| + | AuthName "restricted" | ||
| + | AuthType Basic | ||
| + | AuthUserFile /usr/local/my.htpasswd | ||
| + | Require valid-user | ||
| + | </code> | ||
| + | * Apoi, folosind comanda ''htpasswd'', creati un user ''bob'' in fisierul ''/usr/local/my.htpasswd'' | ||
| + | * In fisierul ''apache2.conf'', setati directiva ''AllowOverride'' la ''All'' | ||
| + | * Restartati serviciul Apache si verificati ca incercand sa accesati, din browser, directorul ''secret'', se cere autentificare. | ||
| + | |||
| + | ===== Virtual Hosts ===== | ||
| + | |||
| + | ==== Configurare de baza ==== | ||
| + | |||
| + | * In ''/etc/hosts'', adaugati 2 alias-uri, astfel incat host-urile ''gsr.ro'' si ''www.gsr.ro'' sa fie mapate pe adresa IP ''127.0.0.1'' | ||
| + | <solution -hidden -en><code> | ||
| + | root@mjolnir:~# cat /etc/hosts | head -n 3 | ||
| + | 127.0.0.1 localhost | ||
| + | 127.0.1.1 mjolnir.labs.cs.pub.ro mjolnir | ||
| + | 127.0.0.1 gsr.ro www.gsr.ro | ||
| + | </code></solution> | ||
| + | |||
| + | * In configuratia server-ului Apache, adaugati un Virtual Host pentru domeniul ''gsr.ro''. | ||
| + | * Ca model, puteti folosi configuratia Virtual Host-ului pentru site-ul default din Apache. | ||
| + | * Aveti in vedere urmatoarele: | ||
| + | * Fisierul de configurare al site-ului se va numi ''gsr.ro.conf'' si se va afla in directorul ''/etc/apache2/sites-available''. | ||
| + | * Virtual Host-ul va fi mapat pe portul 80. | ||
| + | * ServerName-ul va fi ''gsr.ro'' | ||
| + | * Adresa de mail a administatorului este ''admin@gsr.ro'' | ||
| + | * Site-ul va servi fisiere din directorul ''/var/www/html/gsr.ro'' | ||
| + | * Creati in acest director un fisier ''index.html'' care sa afiseze mesajul ''This is gsr.ro''. | ||
| + | * Fisierele de log pentru acest site vor fi in ''/var/log/apache2/gsr.ro.log'' si ''/var/log/apache2/gsr.ro.err.log'' | ||
| + | |||
| + | <code> | ||
| + | root@mjolnir:~# mkdir /var/www/html/gsr.ro | ||
| + | |||
| + | root@mjolnir:~# echo "This is gsr.ro" > /var/www/html/gsr.ro/index.html | ||
| + | |||
| + | root@mjolnir:~# cat /etc/apache2/sites-available/gsr.ro.conf | ||
| + | <VirtualHost *:80> | ||
| + | ServerAdmin admin@gsr.ro | ||
| + | ServerName gsr.ro | ||
| + | |||
| + | DocumentRoot /var/www/html/gsr.ro | ||
| + | <Directory /> | ||
| + | Options FollowSymLinks | ||
| + | AllowOverride None | ||
| + | </Directory> | ||
| + | <Directory /var/www/html/gsr.ro/> | ||
| + | Options Indexes FollowSymLinks MultiViews | ||
| + | AllowOverride None | ||
| + | Order allow,deny | ||
| + | allow from all | ||
| + | </Directory> | ||
| + | |||
| + | ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ | ||
| + | |||
| + | ErrorLog /var/log/apache2/gsr.err.log | ||
| + | |||
| + | LogLevel warn | ||
| + | |||
| + | CustomLog /var/log/apache2/gsr.log combined | ||
| + | </VirtualHost> | ||
| + | </code> | ||
| + | |||
| + | * Activati site-ul ''gsr.ro'' | ||
| + | * Hint: ''a2ensite''. | ||
| + | <solution -hidden -en><code> | ||
| + | root@mjolnir:~# a2ensite gsr.ro | ||
| + | Enabling site gsr.ro. | ||
| + | To activate the new configuration, you need to run: | ||
| + | service apache2 reload | ||
| + | |||
| + | root@mjolnir:~# /etc/init.d/apache2 restart | ||
| + | Restarting web server: apache2[Fri Jan 27 18:29:34 2012] [warn] NameVirtualHost 172.16.7.133:8080 has no VirtualHosts | ||
| + | ... waiting [Fri Jan 27 18:29:35 2012] [warn] NameVirtualHost 172.16.7.133:8080 has no VirtualHosts | ||
| + | . | ||
| + | </code></solution> | ||
| + | |||
| + | * Testati accesand adresa ''http://gsr.ro'' intr-un browser. | ||
| + | |||
| + | ==== Alias-uri ==== | ||
| + | |||
| + | *Vom configura 2 tipuri de alias-uri: | ||
| + | * Alias-uri pentru partea de domeniu din URL. | ||
| + | * Alias-uri pentru partea de cale (path) din URL. | ||
| + | |||
| + | === Alias pentru domeniu === | ||
| + | |||
| + | * Pentru primul tip de alias-uri, configurati Virtual Host-ul ''gsr.ro'' astfel incat sa raspunda si la cereri pentru ''www.gsr.ro'' | ||
| + | * Hint: ''ServerAlias'' | ||
| + | * Testati accesand adresa ''http://www.gsr.ro'' intr-un browser. | ||
| + | | ||
| + | === Alias pentru URL path === | ||
| + | | ||
| + | * Pentru al doilea tip de alias-uri, configurati Virtual Host-ul ''gsr.ro'' astfel incat la accesarea adresei ''http://gsr.ro/config'' sa fie afisat continutul directorului ''/var/www/html/gsr.ro/configfiles''. | ||
| + | * Creati directorul ''/var/www/html/gsr.ro/configfiles''. In interiorul acestuia, creati fisierele ''file1'', ''file2'' si ''file3''. | ||
| + | * Hint: Puteti folosi ca model configuratia alias-ului ''doc -> /usr/share/doc'' din fisierul de configurare al site-ului default al Apache. | ||
| + | * Testati accesand adresa ''http://gsr.ro/config'' intr-un browser. | ||
| + | |||
| + | <code> | ||
| + | root@mjolnir:~# mkdir /var/www/html/gsr.ro/configfiles | ||
| + | |||
| + | root@mjolnir:~# cd $_ | ||
| + | |||
| + | root@mjolnir:/var/www/html/gsr.ro/configfiles# touch file1 file2 file3 | ||
| + | |||
| + | root@mjolnir:/var/www/html/gsr.ro/configfiles# ls -l | ||
| + | total 0 | ||
| + | -rw-r--r-- 1 root root 0 Jan 27 18:30 file1 | ||
| + | -rw-r--r-- 1 root root 0 Jan 27 18:30 file2 | ||
| + | -rw-r--r-- 1 root root 0 Jan 27 18:30 file3 | ||
| + | |||
| + | root@mjolnir:/var/www/html/gsr.ro/configfiles# cd - | ||
| + | /root | ||
| + | |||
| + | root@mjolnir:~# cat /etc/apache2/sites-available/gsr.ro | tail -n 7 | ||
| + | Alias /config "/var/www/html/gsr.ro/configfiles/" | ||
| + | <Directory "/var/www/html/gsr.ro/configfiles/"> | ||
| + | Options Indexes MultiViews FollowSymLinks | ||
| + | AllowOverride None | ||
| + | </Directory> | ||
| + | |||
| + | </VirtualHost> | ||
| + | |||
| + | root@mjolnir:~# /etc/init.d/apache2 restart | ||
| + | Restarting web server: apache2[Fri Jan 27 18:32:57 2012] [warn] NameVirtualHost 172.16.7.133:8080 has no VirtualHosts | ||
| + | ... waiting [Fri Jan 27 18:32:58 2012] [warn] NameVirtualHost 172.16.7.133:8080 has no VirtualHosts | ||
| + | . | ||
| + | </code> | ||
| + | |||
| + | ==== Redirect ==== | ||
| + | |||
| + | * Configurati site-ul ''gsr.ro'' astfel incat la accesarea adresei ''http://gsr.ro/redirect'' sa fiti redirectati catre ''http://ocw.cs.pub.ro/courses/gsr''. | ||
| + | * Hint: http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect | ||
| + | * Pentru testare, creati directorul ''/var/www/html/gsr.ro/redirect''. | ||
| + | * In interiorul acestuia, creati un fisier ''index.html'' care sa afiseze mesajul ''redirect'' | ||
| + | * Testati accesand adresa ''http://gsr.ro/redirect'' intr-un browser. | ||
| + | |||
| + | <code> | ||
| + | root@mjolnir:~# mkdir /var/www/html/gsr.ro/redirect | ||
| + | root@mjolnir:~# echo "redirect" > /var/www/html/gsr.ro/redirect/index.html | ||
| + | |||
| + | root@mjolnir:~# cat /etc/apache2/sites-available/gsr.ro | tail -n 3 | ||
| + | redirect /redirect http://gsr.ro/labs | ||
| + | |||
| + | </VirtualHost> | ||
| + | |||
| + | root@mjolnir:~# /etc/init.d/apache2 restart | ||
| + | Restarting web server: apache2[Fri Jan 27 18:41:54 2012] [warn] NameVirtualHost 172.16.7.133:8080 has no VirtualHosts | ||
| + | ... waiting [Fri Jan 27 18:41:55 2012] [warn] NameVirtualHost 172.16.7.133:8080 has no VirtualHosts | ||
| + | . | ||
| + | </code> | ||
| + | |||
| + | ==== Restrictionarea accesului pe baza adresei IP ==== | ||
| + | |||
| + | * Configurati Virtual Host-ul ''gsr.ro'' pentru a se permite accesul la acesta **doar** de la adresa ''127.0.0.1''. | ||
| + | * Hint: http://httpd.apache.org/docs/2.2/howto/access.html | ||
| + | * Hint: http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#allow | ||
| + | * Nu uitati de directiva ''Order deny,allow'', care specifica ordinea in care sunt interpretate directivele Deny si Allow. | ||
| + | |||
| + | * Testati accesand adresa ''http://gsr.ro/'' de pe sistemul local si adresa ''http://restricted.gsr.ro'' de pe sistemul unui coleg. | ||
| + | * In Virtual Host-ul ''gsr.ro'', adaugati un nou ServerAlias, cu numele ''restricted.gsr.ro'' | ||
| + | * Pe sistemul colegului, adaugati o intrare in ''/etc/hosts'' pentru ''restricted.gsr.ro'', care sa se mapeze cu adresa IP a sistemului vostru. | ||
| + | |||
| + | <code> | ||
| + | root@mjolnir:~# cat /etc/apache2/sites-available/gsr.ro.conf | ||
| + | <VirtualHost *:80> | ||
| + | ServerName gsr.ro | ||
| + | ServerAlias www.gsr.ro | ||
| + | ServerAlias restricted.gsr.ro | ||
| + | |||
| + | DocumentRoot /var/www/html/gsr.ro | ||
| + | <Directory /> | ||
| + | Options FollowSymLinks | ||
| + | AllowOverride None | ||
| + | </Directory> | ||
| + | <Directory /var/www/html/gsr.ro/> | ||
| + | Options Indexes FollowSymLinks MultiViews | ||
| + | AllowOverride None | ||
| + | Order deny,allow | ||
| + | allow from 127.0.0.1 | ||
| + | deny from all | ||
| + | </Directory> | ||
| + | </VirtualHost> | ||
| + | |||
| + | root@mjolnir:~# /etc/init.d/apache2 restart | ||
| + | Restarting web server: apache2[Fri Jan 27 19:27:55 2012] [warn] NameVirtualHost 172.16.7.133:8080 has no VirtualHosts | ||
| + | ... waiting [Fri Jan 27 19:27:56 2012] [warn] NameVirtualHost 172.16.7.133:8080 has no VirtualHosts | ||
| + | . | ||
| + | </code> | ||
| + | |||
| + | ===== mod_rewrite ===== | ||
| + | |||
| + | Modulul ''rewrite'' din Apache permite rescrierea URL-urilor din request-urile HTTP, dupa anumite reguli. | ||
| + | |||
| + | * Configurati, ca in Laboratorul 3, modulul ''userdir''. | ||
| + | * Hint: http://ocw.cs.pub.ro/courses/gsr/laboratoare/laborator-03#userdir | ||
| + | * Folositi ''mod_userdir'' astfel incat cererile catre URL-uri de forma ''gsr.ro/users/$username'' sa fie rescrise in ''gsr.ro/~$username''. | ||
| + | * Hint: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html | ||
| + | * Hint: http://httpd.apache.org/docs/2.0/rewrite/rewrite_guide.html#canonicalhost | ||
| + | * Hint: https://httpd.apache.org/docs/2.2/rewrite/flags.html | ||
| + | |||
| + | <code> | ||
| + | root@mjolnir:/etc/apache2/sites-available# a2enmod rewrite | ||
| + | Enabling module rewrite. | ||
| + | To activate the new configuration, you need to run: | ||
| + | service apache2 restart | ||
| + | | ||
| + | root@mjolnir:/etc/apache2/sites-available# cat gsr.ro | tail -n 5 | ||
| + | RewriteEngine On | ||
| + | RewriteOptions Inherit | ||
| + | RewriteRule ^/users/([^/]+)/?(.*) /~$1/$2 [R] | ||
| + | RewriteRule ^/~/([^/]+)$ /~$1/ [R] | ||
| + | </VirtualHost> | ||
| + | </code> | ||
| + | |||
| + | /* | ||
| ===== Demo: Funcționarea serviciului DNS ===== | ===== Demo: Funcționarea serviciului DNS ===== | ||
| Line 482: | Line 818: | ||
| TODO | TODO | ||
| - | /* | ||
| <note important> | <note important> | ||