Instalacja Apache2 z SSL, CGI, PHP4 i PHP5 oraz MySQL pod Linuksem

Z PHPEdia.pl
Skocz do: nawigacji, wyszukiwania

Wstęp

Instalacja oprogramowania przeprowadzona została wg. poniższych wskazówek pomyślnie na dystrybucjach: debian sarge oraz slackware 10.0

Znak # oznacza, iż polecenie wykonywane było jako użytkownik root. Użytkownik [user] : oznacza zwykłego użytkownika - nie mającego praw root'a. Użytkownika takiego możemy stworzyć poprzez wykonanie jako root następującego polecenia:

 # adduser

i odpowiedzeniu na wyświetlane pod konsolą pytania takie jak nazwa użytkownika, Hasło itp.

Instalacja bazy danych MySQL

pierwszym krokiem będzie pobranie żrżdeś oraz dodanie grupy i użytkownika systemowego pod którym uruchamiany jest serwer baz danych MySQL

 # su - c [user]
 # wget http://sunsite.icm.edu.pl/mysql/Downloads/MySQL-4.0/mysql-4.0.24.tar.gz
 # exit
 # groupadd mysql
 # useradd -g mysql mysql

następnie rozpakowywujemy pobrane źródła:

 # tar -zxvf mysql-4.0.24.tar.gz

przechodzimy do katalogu do którego ów źródła zostały rozpakowane i przystępujemy do procesu kompilacji:

 # cd mysql-4.0.24
 # ./configure --prefix=/usr/local/mysql --with-charset=latin2
 # make
 # make install

po pomyślnej instalacji bazy danych, musimy zainstalować jeszcze bazę danych mysql - bez której nasz mysql nie będzie poprawnie funkcjonować :

 # ./scripts/mysql_install_db

po zainstalowaniu się w katalog /usr/local/mysql/var bazy mysql zmieniamy właściciela i grupę katalogu w którym egzystuje mysql :

 # chown -R mysql /usr/local/mysql
 # chgrp -R mysql /usr/local/mysql

dzięki temu zabiegowi nasz serwer baz danych będzie uruchamiany z prawami normalnego użytkownika ( mysql ). następnie do katalogu, który określiliśmy przy kompilacji parametrem --sysconfdir kopiujemy plik my.cnf

 # cp ./support-files/my-medium.cnf /etc/my.cnf

uruchamiamy serwer mysql :

 # /usr/local/mysql/bin/mysqld_safe &

i sprawdzamy czy rzeczywiście zaczćś on funkcjonować :

 # /usr/local/mysql/bin/mysqladmin ping

powinna zostać wyświetlona następująca informacja :

 # mysqld is alive

zdefiniujemy teraz Hasło do naszego serwera mysql tak aby nie pozostał on otwarty :

 # /usr/local/mysql/bin/mysqladmin -u root password nasze_Hasło

aby uprościć sobie dostęp do najważniejszych narzędzi, utworzymy do nich symboliczne dowiązania :

 # ln -s /usr/local/mysql/bin/mysqladmin /usr/local/bin/mysql.admin
 # ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql.console

zobaczmy jeszcze czy aby napewno do naszego serwera nie można się dostać bez hasśa :

 # mysql.console
 ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)

tak wiąc bez hasśa nikt na root'a mysql się nie dostanie, sprawdżmy jeszcze tylko czy my możemy się do niego dostać :

 # mysql.console -u root -p
 Enter password : *****
 
 Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 13 to server version: 4.0.23a-log
 
 Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 # exit

aby nasz serwer mysql po restarcie maszyny został uruchomiony dokładamy odpowiedni wpis :

  • dla slackware :
 # echo '/usr/local/mysql/bin/mysqld_safe &' >> /etc/rc.d/rc.local
  • dla debian'a :
 # touch /etc/init.d/initialization
 # echo '/usr/local/mysql/bin/mysqld_safe &' >> /etc/init.d/initialization

jeżeli nie chcemy aby dostęp do mysql byś rżnież z zewnątrz ( poza localhost ) w [B]/etc/my.cnf dokonujemy małych modyfikacji, dopisujemy w sekcji [mysqld] :

/etc/my.cnf:

 [mysqld]
 bind-address = 127.0.0.1

koniec instalacji MySQL.

Instalacja serwera www - apache2

apache2 instalować będziemy z obsługę SSL'a - tak wiąc pobieramy dotkniąciem się do żrżdeś apache2, instalujemy najnowszą wersję OpenSSL

 # su - c [user]
 # wget http://www.openssl.org/source/openssl-0.9.7g.tar.gz
 # exit
 # tar -zxvf openssl-0.9.7g.tar.gz
 # cd openssl-0.9.7
 # ./config --prefix=/usr/local/ssl
 # make
 # make install

