Gyula CMS telepítése (Jessie)

A AdminWiki wikiből

A Gyula CMS egy Linux-Apache-MySQL-PHP (LAMP) környezetben futtatható, egyedi fejlesztésű, döntően web-1-es tartalomkezelő (szerkesztőségi) rendszer - fejlesztője Annár Gyula.

Jelenleg a Gyula CMS-nek nincsen közösen használható kódkészlete, így a teljes motort minden virtualhostba külön-külön kell telepíteni (TODO!). Egységes telepítőkészlet sem áll rendelkezésre, így a környezet kialakítását követően a tényleges telepítést (adatbázis-hozzáférés és WebDAV hozzáférés birtokában) a fejlesztő végzi.

Ez a leírás elsősorban példaként szolgál hasonló, egyedi fejlesztésű webszolgáltatások szigorúbb házirend szerinti üzemeltetéséhez.

Tartalomjegyzék

Előfeltételek

  • Házirend szerint telepített LAMP szerver: Apache2 és wsm2, MySQL, PHP.
  • Szükség van a PHP GD, opcionálisan CURL moduljaira (ha még nem lennének telepítve):
apt-get install php5-gd   # Kötelező
apt-get install php5-curl # Opcionális
  • A PHP beállításoknál a levélküldésre és include-ra szükség van (a wsm 2.6 vagy későbbi változataiban ez alapértelmezetten engedélyezett):
-rw-r--r-- root root /etc/php5/apache2/conf.d/99-wsm2-php5.ini

[...]
disable_functions = [...]; mail, include
[...]

Megjegyzés: a beállítások érvényesítéséhez a webszerverek konfigurációit újra kellene olvastatni, de ezt elhagyhatjuk, mert később a wsm2 úgyis megteszi.

  • TODO!

Virtualhost kialakítása

A virtualhostot a szokott módon, a wsm2 segítségével készítjük el; ennek 2.6 vagy későbbi verzióinál, ha van a /etc/ssl/certs-ben elhelyezett, hitelesített webszerver SSL tanúsítványunk, annak fájlnevét (kiterjesztés nélkül) megadhatjuk harmadik paraméterként (ellenkező esetben önaláírt tanúsítvány készül):

wsm2 -cw FULLY.QUALIFIED.HOSTNAME sysadmin@MYDOMAIN certificate_name

Ügyeljünk arra, hogy a FULLY.QUALIFIED.HOSTNAME a www előtaggal kezdődjék!

A beállítások idejére érdemes a virtualhostot letiltani:

a2dissite FULLY.QUALIFIED.HOSTNAME
systemctl reload apache2

Ha a FULLY.QUALIFIED.HOSTNAME DNS feloldása még nem mutat a telepítés alatti szervergépre, vegyünk fel egy kivételt az urlcheck számára:

rw-r--r-- root root /etc/apache2/urlcheck.exception

[...]
FULLY.QUALIFIED.HOSTNAME    FULLY.QUALIFIED.HOSTNAME.SERVER_FULLY.QUALIFIED.HOSTNAME

így az urlcheck mindig a konkrét szervergépen lévő példányt ellenőrzi.

Fájlrendszer beállítások

A wsm2 által létrehozott download könyvtárat töröljük. A virtualhost tárterületén az egyedi tartalom részére a www-data által írható tárterületet (a files könyvtárat és ezalatt a log, private, public, tmp hierarchiát) fizikailag is el kell készíteni:

cd /var/www/FULLY.QUALIFIED.HOSTNAME
pwd # Biztos, ami biztos...

rm -R download
mv upload files
mkdir -m 2770 files/log/;            chown webadmin:www-data files/log
mkdir -m 2770 files/private/;        chown webadmin:www-data files/private
mkdir -m 2770 files/public/;         chown webadmin:www-data files/public
mkdir -m 2770 files/public/cikkepek; chown webadmin:www-data files/public/cikkepek
mkdir -m 2770 files/public/temp;     chown webadmin:www-data files/public/temp
mkdir -m 2770 files/tmp/;            chown webadmin:www-data files/tmp

Elő kell készíteni továbbá az _admin könyvtárat és néhány symlinket:

mkdir -m 2750 _admin; chown webadmin:www-data _admin
ln -s ../config                _admin/config;   chown -h webadmin:www-data _admin/config
ln -s ../files/public/cikkepek _admin/cikkepek; chown -h webadmin:www-data _admin/cikkepek
ln -s ../files                 _admin/files;    chown -h webadmin:www-data _admin/files
ln -s ../files/log             _admin/log;      chown -h webadmin:www-data _admin/log
ln -s ../files/log             log/applog;      chown -h webadmin:www-data log/applog

