Nginx-Serverblock
Bietet geringen Overhead und klare server_name-Verwaltung für statische Inhalte, Reverse Proxy und PHP-FPM.
Ohne Panel müssen Sie Document Roots, Virtual-Host-Dateien, Konfigurationstests, DNS und TLS selbst verwalten. Dieser Leitfaden unterscheidet Debian- und RHEL-Familien in einem Skript.
WEB="nginx"
mkdir -p /var/www/ornek.com/public_html
nginx -t && systemctl reload nginx
apachectl configtest && systemctl reload httpd
Massenautomatisierung darf keine falsche Architektur beschleunigen. Entscheiden Sie zuerst über Kundenisolation, Ressourcenlimits, Anwendungsroots sowie Mail- und DNS-Eigentum.
Bietet geringen Overhead und klare server_name-Verwaltung für statische Inhalte, Reverse Proxy und PHP-FPM.
Geeignet, wenn .htaccess-Kompatibilität und Shared-Hosting-ähnliches Verhalten erforderlich sind.
Jede Domain unter /var/www/domain/public_html vereinfacht Sicherung, Berechtigungen und Deployment.
Dynamisches Mass Virtual Hosting kann für Tausende identische Domains geeignet sein; bei Isolation oder individuellen Einstellungen sind VHosts pro Datei sicherer.
Debian verwendet häufig sites-available, RHEL häufig conf.d; das Skript erkennt beide.
cat /etc/os-release
nginx -v 2>&1 || httpd -v 2>&1 || apache2 -v Verwenden Sie nur Punycode-/ASCII-Domains und einen Eintrag pro Zeile.
awk 'NF{print tolower($0)}' /root/domainler.txt | sort -u > /root/domainler-temiz.txt Setzen Sie je nach installiertem Stack nginx oder apache.
WEB="nginx" Prüfen Sie Dateipfade, Benutzerberechtigungen und Standard-VHost-Verhalten.
head -n 2 /root/domainler-temiz.txt > /root/domainler-test.txt Das Skript erstellt Verzeichnisse und VHosts und führt nur nach erfolgreichem Konfigurationstest einen Reload aus.
chmod 700 /root/linux-toplu-domain.sh
/root/linux-toplu-domain.sh Prüfen Sie zuerst A/AAAA-Auflösung und führen Sie anschließend Certbot oder den gewählten ACME-Client in kontrollierten Chargen aus.
dig +short ornek.com A
curl -I http://ornek.com Erkennt Distributionspfade, erstellt Document Roots und VHosts, testet die Konfiguration und lädt neu.
#!/usr/bin/env bash
set -Eeuo pipefail
WEB="nginx"
DOMAIN_DOSYASI="/root/domainler.txt"
WEB_KOKU="/var/www"
SONUC="/root/linux-domain-sonuclari.csv"
HATA="/root/linux-domain-Fehlerlari.log"
[[ "$EUID" -eq 0 ]] || { echo "root gerekli"; exit 1; }
[[ -f "$DOMAIN_DOSYASI" ]] || { echo "domain listesi bulunamadi"; exit 1; }
if [[ -d /etc/nginx/sites-available ]]; then
NGINX_DIZIN="/etc/nginx/sites-available"
NGINX_ETKIN="/etc/nginx/sites-enabled"
else
NGINX_DIZIN="/etc/nginx/conf.d"
NGINX_ETKIN=""
fi
if [[ -d /etc/apache2/sites-available ]]; then
APACHE_DIZIN="/etc/apache2/sites-available"
APACHE_LOG="/var/log/apache2"
APACHE_SERVIS="apache2"
else
APACHE_DIZIN="/etc/httpd/conf.d"
APACHE_LOG="/var/log/httpd"
APACHE_SERVIS="httpd"
fi
if id -u www-data >/dev/null 2>&1; then
WEB_KULLANICI="www-data"
elif id -u nginx >/dev/null 2>&1; then
WEB_KULLANICI="nginx"
elif id -u apache >/dev/null 2>&1; then
WEB_KULLANICI="apache"
else
WEB_KULLANICI="root"
fi
printf '"domain","web","durum","document_root"\n' > "$SONUC"
: > "$HATA"
chmod 600 "$SONUC" "$HATA"
while IFS= read -r SATIR || [[ -n "$SATIR" ]]; do
DOMAIN="$(printf '%s' "$SATIR" | tr -d '\r' | tr '[:upper:]' '[:lower:]' | sed -E 's#^[[:space:]]+##;s#[[:space:]]+$##;s#^https?://##;s#^www\.##;s#/.*$##')"
[[ -z "$DOMAIN" ]] && continue
[[ "$DOMAIN" == \#* ]] && continue
if [[ ! "$DOMAIN" =~ ^[a-z0-9][a-z0-9.-]*\.[a-z]{2,63}$ ]]; then
printf '"%s","%s","gecersiz",""\n' "$DOMAIN" "$WEB" >> "$SONUC"
continue
fi
KOK="${WEB_KOKU}/${DOMAIN}/public_html"
mkdir -p "$KOK"
printf '<!doctype html><html lang="tr"><meta charset="utf-8"><title>%s</title><h1>%s hazır</h1></html>\n' "$DOMAIN" "$DOMAIN" > "${KOK}/index.html"
chown -R "$WEB_KULLANICI:$WEB_KULLANICI" "${WEB_KOKU}/${DOMAIN}"
chmod -R u=rwX,g=rX,o=rX "${WEB_KOKU}/${DOMAIN}"
if [[ "$WEB" == "nginx" ]]; then
DOSYA="${NGINX_DIZIN}/${DOMAIN}.conf"
cat > "$DOSYA" <<EOF
server {
listen 80;
listen [::]:80;
server_name ${DOMAIN} www.${DOMAIN};
root ${KOK};
index index.html index.php;
access_log /var/log/nginx/${DOMAIN}.access.log;
error_log /var/log/nginx/${DOMAIN}.error.log;
location / {
try_files \$uri \$uri/ /index.php?\$query_string;
}
}
EOF
if [[ -n "$NGINX_ETKIN" ]]; then
ln -sfn "$DOSYA" "${NGINX_ETKIN}/${DOMAIN}.conf"
fi
else
DOSYA="${APACHE_DIZIN}/${DOMAIN}.conf"
cat > "$DOSYA" <<EOF
<VirtualHost *:80>
ServerName ${DOMAIN}
ServerAlias www.${DOMAIN}
DocumentRoot "${KOK}"
ErrorLog "${APACHE_LOG}/${DOMAIN}.error.log"
CustomLog "${APACHE_LOG}/${DOMAIN}.access.log" combined
<Directory "${KOK}">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
EOF
if command -v a2ensite >/dev/null 2>&1; then
a2ensite "${DOMAIN}.conf" >/dev/null
fi
fi
printf '"%s","%s","hazir","%s"\n' "$DOMAIN" "$WEB" "$KOK" >> "$SONUC"
done < "$DOMAIN_DOSYASI"
if [[ "$WEB" == "nginx" ]]; then
nginx -t
systemctl reload nginx
else
apachectl configtest
systemctl reload "$APACHE_SERVIS"
fi
echo "Tamamlandi: $SONUC"
echo "Fehlerlar: $HATA"
Stellen Sie sicher, dass server_name und root zur Domain passen.
server {
listen 80;
server_name ornek.com www.ornek.com;
root /var/www/ornek.com/public_html;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
Gewähren Sie Require all granted für den DocumentRoot und wählen Sie AllowOverride entsprechend der Anwendung.
<VirtualHost *:80>
ServerName ornek.com
ServerAlias www.ornek.com
DocumentRoot "/var/www/ornek.com/public_html"
<Directory "/var/www/ornek.com/public_html">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Messen Sie Statuscodes für die Domainliste mit begrenzter Parallelität.
xargs -a /root/domainler.txt -P 10 -I{} sh -c 'printf "%s " "{}"; curl -LksS -o /dev/null -w "%{http_code}\n" --max-time 10 "http://{}"'
Das Layout sites-available/sites-enabled ist für Nginx und Apache üblich. Der Webbenutzer ist meist www-data.
nginx -tapache2ctl configtestsystemctl reload nginx || systemctl reload apache2Nginx und httpd verwenden meist conf.d. SELinux-Kontexte und firewalld-Regeln müssen zusätzlich geprüft werden.
nginx -t || httpd -trestorecon -Rv /var/wwwfirewall-cmd --list-servicesLVE und CageFS sind meist mit Panelintegration sinnvoll. Entwerfen Sie bei einem panel-freien Stack systemd, PHP-FPM-Pools und Berechtigungen ausdrücklich.
cat /etc/cloudlinux-release 2>/dev/null || truesystemctl list-units 'php*fpm*'find /var/www -maxdepth 2 -type d -printf '%u:%g %p\n' | headDoppelter server_name, fehlendes Semikolon, ungültiges Include oder Berechtigungen können die Ursache sein.
Die VirtualHost-Datei enthält eine ungültige Direktive, Anführungszeichen oder Modulabhängigkeit.
Document-Root-Eigentum, Verzeichnis-Ausführungsrecht, SELinux-Kontext oder Apache-Directory-Regeln können falsch sein.
Der Hostname passt möglicherweise nicht zum vorgesehenen VHost oder DNS zeigt auf eine andere IP.
DNS ist möglicherweise nicht propagiert, Port 80 geschlossen, ein Proxy aktiv oder der Challenge-Pfad wird anders geroutet.
Kein passender Fehler gefunden.
Die Anwendungsanforderungen entscheiden. Apache ist bei .htaccess-Abhängigkeit bequem; Nginx eignet sich für Reverse Proxy und zentrale Konfiguration.
Vierhundert VHosts allein sind auf modernen Servern nicht ungewöhnlich. Messen Sie Zertifikate, Logdateien, Workerlimits, Reload-Zeit und echten Traffic.
Trafficarme Websites innerhalb derselben Vertrauensgrenze können einen Pool teilen. Für verschiedene Kunden, Benutzer oder Ressourcenlimits sind getrennte Pools sicherer.
Es kann für ähnliche Domains verwendet werden; bei unterschiedlichen Roots, Zertifikaten oder Anwendungen sind explizite Serverblöcke/VirtualHosts besser verwaltbar.
Eine getrennte Phase ist meist sicherer. Senden Sie keine ACME-Anfragen, bevor DNS-Propagation und HTTP-Zugriff geprüft sind.
Statt identischen Inhalt auf Hunderte Domains zu duplizieren, verwenden Sie eine Hauptdomain, Canonical-URLs und gegebenenfalls 301-Weiterleitungen.
Wir setzen Panelwahl, DNS, SSL, Webserver, Sicherheit, Sicherung und Prüfung entsprechend Ihrer tatsächlichen Serverarchitektur um.