po zainstalowaniu SSL'a zabieramy się za naszego apache2 :

 # tar -zxvf httpd-2.0.54.tar.gz
 # cd httpd-2.0.54
 # ./configure --prefix=/usr/local/apache2 --enable-so --enable-modules=rewrite --enable-shared=rewrite --enable-ssl --enable-rewrite
 # make
 # make install

po zainstalowaniu serwera apache2, zaczynamy zabawć z naszym httpd.conf, w tym celu zaprzćgamy do roboty nasz ulubiony edytor tekstu, u mnie byś to debianowy nano, ale modyfikacji można równie dobrze dokonywać z poziomu edycji w MC ( midnight commander ). Poniżej załączam opis - jak powinny wyglądać odpowiednie linijki w httpd.conf

/usr/local/apache2/conf/httpd.conf

 "ServerRoot /usr/local/apache2"
 Listen nasze_ip:80
 Listen nasze_ip:443
 
 ServerName nasze_ip
 
 DocumentRoot "/home/www" - powiedzmy że takie
 
 <Directory "/home/www">
 Options Indexes FollowSymLinks
 ....
 </Directory>
 
 DirectoryIndex index.html index.htm
 
 AddDefaultCharset ISO-8859-2 ( tej linijki w httpd.conf nie znajdziemy, trzeba ją dopisać )
 
 NameVirtualHost nasze_ip:80
 NameVirtualHost nasze_ip:443

[sekcja virtualhost - przykładowy nowy Vhost bez obslugi SSL]

 <VirtualHost nasze_ip:80>
 ServerAdmin admin@space
 DocumentRoot /home/www/localhost
 ServerName nasze_ip
 ErrorLog logs/localhost-error_log
 CustomLog logs/localhost-access_log common
 </VirtualHost>

[przykładowy nowy Vhost z obsługę SSL]

 <VirtualHost nasze_ip:443>
 DocumentRoot /home/www/localhost
 ServerName nasze_ip:443
 ServerAdmin root@space
 ErrorLog logs/localhost-error_log
 CustomLog logs/localhost-access_log common
 SSLEngine on
 SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
 SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
 SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
 SetEnvIf User-Agent "."MSIE.*" \
 nokeepalive ssl-unclean-shutdown \
 downgrade-1.0 force-response-1.0
 </VirtualHost>

teraz należy jeszcze co niego zmodyfikować plik : /usr/local/apache2/conf/ssl.conf i zahashować co poniektóre linijki, ponieważ obsługe virtualhosta z SSL ustawiać będziemy w httpd.conf smile.gif

 #Listen 443
 #<VirtualHost _default_:443>
 #  General setup for the virtual host
 #DocumentRoot "/home/www/"
 #ServerName nasze_ip:443
 #ServerAdmin root@space
 #ErrorLog /usr/local/apache2/logs/error_log
 #TransferLog /usr/local/apache2/logs/access_log
 #SSLEngine on
 #SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
 #SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
 #SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
 #SSLOptions +FakeBasicAuth +ExportCertData +CompatEnvVars +StrictRequire
 #<Files ~ "\.(cgi|shtml|phtml|php3?)$">
 #    SSLOptions +StdEnvVars
 #</Files>
 #<Directory "/usr/local/apache2/cgi-bin">
 #    SSLOptions +StdEnvVars
 #</Directory>
 #SetEnvIf User-Agent ".*MSIE.*" \
 #        nokeepalive ssl-unclean-shutdown \
 #        downgrade-1.0 force-response-1.0
 #</VirtualHost>

ok modyfikacji dość, teraz zrobimy sobie dla wygody linka do apachectl

 # ln -s /usr/local/apache2/bin/apachectl /usr/local/bin/apache2

jak rownież dołożymy odpowiednią linijke do rc.local lub naszego debianowego skryptu initialization aby po restarcie maszyny serwer został zainicjowany :

  • dla slackware :
 # echo '/usr/local/apache2/bin/apachectl startssl' >> /etc/rc.d/rc.local
  • dla debian'a :
 # echo '/usr/local/apache2/bin/apachectl startssl' >> /etc/init.d/initialization

oraz co się tyczy stricto Debiana : o ile nie zrobiliśmy już tego wcześniej aby nasz skrypt startowy wogóle byś skryptem startowym systemu, wywołać musimy następującć komende :

 # update-rc.d /etc/init.d/initialization defaults

