maanantai 30. syyskuuta 2024

Rocky Linux 9 asennus osa 4: PHP ja PHP-FPM

PHP on ohjelmointikieli, jota tarvitaan useiden nettisovellusten kuten WordPressin tai Drupalin taustalla. PHP-FPM antaa mahdollisuuden suorittaa rinnakkain useita eri PHP:n versioita, joka helpottaa palvelimen päivitystä.

Lisää Remirepo Rocky Linux 9:n paketinhallintaan komennolla

sudo dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-9.rpm -y

Katso tarjolla olevat PHP-versiot

sudo dnf module list php

Asenna PHP ja yleisimmin tarvittavat moduulit

sudo yum install php85-php-cli php85-php-fpm php85-php-gd php85-php-mbstring \ php85-php-mysqlnd php85-php-opcache php85-php-pdo php85-php-pecl-apcu \ php85-php-pecl-igbinary php85-php-pecl-imagick-im7 php85-php-pecl-zip \ php85-php-soap php85-php-xml

Avaa tekstieditoriin /etc/opt/remi/php85/php-fpm.d/www.conf tiedosto ja korvaa sisältö alla olevalla koodilla

[www]
user = apache
group = apache

listen = /var/opt/remi/php85/run/php-fpm/www.sock
listen.acl_users = apache
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500

php_value[session.save_handler] = files
php_value[session.save_path] = /var/opt/remi/php85/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/opt/remi/php85/lib/php/wsdlcache

Lisää /etc/httpd/vhosts.d-hakemistoon Apache asetustiedosto, joka määrittelee PHP-sivuston. Valmis vhosts.d-tiedosto sisältää esimerkiksi koodin:

<Directory "/var/www/omasaitti">
    AllowOverride All
    Options FollowSymLinks
    Require all granted
    AllowMethods GET POST PUT DELETE OPTIONS
</Directory>

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName omasaitti.fi
    Include conf/vhost.conf

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =omasaitti.fi
    RewriteRule ^ https://omasaitti.fi%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
    DocumentRoot /var/www/omasaitti
    ServerName omasaitti.fi
    Include conf/vhost.conf

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/omasaitti.fi/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/omasaitti.fi/privkey.pem

    DirectoryIndex index.php index.html
    <FilesMatch "\.(php|phar)$">
        SetHandler "proxy:unix:/var/opt/remi/php85/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

missä /var/www/omasaitti on hakemisto, jossa sivusto sijaitsee ja omasaitti.fi on sivustosi verkkotunnus.

Lisää itsesi Apache-ryhmään komennolla

sudo usermod -a -G apache teppo

missä teppo on käyttäjänumesi.

Anna /var/www-hakemisto apache-ryhmän hallintaan

sudo chown -R teppo:apache /var/www sudo chmod -R g+rx,o-rwx /var/www sudo find /var/www -type d -exec chmod g+s {} \; sudo find /var/www -type d -exec setfacl -dm g::rx,o::- {} \;

Asenna sivusto siirtämällä tiedostot /var/www-hakemiston alle. Jos PHP-koodi muokkaa tai tiedostoja asennushakemiston alla, niin anna PHP-FPM:lle kirjoitusoikeudet hakemistoon komennoilla

chmod -R g+w /var/www/omasaitti/tmp find /var/www/omasaitti/tmp -type d -exec setfacl -dm g::rwx,o::- {} \;

missä /var/www/omasaitti/tmp on kirjoitettava hakemisto.

Käynnistä PHP-FPM nyt ja aseta se käynnistymään jatkossa laitteen käynnistyksen yhteydessä

sudo systemctl start php85-php-fpm sudo systemctl enable php85-php-fpm

Tämä kirjoitus on neljäs osa seikkailua Rocky Linux 9:n parissa. Lue edellinen osa tästä blogista.

Päivitetty 18.6.2025: PHP versio 8.4

Päivitetty 12.4.2026: PHP versio 8.5

torstai 26. syyskuuta 2024

Rocky Linux 9 asennus osa 3: Let's Encrypt

Let's Encrypt luo SSL-sertifikaatteja, joita tarvitaan turvallisten ja salattujen yhteyksien toteuttamiseen. Jos palvelimella on yksikin nettisivu, johon kirjaudutaan salasanalla ja käyttäjätunnuksella, niin Let's Encrypt tai muu vastaava systeemi on välttämätön!

Asenna Let's Encrypt Rocky Linux 9 -virtuaalikoneeseen komennolla

sudo yum install certbot python3-certbot-apache

Luo työhakemisto Let's Encryptille

mkdir /var/www/certbot

Luo tiedosto /etc/httpd/conf.d/certbot.conf ja lisää sinne teksti:

