Technologie serwerowe WWW Grzegorz Marczak
Instalacja Centosa 7 w wersji Mininal Strefa czasowa Język (tylko i wyłącznie angielski!) Partycjonowanie dysku Zadania po instalacji: Uruchomienie sieci: nmtui i jej statyczna konfiguracja Ustawienie hostname Uruchomienie demona sshd Aktualizacja systemu i instalacja pakietu epel-release Wyłączenie SELinux Wyłączenie firewalla – wymaga konfiguracji – wrócimy później
Instalacja pakietów net-tools vim httpd php mod_ssl java-1.8.0-openjdk.x86_64
Tworzenie „domen” Trochę przygotowań yum install xorg-x11-xauth firefox.x86_64 Tworzymy substytut DNS w /etc/hosts MÓJ_IP domena1.tsw.nsi domena2.tsw.nsi Łączymy się z VM przez Putty z przekierowaniem X11 Uruchamiamy firefoxa
Pierwsze uruchomienie Apacha systemctl start httpd Nasz serwer WWW obsługuje w chwili obecnej jedynie statyczne treści udostępniane przez protokoły HTTP (port 80) i HTTPS (port 443)
Elementarne zmiany w konfiguracji Tutaj możemy coś pozmieniać… /etc/httpd/conf/httpd.conf /etc/httpd/conf.modules.d/ /etc/httpd/conf.d/* Plik /etc/httpd/conf/httpd.conf Listen 80 DocumentRoot "/var/www/html„
Elementarne zmiany w konfiguracji <Directory "xxxxx"> AllowOverride None #przeciążenie uprawnień katalogu nadrzędnego Options Indexes FollowSymLinks Require all granted #serwer będzie serwował całą zawartość </Directory> <DirectoryMatch "regex"> - wariant z nazwą katalogu w postaci wyrażenia regularnego DirectoryIndex index.php index.htm index.html index.myext
Uruchamiamy obsługę stron użytkowników /etc/httpd/conf.d/userdir.conf Domyślnie serwer udostępnia zawartość katalogów /home/*/public_html Opcja UserDir disabled
Konfigurujemy HTTPS Konfiguracja HTTPS opiera się na wirtualnym hoście, udostępniającym zawartość na porcie 443 Domyślna konfiguracja nie jest zła, ale kilka rzeczy należy poprawić wygenerować nowe (prawidłowe dla domeny) certyfikaty ograniczyć listę bezpiecznych protokołów i algorytmów kryptograficznych: SSLCipherSuite EECDH+AES:EDH+AES:-SHA1:EECDH+AES256:EDH+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5:!3DES:!PSK:!SRP:!DSS:!AECDH:!RC4
Certyfikat CA openssl req -new -x509 -days 3650 -extensions v3_ca -keyout cakey.pem -out cacert.pem CSR openssl genrsa -out cert.key 2048 openssl req -new -sha256 -key cert.key -out cert.csr Podpisanie certyfikatu openssl x509 -req -days 360 -in cert.csr -CA cacert.pem -CAkey cakey.pem -CAcreateserial -out cert.pem
Certyfikat Kopiujemy pliki cacert.pem, cert.pem i cert.key do /etc/httpd/cert i modyfikujemy zawartość pliku ssl.conf SSLCertificateFile /etc/httpd/cert/cert.pem SSLCertificateKeyFile /etc/httpd/cert/cert.key SSLCACertificateFile /etc/httpd/cert/cacert.pem
Wirtualne hosty NameVirtualHost poczta.mat.umk.pl:80 ServerName poczta.mat.umk.pl ServerAlias poczta.mat.uni.torun.pl #DocumentRoot /www/sites/horde Redirect permanent / https://poczta.mat.umk.pl/ </VirtualHost>
Wirtualne hosty NameVirtualHost poczta.mat.umk.pl:443 <VirtualHost poczta.mat.umk.pl:443> ServerName poczta.mat.umk.pl ServerAlias poczta.mat.uni.torun.pl DocumentRoot /www/sites/horde SSLEngine On SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder on SSLCipherSuite EECDH+AES:EDH+AES:-SHA1:EECDH+RC4:EDH+RC4:RC4-SHA:EECDH+AES256:EDH+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5:!3DES:!PSK:!SRP:!DSS:!AECDH SSLCertificateFile /etc/httpd/certs/wildmatumk.pem SSLCertificateKeyFile /etc/httpd/certs/wildmatumk.key SSLCertificateChainFile /etc/httpd/certs/chain.pem </VirtualHost>
Wirtualne hosty – tworzymy własny W pliku /etc/httpd/conf.d/domena1.conf wstawiamy Alias "/d1" /var/www/html/d1 NameVirtualHost domena1.tsw.nsi:80 <VirtualHost domena1.tsw.nsi:80> ServerName domena1.tsw.nsi ServerAlias *.domena1.tsw.nsi DocumentRoot /var/www/html/d1 </VirtualHost>
Wirtualne hosty – tworzymy własny W pliku /etc/httpd/conf.d/domena1.conf wstawiamy NameVirtualHost domena1.tsw.nsi:443 <VirtualHost domena1.tsw.nsi:443> ServerName domena1.tsw.nsi ServerAlias *.domena1.tsw.nsi DocumentRoot /var/www/html/d1 SSLEngine On SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder on SSLCipherSuite EECDH+AES:EDH+AES:-SHA1:EECDH+AES256:EDH+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5:!3DES:!PSK:!SRP:!DSS:!AECDH:!RC4 SSLCertificateFile /etc/httpd/cert/cert.pem SSLCertificateKeyFile /etc/httpd/cert/cert.key SSLCACertificateFile /etc/httpd/cert/cacert.pem </VirtualHost>
PHP Po zainstalowaniu PHP domyślnie pliki *.php są obsługiwane przez interpreter PHP dla wszystkich katalogów Można wyłączyć obsługę PHP dla danego katalogu komendą W pliku .htaccess: php_flag engine off W dyrektywie Directory: php_admin_value engine Off
PHP Jak powiedzieć PHP, że ma przeprocesować dany plik? <IfModule mime_module> AddType application/x-httpd-php .myext AddType .... </IfModule> .htaccess: Addhandler application/x-httpd-php .html .php .myext
mod_rewrite Moduł ten pozwala modyfikować adresy URL Reguły można umieszczać zarówno w plikach *.conf, jak i .htaccess Przykłady: RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
mod_rewrite Przykłady: RewriteEngine on RewriteCond %{HTTP_HOST} ^www.mat.uni.torun.pl [or] RewriteCond %{HTTP_HOST} ^mat.uni.torun.pl [or] RewriteCond %{HTTP_HOST} ^mat.umk.pl RewriteRule (.*) http://www.mat.umk.pl/$1 [R=301,L]
Tomcat Wypakowanie Tomcata: cd /opt unzip apache-tomcat-7.0.82.zip chmod 755 /opt/apache-tomcat-7.0.82/bin/*.sh yum install tomcat-native.x86_64 Start /opt/apache-tomcat-7.0.82/bin/startup.sh Stop /opt/apache-tomcat-7.0.82/bin/shutdown.sh
Tomcat – parametry startowe Tomcat napisany jest w Javie – gdy ma mało pamięci to działa… słabo Konfiguracja pamięci i podobnych: plik setenv.sh JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF8 -Duser.timezone=Europe/Warsaw -server -Xmn256m -XX:ParallelGCThreads=4 -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+OptimizeStringConcat -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:NewSize=256m -XX:MaxNewSize=256m -Xms1024m -Xmx1024m" Tomcat domyślnie działa na porcie 8080
Tomcat – podstawowa konfiguracja Plik server.xml Zmiana portu z 8080 na 80 Wyłączenie AJP (na razie) Przygotowania keystore Konfiguracja HTTPS
Tomcat – certyfikaty Konwertujemy certyfikaty apacha z formatu PEM do formatu JKS openssl pkcs12 -export -out cert.p12 -inkey cert.key -in cert.pem -certfile cacert.pem keytool -importkeystore -srckeystore cert.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype jks keytool -import -trustcacerts -alias ca -file cacert.pem -keystore keystore.jks
Tomcat – konektory – HTTP Konfiguracja konektorów <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" />
Tomcat – konektory – HTTPS Konfiguracja konektorów <!--Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /--> <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" enableLookups="false" keystoreFile="/ opt/apache-tomcat-7.0.82/conf/keystore.jks" keystorePass="xxxxxx" keyAlias="1" clientAuth="false" sslProtocol="TLS" ciphers="TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA"/>
Tomcat – wirtualne hosty <Host name="domena1.tsw.nsi" appBase="domain1" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="domain1_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name="domena2.tsw.nsi" appBase="domain2" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="domain2_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
Tomcat – użytkownicy Userów i role dodajemy w pliku tomcat-users.xml <role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <user username="admin" password="admin123" roles="manager-gui"/> Userzy i role mogą być wykorzystane w dowolnych aplikacjach działających pod kontrolą Tomcata
Tomcat i httpd razem Kiedy to ma sens? Np. gdy chcemy udostępniać na jednym serwerze na tych samych portach jednocześnie aplikacje napisane w PHP oraz w Javie w jednej lub kilku domenach Wykorzystujemy w tym celu moduł proxy_ajp_module oraz konektor AJP
Tomcat i httpd razem Konfiguracja Tomcata Wyłączamy konektory HTTP i HTTPS Włączamy konektor AJP <Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8080" URIEncoding="UTF-8" maxThreads="250" acceptCount="2500" />
Tomcat i httpd razem Plik tomcat.conf apacha NameVirtualHost domena2.tsw.nsi:80 <VirtualHost domena2.tsw.nsi:80> ServerName domena2.tsw.nsi ServerAlias *.domena2.tsw.nsi ProxyPass / ajp://localhost:8009/ ProxyPassReverse / ajp://localhost:8009/ </VirtualHost>
Tomcat i httpd razem Plik tomcat.conf apacha NameVirtualHost domena2.tsw.nsi:443 <VirtualHost domena2.tsw.nsi:443> ServerName domena2.tsw.nsi ServerAlias *.domena2.tsw.nsi ProxyPass / ajp://localhost:8009/ ProxyPassReverse / ajp://localhost:8009/ SSLEngine On SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder on SSLCipherSuite EECDH+AES:EDH+AES:-SHA1:EECDH+AES256:EDH+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5:!3DES:!PSK:!SRP:!DSS:!AECDH:!RC4 SSLCertificateFile /etc/httpd/cert/cert.pem SSLCertificateKeyFile /etc/httpd/cert/cert.key SSLCACertificateFile /etc/httpd/cert/cacert.pem </VirtualHost>
Tomcat i httpd razem Jak pominąć obsługę przez AJP jakiejś podstrony w domenie obsługiwanej przez Tomcata? ProxyPass /strona_w_php !