Zainstalowaliśmy wcześniej openssl'a tak wiąc teraz kiedy mamy rownież zainstalowany serwer www, damy mu możliwość wspżśpracy z SSL.

generujemy główny certyfikat dla naszego serwera :

 # openssl genrsa -des3 -out server.key 1024

rolleyessmileyanim.gif pamietaj jakie ustawiasz Hasło dla certyfikatu

usuwamy haslo z klucza aby umożliwią automatyczny start apache2

 # openssl rsa -in server.key -out server.pem

rolleyessmileyanim.gif podajemy to samo Hasło które wpisaliśmy podczas generowania certyfikatu

generujemy podpis certyfikatu

 # openssl req -new -key server.pem -out server.csr

wypeśniamy pola : country, state, city w momencie kiedy zostaniemy zapytani o 'organization unit' zostawiamy to pole puste [ enter ] pole common name - w nim powinniśmy podać albo adres ip naszego serwera albo jego domene, zalecam domene. pola 'a challenge password' nie musimy wypeśniać.

generujemy tzw. self-signed certificate - certyfikat podpisany 'przez siebie' (podajemy takie samo Hasło jakie podawalismy podczas generowania server.pem )

 # openssl x509 -req -days 365 -in server.csr -signkey server.pem -out server.crt

ok, kiedy wszystko już mamy przygotowane, zabieramy sie do instalacji naszego prywatnego klucza oraz certyfikatu do apache2 :

 # mkdir /usr/local/apache2/conf/ssl.crt
 # cp server.crt /usr/local/apache2/conf/ssl.crt/server.crt
 # mkdir /usr/local/apache2/conf/ssl.key
 # cp server.pem /usr/local/apache2/conf/ssl.key/server.key

kiedy wszystko już praktycznie jest gotowe, sprawdzamy czy nie mamy jakichś błędów w httpd.conf :

 # apache2 -t
 Syntax OK

jeżeli wszystko jest ok, włączamy naszego apache2 z obsługę SSL

 # apache2 startssl

spojrzmy dla pewnosci w procesy i wywolajmy url w przegladarce aby mieć pewność że serwer pracuje prawidśowo.

w procesach widnieć powinno kilka pozycji podobnych do poniższej :

 nobody  14682  0.0  1.0 15296 5168 ?        S    09:05  0:00 /usr/local/apache2/bin/httpd -k start -DSSL

obsługa mod_rewrite

Aby nasz mod_rewrite z którym skompilowaliśmy apache2 funkcjonowaś poprawnie należy w httpd.conf dokonać następujących modyfikacji :

Wyedytujemy httpd.conf w okolicach linijki 335 zaraz pod DocumentRoot "/home/www", struktura musi być następująca jeżeli chcemy mieć możliwość korzystania z mod_rewrite z poziomu .htaccess

<Directory />
Options FollowSymLinks
AllowOverride FileInfo
</Directory>

kawaśek dalej :

<Directory "/home/www">
Options Indexes FollowSymLinks
AllowOverride FileInfo
Order allow,deny
Allow from all
</Directory>

W dowolnym miejscu w httpd.conf dorzucamy jeszcze następujące linijeczki :

# mod_rewrite support
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteLog "/usr/local/apache2/logs/rewrite.log"
RewriteLogLevel 9
< /IfModule>

Aby przetestować czy mod_rewrite działał poprawnie, należy do katalogu dla VirtualHosta, którego sobie utworzymy wprowadzić plik .htaccess o następującej zawartości :

RewriteEngine On
RewriteCond %{HTTP_HOST} ^.*$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/ [R]

dzięki dobrodziejstwu .htaccess i mod_rewrite po wejściu na url, dla którego DocumentRoot wskazuje na katalog zawierający .htaccess z powyższć zawartościć zostaniemy przekierowani na adres www.domain.com

obsługa CGI

Aby mieć możliwość uruchamiania na naszej maszynie skryptów perl'a ( .cgi .pl ) należy w pliku konfiguracyjnym httpd.conf dokonać paru małych modyfikacji :

/usr/local/apache2/conf/httpd.conf modyfikujemy linijke DirectoryIndex

 DirectoryIndex index.html index.htm index.cgi index.pl

dodajemy linijeczke :

 AddHandler cgi-script .cgi .pl

oraz określamy w jakich katalogach mają być parsowane pliki .cgi oraz .pl - jako skrypty CGI, w naszym przypadku wszystkie katalogi cgi-bin we wszystkich podkatalogach * w katalogu /home/www

 <Directory "/home/www/*/cgi-bin">
 Options +ExecCGI
 </Directory>

