Nginx vs Apache konfigurace: Jak porovnat nastavení webserveru
Nginx a Apache jsou dva nejpoužívanější webservery na světě. Ať už spravujete jeden server nebo stovky, pravidelné porovnávání konfigurací je klíčové pro bezpečnost, výkon a stabilitu. Jedna špatně umístěná direktiva může způsobit výpadek služby, bezpečnostní díru nebo dramatické zpomalení webu. Tento článek vás provede technikami a nástroji pro efektivní porovnávání konfigurací obou webserverů.
Proč porovnávat konfigurace webserveru?
Typické scénáře pro diff konfigurace
1. Migrace mezi prostředími Při přesunu aplikace ze staging na production potřebujete ověřit, že konfigurace odpovídá požadavkům produkčního prostředí.
2. Debugging výkonnostních problémů Když web náhle zpomalí, porovnání současné konfigurace s poslední funkční verzí může rychle odhalit příčinu.
3. Bezpečnostní audit Pravidelné porovnání s referenční konfigurací pomáhá odhalit neoprávněné změny nebo bezpečnostní regresy.
4. Migrace Nginx ↔ Apache Při přechodu mezi webservery potřebujete systematicky převést všechny direktivy.
5. Load balancing a clustering Konfigurace všech nodů v clusteru musí být konzistentní – diff pomáhá odhalit nesrovnalosti.
Základy konfigurace Nginx vs Apache
Nginx konfigurační struktura
# /etc/nginx/nginx.conf - hlavní konfigurace
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
}
http {
# Základní nastavení
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Gzip komprese
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript;
# Virtuální hosty
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
# /etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/public;
index index.php index.html;
# SSL redirect
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
root /var/www/example.com/public;
index index.php index.html;
# SSL certifikáty
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
Apache konfigurační struktura
# /etc/apache2/apache2.conf - hlavní konfigurace
ServerRoot "/etc/apache2"
Mutex file:${APACHE_LOCK_DIR} default
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
# MPM konfigurace
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
# Základní bezpečnost
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
# Logging
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
# Načtení modulů a virtuálních hostů
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
# /etc/apache2/sites-available/example.com.conf
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public
# Redirect na HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public
# SSL konfigurace
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
# Security headers
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
<Directory /var/www/example.com/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
# URL rewriting
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</Directory>
# PHP-FPM
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.2-fpm.sock|fcgi://localhost"
</FilesMatch>
# Static files caching
<FilesMatch "\.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$">
ExpiresActive On
ExpiresDefault "access plus 30 days"
Header set Cache-Control "public, immutable"
</FilesMatch>
</VirtualHost>
Nástroje pro porovnání konfigurací
1. Základní diff v příkazové řádce
# Jednoduché porovnání dvou souborů
diff nginx-old.conf nginx-new.conf
# Side-by-side porovnání
diff -y nginx.conf nginx.conf.backup
# Unifikovaný formát (jako git diff)
diff -u apache-staging.conf apache-production.conf
# Ignorování whitespace změn
diff -w nginx.conf nginx.conf.new
# Diff s kontextem
diff -C 5 nginx.conf nginx.conf.backup
2. Git diff pro verzované konfigurace
# Zobrazení změn od posledního commitu
git diff HEAD -- /etc/nginx/nginx.conf
# Porovnání mezi větvemi
git diff staging..production -- nginx/
# Porovnání konkrétních commitů
git diff abc123..def456 -- sites-available/
# Diff s barevným výstupem
git diff --color-words nginx.conf
3. Vimdiff pro interaktivní porovnání
# Dvoucestné porovnání
vimdiff nginx.conf nginx.conf.backup
# Třícestné porovnání (base, local, remote)
vimdiff -d file1 file2 file3
# V editoru vim
:diffthis # Na obou otevřených bufferech
:diffoff # Ukončení diff módu
4. Meld pro grafické porovnání
# Instalace na Ubuntu/Debian
sudo apt install meld
# Porovnání souborů
meld nginx-staging.conf nginx-production.conf
# Porovnání celých adresářů
meld /etc/nginx/sites-available/ /backup/nginx/sites-available/
Porovnání Nginx konfigurací
Typické změny ke sledování
1. Worker procesy a connections:
# Změna výkonu
-worker_processes 4;
+worker_processes auto;
-worker_connections 768;
+worker_connections 2048;
2. SSL/TLS nastavení:
# Bezpečnostní upgrade
-ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
+ssl_protocols TLSv1.2 TLSv1.3;
-ssl_ciphers HIGH:!aNULL:!MD5;
+ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
3. Proxy a upstream změny:
upstream backend {
- server 192.168.1.10:8080;
- server 192.168.1.11:8080;
+ server 192.168.1.10:8080 weight=3;
+ server 192.168.1.11:8080 weight=2;
+ server 192.168.1.12:8080 backup;
+ keepalive 32;
}
Nginx konfigurace – validace před aplikací
# Test syntaxe konfigurace
nginx -t
# Test s konkrétním konfiguračním souborem
nginx -t -c /path/to/nginx.conf
# Zobrazení finální konfigurace (všechny includes rozbalené)
nginx -T
# Diff mezi současnou a novou konfigurací
nginx -T > /tmp/current-config.txt
nginx -T -c /path/to/new/nginx.conf > /tmp/new-config.txt
diff -u /tmp/current-config.txt /tmp/new-config.txt
Porovnání Apache konfigurací
Typické změny ke sledování
1. MPM konfigurace:
<IfModule mpm_prefork_module>
- StartServers 5
- MinSpareServers 5
- MaxSpareServers 10
- MaxRequestWorkers 150
+ StartServers 10
+ MinSpareServers 10
+ MaxSpareServers 20
+ MaxRequestWorkers 300
</IfModule>
2. Moduly a jejich nastavení:
# Přidání nového modulu
+LoadModule headers_module modules/mod_headers.so
+LoadModule expires_module modules/mod_expires.so
# Změna v mod_security
<IfModule mod_security2.c>
- SecRuleEngine DetectionOnly
+ SecRuleEngine On
</IfModule>
3. Directory direktivy:
<Directory /var/www/html>
- Options Indexes FollowSymLinks
+ Options -Indexes +FollowSymLinks
- AllowOverride None
+ AllowOverride All
</Directory>
Apache konfigurace – validace
# Test syntaxe
apachectl configtest
# Nebo
apache2ctl -t
# Zobrazení virtuálních hostů
apache2ctl -S
# Zobrazení načtených modulů
apache2ctl -M
# Kompletní konfigurace (rozbalené includes)
apache2ctl -t -D DUMP_CONFIG
Porovnání při migraci Nginx ↔ Apache
Při migraci mezi webservery je klíčové systematicky mapovat direktivy:
Tabulka ekvivalentních direktiv
| Nginx | Apache | Popis |
|---|---|---|
server { } |
<VirtualHost> |
Virtuální host |
listen 80 |
*:80 v VirtualHost |
Port |
server_name |
ServerName/ServerAlias |
Doména |
root |
DocumentRoot |
Kořenový adresář |
location |
<Directory>, <Location> |
URL/cesta pravidla |
try_files |
RewriteRule |
URL rewriting |
proxy_pass |
ProxyPass |
Reverse proxy |
fastcgi_pass |
SetHandler proxy:fcgi |
PHP-FPM |
add_header |
Header set |
HTTP hlavičky |
expires |
ExpiresDefault |
Cache expiry |
gzip |
mod_deflate |
Komprese |
ssl_certificate |
SSLCertificateFile |
SSL certifikát |
Příklad migrace: Nginx → Apache
Původní Nginx:
server {
listen 80;
server_name example.com;
root /var/www/example;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
}
}
Ekvivalentní Apache:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example
<Directory /var/www/example>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?%{QUERY_STRING} [L]
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.2-fpm.sock|fcgi://localhost"
</FilesMatch>
<FilesMatch "\.(jpg|jpeg|png|gif|ico|css|js)$">
ExpiresActive On
ExpiresDefault "access plus 30 days"
</FilesMatch>
</VirtualHost>
Automatizace diff workflow
1. Pre-commit hook pro konfigurační změny
#!/bin/bash
# .git/hooks/pre-commit
# Testování Nginx konfigurace
if git diff --cached --name-only | grep -q "nginx"; then
echo "Testování Nginx konfigurace..."
nginx -t
if [ $? -ne 0 ]; then
echo "Chyba: Nginx konfigurace není validní!"
exit 1
fi
fi
# Testování Apache konfigurace
if git diff --cached --name-only | grep -q "apache"; then
echo "Testování Apache konfigurace..."
apachectl configtest
if [ $? -ne 0 ]; then
echo "Chyba: Apache konfigurace není validní!"
exit 1
fi
fi
echo "Konfigurace OK"
exit 0
2. CI/CD validace v GitHub Actions
# .github/workflows/webserver-config.yml
name: Webserver Config Validation
on:
pull_request:
paths:
- 'nginx/**'
- 'apache/**'
jobs:
validate-nginx:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Nginx
run: sudo apt-get install -y nginx
- name: Validate Nginx config
run: |
sudo nginx -t -c ${{ github.workspace }}/nginx/nginx.conf
- name: Generate diff report
run: |
echo "## Nginx Config Changes" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`diff" >> $GITHUB_STEP_SUMMARY
git diff origin/main...HEAD -- nginx/ >> $GITHUB_STEP_SUMMARY || true
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
validate-apache:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Apache
run: sudo apt-get install -y apache2
- name: Validate Apache config
run: |
sudo apache2ctl -t -f ${{ github.workspace }}/apache/apache2.conf
3. Skript pro porovnání staging vs production
#!/bin/bash
# compare-webserver-configs.sh
STAGING_HOST="staging.example.com"
PRODUCTION_HOST="production.example.com"
OUTPUT_DIR="/tmp/config-diff"
mkdir -p "$OUTPUT_DIR"
# Stažení konfigurací
echo "Stahování Nginx konfigurací..."
ssh "$STAGING_HOST" "sudo nginx -T" > "$OUTPUT_DIR/staging-nginx.conf"
ssh "$PRODUCTION_HOST" "sudo nginx -T" > "$OUTPUT_DIR/production-nginx.conf"
# Porovnání
echo "=== Rozdíly v Nginx konfiguraci ==="
diff -u "$OUTPUT_DIR/staging-nginx.conf" "$OUTPUT_DIR/production-nginx.conf" | head -100
# Pro Apache
echo "Stahování Apache konfigurací..."
ssh "$STAGING_HOST" "apachectl -t -D DUMP_CONFIG 2>/dev/null" > "$OUTPUT_DIR/staging-apache.conf"
ssh "$PRODUCTION_HOST" "apachectl -t -D DUMP_CONFIG 2>/dev/null" > "$OUTPUT_DIR/production-apache.conf"
echo "=== Rozdíly v Apache konfiguraci ==="
diff -u "$OUTPUT_DIR/staging-apache.conf" "$OUTPUT_DIR/production-apache.conf" | head -100
Bezpečnostní aspekty diff analýzy
Kritické direktivy ke sledování
Nginx bezpečnostní direktivy:
# Změny v těchto direktivách vyžadují extra pozornost
ssl_protocols # Podporované TLS verze
ssl_ciphers # Šifrovací sady
client_max_body_size # Limit velikosti requestu
limit_req # Rate limiting
allow/deny # IP whitelist/blacklist
add_header # Security headers
proxy_pass # Backend servery
Apache bezpečnostní direktivy:
# Kritické pro bezpečnost
SSLProtocol # TLS verze
SSLCipherSuite # Šifry
LimitRequestBody # Limit velikosti
<Limit> # HTTP metody
Require # Přístupová pravidla
Header # Security headers
ProxyPass # Backend konfigurace
Skript pro bezpečnostní diff audit
#!/bin/bash
# security-config-audit.sh
CONFIG_FILE="$1"
BASELINE_FILE="$2"
echo "=== Bezpečnostní audit konfigurace ==="
echo "Soubor: $CONFIG_FILE"
echo "Baseline: $BASELINE_FILE"
echo ""
# Kontrola SSL/TLS změn
echo "--- SSL/TLS změny ---"
diff <(grep -i "ssl\|tls" "$BASELINE_FILE") <(grep -i "ssl\|tls" "$CONFIG_FILE")
# Kontrola přístupových pravidel
echo "--- Přístupová pravidla ---"
diff <(grep -iE "allow|deny|require" "$BASELINE_FILE") <(grep -iE "allow|deny|require" "$CONFIG_FILE")
# Kontrola proxy nastavení
echo "--- Proxy konfigurace ---"
diff <(grep -i "proxy" "$BASELINE_FILE") <(grep -i "proxy" "$CONFIG_FILE")
# Kontrola security headers
echo "--- Security headers ---"
diff <(grep -iE "header|add_header" "$BASELINE_FILE") <(grep -iE "header|add_header" "$CONFIG_FILE")
Praktické příklady diff analýzy
Příklad 1: Debugging výkonnostního problému
Scénář: Web po deploymentu dramaticky zpomalil.
# Porovnání aktuální vs. předchozí verze
git diff HEAD~1 -- nginx/nginx.conf
# Výstup:
# -worker_connections 2048;
# +worker_connections 256; # <- Příčina problému!
#
# -keepalive_timeout 65;
# +keepalive_timeout 5;
Příklad 2: Bezpečnostní regres
Scénář: Security scan odhalil zranitelnost.
# Nalezená změna
-ssl_protocols TLSv1.2 TLSv1.3;
+ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # PROBLÉM: TLSv1 a TLSv1.1 jsou zranitelné
-add_header X-Frame-Options "DENY" always;
+# add_header X-Frame-Options "DENY" always; # PROBLÉM: Odstraněna ochrana proti clickjackingu
Příklad 3: Migrace z Apache na Nginx
Postup:
- Export Apache konfigurace
- Mapování direktiv
- Vytvoření Nginx ekvivalentu
- Diff test
# Vytvoření porovnávacího přehledu
echo "=== Apache originál ===" > migration-report.txt
cat apache-site.conf >> migration-report.txt
echo "" >> migration-report.txt
echo "=== Nginx konverze ===" >> migration-report.txt
cat nginx-site.conf >> migration-report.txt
# Kontrolní body
echo "" >> migration-report.txt
echo "=== Checklist ===" >> migration-report.txt
echo "[ ] DocumentRoot -> root" >> migration-report.txt
echo "[ ] ServerName -> server_name" >> migration-report.txt
echo "[ ] RewriteRule -> try_files/rewrite" >> migration-report.txt
echo "[ ] mod_php -> fastcgi_pass" >> migration-report.txt
Integrace s PorovnejText.cz
Pro rychlé vizuální porovnání webserver konfigurací použijte náš Code Diff nástroj:
Výhody:
- Okamžité porovnání bez instalace nástrojů
- Barevné zvýraznění změn
- Vše běží lokálně – citlivé konfigurace zůstávají v prohlížeči
- Export výsledků pro dokumentaci a code review
Workflow:
- Zkopírujte starší verzi konfigurace do levého pole
- Vložte novější verzi do pravého pole
- Ihned vidíte barevně zvýrazněné změny
- Exportujte pro dokumentaci nebo sdílení s týmem
Tip: Použijte volbu "Code" a vyberte jazyk "Nginx" nebo "Apache" pro lepší syntax highlighting.
Best practices pro správu konfigurací
1. Verzování všeho
# Struktura Git repozitáře pro webserver konfigurace
webserver-configs/
├── nginx/
│ ├── nginx.conf
│ ├── conf.d/
│ └── sites-available/
├── apache/
│ ├── apache2.conf
│ ├── mods-available/
│ └── sites-available/
├── scripts/
│ ├── deploy.sh
│ └── validate.sh
└── README.md
2. Prostředí jako větve
# Struktura větví
main # Production konfigurace
staging # Staging prostředí
feature/* # Nové změny
# Workflow
git checkout -b feature/add-rate-limiting
# ... úpravy ...
git commit -m "Add rate limiting for API endpoints"
git push origin feature/add-rate-limiting
# -> Pull request -> Review -> Merge
3. Automatické deploymenty
# ansible playbook pro deploy konfigurací
- name: Deploy Nginx configuration
hosts: webservers
tasks:
- name: Copy nginx.conf
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Reload nginx
- name: Test configuration
command: nginx -t
changed_when: false
handlers:
- name: Reload nginx
service:
name: nginx
state: reloaded
Shrnutí
Porovnávání konfigurací Nginx a Apache je kritická dovednost pro každého DevOps inženýra a systémového administrátora:
Používejte správné nástroje:
diffagit diffpro příkazovou řádkuvimdiffnebomeldpro interaktivní práci- Online nástroje jako PorovnejText.cz pro rychlé porovnání
Automatizujte validaci:
- Pre-commit hooky pro testování syntaxe
- CI/CD pipeline pro komplexní kontroly
- Skripty pro porovnání prostředí
Verzujte konfigurace:
- Git pro všechny konfigurační soubory
- Větve pro různá prostředí
- Tagy pro production deploymenty
Sledujte bezpečnost:
- Pravidelný audit kritických direktiv
- Baseline konfigurace pro porovnání
- Automatické upozornění na nebezpečné změny
S těmito praktikami budete mít plnou kontrolu nad konfiguracemi vašich webserverů a minimalizujete riziko výpadků nebo bezpečnostních incidentů.
Potřebujete rychle porovnat Nginx nebo Apache konfiguraci? Použijte PorovnejText.cz – okamžité porovnání kódu s barevným zvýrazněním přímo ve vašem prohlížeči. Vše běží lokálně, žádná data se neodesílají na server.
Vyzkoušejte PorovnejText.cz zdarma
Nejrychlejší český nástroj pro porovnání textů. Vše probíhá ve vašem prohlížeči, žádná registrace není potřeba.
Porovnat texty nyní →Související články
Jak kontroluju config soubory před deployem
Jedna špatná změna v YAML a máte outage. Tady je jak porovnávám konfigurace mezi prostředími.
XML konfiguráky - jak je porovnat bez bolesti hlavy
Praktické tipy na porovnávání XML souborů. Od Spring configu přes Maven POM po .NET app.config - co funguje a na co si dát pozor.
Porovnávání server configů - jak to dělám já
Praktický DevOps návod na porovnávání konfigurací. Od nginx přes Kubernetes po automatizaci v CI/CD.