A teszteléshez szükség lesz három .php kiterjesztésű tartalomra, amelyeket a wsm2 által létrehozott index.html-ből állítunk elő:

cat index.html |  sed "s/www\./admin\./g"  >_admin/index.php;  chown webadmin:www-data _admin/index.php;  chmod 640 _admin/index.php
cat index.html |  sed "s/www\./keptar\./g" >_admin/keptar.php; chown webadmin:www-data _admin/keptar.php; chmod 640 _admin/keptar.php
cat index.html |  sed "s/www\./kepcache\./g" >kepcache.php;    chown webadmin:www-data kepcache.php;      chmod 640 kepcache.php
mv index.html index.php

Amennyiben a virtualhost neve www. előtaggal kezdődött, a létrehozott teszt tartalmakba ehelyett a megfelelő admin., keptar. illetve kepcache. előtagok kerültek.

Ezzel a fájlrendszert tesztelésre előkészítettük.

A webszerver beállításai

Az Apache-2 webszerverben a virtualhost wsm2 által definiált beállításait az alábbiak szerint módosítsuk:

  • állítsuk be a ServerAlias-okat mind a http, mind a https konfigurációs részben:
rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

[...]
    ServerName          www.DOMAINNAME
    ServerAlias           *.DOMAINNAME
    ServerAlias             DOMAINNAME
    ServerAlias         www.DOMAINNAME.SERVER.FULLY.QUALIFIED.HOSTNAME
    ServerAlias           *.DOMAINNAME.SERVER.FULLY.QUALIFIED.HOSTNAME
[...]
  • mind a http, mind a https konfigurációs részben opcionálisan tiltsuk le a HTTP/1.1 keep-alive kapcsolatok használatát az Internet Explorer böngészőkben (a Gyula CMS általában Ajax/JS felületű, és tapasztalat szerint ezek a böngészők az Ajax használatakor nem veszik figyelembe az alapértelmezett KeepAlive: timeout szerver válaszfejlécet, így megpróbálnak már lezárt kapcsolaton keresztül kommunikálni):
rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

<VirtualHost *:80 >
[...]
    # Fix buggy clients' communications.
    <IfModule setenvif_module>
        [...]
        ## Internet Explorer up to 10.x (Ajax KeepAliveTimeout problem)
        SetEnvIf User-Agent ".*MSIE [17-9].*" \
            nokeepalive
        ## Internet Explorer 11.x (Ajax KeepAliveTimeout problem)
        SetEnvIfNoCase User-Agent "^Mozilla\/5\.0 \(Windows NT.*rv:11" \
            nokeepalive
    </IfModule>

[...]

# Administration and special features via SSL.
<IfModule mod_ssl.c>
    <VirtualHost *:443 >
    [...]
        # Fix buggy clients' communications.
        <IfModule setenvif_module>
            [...]
            ## Internet Explorer up to 10.x
            SetEnvIf User-Agent ".*MSIE [17-9].*" \
                ssl-unclean-shutdown \
                nokeepalive
            ## Internet Explorer 11.x (the KeepAliveTimeout problem)
            SetEnvIfNoCase User-Agent "^Mozilla\/5\.0 \(Windows NT.*rv:11" \
                ssl-unclean-shutdown \
                nokeepalive
            [...]
  • a PHP beállításokban engedélyezzük a PHP végrehajtást, vegyük ki a kommenteket az alábbi beállítások elől, és módosítsuk az átmeneti feltöltési könyvtár útvonalát. Szükség szerint az egyszerre feltölthető file méretet is megemelhetjük (az alábbiak részben a wsm2 alapbeállításai):
rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

[...]
    <IfModule mod_php5.c>
        php_admin_flag engine on
[...]
        php_admin_value include_path .:/usr/share/php5/
        #php_admin_value safe_mode_exec_dir bin/
        php_admin_value memory_limit 32M
        php_admin_value max_execution_time 30
        php_admin_flag magic_quotes_gpc off
        php_admin_flag magic_quotes_runtime off
        php_admin_flag magic_quotes_sybase off
        php_admin_flag file_uploads on