Teraz sprawdżmy czy nasze skrypty CGI aby napewno działają poprawnie, otwieramy nasz ulubiony edytorek i wpisujemy :

 #!/usr/bin/perl
 print "Content-type: text/html\n\n";
 print "Hello, Im a CGI script and Im gonna print You some environment variables to make You belive that Im working fine smile.gif \n";
 print "

"; foreach $key (keys %ENV) { print "$key --> $ENV{$key}
"; }

Nasz kod zapisujemy jako plik .cgi lub .pl w miejscu w którym nadaliśmy mozliwość parsowania plików jako skrypty CGI. następnie nadajemy odpowiednie prawa dla pliku :

 # chmod 755 /home/www/localhost/cgi-bin/skrypt.cgi
 # chmod +x /home/www/localhost/cgi-bin/skrypt.cgi

teraz sprawdzamy już tylko w przeglądarce czy wszystko działał poprawnie podając w url'u scieżkć do naszego skryptu cgi np. : http://nasze_ip/cgi-bin/skrypt.cgi. Jeżeli wszystko działał poprawnie w przeglądarce powinno pokazać się co nieco zmiennych środowiskowych smile.gif

obsługa php4

zatrzymujemy serwer apache :

 # apache2 stop

następnie pobieramy źródła, rozpakowywujemy je i przystępujemy do kompilacji. php4 zainstalujemy jako moduł dla apache2

moja instalacja php4 byśa non-standard - tak wiąc doinstalowałem wcześniej rzeczy takie jak :

 Zlib 1.2.2 - http://prdownloads.sourceforge.net/libpng/zlib-1.2.2.tar.gz?download
 curl 7.13.1 - http://curl.haxx.se/download.html
 gd 2.0.33 - http://www.boutell.com/gd/
 libmcrypt 2.5.7 - http://sourceforge.net/project/showfiles.php?group_id=87941&package_id=91774&release_id=178782
 mcrypt 2.6.4 - http://sourceforge.net/project/showfiles.php?group_id=87941&package_id=91948&release_id=178780
 mhash 0.9.2 - http://sourceforge.net/project/showfiles.php?group_id=4286
 libiconv 1.9.2 - ftp://ftp.gnu.org/gnu/libiconv/
 libjpeg-6b - http://site.n.ml.org/info/libjpeg/
 libtiff 3.7.1 - http://dl.maptools.org/dl/libtiff/

instalacja tych elementów to prawie zawsze samo :

 ./configure
 make
 make install

ale przed wykonaniem powyższego należy się upewnić wydając polecenie ./configure --help

pamiętać również należy o tym aby nasz pliczek /etc/ld.so.conf zawieraś w sobie między innymi :

 /lib
 /usr/lib
 /usr/local/lib
 /usr/local/ssl/lib

co sprawi iż aplikacje które będziemy instalować ( nie tylko to co tutaj w tym tutorialu ale też cokolwiek innego kiedykolwiek ) będą posiadać informacje na temat środowiska bibliotek naszego systemu - krżcej - plik ld.so.conf zawiera informacje dla środowiska bibliotek systemu w jakich katalogach leżć biblioteki które należy uwzglądnić - po dopisaniu powyższych linijek do ld.so.conf wydajemy polecenie # ldconfig

 # su -c [user]
 # wget http://pl.php.net/distributions/php-4.3.11.tar.gz
 # exit
 # tar -zxvf php-4.3.11.tar.gz
 # cd php-4.3.11.tar.gz

