Ana içeriğe geç

Nginx Yapılandırması

FeedbackPulse SaaS için tam Nginx kurulum kılavuzu.


Ön Koşullar

  • Nginx 1.18+
  • PHP-FPM 8.4+
  • SSL sertifikası (önerilen)

Temel Sunucu Bloğu

Yeni bir Nginx yapılandırması oluşturun:

sudo nano /etc/nginx/sites-available/feedbackpulse

Şunu yapıştırın:

server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/feedbackpulse-saas/public;

index index.php index.html;

charset utf-8;

# Laravel URL yeniden yazma
location / {
try_files $uri $uri/ /index.php?$query_string;
}

# PHP işleme
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}

# Gizli dosyalara erişimi reddet
location ~ /\.(?!well-known).* {
deny all;
}

# Statik dosya önbellekleme
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}

# Maksimum yükleme boyutu (fotoğraflar, logolar için)
client_max_body_size 20M;

# Günlük kaydı
access_log /var/log/nginx/feedbackpulse-access.log;
error_log /var/log/nginx/feedbackpulse-error.log;
}

Siteyi etkinleştirin:

sudo ln -s /etc/nginx/sites-available/feedbackpulse /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default # Varsayılan siteyi kaldırın (isteğe bağlı)
sudo nginx -t # Yapılandırmayı test edin
sudo systemctl restart nginx

HTTPS Sunucu Bloğu (Let's Encrypt ile)

# HTTP'yi HTTPS'ye yönlendir
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://yourdomain.com$request_uri;
}

# Ana HTTPS sunucusu
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
root /var/www/feedbackpulse-saas/public;

index index.php index.html;
charset utf-8;

# SSL Yapılandırması
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

# Güvenlik Başlıkları
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

# Laravel URL yeniden yazma
location / {
try_files $uri $uri/ /index.php?$query_string;
}

# PHP işleme
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
fastcgi_read_timeout 300;
}

# Gizli dosyalara erişimi reddet (ACME için .well-known hariç)
location ~ /\.(?!well-known).* {
deny all;
}

# Statik dosya önbellekleme
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}

client_max_body_size 20M;

access_log /var/log/nginx/feedbackpulse-access.log;
error_log /var/log/nginx/feedbackpulse-error.log;
}

Joker Karakter Alt Etki Alanı Desteği

acme.yourdomain.com gibi kiracı alt etki alanları için:

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com *.yourdomain.com;
root /var/www/feedbackpulse-saas/public;

# Joker karakter SSL sertifikası kullanın
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

# ... yukarıdaki HTTPS bloğuyla aynı yapılandırmanın geri kalanı ...

index index.php index.html;
charset utf-8;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}

location ~ /\.(?!well-known).* {
deny all;
}

client_max_body_size 20M;
}

Gereksinimler: Joker karakter DNS kaydı + joker karakter SSL sertifikası. Bkz. Joker Karakter DNS Kurulumu.


PHP-FPM Yapılandırması

FeedbackPulse için PHP-FPM'yi optimize edin:

sudo nano /etc/php/8.4/fpm/pool.d/www.conf

Temel ayarlar:

; Süreç yönetimi
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500

; Zaman aşımları
request_terminate_timeout = 300

; Yükleme sınırları
php_admin_value[upload_max_filesize] = 20M
php_admin_value[post_max_size] = 25M
php_admin_value[memory_limit] = 256M

PHP-FPM'yi yeniden başlatın:

sudo systemctl restart php8.4-fpm

Laravel Forge / Ploi / RunCloud

Yönetilen sunucu sağlayıcısı kullanıyorsanız:

Laravel Forge

  1. yourdomain.com etki alanıyla yeni bir site oluşturun
  2. Web Dizini'ni /public olarak ayarlayın
  3. Kodunuzu dağıtın (Git veya yükleme)
  4. Forge Nginx'i otomatik olarak doğru şekilde yapılandırır
  5. "SSL" sekmesinden SSL'i etkinleştirin (Let's Encrypt)

Ploi

  1. Yeni site ekle → etki alanınızı girin
  2. Kökü /public olarak ayarlayın
  3. Kodu dağıtın
  4. SSL otomatik olarak yapılandırılır

RunCloud

  1. Web uygulaması oluştur → "PHP" seçin → etki alanı girin
  2. Genel yolu public olarak ayarlayın
  3. Git veya dosya yöneticisi aracılığıyla dağıtın
  4. SSL'i etkinleştirin

Nginx Yapılandırmasını Doğrulayın

# Sözdizimini test edin
sudo nginx -t

# PHP-FPM'nin çalışıp çalışmadığını kontrol edin
sudo systemctl status php8.4-fpm

# Nginx'in çalışıp çalışmadığını kontrol edin
sudo systemctl status nginx

# Hangi PHP-FPM soketinin kullanıldığını kontrol edin
ls /var/run/php/

# Her şeyi yeniden başlatın
sudo systemctl restart php8.4-fpm nginx

Yaygın Nginx Sorunları

SorunÇözüm
502 Bad GatewayPHP-FPM çalışmıyor veya soket yolu yanlış. fastcgi_pass'in PHP-FPM soketinizle eşleştiğini kontrol edin.
Tüm rotalarda 404Location bloğunda try_files $uri $uri/ /index.php?$query_string; eksik.
413 Request Entity Too Largeclient_max_body_size'ı artırın (varsayılan 1M).
"Dosya bulunamadı"root'un public/ dizinine işaret ettiğini ve SCRIPT_FILENAME'de $realpath_root kullanıldığını kontrol edin.
Boş sayfastorage/logs/laravel.log ve /var/log/nginx/feedbackpulse-error.log dosyalarını kontrol edin.

Sonraki Adımlar