#       php_admin_flag apc.rfc1867 on
        php_admin_value upload_max_filesize 10M
        php_admin_value post_max_size 10M
        php_admin_value upload_tmp_dir /var/www/FULLY.QUALIFIED.HOSTNAME/files/tmp/
[...]
  • a Gyula CMS adatforgalma a ModSecurity-vel jelenleg értelmesen nem szűrhető (TODO!), ezért azt kénytelenek vagyunk kikapcsolni:
rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

[...]
    # ModSecurity settings (entire virtualhost).
    <IfModule security2_module>
        # Engine On/Off/DetectionOnly.
        SecRuleEngine Off
        [...]
    </IfModule>
[...]
  • definiáljuk a http konfigurációban a Gyula CMS működéséhez szükséges átirányításokat:
rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

[...]
    # Application-specific rewrites.
    <IfModule mod_rewrite.c>
        [...]
        # Imagecache settings
        RewriteCond %{REQUEST_URI} ^/files/public/temp
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
        RewriteRule ^(.*)$      /kepcache.php?image=%{REQUEST_URI} [L,QSA]
        # admin.FQHN rewrited to /_admin subfolder
        RewriteCond %{HTTP_HOST} ^admin\.
        RewriteRule ^(.*)       /_admin$1 [L,QSA]
        # keptar.FQHN rewrited to /_admin subfolder and keptar.php
        RewriteCond %{HTTP_HOST} ^keptar\.
        RewriteRule !\.(ico|flv|gif|jpg|png)$ /_admin/keptar.php [L,QSA]
        RewriteCond %{HTTP_HOST} ^keptar\.
        RewriteRule ^(.*)       /_admin$1 [L,QSA]
        # Almost all web requests are rewrited to index.php
        RewriteCond %{HTTP_HOST}   !^admin\.
        RewriteCond %{REQUEST_URI} !/robots.txt$
        RewriteCond %{REQUEST_URI} !/FCKeditor/
        RewriteCond %{REQUEST_URI} !\.(css|js|ttf)$
        RewriteCond %{REQUEST_URI} !\.(flv|gif|ico|jpg|mp3|png|swf)$
        RewriteCond %{REQUEST_URI} !\.(eot|otf|svg|ttf|woff|woff2)$
        RewriteCond %{REQUEST_URI} !\.(doc|docx|od.|pdf|ppt|pptx|xls|xlsx)$
        RewriteCond %{REQUEST_URI} !\.(arj|gz|rar|tar|tgz|zip)$
        RewriteRule (.*)        /index.php [L,QSA]
    </IfModule>
[...]
  • készítsünk egy <Directory> bejegyzést az _admin kezelésére; itt eltérő PHP beállítások szükségesek, és a ModSecurity-t itt mindenképpen érdemes kikapcsolni, illetve a nagyobb méretű POST-okat engedni:
rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

[...]
    # Gyula CMS admin
    <Directory /var/www/FULLY.QUALIFIED.HOSTNAME/_admin>
        Require all granted
        AllowOverride all
        ## Bugous, take care!
        ## AllowOverrideList None
        Options +FollowSymLinks
        AddDefaultCharset   utf-8

        <IfModule mod_php5.c>
            php_admin_flag engine on
            php_admin_flag magic_quotes_gpc Off
            php_admin_flag track_vars On
            php_admin_value default_charset utf-8
            php_admin_value open_basedir /var/www/FULLY.QUALIFIED.HOSTNAME/_admin/:/var/www/FULLY.QUALIFIED.HOSTNAME/config/:/var/www/FULLY.QUALIFIED.HOSTNAME/files/
            php_admin_value include_path .:/var/www/FULLY.QUALIFIED.HOSTNAME/_admin/:/var/www/FULLY.QUALIFIED.HOSTNAME/config/
            # You may raise the limits below
            php_admin_value memory_limit 32M
            php_admin_value max_execution_time 30
            php_admin_value upload_max_filesize 10M
            php_admin_value post_max_size 10M
            php_admin_flag allow_url_fopen on
            php_admin_value user_agent 'PHP (5.x)'
        </IfModule>

        <IfModule security2_module>
            # Engine On/Off/DetectionOnly.
            SecRuleEngine Off
            # Overriding conservative 128K limit up to php_admin_value post_max_size
            SecRequestBodyNoFilesLimit 10485760
        </IfModule>

    </Directory>
[...]
  • töröljük a nem használt download könyvtárra vonatkozó <Directory> bejegyzéseket;
  • módosítsuk, illetve egészítsük ki az upload könyvtárra vonatkozó <Directory> bejegyzést:
rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

[...]
    # Official upload directory (writable by www-data).
    <Directory /var/www/FULLY.QUALIFIED.HOSTNAME/files>
[...]
    </Directory>
    # Public area
    <Directory /var/www/FULLY.QUALIFIED.HOSTNAME/files/public>
        Require all granted
        Options +FollowSymLinks
    </Directory>
    # Applications' logfiles
    <Directory /var/www/FULLY.QUALIFIED.HOSTNAME/files/log>
        Require all granted
        Options +FollowSymLinks
    </Directory>
[...]

Ne feledjük a FULLY.QUALIFIED.HOSTNAME hivatkozásokat kitölteni!

Gyorsteszt

Mivel a CMS motort és az adatbázist a fejlesztő tölti fel, itt csak az átirányításokat tudjuk letesztelni. Engedélyezzük a virtualhostot a fentebb beállított Apache konfigurációval:

a2ensite FULLY.QUALIFIED.HOSTNAME
systemctl reload apache2

Ezután egy, a telepítés alatt álló szervert http protokollon elérő kliensgép grafikus böngészőjében hívjuk be az alábbi URL-eket:

  • http://www.DOMAINNAME.SERVER.FULLY.QUALIFIED.HOSTNAME/
  • http://admin.DOMAINNAME.SERVER.FULLY.QUALIFIED.HOSTNAME/
  • http://keptar.DOMAINNAME.SERVER.FULLY.QUALIFIED.HOSTNAME/
  • http://www.DOMAINNAME.SERVER.FULLY.QUALIFIED.HOSTNAME/files/public/temp/valami.jpg

Eredményül rendre az előkészített teszt PHP tartalmakat (www.DOMAINNAME, admin.DOMAINNAME, keptar.DOMAINNAME illetve kepcache.DOMAINNAME feliratokat) kell kapjuk.

További tesztként a

  • http://www.DOMAINNAME.SERVER.FULLY.QUALIFIED.HOSTNAME/valami
  • http://www.DOMAINNAME.SERVER.FULLY.QUALIFIED.HOSTNAME/valami.jpg

hívások közül az elsőre a www.DOMAINNAME feliratot, a másodikra a rewrite alóli kivételként a webszerver beállítása szerinti 404-es hibaüzenetet kell kapnunk.

További teszt: TODO!

MySQL adatbázis készítése

A MySQL adatbázisnak egyetlen, az adatbázisra nézve teljes jogú felhasználója van, akinek neve célszerűen megegyezik az adatbázis nevével. Konvenció szerint ezt a nevet a gy_ előtaggal kezdjük.

Az adatbázist és a felhasználót a MySQL root hozzáféréssel hozzuk létre:

mysql --defaults-file=/etc/mysql/root.cnf

mysql> CREATE DATABASE gy_WEBNAME CHARACTER SET utf8 DEFAULT COLLATE utf8_hungarian_ci;
mysql> GRANT ALL PRIVILEGES ON gy_WEBNAME.* TO 'gy_WEBNAME'@'localhost' IDENTIFIED BY 'PASSWORD';
mysql> FLUSH PRIVILEGES;

ahol a PASSWORD egy megfelelő jelszó. Relatív megjegyezhető, mégis erős jelszó a pwgen segédprogrammal is generálható, pl. a következőképpen:

/usr/bin/pwgen -s -n -c 12 1

Ellenőrizzük, hogy a felhasználó megfelelően létrejött-e:

mysql> SELECT host, user, password FROM mysql.user ORDER BY user;
+-----------+------------------+---------------------------------------------+
| host      | user             | password                                    |
+-----------+------------------+---------------------------------------------+
| localhost | gy_WEBNAME       | *73CDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
[...]
+-----------+------------------+---------------------------------------------+

mysql> quit

Ezután próbáljunk a létrehozott felhasználó nevében és jelszavával belépni. Az alábbi parancsokkal ellenőrizhetjük, hogy a felhasználó jogosultságai valóban csak erre az adatbázisra terjednek ki:

mysql -u gy_WEBNAME -p
Enter password:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| gy_WEBNAME         |
+--------------------+

A felhasználó felvételét és kipróbálását követően töröljük le a .mysql_history állományt, mert ebben a jelszó szabad szöveges formában benne van:

rm ~/.mysql_history

Az adatbázis iniciális feltöltését a fejlesztő végzi.