wszystko w jednej linijce ! u mnie wyglądaśo to tak : ( !! jeżeli na serwerze macie zainstalowanego jakiegoś MTA ( mail transport agent ) z obsługę imap'u to do poniższego configure dołączyć możecie --with-imap --with-imap-ssl

 # ./configure --prefix=/usr/local/php4 --with-config-file-path=/usr/local/php4 --sysconfdir=/usr/local/php4 --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql --with-openssl=/usr/local/ssl --enable-discard-path --enable-debug --enable-track-vars --enable-versioning --with-openssl=/usr/local/ssl --with-xml --enable-bcmath --with-bz2 --enable-calendar --with-jpeg-dir=/usr/local --with-png-dir=/usr/lib --with-tiff-dir=/usr/local --with-ttf=/usr/lib --with-curl --with-db --with-dbase --with-pear --enable-exif --enable-ftp --with-gettext --with-iconv --with-iconv-dir=/usr/local --enable-mbstring --with-mcrypt --with-mhash --with-zlib --with-gd --with-gd-native-ttf --with-xslt-sablot=/usr/lib --enable-xslt --enable-wddx --with-kerberos --with-ncurses
 # make
 # make install

teraz zapewne jako iż instalowaliśmy php4 jako moduł do apache2 w pliku : /usr/local/apache2/conf/httpd.conf - powinna znajdować się linijka odpowiedzialna za zaśadowanie modułu : LoadModule php4_module modules/libphp4.so

do httpd.conf dorzucamy jeszcze samą obsługę parsowania php - ponieważ samo zaśadowanie modułu nie wystarcza, tak wiąc dopisujemy np. pod LoadModule php4_module modules/libphp4.so linijki :

 dopisujemy do DirectoryIndex: index.php index.php4
 oraz powiedzmy pod LoadModule php4_module :
 AddType application/x-httpd-php .php
 AddType application/x-httpd-php .php4

teraz skoro mamy już obsługę php4, sprawdżmy czy działał ona poprawnie :

 # apache2 startssl
 # touch /home/www/localhost/phpinfo.php
 # echo '<?php phpinfo(); ?>' >> /home/www/localhost/phpinfo.php

wywołujemy w przeglądarce plik phpinfo.php i naszym oczom powinna się ukazać śadna informacja na temat php4 smile.gif

obsługa php5

obsługę php5 w tym przypadku zamontujemy jako CGI. kwestia dwżch wersji php jako modułów na jednym porcie bez żadnych ProxyPass'ów itp itd. jest dla mnie kwestić ciężkć do przegryzienia jak narazie, no ale może poprostu porzebuje troche więcej czasu, jeżeli uda mi się to zrobić, zamieszczć poprawke w tutorialu, a jeżli udało się komuś z Was to zrobić i macie jakieś konkretne i też zaraz proste rozwiązanie - napiszcie do mnie PW, przeczytam, potestują i jeżeli faktycznie będzie wszystko ok, wprowadzć poprawkć do tego tutka winksmiley.jpg

ściągamy źródła, rozpakowywujemy i instalujemy na pokładzie php5 jako CGI

 # apache2 stop
 # su - c [user]
 # wget http://pl.php.net/distributions/php-5.0.4.tar.gz
 # tar -zxvf php-5.0.4.tar.gz
 # cd php-5.0.4

configure u mnie wyglądaśo tak, ale to czego obsługa ma być zainstalowana to już wiadomo - jak komu pasuje smile.gif tak jak ostatnim razem - jeżeli na naszym systemie posiadamy oprogramowanie pozwalające na dołączenie funkcji --with-imap --with-imap-ssl, dołączamy je smile.gif

 # ./configure --prefix=/usr/local/php5 --with-config-file-path=/usr/local/php5 --sysconfdir=/usr/local/php5 --with-mysql=/usr/local/mysql --with-zlib --with-bzip --with-gd --enable-force-cgi-redirect --enable-bcmath --enable-calendar --enable-ctype --enable-dbase --enable-discard-path --enable-exif --enable-filepro --enable-ftp --enable-gd-imgstrttf --enable-gd-native-ttf --enable-inline-optimization --enable-mbstr-enc-trans --enable-mbstring --enable-mbregex --enable-track-vars --enable-versioning --enable-wddx --enable-bz2 --with-dom=/usr/include/libxml2 --with-ftp --with-gettext --with-gmp --with-jpeg-dir=/usr/local --with-mcal=/usr/include --with-mcrypt --with-mhash --with-png-dir=/usr/lib --with-iconv --with-ncurses --with-xml --with-xslt-sablot=/usr/lib --enable-xslt --with-kerberos --enable-fastcgi --with-openssl=/usr/local/ssl --with-tiff-dir=/usr/local --with-curl
 # make
 # make install

teraz musimy wyedytować ponownie /usr/local/apache2/conf/httpd.conf i dorzucamy do niego taki wpis :

 AddType application/x-httpd-php5 .php5
 ScriptAlias /php/ "/usr/local/php5/bin/"
 Action application/x-httpd-php5 "/php/php"

oraz oczywiście do DirectoryIndex dorzucamy index.php5

następnie pozostaje już tylko start apache2 ( # apache2 startssl ) i utworzenie pliku w /home/www/localhost/phpinfo.php5 z zawartościć <? phpinfo(); ?>

warto mieć również na wzglądzie pliki php.ini i dyrektywe : disable_functions która u mnie zawiera następującć zawartość :

 disable_functions = shell_exec, system, passthru, escapeshellcmd, escapeshellarg

tak wiąc wypada na to że to już wszystko Teraz na naszej maszynie powinno sprawnie funkcjonować: Apache2 + SSL + CGI + PHP4 + PHP5 + MySQL-4.0

Utworzono na podstawie http://forum.php.pl/index.php?showtopic=30631