Alias /.well-known "/var/www/certbot"
<Directory "/var/www/certbot">
    AllowOverride None
    Options FollowSymLinks
    Require all granted
</Directory>

Tarkista tiedoston formaatti

sudo apachectl configtest

ja käynnistä Apache uudelleen

sudo systemctl restart httpd

Luo SSL-sertifikaatti Apacheen määritellylle sivustolle komennolla

sudo certbot --apache certonly

Kun sertifikaatti on luotu, niin päivitä Apachen vhosts.d-tiedosto vastaavasti. Jos tiedosto ennen päivitystä sisälsi esimerkiksi koodin

<Directory "/var/www/omaverkkotunnus">
    AllowOverride All
    Options FollowSymLinks
    Require all granted
</Directory>

<VirtualHost *:80>
    DocumentRoot /var/www/omaverkkotunnus
    ServerName omaverkkotunnus.fi
    ServerAlias www.omaverkkotunnus.fi
    Include conf/vhost.conf
</VirtualHost>

niin SSL-sertifikaatin asennuksen jälkeen tiedostoon tulee koodi

<Directory "/var/www/omaverkkotunnus">
    AllowOverride All
    Options FollowSymLinks
    Require all granted
</Directory>

<VirtualHost *:80>
    # Ohjaa DocumentRoot tyhjään hakemistoon
    DocumentRoot /var/www/html
    ServerName omaverkkotunnus.fi
    ServerAlias www.omaverkkotunnus.fi
    Include conf/vhost.conf
    
    # Käännä kaikki liikenne HTTPS-porttiin
    RewriteEngine on
    RewriteCond %{SERVER_NAME} =omaverkkotunnus.fi
    RewriteRule ^ https://omaverkkotunnus.fi%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
    # Lataa sivuston tiedostot oikeasta hakemistosta
    DocumentRoot /var/www/omaverkkotunnus
    ServerName omaverkkotunnus.fi
    ServerAlias www.omaverkkotunnus.fi
    Include conf/vhost.conf

    # Lataa SSL-sertifikaatti
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/omaverkkotunnus.fi/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/omaverkkotunnus.fi/privkey.pem
</VirtualHost>

Tarkista tiedostojen formaatti

sudo apachectl configtest

Käynnistä Apache uudelleen komennolla

sudo systemctl restart httpd

Varmista, että HTTP-liikenne ohjautuu HTTPS-porttiin avaamalla nettiselain ja käymällä sivustosssa.

Certbotin asennus lisää sen automaattisesti systemctl:ään suoritettavaksi 12 tunnin välein. Henkilökohtaisesti pidän kuitenkin crontabia parempana ratkaisuna, koska ajastetut ohjelmat näkee samassa listassa ja on helpompi ajastaa työt eri aikoihin. Jos palvelimelle on asennettu sähköpostiohjelma, niin certbotin virheilmoitukset saadaan myös kätevästi tietoon.

Ota certbot pois systemctl:stä

sudo systemctl stop certbot-renew.timer sudo systemctl disable certbot-renew.timer

Avaa crontab-tiedosto muokattavaksi komennolla

sudo crontab -e

Lisää tiedostoon rivi

M H * * D /usr/bin/certbot renew -q

missä M on satunnainen minuutti 0-59, H on satunnainen tunti 0-23 ja D on satunnainen viikonpäivä 0-6 (0 sunnuntai, 1 maanantai jne). Certbot käynnistyy annettuna aikana ja päivittää kaikki vanhentumassa olevat sertifikaatit automaattisesti uusiin. Let's Encrypt sertifikaatit ovat voimassa 3 kuukautta kerrallaan.

Tämä on kolmas osa Rocky Linux 9 seikkailusta. Lue edellinen osa tästä blogista!

Rocky Linux 9 asennus osa 2: MariaDB

MariaDB on tietokanta, joka auttaa tallentamaan ja jäsentämään tietoa. MariaDB:tä käytetään esimerkiksi julkaisujärjestelmien kuten WordPressin taustalla.

Asenna MariaDB-pakettivalikoima Rocky Linux 9:iin komennoilla

curl -LO https://r.mariadb.com/downloads/mariadb_repo_setup chmod +x mariadb_repo_setup sudo ./mariadb_repo_setup --mariadb-server-version=11.6 --skip-maxscale

missä 11.6 on haluamasi MariaDB:n versio.

Asenna MariaDB-asiakas ja -palvelin pakettikirjastosta komennolla

sudo yum install MariaDB-server MariaDB-client mysql-selinux

Avaa /etc/my.cnf.d/server.cnf tiedosto editoriin ja lisää [mysql] osioon rivi:

bind-address=127.0.0.1

Rivi estää yhteydenotot MariaDB-tietokantoihin muilta laitteilta ja parantaa siten tietoturvaa.

