Rozchození Apache serveru na Linuxu typu Debian (Ubuntu a klony) je poměrně jednoduché, trochu složitější je vystavení certifikáru pro https a jeho podpis certifikační autoritou Let’s Encrypt.
V tomto návodu se dozvíte, jak jsem to dělal. Dělal jsem to na Linux Mint v učebně OU5. Toto je práce pro uživatele root a proto všechy příkazy sudo vynechám.
Roota dostanete tak, že se přihlásíte jako uživatel admin a uděláte sudo su.
jirka@pt3610:~$ ssh admin@ou5-14.jr.lixis.cz
The authenticity of host 'ou5-14.jr.lixis.cz (2a12:b7c0:3:110:4443:70e:e817:f68e)' can't be established.
ED25519 key fingerprint is SHA256:waznaWHP92XwOKPvONoMWOqpURVa6TXGn4N/22cCtms.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ou5-14.jr.lixis.cz' (ED25519) to the list of known hosts.
admin@ou5-14.jr.lixis.cz's password:
Last login: Thu Jan 23 00:12:09 2025 from 2a0e:5340:4:1:21e:6ff:fe42:2771
$ sudo su
[sudo] heslo pro admin:
root@ou5-14:/home/admin# (1)
| 1 | Bacha, jsme root a mřížka nám naznačuje, že pokud to zmastíme, tak můžeme jít do vězení :-) |
Nastavení sítě a DNS
Linuxový stroj s webem se bude jmenovat ou5-14.jr.lixis.cz, budeme používat jenom IPv6, protože pro IPv4 nemáme k dispozici veřejnou IP adresu. K DNS mám přístup, použijeme moji testovací zónu jr.lixis.cz.
Do zónového souboru domény jr.lixis.cz musíme přidat AAAA záznam pro stroj ou5-14 (a další stroje pro ostatní studenty).
$ORIGIN jr.lixis.cz.
$TTL 3600
jr.lixis.cz. IN SOA dizzy.jr.lixis.cz. jirka.lixis.cz. (
2024012458; serial (1)
3600 ; refresh
900 ; retry
1209600 ; expire
43200 ; default_ttl
)
; ....
ou5-1 IN AAAA 2a12:b7c0:3:110:40dd:bd93:f0a3:302b
ou5-1-web2 IN AAAA 2a12:b7c0:3:110:40dd:bd93:f0a3:302b
ou5-2 IN AAAA 2a12:b7c0:3:110:c8e2:f07c:c0a4:2279
ou5-3 IN AAAA 2a12:b7c0:3:110:c50:f527:6fd9:e284
ou5-4 IN AAAA 2a12:b7c0:3:110:9c2d:e6e4:d2bf:3c53
ou5-5 IN AAAA 2a12:b7c0:3:110:9820:3e2:65cd:96a5
ou5-6 IN AAAA 2a12:b7c0:3:110:2d4f:7b36:2283:d7ee
ou5-7 IN AAAA 2a12:b7c0:3:110:32f1:e570:18c4:73c2
ou5-8 IN AAAA 2a12:b7c0:3:110:4b44:8a23:3a5b:bab2
ou5-9 IN AAAA 2a12:b7c0:3:110:74e8:55fd:3ec9:ed10
ou5-10 IN AAAA 2a12:b7c0:3:110:cf7a:129:bf0a:5aab
ou5-11 IN AAAA 2a12:b7c0:3:110:31fb:37b8:935:c92c
ou5-12 IN AAAA 2a12:b7c0:3:110:2bc0:5538:25b5:633b
ou5-13 IN AAAA 2a12:b7c0:3:110:973e:ea19:b194:b137
ou5-14 IN AAAA 2a12:b7c0:3:110:4443:70e:e817:f68e
ou5-15 IN AAAA 2a12:b7c0:3:110:5eb9:4869:5a8d:6076
; ....
| 1 | Nesmíme zapomenout zvýšit sériové číslo zóny. |
Nastavení firewallu
Ve firewallu musíme povolit příchozí připojení na TCP port 80 pro http provoz a na TCP port 443 pro šifrovaný https provoz.
Port 80 musíme povolit hlavně kvůli verifikaci certifikátu, který musíme vystavit. V našem případě máme jednoduchý firewall ufw vypnutý, takže se tím nebudeme zabývat.
Pokud by přece někde běžel, vypneme ho pomocí:
# systemctl stop ufw
Až nám bude všechno fungovat, tak můžeme povolit ve firewallu TCP porty 80 a 443 a zase ho zapnout příkazem
# systemctl start ufw
O jednoduchém firewallu je článek zde: Jednoduchý firewall pro Ubuntu Linux
Instalace httpd serveru Apache
Apache HTTP SERVER PROJECT neposkytuje binární soubory pro instalaci web serveru Apache, pouze zdrojové soubory. Naštěstí to pro nás udělal sestavitel operačního systému.
# apt update
# apt install apache2
Úprava souboru /etc/hosts
Ukazuje se, že je velmi dobré do souboru /etc/hosts přidat IPv6 adresu našeho stroje a přidat plně kvalifikované jméno našeho stroje a zkrácené jméno.
root@ou5-14:~# ip -6 a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2a12:b7c0:3:110:4ee1:c387:aff2:9892/64 scope global temporary dynamic
valid_lft 5312sec preferred_lft 2612sec
inet6 2a12:b7c0:3:110:4443:70e:e817:f68e/64 scope global dynamic mngtmpaddr noprefixroute (1)
valid_lft 5312sec preferred_lft 2612sec
inet6 fe80::2325:b746:1f68:84af/64 scope link noprefixroute
valid_lft forever preferred_lft forever
root@ou5-14:~#
| 1 | Toto je pevná adresa, která se nijak nebude měnit. |
IP adresu 2a12:b7c0:3:110:4443:70e:e817:f68e přidáme do /etc/hosts, nejrychlejší způsob je:
/etc/hostsroot@ou5-14:~# ip -6 a s | grep mngtmpaddr >>/etc/hosts
root@ou5-14:~# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 ou5-9
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
2a12:b7c0:3:110:4443:70e:e817:f68e ou5-9.jr.lixis.cz ou5-9
inet6 2a12:b7c0:3:110:4443:70e:e817:f68e/64 scope global dynamic mngtmpaddr noprefixroute
root@ou5-14:~#
root@ou5-14:~# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 ou5-14
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# Pro apache server
2a12:b7c0:3:110:4443:70e:e817:f68e ou5-14.jr.lixis.cz ou5-14
Konfigurace Apache
Konfigurační soubory Apache se nacházejí v adresáři /etc/apache2/ a podadresářích, prostor pro html stránky je v adresáři /var/www/html.
Apache server je programován pro operační systém Linux a různé jiné Unixy, kde se používá jako oddělovač adresářů v cestě k souboru znak lomítko /, znak zpětné lomítko \ je escape znak.
V konfiguračních souborech Apache proto budeme psát cestu třeba takto: /var/www/html a Apache tomu bude rozumět.
Pokud se budeme držet hloupých Windowsích zvyklostí a budeme používat ve jménech souborů a adresářů znak mezera a různá háčkovaná a čárkovaná písmenka, tak se zcela jistě dostaneme do problémů.
/etc/apache2/
|-- apache2.conf
| `-- ports.conf
|-- mods-enabled
| |-- *.load
| `-- *.conf
|-- conf-enabled
| `-- *.conf
|-- sites-enabled
| `-- *.conf
-
apache2.confje hlavní konfigurační soubor. Dává dohromady všechny zbývající konfigurační soubory při spouštění webového serveru. Obvykle do něj nebudeme moc sahat, nebo to rozbijeme. -
ports.confje vždy součástí hlavního konfiguračního souboru. Používá se k určení naslouchacích portů pro příchozí připojení a tento soubor lze kdykoli upravit. -
Konfigurační soubory v adresářích
mods-enabled/,conf-enabled/asites-enabled/obsahují konkrétní fragmenty konfigurace, které spravují moduly, fragmenty globální konfigurace nebo konfigurace virtuálních hostitelů. -
Aktivují se symbolickým propojením dostupných konfiguračních souborů z jejich příslušných
*-available/protějšků. Ty by měly být spravovány pomocí našich pomocníkůa2enmod,a2dismod,a2ensite,a2dissiteaa2enconf,a2disconf. Podrobné informace naleznete v příslušných manuálových stránkách. -
Binární soubor se nazývá
apache2a je spravován pomocísystemd, takže ke spuštění nebo zastavení služby použijtesystemctl start apache2asystemctl stop apache2a ke kontrole stavu použijtesystemctl status apache2ajournalctl -u apache2.systemdaapache2ctllze v případě potřeby použít také pro správu služeb. Přímé volání/usr/bin/apache2nebude fungovat s výchozí konfigurací.
Náš konfigurační soubor je /etc/apache2/sites-available/000-default.conf, pro šifrovaný web je to bude /etc/apache2/sites-available/default-ssl.conf.
V konfiguračním souboru musíme změnit pár věcí (jméno webu a správce), ostatní věci necháme na pokoji. Konfigurační soubor 000-default.conf je obyčejný textový soubor, který se dá upravovat libovolným textovým editorem, jako je nano nebo mcedit.
Před každou úpravou konfiguračního souboru doporučuji udělat zálohu.
Pokud uděláte někde chybu, služba nebude fungovat a můžete se vrátit k předchozímu funkčnímu stavu.
Ve všech konfiguračních souborech znak mřížka # slouží jako komentář do konce řádku.
# ...
ServerAdmin jirka@lixis.cz
# ...
ServerName ou5-14.jr.lixis.cz
Konfiguraci šifrovaného webu pro https necháme na později, až se nám podaří vystavit certifikát.
Po každé změně konfiguračních souborů je potřeba pomocí systemctl službu zastavit a znova nastartovat.
# systemctl status apache2 (1)
# systemctl stop apache2 (2)
# systemctl start apache2 (3)
| 1 | Zjištění, zda apache2 běží nebo neběží, prostě v jakém je stavu. |
| 2 | Zastavení serveru apache2. |
| 3 | Spuštění serveru apache2. |
Uděláme si jednoduchý html soubor, který umístíme do kořene webu (toto není nezbytně nutné, protože tam už podobný soubor máme).
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>ou5-14.jr.lixis.cz - Funguje to.</title>
<style>
body {
background-color: #96d7d7;
}
</style>
</head>
<body>
<h1>Funguje to.</h1>
<p>
Index.html pro testovací web ou5-14.jr.lixis.cz.
</p>
</body>
</html>
|
Některé debilní prohlížeče na Windows nechtějí zobrazovat nešifrované stránky, protože je to údajně nebezpečné. Pokud na takový narazíme, tak musíme zjistit (třeba pomocí strejdy Google), jak ho k zobrazení nešifrované stránky donutit. |

