DevOps

Nginx vs Apache konfigurace: Jak porovnat nastavení webserveru

6. února 2026
12 min čtení
nginx configapache configwebserverDevOpskonfiguracemigrace

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:

  1. Export Apache konfigurace
  2. Mapování direktiv
  3. Vytvoření Nginx ekvivalentu
  4. 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:

  1. Zkopírujte starší verzi konfigurace do levého pole
  2. Vložte novější verzi do pravého pole
  3. Ihned vidíte barevně zvýrazněné změny
  4. 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:

  • diff a git diff pro příkazovou řádku
  • vimdiff nebo meld pro 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í →