Käynnistä MariaDB komennolla

sudo systemctl start mariadb

Alusta MariaDB tuotantokäyttöön komennolla

sudo mariadb-secure-installation

Kirjaudu roottina tietokantaan komennolla

sudo mariadb

Luo ensimmäinen tietokanta ja käyttäjä esimerkiksi SQL-lauseilla

CREATE DATABASE korppi DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'www'@'localhost' IDENTIFIED BY 'juustokeitto3M';
GRANT ALL ON korppi.* TO 'www'@'localhost' WITH GRANT OPTION;

missä korppi on tietokannan nimi (×2), www on tietokantakäyttäjän nimi (×2) ja juustokeitto3M on tietokantakäyttäjän salasana.

Tietokanta on nyt valmis käyttöön ja voit kirjautua siihen tietokantakäyttäjänä komennolla

mariadb -uwww -p'juustokeitto3M' korppi

Aseta loppuksi MariaDB käynnistymään automaattisesti laitteen käynnistyessä

sudo systemctl enable mariadb

Tämä teksti jatkaa seikkailua Rocky Linux 9:n parissa. Lue edellinen osa tästä blogista!

Rocky Linux 9 asennus osa 1: Apache

Tässä sarjassa tehdään Rocky Linux 9 -palvelimesta nettiserveri, jossa voidaan ajaa esimerkiksi WordPressiä tai Drupalia. Sarjan ensimmäisessä osassa asennetaan Apache. Apache on palvelinohjelma, jota tarvitaan HTML-sivujen ja nettipalveluiden toteuttamiseen.

Jos asennat Apachea uuteen Rocky Linux 9 -virtuaalikoneeseen, niin asenna ensimmäiseksi EPEL-pakettikirjasto. Tarvitse asentamiseen sudon.

sudo dnf upgrade --refresh sudo dnf install dnf-utils dnf-plugins-core sudo dnf config-manager --set-enabled crb sudo dnf install \ https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm \ https://dl.fedoraproject.org/pub/epel/epel-next-release-latest-9.noarch.rpm

Asenna sitten Apache

sudo yum install httpd mod_ssl brotli

Luo SSL-sertifikaatti oletussivustolle

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -nodes \ -subj "/C=XX/ST=State/L=City/O=Company/OU=Section/CN=CommonName" \ -keyout /etc/pki/tls/private/localhost.key \ -out /etc/pki/tls/certs/localhost.crt

Käy läpi Apachen asetustiedostot /etc/httpd-hakemistossa ja päivitä tiedostot tarpeesi mukaan. Alla esimerkki, miltä tiedostot saattavat näyttää, kun tarpeettomat ominaisuudet ja esimerkkikoodi poistetaan.

/etc/httpd/conf/httpd.conf

