{"id":1593,"date":"2017-07-28T15:08:43","date_gmt":"2017-07-28T13:08:43","guid":{"rendered":"http:\/\/miroslaw.borodziuk.eu\/?p=1593"},"modified":"2017-07-30T12:58:26","modified_gmt":"2017-07-30T10:58:26","slug":"serwer-www-apache","status":"publish","type":"post","link":"http:\/\/miro.borodziuk.eu\/index.php\/2017\/07\/28\/serwer-www-apache\/","title":{"rendered":"Serwer WWW Apache"},"content":{"rendered":"<p>HTTP (<em>HyperText Transfer Protocol<\/em>) to sieciowy protok\u00f3\u0142, kt\u00f3ry zapewnia dost\u0119p do stron sieci web w Internecie. Termin hypertext odnosi si\u0119 do strukturyzowanego tekstu, kt\u00f3ry u\u017cywa hyperlink\u00f3w aby zezwoli\u0107 na niesekwencyjny dost\u0119p do informacji hostowanych na serwerze www przez protok\u00f3\u0142 HTTP. Serwer WWW okre\u015blany jest tak\u017ce serwerem HTTP. Klientem sieci web jest zazwyczaj przegl\u0105darka taka jak Firefox, Google Chrome czy Ms Edge, kt\u00f3ra rozumie protok\u00f3\u0142 HTTP i jest w stanie &#8220;rozmawia\u0107&#8221; z serwerem webowym.\u00a0Najbardziej popularnym serwerem, kt\u00f3ry dostarcza us\u0142ugi webowe przy wykorzystaniu protoko\u0142u HTTP i HTTPS jest Apache.\u00a0 <!--more--><\/p>\n<p>Apache to aplikacja dzia\u0142aj\u0105ca w architekturze klient\/serwer, wykorzystuje demona <em>httpd<\/em>, kt\u00f3ry nas\u0142uchuje na porcie 80 TCP (http) lub 443 TCP (https).<\/p>\n<p>Komendy do kontrolowania Apache:<\/p>\n<ul>\n<li><span style=\"color: #008000;\"><code># apachectl<\/code> <\/span>&#8211; uruchamia, zatrzymuje, restartuje i sprawdza status procesu httpd. Do tych czynno\u015bci mo\u017ce by\u0107 wykorzystywany tak\u017ce <em>systemctl<\/em> lub <em>service<\/em>. Ponadto apachectl mo\u017ce testowa\u0107 sk\u0142adnie plik\u00f3w konfiguracyjnych.<\/li>\n<li><span style=\"color: #008000;\"><code># htpasswd<\/code> <\/span>&#8211; tworzy i modyfikuje pliki do sk\u0142adowania nazw u\u017cytkownik\u00f3w i hase\u0142 do autentykacji basic. Opcja &#8211;<em>c<\/em> tworzy plik, <em>-m<\/em> u\u017cywa szyfrowania MD5 dla hase\u0142.<\/li>\n<li><code><span style=\"color: #008000;\"># httpd<\/span> <\/code>&#8211; demon Apacha, uruchomiony z opcj\u0105 -t sprawdza sk\u0142adni\u0119 plik\u00f3w konfiguracyjnych.<\/li>\n<\/ul>\n<p>Wi\u0119cej informacji w dokumentacji systemowej <em>man<\/em>.<\/p>\n<p>Pliki z logami Apacha znajduj\u0105 si\u0119 w katalogu <code>\/var\/log\/httpd<\/code><i>.<\/i><\/p>\n<p>Pakiety zwi\u0105zane z Apachem w RHEL to m.in:<\/p>\n<ul>\n<li><em>httpd<\/em> &#8211; demon Apacha.<\/li>\n<li><em>httpd-tool<\/em> -narz\u0119dzia do obs\u0142ugi Apacha.<\/li>\n<li><em>httpd-manual<\/em> &#8211; dokumentacja i przyk\u0142adowe pliki konfiguracyjne. Dost\u0119pna jest pod adresem <em>http:\/\/localhost\/manual<\/em>.<\/li>\n<li><em>mod_ssl<\/em> &#8211; wsparcie dla stron bezpiecznych stron https.<\/li>\n<li><em>mod_wsgi<\/em> &#8211; wsparcie dla obs\u0142ugi skrypt\u00f3w WSGI.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Pliki konfiguracyjne.<\/span><\/p>\n<p>Ca\u0142a konfiguracja Apacha sk\u0142adowana jest w katalogu<code> \/etc\/httpd<\/code>, g\u0142\u00f3wny plik konfiguracyjny to: <code>\/etc\/httpd\/http.conf<\/code>.\u00a0 G\u0142\u00f3wne dyrektywy\u00a0 pliku konfiguracyjnego przedstawia tabela poni\u017cej.<\/p>\n<table style=\"width: 737px;\">\n<tbody>\n<tr>\n<td style=\"width: 135.367px;\"><span style=\"color: #808080;\">\u00a0Dyrektywa<\/span><\/td>\n<td style=\"width: 583.633px;\"><span style=\"color: #808080;\">\u00a0Opis<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 135.367px;\"><em><span style=\"color: #008000;\">\u00a0ServerRoot<\/span><\/em><\/td>\n<td style=\"width: 583.633px;\">Katalog z konfiguracj\u0105 serwera, domy\u015blnie <code>\/etc\/httpd<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 135.367px;\"><em><span style=\"color: #008000;\">\u00a0Listen<\/span><\/em><\/td>\n<td style=\"width: 583.633px;\">Port na kt\u00f3rym nas\u0142uchuje serwer. Domy\u015blnie 80. Mo\u017cna poza portem okre\u015bli\u0107 tak\u017ce adres IP, na kt\u00f3rym ma nas\u0142uchiwa\u0107 serwer.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 135.367px;\"><em><span style=\"color: #008000;\">\u00a0Include<\/span><\/em><\/td>\n<td style=\"width: 583.633px;\">Okre\u015bla po\u0142o\u017cenie modu\u0142\u00f3w wczytywanych podczas startu demona. domy\u015blnie <code> conf.modules.d\/*.conf<\/code> w odniesieniu do katalogu z konfiguracj\u0105 apacha.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 135.367px;\"><em><span style=\"color: #008000;\">\u00a0User<\/span><\/em><\/td>\n<td style=\"width: 583.633px;\">\u00a0W\u0142a\u015bciciel procesu <em>httpd<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 135.367px;\"><em><span style=\"color: #008000;\">Group<\/span><\/em><\/td>\n<td style=\"width: 583.633px;\">Grupa systemowa, do kt\u00f3rej nale\u017cy demon <em>httpd<\/em>. Domy\u015bln\u0105 grup\u0105 jest <em>apache<\/em>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Dyrektywy, kt\u00f3re dotycz\u0105 domy\u015blnego web serwera przedstawia tabela poni\u017cej. Dyrektywy te dotycz\u0105 r\u00f3wnie\u017c host\u00f3w wirtualnych o ile nie s\u0105 nadpisane przez te same dyrektywy wewn\u0105trz definicji konfiguracji hosta wirtualnego.<\/p>\n<table style=\"width: 737px;\">\n<tbody>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #808080;\">Dyrektywa<\/span><\/td>\n<td style=\"width: 585.067px;\"><span style=\"color: #808080;\">Opis<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>ServerName<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Nazwa web serwera (lub adres IP) i numer portu. Domy\u015blnie <em>www.example.com:80<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>ServerAdmin<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Adres e-mail webmastera. Domy\u015blnie root@localhost.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>DocumentRoot<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Po\u0142o\u017cenie katalogu z plikami web. Domy\u015blnie <code>\/var\/www\/html<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>DirectoryIndex<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Okre\u015bla jaka strona ma by\u0107 serwowana klientowi, kt\u00f3ry odwiedza serwer. Domy\u015blnie <code>index.html<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>AccessFileName<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Plik u\u017cywany do kontroli dost\u0119pu do serwera. Domy\u015blnie .<code>htaccess<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>Alias<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Po\u0142o\u017cenie katalogu do sk\u0142adowania plik\u00f3w poza <em>DocumentRoot<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>ScriptAlias<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Po\u0142o\u017cenie skryptu CGI (Common Gateway Interface).<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>WSGIScriptAlias<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Po\u0142o\u017cenie skryptu WSGI.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>IncludeOptional<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Po\u0142o\u017cenie dodatkowych plik\u00f3w konfiguracyjnych.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>CustomLog<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Okre\u015bla custom log i jego format. Domy\u015blnie custom log sk\u0142adowany jest w <code>logs\/httpd\/access_log<\/code> w odniesieniu do katalogu <em>ServerRoot<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>ErrorLog<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Po\u0142o\u017cenie logu z komunikatami o b\u0142\u0119dach. Domy\u015blnie w <code>logs\/error_log<\/code> w <em>ServerRoot<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>LogFormat<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Format dla komunikat\u00f3w logowania.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>LogLevel<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Poziom &#8220;gadatliwo\u015bci&#8221; log\u00f3w. Domy\u015blnie warn, inne opcje to: <em>debug, info, notice, error, crit, alert i emerg<\/em>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>\u00a0Options<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Ustawia funkcjonalno\u015b\u0107 zwi\u0105zan\u0105 w katalogami, w kt\u00f3rych znajduj\u0105 si\u0119 pliki stron web.<\/p>\n<ul>\n<li><em>ExecCGI<\/em> &#8211; pozwala na uruchamianie skrypt\u00f3w CGI.<\/li>\n<li><em>FollowSymLinks<\/em> &#8211; pozwala na u\u017cywanie dowi\u0105za\u0144 do katalog\u00f3w z poza <em>DocumentRoot<\/em>.<\/li>\n<li><em>Indexes<\/em> &#8211; je\u017celi w katalogu <em>DirectoryRoot<\/em> danego serwera web nie ma pliku <code>index.html<\/code> (lub<code> index.php<\/code> itd.) to wy\u015bwietlana jest zawarto\u015b\u0107 tego katalogu zamiast strony web.<\/li>\n<li><em>Includes<\/em> &#8211; w\u0142\u0105cza include po stronie serwera (?).<\/li>\n<li><em>MultiViews<\/em> &#8211; pozwala na zamienniki rozszerze\u0144 plik\u00f3w.<\/li>\n<li><em>All<\/em> &#8211; w\u0142\u0105cza wszystkie opcja poza MultiViews.<\/li>\n<li><em>None<\/em> &#8211; wy\u0142\u0105cza wszystkie dodatkowe funkcjonalno\u015bci.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>AllowOverride<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Okre\u015bla typy dyrektyw jakie mog\u0105 by\u0107 zdefiniowane w pliku <code>AccessFileName<\/code>. Dyrektywy te kontroluj\u0105 dost\u0119p u\u017cytkownik\u00f3w i grup do katalog\u00f3w prywatnych i hosta. Niekt\u00f3re opcje:<\/p>\n<ul>\n<li><em>All<\/em> &#8211; pozwala na u\u017cycie wszystkich wspieranych dyrektyw <em>AccessFileName<\/em>.<\/li>\n<li><em>AuthConfig<\/em> &#8211; pozwala na u\u017cycie dyrektyw autoryzacyjnych takich jak <em>AuthName, AuthType, AuthUserFile, AuthGroupFile<\/em> oraz <em>Require<\/em> w <em>AccessFileName<\/em>.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>\u00a0Require<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">Zezwala lub zakazuje dost\u0119pu dla okre\u015blonych u\u017cytkownik\u00f3w, grup, host\u00f3w, sieci lub domen.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 134.933px;\"><span style=\"color: #008000;\"><em>\u00a0AddHandler<\/em><\/span><\/td>\n<td style=\"width: 585.067px;\">\u00a0Mapuj\u0105 rozszerzenia plik\u00f3w do okre\u015blonego handlera.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Wiele dyrektyw jest definiowanych wewn\u0105trz kontener\u00f3w:<code><\/code><\/p>\n<ul>\n<li><code>&lt;Directory \u2026\u2026\u2026 &gt;\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/Directory&gt;<\/code><\/li>\n<li><code> &lt;Files \u2026\u2026\u2026\u2026. &gt; \u00a0 \u00a0 \u00a0\u00a0 &lt;\/Files&gt;<\/code><\/li>\n<li><code> &lt;IfModule \u2026\u2026. &gt; \u00a0 \u00a0 \u00a0 &lt;\/IfModule&gt;<\/code><\/li>\n<li><code> &lt;VirtualHost \u2026. &gt; \u00a0 \u00a0 &lt;\/VirtualHost&gt;<\/code><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Kontrola dost\u0119pu.<\/span><\/p>\n<p>Ograniczanie dost\u0119pu do katalog\u00f3w dla okre\u015blonych u\u017cytkownik\u00f3w lub grup jest zarz\u0105dzane przez dyrektywy zdefiniowane w pliku .<code>htaccess<\/code> lub bezpo\u015brednio w kontenerze<code> &lt;Directory ....&gt;<\/code> w pliku<code> httpd.conf<\/code> i jego za\u0142\u0105cznikach. U\u017cytkownicy mog\u0105 mie\u0107 inne has\u0142a ni\u017c systemowe. Kluczowe dyrektywy zwi\u0105zane z kontrol\u0105 dost\u0119pu na poziomie u\u017cytkownika przedstawia tabela poni\u017cej.<\/p>\n<table style=\"width: 742px;\">\n<tbody>\n<tr>\n<td style=\"width: 141.717px;\"><span style=\"color: #808080;\">\u00a0Dyrektywa<\/span><\/td>\n<td style=\"width: 583.283px;\"><span style=\"color: #808080;\">Opis<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 141.717px;\"><span style=\"color: #008000;\"><em>AuthType<\/em><\/span><\/td>\n<td style=\"width: 583.283px;\">Ustawia podstawow\u0105 autentykacj\u0119.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 141.717px;\"><span style=\"color: #008000;\"><em>AuthName<\/em><\/span><\/td>\n<td style=\"width: 583.283px;\">Dodaje komentarz.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 141.717px;\"><span style=\"color: #008000;\"><em>AuthBasicProvider<\/em><\/span><\/td>\n<td style=\"width: 583.283px;\">Typ u\u017cywanej autentykacji. Domy\u015blnie file.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 141.717px;\"><span style=\"color: #008000;\"><em>\u00a0AuthUserFile<\/em><\/span><\/td>\n<td style=\"width: 583.283px;\">\u00a0Okre\u015bla plik z autoryzowanymi has\u0142ami u\u017cytkownik\u00f3w.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 141.717px;\"><span style=\"color: #008000;\"><em>\u00a0AuthGroupFile<\/em><\/span><\/td>\n<td style=\"width: 583.283px;\">\u00a0Okre\u015bla plik z autoryzowanymi has\u0142ami grup.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Za ograniczanie dost\u0119pu na poziomie hosta odpowiada dyrektywa <em>Require<\/em>, przyk\u0142ady jej u\u017cycia przedstawia tabela poni\u017cej:<\/p>\n<table style=\"width: 759px;\">\n<tbody>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #808080;\">Dyrektywa Require<\/span><\/td>\n<td style=\"width: 431.2px;\"><span style=\"color: #808080;\">Skutek<\/span><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require user &lt;username or UID&gt;<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Dost\u0119p jest przyznany tylko dla okre\u015blonego u\u017cytkownika (dotyczy katalog\u00f3w).<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require not user &lt;username or<\/code><\/span><span style=\"color: #008000;\"><code>UID&gt;<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Odmowa dost\u0119pu dla okre\u015blonego u\u017cytkownika<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require group &lt;group name or<\/code><\/span><span style=\"color: #008000;\"><code>GID&gt;<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Dost\u0119p jest przyznany tylko dla okre\u015blonej grupy (dotyczy zawarto\u015bci zarz\u0105dzanych przez grupy).<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require not group &lt;group name or GID&gt;<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Odmowa dost\u0119pu dla okre\u015blonej grupy.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require valid-user<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Dost\u0119p jest przyznany dla wa\u017cnych (aktualnych) u\u017cytkownik\u00f3w.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require ip 192.168.0 15.2<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Dost\u0119p jest przyznany tylko dla podsieci 192.168.0 i 15.2.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require not ip 192.168.0 15.2<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Odmowa dost\u0119pu dla podsieci 192.168.0 i 15.2.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require host server2<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Dost\u0119p jest przyznany dla hosta server2.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require not host server2<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Odmowa dost\u0119pu dla hosta server2.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require host example.com<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Dost\u0119p jest przyznany dla domen example.com.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require not host .example.com<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Odmowa dost\u0119pu dla domen example.com.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require all granted<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Dost\u0119p jest przyznany\u00a0 dla wszystkich host\u00f3w.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 305.8px;\"><span style=\"color: #008000;\"><code> Require all denied<\/code><\/span><\/td>\n<td style=\"width: 431.2px;\">Odmowa dost\u0119pu dla wszystkich host\u00f3w.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Przyk\u0142ad 1:\u00a0 zezwolenie na dost\u0119p<strong> bez has\u0142a<\/strong> do <code>\/var\/www\/example<\/code><em><code><\/code> <\/em>dla u\u017cytkownik\u00f3w <em>user1<\/em>, <em>user2<\/em> i grupy <em>dba<\/em>.<\/p>\n<pre class=\"lang:sh decode:true\">&lt;Directory \/var\/www\/example&gt;\r\n   AllowOverride None\r\n   Require user user1 user2\r\n   Require group dba\r\n&lt;\/Directory&gt;<\/pre>\n<p>Przyk\u0142ad 2:\u00a0 zezwolenie na dost\u0119p <strong>bez has\u0142a<\/strong> do <code>\/var\/www\/example<\/code> dla u\u017cytkownik\u00f3w <em>user1<\/em>, <em>user2<\/em> i grupy <em>dba<\/em> z domeny <i>example.net<\/i>, podsieci <em>192.168.0<\/em> i hosta <i>server2.example.com<\/i>. Odmowa dost\u0119pu z domeny\u00a0<i>example.org<\/i>.<\/p>\n<pre class=\"lang:sh decode:true\">&lt;Directory \/var\/www\/example&gt;\r\n   AllowOverride None\r\n   Require user user1 user2\r\n   Require group dba\r\n   Require host example.net server2.example.com\r\n   Require ip 192.168.0\r\n   Require not host example.org\r\n&lt;\/Directory&gt;<\/pre>\n<p>Przyk\u0142ad 3:\u00a0 zezwolenie na dost\u0119p <strong>z has\u0142em<\/strong> do <code>\/var\/www\/example<\/code> dla u\u017cytkownik\u00f3w <em>user1<\/em>, <em>user2<\/em> i grupy <em>dba<\/em> z domeny <i>example.net<\/i>, podsieci <em>192.168.0<\/em> i hosta <i>server2.example.com<\/i>. Odmowa dost\u0119pu z domeny\u00a0<i>example.org<\/i>.<\/p>\n<pre class=\"lang:sh decode:true\">&lt;Directory \/var\/www\/example&gt;\r\n   AllowOverride AuthConfig\r\n   AccessFileName conf\/.htaccess\r\n&lt;\/Directory&gt;\r\n<\/pre>\n<p>Zawarto\u015b\u0107 pliku The <code>.htaccess<\/code>:<\/p>\n<pre class=\"lang:sh decode:true\">AuthType          Basic\r\nAuthName          \u201cThis site is password-protected.\u201d\r\nAuthBasicProvider file\r\nAuthUserFile      \/etc\/httpd\/conf\/.userdb\r\nAuthGroupFile     \/etc\/httpd\/conf\/.groupdb\r\nRequire user      user1 user2\r\nRequire group     dba\r\nRequire host      example.net server2.example.com\r\nRequire ip        192.168.0\r\nRequire not host  example.org<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Wymagania SELinux.<\/span><\/p>\n<p>Zmienne boolean zwi\u0105zane z Apachem przedstawia tabela poni\u017cej.<\/p>\n<table style=\"width: 758px;\">\n<tbody>\n<tr>\n<td style=\"width: 177.933px;\">Boolean<\/td>\n<td style=\"width: 563.067px;\">Opis<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 177.933px;\"><span style=\"color: #008000;\"><code> httpd_anon_write<\/code><\/span><\/td>\n<td style=\"width: 563.067px;\">Zezwala\/zabrania Apachowi na zapis do katalog\u00f3w z etykiet\u0105 <code>public_content_rw_t<\/code>\u00a0 tak jak do katalog\u00f3w publicznych.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 177.933px;\"><span style=\"color: #008000;\"><code> httpd_sys_script_anon_write<\/code><\/span><\/td>\n<td style=\"width: 563.067px;\">\u00a0Zezwala\/zabrania skryptom Apacha na zapis do katalog\u00f3w z etykiet\u0105 <code>public_content_rw_t<\/code>\u00a0 tak jak do katalog\u00f3w publicznych.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 177.933px;\"><span style=\"color: #008000;\"><code> httpd_enable_cgi<\/code><\/span><\/td>\n<td style=\"width: 563.067px;\">W\u0142\u0105cza\/wy\u0142\u0105cza mo\u017cliwo\u015b\u0107 uruchamiania skrypt\u00f3w CGI z etykiet\u0105 <code>httpd_sys_script_exec_t<\/code> .<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 177.933px;\"><span style=\"color: #008000;\"><code> httpd_enable_ftp_server<\/code><\/span><\/td>\n<td style=\"width: 563.067px;\">Zezwala\/zabrania Apachowi dzia\u0142ania jako serwer FTP i nas\u0142uchiwania na porcie 21.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 177.933px;\"><span style=\"color: #008000;\"><code> httpd_enable_homedirs<\/code><\/span><\/td>\n<td style=\"width: 563.067px;\">W\u0142\u0105cza\/wy\u0142\u0105cza Apachowi dost\u0119p do katalog\u00f3w domowych u\u017cytkownik\u00f3w.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 177.933px;\"><span style=\"color: #008000;\"><code> httpd_use_cifs<\/code><\/span><\/td>\n<td style=\"width: 563.067px;\">Zezwala\/zabrania Apachowi na u\u017cywanie podmontowanych zasob\u00f3w Samba typu <code>cifs_t<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 177.933px;\"><span style=\"color: #008000;\"><code> httpd_use_nfs<\/code><\/span><\/td>\n<td style=\"width: 563.067px;\">Zezwala\/zabrania Apachowi na u\u017cywanie podmontowanych zasob\u00f3w\u00a0 typy <code>nfs_t<\/code> .<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Poza zmiennymi boolean SELinux wymaga aby by\u0142 ustawiony odpowiedni kontekst na katalogach zwi\u0105zanych z Apachem.<\/p>\n<pre class=\"lang:sh decode:true\"># ll \u2013Zd \/etc\/httpd\r\ndrwxr-xr-x. root root system_u:object_r:httpd_config_t:s0 \/etc\/httpd\r\n# ll \u2013Zd \/var\/www\r\ndrwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 \/var\/www\r\n# ll \u2013Zd \/var\/log\/httpd\r\ndrwx------. root root system_u:object_r:httpd_log_t:s0 \/var\/log\/httpd<\/pre>\n<p>A zatem katalogi z konfiguracj\u0105 musz\u0105 mie\u0107 ustawiony kontekst <code>httpd_config_t<\/code>,\u00a0 katalogi ze stronami web kontekst <code>httpd_sys_content_t<\/code>, a katalogi z logami kontekst <code>httpd_log_t<\/code>.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Konfiguracja domy\u015blnego web serwera.<\/span><\/p>\n<p>1. Instalacja pakietu Apache.<\/p>\n<pre class=\"lang:sh decode:true \"># yum \u2013y install httpd<\/pre>\n<p>2. Odblokowanie protoko\u0142u http na firewallu:<\/p>\n<pre class=\"lang:sh decode:true \"># firewall-cmd --permanent --add-service=http\r\n# firewall-cmd --reload<\/pre>\n<p>3. Autostart, uruchomienie i status Apacha:<\/p>\n<pre class=\"lang:sh decode:true \"># systemctl enable httpd\r\n# systemctl start httpd\r\n# systemctl status httpd<\/pre>\n<p>4. Weryfikacka mo\u017cliwo\u015bci dost\u0119pu do domy\u015blnej strony web:<\/p>\n<pre class=\"lang:sh decode:true \"># yum \u2013y install links\r\n# links http:\/\/localhost<\/pre>\n<p>5. Weryfikacja na komputerze klienta:<\/p>\n<pre class=\"lang:sh decode:true\"># yum \u2013y install links\r\n# links http:\/\/server.example.com<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Wystawienie innej strony na domy\u015blnym web serwerze.<\/span><\/p>\n<p>1. Utworzenie strony w katalogu <em>DocumentRoot\u00a0<\/em> <code>\/var\/www\/html<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># cd \/var\/www\/html\r\n# vim index.html\r\nTo jest strona internetowa.<\/pre>\n<p>2. Modyfikacja pliku <code>\/etc\/hosts<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># vim \/etc\/hosts\r\n192.168.0.1 server.example.com server webserver1.example.com webserver1<\/pre>\n<p>3. Modyfikacja konfiguracji w pliku <code>\/etc\/httpd\/conf\/httpd.conf<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># vim \/etc\/httpd\/conf\/httpd.conf\r\nServerAdmin root@webserver1.example.com\r\nServerName webserver1.example.com<\/pre>\n<p>4. Sprawdzenie poprawno\u015bci sk\u0142adni pliku<code> httpd.conf<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># httpd \u2013t\r\nSyntax OK<\/pre>\n<p>5. Weryfikacja dost\u0119pu do nowej strony:<\/p>\n<pre class=\"lang:sh decode:true \"># links http:\/\/webserver1.example.com<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Przyznanie dost\u0119pu do prywatnego katalogu web serwera.<\/span><\/p>\n<p>1. Utworzenie prywatnego katalogu w <em>DocumentRoot<\/em>:<\/p>\n<pre class=\"lang:sh decode:true \"># mkdir \/var\/privusr<\/pre>\n<p>2. Zmiana praw dost\u0119pu do katalogu:<\/p>\n<pre class=\"lang:sh decode:true \"># chown user1:user1 \/var\/privusr\r\n# chmod 0711 \/var\/privusr<\/pre>\n<p>3. Utworzenie pliku <code>index.html<\/code> w prywatnym katalogu:<\/p>\n<pre class=\"lang:sh decode:true \"># vim \/var\/privusr\/index.html\r\nThis is webserver1 providing user1 access to a private directory.<\/pre>\n<p>4. Dodanie kontekstu SELinux typ<em> httpd_sys_content_t<\/em> dla katalogu <code>\/var\/privusr<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># semanage fcontext \u2013at httpd_sys_content_t \u201c\/var\/privusr(\/.*)?\u201d\r\n# restorecon \u2013Rv \/var\/privusr<\/pre>\n<p>5. Modyfikacja konfiguracji w pliku <code>httpd.conf<\/code>:<\/p>\n<pre class=\"lang:sh decode:true\">ServerAdmin root@webserver1.example.com\r\nServerName webserver1.example.com\r\nDocumentRoot \u201c\/var\u201d\r\n&lt;Directory \/var\/privusr&gt;\r\n   AllowOverride AuthConfig\r\n&lt;\/Directory&gt;<\/pre>\n<p>7. Weryfikacja poprawno\u015bci sk\u0142adni pliku <code>httpd.conf<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># httpd \u2013t\r\nSyntax OK<\/pre>\n<p>8. Utworzenie pliku <code>.htaccess<\/code> w katalogu<code> \/var\/privusr<\/code>:<\/p>\n<pre class=\"lang:sh decode:true\"># cd \/var\/privusr\r\n# vim .htaccess\r\nAuthType Basic\r\nAuthName \u201cPassword-protected User Contents. Enter your credentials to log in:\u201d\r\nAuthUserFile \u201c\/etc\/httpd\/conf\/.userdb\u201d\r\nRequire user user1<\/pre>\n<p>9. Utworzenie has\u0142a dla u\u017cytkownika <em>user1<\/em> i umieszczenie go komend\u0105 <em>htpasswd<\/em> w pliku <em>AuthUserFile<\/em> (<code>\/etc\/httpd\/conf\/.userdb<\/code>).<br \/>\nHas\u0142o mo\u017ce by\u0107 inne ni\u017c has\u0142o systemowe u\u017cytkownika <em>user1<\/em>.<\/p>\n<pre class=\"lang:sh decode:true \"># cd \/etc\/httpd\/conf\r\n# htpasswd \u2013c .userdb user1\r\nNew password:\r\nRe-type new password:\r\nAdding password for user user1\r\n# cat .userdb\r\nuser1:$apr1$CMmJ4ru9$yMiBitQNS5hjOQDJPSIrx.<\/pre>\n<p>10. Zmiana praw dost\u0119pu do pliku <em>AuthUserFile<\/em> file:<\/p>\n<pre class=\"lang:sh decode:true\"># chgrp apache .userdb\r\n# chmod 0640 .userdb<\/pre>\n<p>11. Restart Apacha:<\/p>\n<pre class=\"lang:sh decode:true \"># systemctl restart httpd<\/pre>\n<p>12. Test konfiguracji ze zdalnego systemu przy wykorzystaniu dowolnej przegl\u0105darki:<\/p>\n<pre class=\"lang:sh decode:true \">http:\/\/webserver1.example.com\/privusr<\/pre>\n<p>\u017beby sprawdzi\u0107 czy nie wyst\u0119puj\u0105 jakie\u015b b\u0142\u0119dy mo\u017cna wykorzysta\u0107 <em>tail<\/em>:<\/p>\n<pre class=\"lang:sh decode:true\"># tail -f \/var\/log\/httpd\/error_log\r\n# tail -f \/var\/log\/httpd\/access_log<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Zapewnienie dost\u0119pu do katalog\u00f3w pracy grupowej.<\/span><\/p>\n<p>1. Utworzenie katalogu, kt\u00f3ry b\u0119dzie zarz\u0105dzany przez grup\u0119 w DocumentRoot:<\/p>\n<pre class=\"lang:sh decode:true \"># mkdir \/var\/privgrp\r\n# groupadd dba\r\n# usermod \u2013G dba user10\r\n# usermod \u2013G dba user11\r\n# chgrp dba \/var\/privgrp\r\n# chmod 0771 \/var\/privgrp<\/pre>\n<p>2. Create an<code> index.html<\/code> file in the directory:<\/p>\n<pre class=\"lang:sh decode:true \"># vim \/var\/privgrp\/index.html\r\nThis is webserver1 providing dba group members access to a directory.<\/pre>\n<p>3. Dodanie kontekstu SELinux <em>httpd_sys_content_t<\/em> dla katalogu <code>\/var\/privgrp<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># semanage fcontext \u2013at httpd_sys_content_t \u201c\/var\/privgrp(\/.*)?\u201d\r\n# restorecon \u2013Rv \/var\/privgrp<\/pre>\n<p>4. Modyfikacja dyrektyw w pliku <code>\/etc\/httpd\/conf\/httpd.conf<\/code>:<\/p>\n<pre class=\"lang:sh decode:true\">ServerAdmin root@webserver1.example.com\r\nServerName webserver1.example.com\r\nDocumentRoot \u201c\/var\u201d\r\n&lt;Directory \/var\/privusr&gt;\r\n    AllowOverride AuthConfig\r\n&lt;\/Directory&gt;\r\n&lt;Directory \/var\/privgrp&gt;\r\n    AllowOverride AuthConfig\r\n&lt;\/Directory&gt;<\/pre>\n<p>5. Weryfikacja:<\/p>\n<pre class=\"lang:sh decode:true \"># httpd \u2013t\r\nSyntax OK<\/pre>\n<p>6. Utworzenie pliku<code> .htaccess<\/code> file w katalogu <code>\/var\/privgrp<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># cd \/var\/privgrp\r\n# vi .htaccess\r\nAuthType Basic\r\nAuthName \u201cPassword-protected Group Contents. Enter your credentials to log in:\u201d\r\nAuthUserFile \u201c\/etc\/httpd\/conf\/.grouppassworddb\u201d\r\nAuthGroupFile \u201c\/etc\/httpd\/conf\/.groupdb\u201d\r\nRequire group dba<\/pre>\n<p>7. Utworzenie <em>AuthGroupFile<\/em> (<code>\/etc\/httpd\/conf\/.userdb<\/code>) i dodanie informacji o grupie:<\/p>\n<pre class=\"lang:sh decode:true \"># cd \/etc\/httpd\/conf\r\n# vi .groupdb\r\ndba: user10 user11<\/pre>\n<p>8. Zmiana uprawnie\u0144 do pliku <em>AuthGroupFile<\/em>:<\/p>\n<pre class=\"lang:sh decode:true \"># chgrp apache .groupdb\r\n# chmod 0640 .groupdb<\/pre>\n<p>9. Utworzenie hase\u0142 dla cz\u0142onk\u00f3w grupy i umieszczenie ich w pliku <em>AuthUserFile<\/em> (<code>\/etc\/httpd\/conf\/.grouppassworddb<\/code>) komend\u0105<em> htpasswd<\/em>:<\/p>\n<pre class=\"lang:sh decode:true \"># htpasswd \u2013c .grouppassworddb user10\r\nNew password:\r\nRe-type new password:\r\nAdding password for user user10\r\n# htpasswd .grouppassworddb user11\r\nNew password:\r\nRe-type new password:\r\nAdding password for user user11<\/pre>\n<p>10. Restart Apacha:<\/p>\n<pre class=\"lang:sh decode:true \"># systemctl restart httpd<\/pre>\n<p>11. Test konfiguracji ze zdalnego systemu przy wykorzystaniu dowolnej przegl\u0105darki:<\/p>\n<pre class=\"lang:sh decode:true \">http:\/\/webserver1.example.com\/privgrp<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Zapewnienie dost\u0119pu do serwera web tylko dla wybranego hosta na niedomy\u015blnym porcie.<\/span><\/p>\n<p>1. Modyffikacja pliku <code>\/etc\/httpd\/conf\/httpd.conf<\/code>:<\/p>\n<pre class=\"lang:sh decode:true\">ServerAdmin root@webserver1.example.com\r\nServerName webserver1.example.com:8989\r\nDocumentRoot \u201c\/var\u201d\r\n&lt;Directory \/var\/privusr&gt;\r\n   AllowOverride AuthConfig\r\n   Require host example.com\r\n   Require ip 192.168.1.0\/24\r\n&lt;\/Directory&gt;\r\n&lt;Directory \/var\/privgrp&gt;\r\n   AllowOverride AuthConfig\r\n   Require host example.com\r\n   Require ip 192.168.1.0\/24\r\n&lt;\/Directory&gt;<\/pre>\n<p>2. Weryfikacja ppoprawno\u015bci sk\u0142adni pliku <code>httpd.conf<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># httpd \u2013t<\/pre>\n<p>3. Restart Apacha:<\/p>\n<pre class=\"lang:sh decode:true \"># systemctl restart httpd<\/pre>\n<p>4. Otwarcie portu TCP 8989 na firewallu:<\/p>\n<pre class=\"lang:sh decode:true\"># firewall-cmd --permanent --add-port 8989\/tcp\r\n# firewall-cmd --reload<\/pre>\n<p>5. Dodanie portu 8989 TCP do polityki SELinux dla typu <em>http_port_t<\/em>:<\/p>\n<pre class=\"lang:sh decode:true \"># semanage port \u2013at http_port_t \u2013p tcp 8989\r\n# semanage port \u2013l | grep ^http_port_t\r\nhttp_port_t tcp 8989, 80, 81, 443, 488, 8008, 8009, 8443, 9000<\/pre>\n<p>6. Test konfiguracji z systemu w domenie example.com domain i z podsieci 192.168.1.0\/24 przez przegl\u0105dark\u0119 Firefox:<\/p>\n<pre class=\"lang:sh decode:true \">http:\/\/webserver1.example.com:8989\/privusr\r\nhttp:\/\/webserver1.example.com:8989\/privgrp<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Wirtualne web serwery &#8211; hosty wirtualne.<\/span><\/p>\n<p>Apache pozwala na uruchamianie wielu web serwer\u00f3w na jednym systemie. Ka\u017cdy wirtualny host mo\u017ce zar\u00f3wno wsp\u00f3\u0142dzieli\u0107 jeden adres IP jak i mie\u0107 przypisany osobny adres IP.\u00a0 Konfiguracj\u0119 host\u00f3w wirtualnych umieszczamy w katalogu <code>\/etc\/httpd\/conf.d <\/code>w osobnych plikach. Przyk\u0142ad kontenera z konfiguracj\u0105 hosta wirtualnego:<\/p>\n<pre class=\"lang:sh decode:true\">&lt;VirtualHost *:80&gt;\r\n   DocumentRoot \/var\/www\/html\/vh1.example.com\r\n   ServerAdmin admin@vh1.example.com\r\n   ServerName vh1.example.com\r\n   ErrorLog logs\/vh1.example.com-error_log\r\n   CustomLog logs\/vh1.example.com-access_log common\r\n&lt;\/VirtualHost&gt;\r\n<\/pre>\n<p>Weryfikacja poprawno\u015bci konfiguracji hosta wirtualnego przeprowadzana jest komend\u0105:<\/p>\n<pre class=\"lang:sh decode:true\"># httpd \u2013D DUMP_VHOSTS\r\nAH00112: Warning: DocumentRoot [\/var\/www\/html\/vh1.example.com] does not exist\r\nVirtualHost configuration:\r\n*:80 is a NameVirtualHost\r\ndefault server vh1.example.com (\/etc\/httpd\/conf.d\/vh1.example.com.conf:1)\r\nport 80 namevhost vh1.example.com (\/etc\/httpd\/conf.d\/vh1.example.com.conf:1)\r\nport 80 namevhost vh1.example.com (\/etc\/httpd\/conf.d\/vh1.example.com.conf:1)<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Konfiguracja prostego hosta wirtualnego.<\/span><\/p>\n<p>1. Utworzenie pliku<code> \/etc\/httpd\/conf.d\/vhost1.conf<\/code> o tre\u015bci:<\/p>\n<pre class=\"lang:sh decode:true\"># vim \/etc\/httpd\/conf.d\/vhost1.conf\r\n&lt;VirtualHost *:80&gt;\r\n   ServerAdmin admin@vhost1.example.com\r\n   DocumentRoot \/var\/www\/html\/vhost1\r\n   ServerName vhost1.example.com\r\n   ErrorLog logs\/vhost1-error_log\r\n   CustomLog logs\/vhost1-access_log combined\r\n&lt;\/VirtualHost&gt;<\/pre>\n<p>2. Utworzenie katalogu, w kt\u00f3rym b\u0119dzie sk\u0142adowana strona:<\/p>\n<pre class=\"lang:sh decode:true \"># mkdir \/var\/www\/html\/vhost1<\/pre>\n<p>3. Utworzenie pliku<code> index.html<\/code> w DocumentRoot:<\/p>\n<pre class=\"lang:sh decode:true\"># vi \/var\/www\/html\/vhost1\/index.html\r\nThis web page is to test virtual host.<\/pre>\n<p>4. Weryfikacja:<\/p>\n<pre class=\"lang:sh decode:true \"># httpd \u2013D DUMP_VHOSTS\r\nVirtualHost configuration:\r\n*:80 is a NameVirtualHost\r\ndefault server vhost1.example.com (\/etc\/httpd\/conf.d\/vhost1.conf:1)\r\nport 80 namevhost vhost1.example.com (\/etc\/httpd\/conf.d\/vhost1.conf:1)\r\nport 80 namevhost vhost1.example.com (\/etc\/httpd\/conf.d\/vhost1.conf:1)<\/pre>\n<p>5. Modyfikacja pliku <code>\/etc\/hosts<\/code>:<\/p>\n<pre class=\"lang:sh decode:true\">192.168.0.1 server.example.com server webserver1.example.com webserver1 vhost1.example.com vhost1<\/pre>\n<p>6. Restart Apacha:<\/p>\n<pre class=\"lang:sh decode:true\"># systemctl restart httpd<\/pre>\n<p>7. Test:<\/p>\n<pre class=\"lang:sh decode:true\"># links http:\/\/vhost1.example.com<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Konfiguracja bardziej skomplikowanego hosta wirtualnego.<\/span><\/p>\n<p>1. Utworzenie pliku <code>\/etc\/httpd\/conf.d\/vhost2.conf<\/code> o tre\u015bci:<\/p>\n<pre class=\"lang:sh decode:true\"># vi \/etc\/httpd\/conf.d\/vhost2.conf\r\n&lt;VirtualHost *:8900&gt;\r\n   ServerAdmin admin@vhost2.example.com\r\n   DocumentRoot \/var\/vhost2\r\n   ServerName vhost2.example.com\r\n   ErrorLog logs\/vhost2-error_log\r\n   CustomLog logs\/vhost2-access_log combined\r\n&lt;\/VirtualHost&gt;<\/pre>\n<p>2. Utworzenie katalogu, w kt\u00f3rym b\u0119dzie sk\u0142adowana strona:<\/p>\n<pre class=\"lang:sh decode:true \"># mkdir \/var\/vhost2<\/pre>\n<p>3. Utworzenie pliku <code>index.html<\/code> w <em>DocumentRoot<\/em>:<\/p>\n<pre class=\"lang:sh decode:true \"># vim \/var\/vhost2\/index.html\r\nThis web page is to test a more complex virtual host setup.<\/pre>\n<p>4. Weryfikacja:<\/p>\n<pre class=\"lang:sh decode:true \"># httpd \u2013D DUMP_VHOSTS\r\nVirtualHost configuration:\r\n*:8900 is a NameVirtualHost\r\ndefault server vhost2.example.com (\/etc\/httpd\/conf.d\/vhost2.conf:1)\r\nport 8900 namevhost vhost2.example.com (\/etc\/httpd\/conf.d\/vhost2.conf:1)\r\nport 8900 namevhost vhost2.example.com (\/etc\/httpd\/conf.d\/vhost2.conf:1)<\/pre>\n<p>5. Modyfikacja pliku <code>\/etc\/hosts<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \">192.168.0.1 serveripv4.example.com serveripv4 vhost2.example.com vhost2\r\nMake the above change to the hosts file on server2 and host1 as well, so that you can test access to this virtual host from there.<\/pre>\n<p>6. Dodanie kontekstu SELinux typ <em>httpd_sys_content_t<\/em> dla katalogu \/<code>var\/vhost2<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># semanage fcontext \u2013at httpd_sys_content_t \u201c\/var\/vhost2(\/.*)?\u201d\r\n# restorecon \u2013Rv \/var\/vhost2<\/pre>\n<p>7. Dodanie portu <em>TCP 8900<\/em> do polityki SELinux typ<em> http_port_t<\/em>:<\/p>\n<pre class=\"lang:sh decode:true \"># semanage port \u2013at http_port_t 8900 \u2013p tcp\r\n# semanage port \u2013l | grep 8900\r\nhttp_port_t tcp 8900, 8989, 80, 81, 443, 488, 8008, 8009, 8443, 9000<\/pre>\n<p>8. Odblokowanie portu TCP 8900 na firewallu:<\/p>\n<pre class=\"lang:sh decode:true \"># firewall-cmd --permanent --add-port 8900\/tcp\r\n# firewall-cmd --reload<\/pre>\n<p>9. Restart Apacha:<\/p>\n<pre class=\"lang:sh decode:true\"># systemctl restart httpd<\/pre>\n<p>10. Test dost\u0119pu lokalnie i zdalnie:<\/p>\n<pre class=\"lang:sh decode:true \"># links http:\/\/vhost2.example.com\r\n# tail -f \/var\/log\/httpd\/vhost2-access_log<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Web serwery SSL\/TLS.<\/span><\/p>\n<p>Secure Socket Layer (SSL) to protok\u00f3\u0142 kryptograficzny, kt\u00f3ry pozwala systememom na bezpieczn\u0105 komunikacj\u0119 przez sie\u0107. Mo\u017ce by\u0107 u\u017cywane wraz z <em>Transport<\/em> <i>Layer Security <\/i>(TLS), protoko\u0142em kt\u00f3ry zapewnia integralno\u015b\u0107, prywatno\u015b\u0107 i bezpieczn\u0105 autentykacj\u0119. Apache dzia\u0142aj\u0105cy w oparciu o SSL i TLS mo\u017ce by\u0107 okre\u015blany jako HTTPS (<i>HyperText Transfer <\/i><i>Protocol Secure<\/i>)\u00a0 webowy serwer SSL. Serwer HTTPS u\u017cywa cyfrowego certyfikatu by dowie\u015b\u0107 swej autentyczno\u015bci klientom, kt\u00f3rzy si\u0119 do niego pod\u0142\u0105czaj\u0105. Certyfikat podpisywany jest przez Certificate Authority (CA). Aby uzyska\u0107 podpis aplikant generuje par\u0119 zaszyfrowanych kluczy prywatny\/publiczny oraz<br \/>\nCSR (Certificate Signing Request) na serwerze, dla kt\u00f3rego ma by\u0107 wystawiony certyfikat. CSR zawiera dane identyfikuj\u0105ce aplikanta takie jak nazwa, adres czy nazw\u0119 systemu hosta. CSR jest szyfrowany przed wys\u0142aniem do CA. CA przegl\u0105da CSR i wydaje podpisany certyfikat. Innym typem certyfikat\u00f3w s\u0105 certyfikaty podpisane samodzielnie. Taki certyfikat jest wygenerowany lokalnie i jest u\u017cywany do cel\u00f3w testowych.<\/p>\n<p>W RHEL pakiety wspieraj\u0105ce HTTPS to <em>mod_ssl<\/em> i <em>openssl<\/em>. Po instalacji <em>mod_ssl<\/em> w katalogu <code>\/etc\/httpd\/conf.d<\/code> pojawi si\u0119 przyk\u0142adowy plik <code>ssl.conf<\/code>, kt\u00f3ry mo\u017ce byy\u0107 wykorzystany jako wz\u00f3r przy uruchamianiu web serwer\u00f3w ssl. Openssl oferuje wiele narz\u0119dzi do tworzenia i zarz\u0105dzania zaszyfrowanymi kluczami, CSRami, cyfrowymi certyfikatami oraz po\u0142\u0105czeniami HTTPS. Komendy dost\u0119pne w pakiecie openssl mo\u017cna wylistowa\u0107 w spos\u00f3b nast\u0119puj\u0105cy:<\/p>\n<pre class=\"lang:sh decode:true \"># openssl list-standard-commands\r\n# openssl list-cipher-commands\r\n# openssl list-message-digest-comands<\/pre>\n<p>Przyk\u0142ad wirtualnego hosta SSL:<\/p>\n<pre class=\"lang:sh decode:true \"> Listen 443 https\r\n \r\n## SSL Virtual Host Context\r\n&lt;VirtualHost _default_:443&gt;\r\n   DocumentRoot \"\/var\/www\/html\"\r\n   ServerName www.example.com:443\r\n   ErrorLog logs\/ssl_error_log\r\n   TransferLog logs\/ssl_access_log\r\n   LogLevel warn\r\n   SSLEngine on\r\n   SSLProtocol all -SSLv2\r\n   SSLCertificateFile \/etc\/pki\/tls\/certs\/host1.crt\r\n   SSLCertificateKeyFile \/etc\/pki\/tls\/private\/host1.key\r\n   &lt;Files \u223c \"\\.(cgi|shtml|phtml|php3?)$\"&gt;\r\n      SSLOptions +StdEnvVars\r\n   &lt;\/Files&gt;\r\n   &lt;Directory \"\/var\/www\/cgi-bin\"&gt;\r\n      SSLOptions +StdEnvVars\r\n   &lt;\/Directory&gt;\r\nCustomLog logs\/ssl_request_log \"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \\\"%r\\\" %b\"\r\n&lt;\/VirtualHost&gt;<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Generowanie pary kluczy i samodzielnie podpisanego certyfikatu.<\/span><\/p>\n<p>1. Instalacja pakiet\u00f3w <em>mod_ssl<\/em> i <em>openssl<\/em>:<\/p>\n<pre class=\"lang:sh decode:true \"># yum \u2013y install mod_ssl openssl<\/pre>\n<p>2. Zmiana katalogu na<code> \/etc\/pki\/tls\/certs<\/code> i wygenerowanie klucza prywatnego o rozmiarze 2048 bits algorytmem RSA.<br \/>\nZapisanie klucza w pliku <code>server.example.com.key<\/code>.<\/p>\n<pre class=\"lang:sh decode:true \"># cd \/etc\/pki\/tls\/certs\r\n# openssl genpkey \u2013algorithm rsa \u2013pkeyopt rsa_keygen_bits:2048 \u2013out server.example.com.key\r\n\r\n\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026.+++\r\n\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026+++\r\nYou can view the man pages ofthe openssl command for details, and run \u201dopenssl genpkey\u201d to\r\nobtain help on the options used.<\/pre>\n<p>3. Utworzenie \u017c\u0105dania podpisania certyfikatu (CSR) w pliku <code>server.example.com.csr<\/code> przy wykorzystaniu klucza prywatnego wygenerowanego w poprzednim punkcie:<\/p>\n<pre class=\"lang:sh decode:true\"># openssl req \u2013new \u2013key server.example.com.key \u2013out server.example.com.csr\r\n\r\nYou are about to be asked to enter information that will be incorporated into your certificate request.\r\nWhat you are about to enter is what is called a Distinguished Name or a DN.\r\nThere are quite a few fields but you can leave some blank\r\nFor some fields there will be a default value, If you enter '.', the field will be left blank.\r\n-----\r\nCountry Name (2 letter code) [XX]:CA\r\nState or Province Name (full name) []:Ontario\r\nLocality Name (eg, city) [Default City]:Toronto\r\nOrganization Name (eg, company) [Default Company Ltd]:example\r\nOrganizational Unit Name (eg, section) []:example\r\nCommon Name (eg, your name or your server's hostname) []:server.example.com\r\nEmail Address []:info@server.example.com\r\nPlease enter the following 'extra' attributes\r\nto be sent with your certificate request\r\nA challenge password []:\r\nAn optional company name []:<\/pre>\n<p>4. Wygenerowanie samodzielnie podpisanego certyfikatu (<code>server.example.com.crt<\/code>) wa\u017cnego 120 dni przy wykorzystaniu klucza prywatnego (<code>server.example.com.key<\/code>) i \u017c\u0105dania podpisania certyfikatu (<code>server.example.com.csr<\/code>) utworzonych wcze\u015bniej:<\/p>\n<pre class=\"lang:sh decode:true\"># openssl x509 \u2013req \u2013days 120 \u2013signkey server.example.com.key \u2013in server.example.com.csr \u2013out server1.example.com.crt\r\n\r\nSignature ok\r\nsubject=\/C=CA\/ST=Ontario\/L=Toronto\/O=example\/OU=example\/CN=server.example.com\/emailAddress=info@server.example.com\r\nGetting Private key<\/pre>\n<p>5. Zabezpieczenie kluczy nadaniem im odpowiednich praw dost\u0119pu and umieszczenie ich w katalogu <code>\/etc\/pki\/tls\/private<\/code>:<\/p>\n<pre class=\"lang:sh decode:true\"># chmod 0600 server.example.com.key\r\n# mv server.example.com.key ..\/private<\/pre>\n<p>6. Sprawdzenie wa\u017cno\u015bci i statusu certyfikatu komend\u0105 <em>openssl<\/em>:<\/p>\n<pre class=\"lang:sh decode:true\"># openssl s_client \u2013connect localhost:443 \u2013state\r\n\r\nCONNECTED(00000003)\r\nSSL_connect:before\/connect initialization\r\nSSL_connect:SSLv2\/v3 write client hello A\r\nSSL_connect:SSLv3 read server hello A\r\ndepth=0 C = --, ST = SomeState, L = SomeCity, O = SomeOrganization, OU = SomeOrganizationalUnit, CN =\r\nserver.example.com, emailAddress = root@server.example.com\r\n\u2026\u2026 . .\r\nCertificate chain\r\n0 s:\/C=--\r\n\/ST=SomeState\/L=SomeCity\/O=SomeOrganization\/OU=SomeOrganizationalUnit\/CN=server.example.com\/emailAddress=root@server.example.com\r\ni:\/C=--\r\n\/ST=SomeState\/L=SomeCity\/O=SomeOrganization\/OU=SomeOrganizationalUnit\/CN=server.example.com\/emailAddress=root@server.example.com\r\nServer certificate\r\n-----BEGIN CERTIFICATE-----\r\nMIIEBjCCAu6gAwIBAgICGeIwDQYJKoZIhvcNAQELBQAwgbcxCzAJBgNVBAYTAi0t\r\nMRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK\r\n\u2026\u2026 . .\r\nThis key and the certificate will be used in our next exercise.<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Konfiguracja bezpiecznego hosta wirtualnego SSL.<\/span><\/p>\n<p>1. Utworzenie DocumentRoot:<\/p>\n<pre class=\"lang:sh decode:true \"># mkdir \/var\/www\/html\/secure<\/pre>\n<p>2. Wykorzystanie przyk\u0142adowego pliku<code> \/etc\/httpd\/conf.d\/ssl.conf<\/code> do konfiguracji witual hosta. Zmieniamy w pliku<code> ssl.conf<\/code> tylko dyrektywy zawarte poni\u017cej, pozosta\u0142e pozostawwiamy bez zmian.<\/p>\n<pre class=\"lang:sh decode:true\">&lt;VirtualHost *:443&gt;\r\n   DocumentRoot \u201c\/var\/www\/html\/secure\u201d\r\n   ServerName server1.example.com:443\r\n   SSLCertificateFile \/etc\/pki\/tls\/certs\/server.example.com.crt\r\n   SSLCertificateKeyFile \/etc\/pki\/tls\/private\/server.example.com.key\r\n&lt;\/VirtualHost&gt;<\/pre>\n<p>3. Weryfikacja sk\u0142adni pliku konfiguracyjnego:<\/p>\n<pre class=\"lang:sh decode:true \"># httpd \u2013D DUMP_VHOSTS\r\n\r\nVirtualHost configuration:\r\n*:443 is a NameVirtualHost\r\ndefault server server1.example.com (\/etc\/httpd\/conf.d\/ssl.conf:8)\r\nport 443 namevhost server.example.com (\/etc\/httpd\/conf.d\/ssl.conf:8)\r\nport 443 namevhost server.example.com (\/etc\/httpd\/conf.d\/ssl.conf:8)<\/pre>\n<p>4. Utworzenie pliku <code>index.html<\/code> w <em>DocumentRoot<\/em>:<\/p>\n<pre class=\"lang:sh decode:true\"># vim \/var\/www\/html\/secure\/index.html\r\nThis web page is to test a more complex virtual host setup.<\/pre>\n<p>5. Zastosowanie kontektu SELinux dla katalogu <code>\/var\/www\/html<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># restorecon \u2013Rv \/var\/www\/html<\/pre>\n<p>6. Odblokowanie <em>https<\/em> na firewallu:<\/p>\n<pre class=\"lang:sh decode:true \"># firewall-cmd --permanent --add-service=https\r\n# firewall-cmd --reload<\/pre>\n<p>7. Restart Apacha:<\/p>\n<pre class=\"lang:sh decode:true \"># systemctl restart httpd<\/pre>\n<p>8. Test dost\u0119pu z hosta lokalnego i zdalnego:<\/p>\n<pre class=\"lang:sh decode:true \"># links https:\/\/server.example.com\r\n# tail -f \/var\/log\/httpd\/server1-ssl_access_log<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Hostowanie dynamicznych stron CGI.<\/span><\/p>\n<p>Apache pozwala nam nie tylko na hostowanie stron statycznych ale tak\u017ce dynamicznych. Skrypt jest uruchamiany w tle a wynik jego wykonania wy\u015bwietlany jest na serwowanej stronie web. Taki mechanizm mo\u017ce by\u0107 realizowany m.in. dzi\u0119ki Common Gateway Interface (CGI). Skrypty CGI mog\u0105 by\u0107 napisane w Perlu, Ruby, Pythonie, C, bashu lub w innym j\u0119zyku programowania.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Uruchomienie podstawowego skryptu CGI.<\/span><\/p>\n<p>1. Utworzenie skryptu <em>systime.sh<\/em> w katalogu <code>\/var\/www\/cgi-bin<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># vim \/var\/www\/cgi-bin\/systime.sh\r\n#!\/bin\/bash\r\necho \u201cContent-type: text\u201d\r\necho\r\necho \u201cThe current system time is `date`\u201d<\/pre>\n<p>2. Zezwolenie na wykonywanie skryptu:<\/p>\n<pre class=\"lang:sh decode:true \"># chmod +x \/var\/www\/cgi-bin\/systime.sh<\/pre>\n<p>3. Aktywacja zmiennej boolean SELinux <em>httpd_enable_cgi<\/em>:<\/p>\n<pre class=\"lang:sh decode:true \"># setsebool \u2013P httpd_enable_cgi 1<\/pre>\n<p>4. Restart Apacha:<\/p>\n<pre class=\"lang:sh decode:true \"># systemctl restart httpd<\/pre>\n<p>5. Test:<\/p>\n<pre class=\"lang:sh decode:true \"># links http:\/\/server1\/cgi-bin\/systime.sh<\/pre>\n<p>6. Sprawdzenie logu:<\/p>\n<pre class=\"lang:sh decode:true \"># tail -n 20 \/var\/log\/httpd\/server1-ssl_access_log file<\/pre>\n<p>7. Sprawdzenie, jakie logi zosta\u0142y zaktualizowane:<\/p>\n<pre class=\"lang:sh decode:true \"># ll \u2013lrt \/var\/log\/httpd:<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Uruchomienie podstawowego skryptu CGI w niedomy\u015blnym katalogu.<\/span><\/p>\n<p>1. Utworzenie katalogu<code> \/var\/dynpage<\/code> do sk\u0142adowania skrypt\u00f3w CGI:<\/p>\n<pre class=\"lang:sh decode:true \"># mkdir \/var\/dynpage<\/pre>\n<p>2. Utworzenie skryptu<em> sysmem.sh<\/em> w katalogu <code>\/var\/dynpage<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># vi \/var\/dynpage\/sysmem.sh\r\n#!\/bin\/bash\r\necho \u2013e \u201cContent-type: text\\n\u201d\r\necho\r\necho \u201cThe system memory usage is $(free \u2013m) \u201d<\/pre>\n<p>3. Dodanie praw wykonywania skryptu:<\/p>\n<pre class=\"lang:sh decode:true \"># chmod +x \/var\/dynpage\/sysmem.sh<\/pre>\n<p>4. Aktywacja zmiennej boolean SELinux <code>httpd_enable_cgi:<\/code><\/p>\n<pre class=\"lang:sh decode:true \"># setsebool \u2013P httpd_enable_cgi 1<\/pre>\n<p>5. Dodanie kontekstu SELinux typ <em>httpd_sys_script_exec_t<\/em> dla katalogu <code>\/var\/dynpage<\/code>:<\/p>\n<pre class=\"lang:sh decode:true\"># semanage fcontext \u2013at httpd_sys_script_exec_t \"\/var\/dynpage(\/.*)?\"\r\n# restorecon \u2013Rv \/var\/dynpage<\/pre>\n<p>6. Modyfikacja dyrektywy <em>ScriptAlias<\/em> w pliku<code> httpd.conf<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \">ScriptAlias \/cgi-bin\/ \/var\/dynpage\/\r\n&lt;Directory \/var\/dynpage&gt;\r\n  AllowOverride None\r\n  Options None\r\n  Require all granted\r\n&lt;\/Directory&gt;<\/pre>\n<p>7. Restart Apacha:<\/p>\n<pre class=\"lang:sh decode:true \"># systemctl restart httpd<\/pre>\n<p>8. Test:<\/p>\n<pre class=\"lang:sh decode:true \"># links http:\/\/server1\/cgi-bin\/sysmem.sh<\/pre>\n<p>9. Sprawdzenie logu:<\/p>\n<pre class=\"lang:sh decode:true \"># tail -f \/var\/log\/httpd\/server1-ssl_access_log<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Serwowanie dynamicznych stron PHP.<\/span><\/p>\n<p>Skrypty PHP mog\u0105 by\u0107 serwowane jako skrypty CGI ale lepiej jest zainstalowa\u0107 modu\u0142 <em>mod_php<\/em>, kt\u00f3ry w\u0142\u0105cza wewn\u0119trzny bardziej wydajny interpreter PHP.\u00a0 Instalacja <em>mod_php<\/em> tworzy nowy plik konfiguracyjny <code>\/etc\/httpd\/conf.d\/php.conf<\/code>, kt\u00f3ry zawiera kilka dyrektyw pozwalaj\u0105cych na uruchamianie skrypt\u00f3w PHP.<\/p>\n<pre class=\"lang:sh decode:true \"># grep -v '^#' \/etc\/httpd\/conf.d\/php.conf\r\n\r\n&lt;FilesMatch \\.php$&gt;\r\n   SetHandler application\/x-httpd-php\r\n&lt;\/FilesMatch&gt;\r\n\r\nAddType text\/html .php\r\nDirectoryIndex index.php\r\n\r\nphp_value session.save_handler \"files\"\r\nphp_value session.save_path \"\/var\/lib\/php\/session\"<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #3366ff;\">Serwowanie dynamicznych stron Python.<\/span><\/p>\n<p>R\u00f3wnie\u017c skrypty Python mog\u0105 by\u0107 serwowane jako skrypty CGI lub przez Web Server Gateway Interface (WSGI) zawarty w module <code>mod_wsgi<\/code>.<\/p>\n<p>1. Instalacja modu\u0142u mod_wsgi.<\/p>\n<pre class=\"lang:sh decode:true \"># yum -y install mod_wsgi<\/pre>\n<p>2. Edycja<code> \/etc\/hosts<\/code>:<\/p>\n<pre class=\"lang:sh decode:true \"># vim \/etc\/hosts\r\n192.168.0.1 server server.example.com www.example.com webapp.example.com<\/pre>\n<p>3. Utworzenie katalogu, w kt\u00f3rym b\u0119dzie hostowany skrypt WSGI:<\/p>\n<pre class=\"lang:sh decode:true \"># mkdir \/var\/www\/webapp<\/pre>\n<p>4. Utworzenie przyk\u0142adowego skryptu WSGI:<\/p>\n<pre class=\"lang:sh decode:true \"># cd \/var\/www\/webapp\r\n# touch webapp.wsgi\r\n# vim webapp.wsgi\r\n\r\ndef application(environ, start_response):\r\nstatus = '200 OK'\r\noutput = 'Hello World!'\r\n\r\nresponse_headers = [('Content-type', 'text\/plain'),\r\n('Content-Length', str(len(output)))]\r\n\r\nstart_response(status, response_headers)\r\n\r\nreturn [output]<\/pre>\n<p>5. Konfiguracja hosta wirtualnego do serwowania skryptu WSGI:<\/p>\n<pre class=\"lang:sh decode:true\"># vim \/etc\/httpd\/conf.d\/wsgi.conf\r\n\r\n&lt;VirtualHost *:80&gt;\r\n   ServerAdmin webmaster@www.example.com\r\n   DocumentRoot \u201e\/var\/www\/webapp\u201d\r\n   ServerName webapp.example.com\r\n   WSGIScriptAlias \/ \/var\/www\/webapp\/webapp.wsgi\r\n   ErrorLog \/var\/log\/httpd\/webapp.example.com-error_log\r\n   CustomLog \/var\/log\/httpd\/webapp.example.com-access_log combined\r\n&lt;\/VirtualHost&gt;\r\n\r\n&lt;Directory \/var\/www\/webapp&gt;\r\n   AllowOverride None\r\n   Require all granted\r\n&lt;\/Directory&gt;<\/pre>\n<p>6. Restart Apacha.<\/p>\n<pre class=\"lang:sh decode:true \"># systemctl restart httpd<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>HTTP (HyperText Transfer Protocol) to sieciowy protok\u00f3\u0142, kt\u00f3ry zapewnia dost\u0119p do stron sieci web w Internecie. Termin hypertext odnosi si\u0119 do strukturyzowanego tekstu, kt\u00f3ry u\u017cywa hyperlink\u00f3w aby zezwoli\u0107 na niesekwencyjny dost\u0119p do informacji hostowanych na serwerze www przez protok\u00f3\u0142 HTTP. Serwer WWW okre\u015blany jest tak\u017ce serwerem HTTP. Klientem sieci web jest zazwyczaj przegl\u0105darka taka jak &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/miro.borodziuk.eu\/index.php\/2017\/07\/28\/serwer-www-apache\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Serwer WWW Apache&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1597,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[],"_links":{"self":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/1593"}],"collection":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1593"}],"version-history":[{"count":60,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/1593\/revisions"}],"predecessor-version":[{"id":1661,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/posts\/1593\/revisions\/1661"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media\/1597"}],"wp:attachment":[{"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1593"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/categories?post=1593"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/miro.borodziuk.eu\/index.php\/wp-json\/wp\/v2\/tags?post=1593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}