Nginx server block
Statik içerik, reverse proxy ve PHP-FPM yapılarında düşük ek yük ve net server_name yönetimi sunar.
Panel olmadığında domain eklemek; document root oluşturma, web sunucusu sanal host dosyası üretme, yapılandırma testi, DNS ve TLS işlemlerinin tamamını sizin yönetmeniz anlamına gelir. Bu rehber Debian ve RHEL ailesini tek betikte ayırır.
WEB="nginx"
mkdir -p /var/www/ornek.com/public_html
nginx -t && systemctl reload nginx
apachectl configtest && systemctl reload httpd
Toplu otomasyon yanlış mimariyi hızlandırmamalıdır. Müşteri izolasyonu, kaynak limiti, uygulama kökü, mail ve DNS sahipliği kararlarını önce verin.
Statik içerik, reverse proxy ve PHP-FPM yapılarında düşük ek yük ve net server_name yönetimi sunar.
.htaccess uyumluluğu ve paylaşımlı hosting benzeri yapı gereken projelerde uygundur.
Her domaini /var/www/domain/public_html altında tutmak yedekleme, izin ve deployment süreçlerini sadeleştirir.
Binlerce benzer domain için dinamik vhost düşünülebilir; ancak müşteri izolasyonu ve farklı ayarlar varsa dosya başına vhost daha güvenlidir.
Debian ailesinde sites-available, RHEL ailesinde conf.d yolu yaygındır; betik her ikisini algılar.
cat /etc/os-release
nginx -v 2>&1 || httpd -v 2>&1 || apache2 -v Yalnız Punycode/ASCII domain ve her satırda tek kayıt kullanın.
awk 'NF{print tolower($0)}' /root/domainler.txt | sort -u > /root/domainler-temiz.txt Kurulu stack'e göre nginx veya apache değerini belirleyin.
WEB="nginx" Dosya yollarını, kullanıcı izinlerini ve varsayılan vhost davranışını kontrol edin.
head -n 2 /root/domainler-temiz.txt > /root/domainler-test.txt Betik klasör ve vhost üretir; sonunda config test başarılıysa tek reload yapar.
chmod 700 /root/linux-toplu-domain.sh
/root/linux-toplu-domain.sh Önce A/AAAA çözümlemesini doğrulayın; daha sonra Certbot veya tercih edilen ACME istemcisini kontrollü partilerle çalıştırın.
dig +short ornek.com A
curl -I http://ornek.com Dağıtım yollarını algılar, document root ve vhost üretir, yapılandırmayı test edip reload eder.
#!/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-hatalari.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 "Hatalar: $HATA"
server_name ve root alanlarının domainle eşleştiğini doğrulayın.
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;
}
}
DocumentRoot dizinine Require all granted verin; AllowOverride ihtiyacını uygulamaya göre seçin.
<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>
Domain listesindeki durum kodlarını paralelliği sınırlayarak ölçün.
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://{}"'
Nginx ve Apache için sites-available/sites-enabled düzeni yaygındır. Web kullanıcısı çoğunlukla www-data'dır.
nginx -tapache2ctl configtestsystemctl reload nginx || systemctl reload apache2Nginx ve httpd genellikle conf.d kullanır. SELinux bağlamı ve firewalld kuralları ayrıca doğrulanmalıdır.
nginx -t || httpd -trestorecon -Rv /var/wwwfirewall-cmd --list-servicesLVE ve CageFS çoğunlukla panel entegrasyonuyla anlam kazanır. Panelsiz stack'te standart systemd, PHP-FPM pool ve izin modelini açıkça tasarlayın.
cat /etc/cloudlinux-release 2>/dev/null || truesystemctl list-units 'php*fpm*'find /var/www -maxdepth 2 -type d -printf '%u:%g %p\n' | headAynı server_name, eksik noktalı virgül, yanlış include veya izin hatası olabilir.
VirtualHost dosyasında hatalı directive, tırnak veya modül bağımlılığı bulunur.
Document root sahipliği, execute dizin izni, SELinux bağlamı veya Apache Directory kuralı hatalı olabilir.
Host adı doğru vhost ile eşleşmiyor veya DNS başka IP'ye gidiyor olabilir.
DNS yayılmamış, port 80 kapalı, proxy açık veya challenge yolu başka uygulamaya gidiyor olabilir.
Aramayla eşleşen hata bulunamadı.
Uygulama ihtiyacı belirleyicidir. .htaccess bağımlılığı varsa Apache kolaydır; reverse proxy ve merkezi yapılandırma için Nginx uygundur.
Modern sunucularda yüzlerce vhost tek başına olağan dışı değildir. Sertifika sayısı, log dosyaları, worker limitleri, config reload süresi ve gerçek trafik ölçülmelidir.
Aynı güven sınırındaki düşük trafikli siteler pool paylaşabilir. Farklı müşteriler, farklı kullanıcılar veya kaynak limitleri için ayrı pool daha güvenlidir.
Benzer yapıdaki domainlerde kullanılabilir; ancak her domainin farklı kökü, sertifikası veya uygulaması varsa açık server block/VirtualHost daha yönetilebilirdir.
Genellikle ayrı aşama daha güvenlidir. DNS yayılımı ve HTTP erişimi doğrulanmadan ACME isteği göndermeyin.
Aynı içeriği yüzlerce domainde çoğaltmak yerine ana domain, canonical ve gerektiğinde 301 yönlendirme stratejisi kullanın.
Panel seçimi, DNS, SSL, web sunucusu, güvenlik, yedekleme ve doğrulama adımlarını sunucunuzun gerçek yapısına göre uyguluyoruz.