ServerRoot "/etc/httpd"
DocumentRoot "/var/www/html"
Listen 80
User apache
Group apache
Include conf.modules.d/*.conf
Include conf.d/*.conf
Include vhosts.d/*.conf

/etc/httpd/conf/vhost.conf (Sama hakemisto kuin httpd.conf-tiedostolla)

RewriteEngine on

# Älä palvele pahoja botteja
RewriteCond %{HTTP_USER_AGENT} "Go-http-client|Mozilla/5.0 zgrab|python-requests|Custom-AsyncHttpClient|l9explore|^-?$"
RewriteRule ^ - [R=404,L]

# Estä pääsy arkaluontoisiin tiedostoihihn
RewriteRule \.(htpasswd|htaccess|env|ini|yml|conf|git|orig|bak|aws|sql)$ - [R=404,L]
RewriteRule (^|/)composer\.(json|lock)$ - [R=404,L]
RewriteRule (^|/)(package|package-lock)\.json$ - [R=404,L]

# Älä uudelleenohjaa tiedostoja, joita meillä ei varmasti ole
RewriteRule ^/?(cgi-bin|vendor|backup)(/|$) - [R=404,L]

# Älä palvele HTTP/1.0 asiakkaita
RewriteCond %{SERVER_PROTOCOL} ^HTTP/1\.0$
RewriteRule ^ - [R=404,L]

# Ohjaa Apple-asiakkaat suoraan faviconiin
RedirectMatch 301 (?i)/apple-touch-icon(.*)?.png /favicon.ico

/etc/httpd/conf.modules.d/00-base.conf

# Minimaalinen setti moduuleita
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule alias_module modules/mod_alias.so
LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule filter_module modules/mod_filter.so
LoadModule headers_module modules/mod_headers.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule status_module modules/mod_status.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule version_module modules/mod_version.so

/etc/httpd/conf.modules.d/00-dav.conf

# (tyhjä tiedosto)

/etc/httpd/conf.modules.d/00-lua.conf

# (tyhjä tiedosto)

/etc/httpd/conf.modules.d/00-proxy.conf

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

/etc/httpd/conf.d/autoindex.conf

# (tyhjä tiedosto)

/etc/httpd/conf.d/errors.conf

ErrorDocument 400 "E400"
ErrorDocument 401 "E401"
ErrorDocument 403 "E403"
ErrorDocument 404 "E404"
ErrorDocument 405 "E405"
ErrorDocument 408 "E408"
ErrorDocument 410 "E410"
ErrorDocument 411 "E411"
ErrorDocument 412 "E412"
ErrorDocument 413 "E413"
ErrorDocument 414 "E414"
ErrorDocument 415 "E415"
ErrorDocument 500 "E500"
ErrorDocument 501 "E501"
ErrorDocument 502 "E502"
ErrorDocument 503 "E503"
ErrorDocument 506 "E506"

/etc/httpd/conf.d/http2.conf

Protocols h2 h2c http/1.1
ProtocolsHonorOrder Off

/etc/httpd/conf.d/log.conf

# Kaikkien sivustojen loki samaan tiedostoon
ErrorLog "/var/log/httpd/error_log"
CustomLog "/var/log/httpd/access_log" combined
LogLevel warn

# Lisää palvelimen nimi lokitiedostoon
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%v %h %l %u %t \"%r\" %>s %b" common

/etc/httpd/conf.d/limits.conf

# Rajoita pyynnön koko 10 megatavuun
LimitRequestBody 10000000

# Katkaise yhteys 30 sekunnin kuluttua
RequestReadTimeout handshake=5 header=5-10,MinRate=1000 body=5-30,MinRate=1000
TimeOut 30
ProxyTimeout 30

/etc/httpd/conf.d/mime.conf

<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>
AddDefaultCharset UTF-8
AddCharset UTF-8 .html .js .css

/etc/httpd/conf.d/security.conf

# Piilota palvelimen versio
ServerTokens Prod
ServerSignature Off

# Lisää HTML-dokumentteihin turvallisuustiedot
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
Header always set X-Content-Type-Options "nosniff" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
Header always set X-Frame-Options "SAMEORIGIN" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
Header always set Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'; frame-ancestors 'self';" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
Header always set Referrer-Policy "same-origin" "expr=%{CONTENT_TYPE} =~ m#text/html#i"

# Estä pääsy tiedostoihin /var/www-hakemiston ulkopuolella
<Directory "/">
    AllowOverride none
    Options None
    Require all denied
</Directory>

/etc/httpd/conf.d/ssl.conf

Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 300
SSLCryptoDevice builtin

SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLOpenSSLConfCmd Curves X25519:prime256v1:secp384r1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder off
SSLSessionTickets off

/etc/httpd/conf.d/welcome.conf

# (tyhjä tiedosto)

/etc/httpd/vhosts.d/000-default.conf

<Directory "/var/www/html">
    AllowOverride None
    Options FollowSymLinks
    Require all granted
    AllowMethods GET
    DirectoryIndex index.html
</Directory>

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName default.local
    Include conf/vhost.conf
    
    RewriteEngine on
    RewriteRule "\.(php|phps)$" - [R=404,L]
</VirtualHost>

<VirtualHost *:443>
    DocumentRoot /var/www/html
    ServerName default.local
    Include conf/vhost.conf
    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
   
    RewriteEngine on
    RewriteRule "\.(php|phps)$" - [R=404,L]
</VirtualHost>

Kun olet päivittänyt asetustiedostot, niin tarkista asetustiedostojen syntaksi ja käynnistä Apache

sudo apachectl configtest sudo systemctl start httpd

Lisää itsesi apache-ryhmään

sudo usermod -a -G apache teppo

missä teppo on oma käyttäjätunnuksesi

Anna /var/www-hakemisto apache-ryhmän hallintaan

sudo chown -R teppo:apache /var/www chmod -R g+rxs,o-rwx /var/www find /var/www -type d -exec setfacl -dm g::rx,o::- {} \;

Alusta /var/www/html hakemisto

echo "OK" > index.html touch favicon.ico touch robots.txt

Avaa portit 80 ja 443 liikenteellä lisäämällä http ja https palvelut palomuuriin

sudo firewall-cmd --permanent --add-service="http" sudo firewall-cmd --permanent --add-service="https" sudo firewall-cmd --reload

Avaa nettiselain ja menee palvelimen ip-osoitteeseen. Jos näet tekstin OK, niin Apache toimii.

Aseta lopuksi Apache käynnistymään bootissa komennolla

sudo systemctl enable httpd

Tämä on ensimmäinen osa Rocky Linux 9 asennuksesta. Lue seuraava osa tästä blogista!

22.9.2015: lisätty tuki TLS v1.3 protokollalle