Když nám všechno funguje, tak nezapomeneme nastavit automatické spouštění serveru apache2 po startu systému pomocí: systemctl enable apache2
Vystavení certifikátu a podepsání
Budu používat certifikát s platností 3 měsíce a nechám si ho podepsat certifikační autoritou Let’s Encrypt.
Výhoda je, že podepsání cetifikátu je zadarmo a certifikační autorita Let’s Encrypt je považována za důveryhodnou skoro všude (kromě prastarých systémů).
Nevýhoda spočívá v tom, že musíme vymyslet, jak automaticky po 3 měsících prodloužit platnost certifikátu. To nebude tak obtížné, protože to za nás udělá program crond.
Pro generování certifikátu jsem použil jednoduchého ACMEv2 klienta https://get.acme.sh.
Instalace acme klienta
root@ou5-14:/home/admin# wget -O - https://get.acme.sh | sh -s email=admin@sspvc.cz (1)
--2025-01-23 00:46:33-- https://get.acme.sh/
Překládám get.acme.sh (get.acme.sh)… 2a06:98c1:3121::9, 2a06:98c1:3120::9, 188.114.96.9, ...
Navazuje se spojení s get.acme.sh (get.acme.sh)|2a06:98c1:3121::9|:443… spojeno.
HTTP požadavek odeslán, program čeká na odpověď… 200 OK
Délka: neudáno [text/html]
Ukládám do: ‘STDOUT’
- [ <=> ] 1,01K --.-KB/s za 0s
2025-01-23 00:46:34 (14,9 MB/s) – zapsáno na standardní výstup [1032]
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 220k 100 220k 0 0 596k 0 --:--:-- --:--:-- --:--:-- 597k
[Čt 23. ledna 2025, 00:46:34 CET] Installing from online archive.
[Čt 23. ledna 2025, 00:46:34 CET] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[Čt 23. ledna 2025, 00:46:35 CET] Extracting master.tar.gz
[Čt 23. ledna 2025, 00:46:35 CET] It is recommended to install socat first.
[Čt 23. ledna 2025, 00:46:35 CET] We use socat for the standalone server, which is used for standalone mode.
[Čt 23. ledna 2025, 00:46:35 CET] If you don't want to use standalone mode, you may ignore this warning.
[Čt 23. ledna 2025, 00:46:35 CET] Installing to /root/.acme.sh
[Čt 23. ledna 2025, 00:46:35 CET] Installed to /root/.acme.sh/acme.sh
[Čt 23. ledna 2025, 00:46:35 CET] Installing alias to '/root/.bashrc'
[Čt 23. ledna 2025, 00:46:35 CET] Close and reopen your terminal to start using acme.sh
[Čt 23. ledna 2025, 00:46:35 CET] Installing cron job
12 7 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
[Čt 23. ledna 2025, 00:46:35 CET] bash has been found. Changing the shebang to use bash as preferred.
[Čt 23. ledna 2025, 00:46:36 CET] OK
[Čt 23. ledna 2025, 00:46:36 CET] Install success!
root@ou5-14:/home/admin#
| 1 | Instalace acme klienta, který se nám nainstaluje do adresáře `/root/.acme.sh/ |
|
Po instalaci acme klienta se musíme odhlásit a zase přihlásit, jinak nám nebude vystavování certifikátů fungovat |
Acme klient umí používat více certifikačních autorit (CA), vybereme si Let’s Encrypt, protože vystavuje certifikáty s platností na 3 měsíce.
root@ou5-14:~# acme.sh --set-default-ca --server letsencrypt
Při vystavování certifikátu nám musí Apache běžet.
root@ou5-14:~# acme.sh --issue -d ou5-14.jr.lixis.cz -w /var/www/html/
-
Parametr
-dnám určuje doménové jméno, pro který chceme vystavit certifikát (ou5-14.jr.lixis.cz). -
Parametr
-wnám určuje cestu ke kořeni webu (/var/www/html/
Nyní máme certifikát vystaven a podepsán a nachází se v adresáři `/root/.acme.sh/ou5-14.jr.lixis.cz-ecc/
root@ou5-14:~# cd /root/.acme.sh/ou5-14.jr.lixis.cz_ecc/
root@ou5-14:~/.acme.sh/ou5-14.jr.lixis.cz_ecc# ls -l
celkem 28
-rw-r--r-- 1 root root 1567 led 22 12:47 ca.cer (1)
-rw-r--r-- 1 root root 2848 led 22 12:47 fullchain.cer (2)
-rw-r--r-- 1 root root 1281 led 22 12:47 ou5-14.jr.lixis.cz.cer (3)
-rw-r--r-- 1 root root 621 led 22 12:47 ou5-14.jr.lixis.cz.conf (4)
-rw-r--r-- 1 root root 477 led 22 12:47 ou5-14.jr.lixis.cz.csr (5)
-rw-r--r-- 1 root root 191 led 22 12:47 ou5-14.jr.lixis.cz.csr.conf (6)
-rw------- 1 root root 227 led 22 12:47 ou5-14.jr.lixis.cz.key (7)
root@ou5-14:~/.acme.sh/ou5-14.jr.lixis.cz_ecc#
| 1 | Certifikát certifikační autority, která nám podepsala náš certifikát pro web. |
| 2 | Kombinovaný certifikát našeho webu a certifikační autority, která ho podepsala. |
| 3 | Podepsaný certifikát našeho webu, nakopírujeme ho do /etc/ssl/certs. |
| 4 | Konfigurace, která slouží acme klientovi k podepsání certifikátu. |
| 5 | Žádost pro certifikační autoritu k podepsání. |
| 6 | Konfigurace žádosti. |
| 7 | Soukromý klíč příslušný k našemu certifikátu. Nakopírujeme ho do /etc/ssl/private/. |
|
Pokud se nám nedaří certifikát vystavit, je potřeba zkontrolovat, zda běží apache2 server anebo nám někde blokuje port 80 nějaký firewall. |
V konfiguraci apache2 musíme říct, že chceme používat šifrování neboli modul ssl. To můžeme udělat pomocí a2enmod:
root@ou5-14:~/.acme.sh/ou5-14.jr.lixis.cz_ecc# a2enmod
Your choices are: access_compat actions alias allowmethods asis auth_basic auth_digest auth_form authn_anon authn_core authn_dbd authn_dbm authn_file authn_socache authnz_fcgi authnz_ldap authz_core authz_dbd authz_dbm authz_groupfile authz_host authz_owner authz_user autoindex brotli buffer cache cache_disk cache_socache cern_meta cgi cgid charset_lite data dav dav_fs dav_lock dbd deflate dialup dir dump_io echo env expires ext_filter file_cache filter headers heartbeat heartmonitor http2 ident imagemap include info lbmethod_bybusyness lbmethod_byrequests lbmethod_bytraffic lbmethod_heartbeat ldap log_debug log_forensic lua macro md mime mime_magic mpm_event mpm_prefork mpm_worker negotiation proxy proxy_ajp proxy_balancer proxy_connect proxy_express proxy_fcgi proxy_fdpass proxy_ftp proxy_hcheck proxy_html proxy_http proxy_http2 proxy_scgi proxy_uwsgi proxy_wstunnel ratelimit reflector remoteip reqtimeout request rewrite sed session session_cookie session_crypto session_dbd setenvif slotmem_plain slotmem_shm socache_dbm socache_memcache socache_redis socache_shmcb speling ssl status substitute suexec unique_id userdir usertrack vhost_alias xml2enc
Which module(s) do you want to enable (wildcards ok)?
ssl
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling config file ssl.conf.
To activate the new configuration, you need to run:
systemctl restart apache2
root@ou5-14:~/.acme.sh/ou5-14.jr.lixis.cz_ecc#
Uděláme konfigurační soubor pro šifrovaný https web. K tomu si upravíme předpřiravený soubor /etc/apache2/sites-available/default-ssl.conf.
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName ou5-14.jr.lixis.cz:443 (1)
ServerAdmin jirka@lixis.cz (2)
SSLEngine On
SSLCertificateFile "/etc/ssl/certs/ou5-14.jr.lixis.cz.cer" (3)
SSLCertificateKeyFile "/etc/ssl/private/ou5-14.jr.lixis.cz.key" (4)
</VirtualHost>
| 1 | Nastavení jména serveru. |
| 2 | Nastavení administrátora serveru. |
| 3 | Sem dáme náš vystavený a podepsaný certifikát. Celá cesta je: /etc/ssl/certs/ou5-14.jr.lixis.cz.cer |
| 4 | Toto je privátní klíč k certifikátu, vygenerovaný soubor ou5-14.jr.lixis.cz.key překopírujeme z adresáře /root/acme.sh/ou5-14.lixis.cz_ecc do adresáře /etc/ssl/private/. |
Když máme vše hotovo, přidáme do konfigurace apache další web pomocí a2ensite:
root@ou5-14:~/.acme.sh/ou5-14.jr.lixis.cz_ecc# a2ensite
Your choices are: 000-default default-ssl
Which site(s) do you want to enable (wildcards ok)?
default-ssl
Enabling site default-ssl.
To activate the new configuration, you need to run:
systemctl reload apache2
root@ou5-14:~/.acme.sh/ou5-14.jr.lixis.cz_ecc#
root@ou5-14:~/.acme.sh/ou5-14.jr.lixis.cz_ecc# systemctl restart apache2
root@ou5-14:~/.acme.sh/ou5-14.jr.lixis.cz_ecc# systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
Active: active (running) since Thu 2025-01-23 01:27:42 CET; 7s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 3834 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
Main PID: 3838 (apache2)
Tasks: 55 (limit: 18960)
Memory: 6.7M (peak: 7.2M)
CPU: 36ms
CGroup: /system.slice/apache2.service
├─3838 /usr/sbin/apache2 -k start
├─3840 /usr/sbin/apache2 -k start
└─3841 /usr/sbin/apache2 -k start
led 23 01:27:42 ou5-14 systemd[1]: Starting apache2.service - The Apache HTTP Server...
led 23 01:27:42 ou5-14 systemd[1]: Started apache2.service - The Apache HTTP Server.
root@ou5-14:~/.acme.sh/ou5-14.jr.lixis.cz_ecc#
A pokud všechno dopadlo dobře, tak nám bude fungovat https.
