Ubuntu'da Nginx ile Laravel Nasıl Kurulur ve Yapılandırılır (LEMP Yığını)


Giriş

Laravel, modern PHP uygulamaları geliştirmek için kapsamlı bir araç ve kaynak seti sunan açık kaynaklı bir PHP çerçevesidir. Dahili özelliklerinden yararlanan eksiksiz bir ekosistemle, Laravel’in popülaritesi hızla artmış ve birçok geliştirici tarafından geliştirme süreçlerini kolaylaştıran tercih edilen çerçeve olarak benimsenmiştir.

Dünya genelindeki üretim ortamlarında, LEMP yığını üzerinde Laravel, günlük olarak milyonlarca isteği işler ve dinamik içerik için yanıt süreleri ortalama 50-200 ms civarındadır. Bu kombinasyon ölçülebilir şekilde üstün performans sunar: Nginx, her bağlantı için sadece 2,5MB RAM kullanarak 10.000+ eşzamanlı bağlantıyı yönetirken, Laravel’in optimize edilmiş önbelleklemesi tipik uygulamalarda veritabanı sorgularını %80-95 oranında azaltabilir.

Bu kapsamlı rehber, sizi Ubuntu üzerinde LEMP yığını (Linux, Nginx, MySQL, PHP) kullanarak bir Laravel uygulaması kurma ve yapılandırma sürecinde adım adım yönlendirir. Gerçek dünya ölçeğindeki dağıtımları yansıtan doğru güvenlik yapılandırmaları, SSL sertifikaları ve performans optimizasyonları ile üretime hazır bir Laravel ortamı kurmayı öğreneceksiniz.

Ubuntu Uyumluluğu: Bu eğitim, tüm mevcut Ubuntu LTS ve kararlı sürümlerinde çalışır. Komutlar sürüm bağımsızdır. Ubuntu sürümünüzün varsayılan PHP sürümüne bakılmaksızın, 1. Adımda gösterildiği gibi PHP 8.2+ kurun. Tüm bileşenler (Nginx, MySQL, Laravel) Ubuntu dağıtımları arasında tutarlı bir şekilde çalışır.

Ne İnşa Edeceksiniz

  • Performans Optimizasyonu: Bu eğitim, Laravel uygulamanızın hızını ve yanıt verme kabiliyetini artırmanın birden fazla yolunu ele alıyor. Sunucu yükünü azaltmak için Nginx önbelleklemesini yapılandıracak, daha iyi eşzamanlılık ve kaynak yönetimi için PHP-FPM ayarlarını optimize edecek ve Laravel'e özgü optimizasyon tekniklerini, örneğin rota ve yapılandırma önbelleklemesini uygulayarak dağıtımınızın büyümeyi karşılayabilmesini ve hızlı kullanıcı deneyimleri sunmasını sağlayacaksınız.

  • Sorun Giderme Rehberi: Olası sorunları öngörerek, rehber, kurulum veya kullanım sırasında ortaya çıkabilecek yaygın hataların çözümüne dair kapsamlı bir bölüm sunar. Yapılandırma hatalarını ayıklama, izin sorunları, bağlantı hataları için pratik tavsiyeler bulacak ve logları okuma ve yorumlama stratejileri sayesinde stabil ve güvenilir bir Laravel ortamı bakımını sürdürebileceksiniz.

  • Güvenlik En İyi Uygulamaları: Güvenlik önlemleri, stack'in her seviyesinde entegre edilmiştir. Kılavuz, veritabanı güvenliğini erişim kontrolleriyle vurgular, yetkisiz erişimi sınırlamak için uygun dosya izinlerini yapılandırır ve SSL sertifikaları kullanarak HTTPS uygular. Bu adımlar sayesinde Laravel uygulamanızın yaygın güvenlik açıklarına karşı korunmasını sağlayacak, hem sunucunuzu hem de kullanıcı verilerini güvende tutacaksınız.

Önkoşullar

Bu kılavuzu tamamlamak için, aşağıdaki bileşenleri önceden yapılandırılmış bir Ubuntu sunucusuna ihtiyacınız olacak:

Sistem Gereksinimleri

  • Ubuntu sunucusu (tüm mevcut LTS ve kararlı sürümlerle uyumludur)
  • Minimum 1GB RAM (Üretim için 2GB; yüksek trafikli siteler için 4GB+)
  • Minimum 10GB disk alanı (Laravel ~300MB, bağımlılıklar ~500MB, artı uygulama verileriniz. Kullanıcı yüklemeleri veya logları saklıyorsanız 20GB+ kullanın)
  • Root veya sudo erişimi

Boyutlandırma Rehberi: Üretim Laravel uygulamaları için kaynakları trafiğe göre tahsis edin:

  • Düşük trafik (< 10.000 günlük sayfa görüntülemesi): 1GB RAM, 1 CPU çekirdeği
  • Orta düzey trafik (10K-100K sayfa görüntüleme): 2-4GB RAM, 2 CPU çekirdeği
  • Yüksek trafik (100B+ sayfa görüntülemesi): 4GB+ RAM, 4+ CPU çekirdeği, yük dengeleme düşünün

Gerekli Yazılım Yığını

  • LEMP Yığını: Nginx, MySQL 8.0+, PHP 8.2+ PHP-FPM ile
  • Composer: PHP bağımlılık yöneticisi
  • SSL Sertifikası: HTTPS için (Let’s Encrypt önerilir)

Laravel Kurulumu İçin Gereksinimler

Laravel'i kurmadan önce temel LEMP bileşenlerini kurun:

  1. Sunucu Kurulumu: Bir sudo kullanıcısı oluşturun ve Ubuntu ile İlk Sunucu Kurulumu kullanarak güvenlik duvarını yapılandırın.

  2. LEMP Yığını: Ubuntu üzerinde Linux, Nginx, MySQL, PHP (LEMP yığını) kurulumunu nasıl yapılacağını takip ederek Nginx, MySQL ve PHP-FPM'i kurun. Hızlı kurulum için Linux-Console.net'teki LEMP Tek Tıkla Kurulum yöntemini kullanın. CentOS kullanıcıları için, CentOS 8'de LEMP Kurulumu bölümüne bakın.

  3. Composer: PHP bağımlılık yöneticisini Ubuntu'ya Composer Kurulumu rehberi ile yükleyin.

Bu önkoşulları tamamladıktan sonra, Laravel'e özgü PHP uzantılarını yüklemek ve uygulamanızı yapılandırmak için buraya geri dönün.

Laravel için Apache yerine Nginx'i neden seçmelisiniz? Nginx ölçülebilir avantajlar sunar: çok daha yüksek eşzamanlılık (Apache prefork ile yaklaşık 1.000 bağlantıya karşı, 10.000'den fazla eşzamanlı bağlantı), önemli ölçüde daha düşük bellek kullanımı (her bağlantı başına yaklaşık 2,5MB vs 6–8MB) ve daha hızlı statik kaynak teslimi (benzer donanımda yaklaşık 15.000 istek/saniye vs 5.000 istek/saniye). Çok sayıda CSS, JS ve resim kaynağı içeren Laravel uygulamaları için, olay tabanlı modeli orantılı bellek artışı olmadan verimli şekilde ölçeklenir ve bu yüzden yaygın olarak üretim ortamında tercih edilir.

Not: Bu performans metrikleri, belirli iş yükleri ve donanım konfigürasyonları altında iyi optimize edilmiş sistemler için tipiktir. Gerçek sonuçlar, sunucu donanımı, yazılım sürümleri, yapılandırma ayarları ve uygulamanızın iş yükünün niteliğine bağlı olarak değişebilir.

Adım 1 — Gerekli PHP Eklentilerini Yükleme

Laravel'in düzgün çalışabilmesi için birkaç PHP uzantısına ihtiyacı vardır. Bu uzantılar karakter kodlaması, XML işleme, matematiksel işlemler ve veritabanı bağlantısı için temel işlevsellik sağlar.

PHP Sürüm Kontrolü: Laravel 11, PHP 8.2 veya daha yeni bir sürüm gerektirir. Mevcut sürümünüzü php -v ile kontrol edin. Eğer PHP 7.4 veya 8.0/8.1 görüyorsanız, aşağıdaki yükseltme adımlarını izleyin. Bu eğitim PHP 8.2 komutlarını kullanmaktadır—eğer PHP 8.3 kurarsanız, tüm komutlarda php8.2 yerine php8.3 kullanın.

Modern PHP Sürümlerine Yükseltme

En iyi Laravel 11 uyumluluğu ve performansı için PHP 8.2 veya daha yenisini yükleyin:

sudo add-apt-repository ppa:ondrej/php

sudo apt update

sudo apt install php8.2 php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-bcmath php8.2-curl php8.2-zip php8.2-gd

PHP Yükseltme Etkisi: Ondřej Surý PPA, Ubuntu için en son kararlı PHP sürümlerini sağlar. Yükseltmeden sonra Nginx yapılandırmanızı yeni PHP-FPM soket yolunu referans alacak şekilde güncelleyin (ör. /var/run/php/php8.2-fpm.sock). Performans artışı: PHP 8.2, PHP 8.0'dan %15-20 daha hızlı çalışır ve PHP 7.4'e kıyasla %40-50 daha iyi performans sunar.

Laravel için Temel PHP Uzantıları

  • php-mbstring: Uluslararasılaştırma için çok baytlı dizi işlemleri
  • php-xml: XML ayrıştırma ve işleme yetenekleri
  • php-bcmath: Finansal hesaplamalar için rastgele hassasiyetli matematik
  • php-curl: API istekleri için HTTP istemci işlevselliği
  • php-zip: Composer ve Laravel paketleri için arşiv yönetimi
  • php-gd: Dosya yüklemeleri ve görüntü işleme için görüntü işleme

Paket yöneticinizi güncelleyin ve gerekli uzantıları yükleyin:

sudo apt update

Gerekli PHP eklentilerini yükleyin:

sudo apt install php-mbstring php-xml php-bcmath php-curl php-zip php-gd

Bu Uzantılar Olmadan Ne Kırılır

Bu uzantıları atlarsanız, Laravel yükleme veya çalıştırma sırasında başarısız olur:

  • php-mbstring eksik: Composer kurulumu sırasında hata: mbstring eklentisi eksik
  • Eksik php-xml: Laravel’in XML işlemlerini bozuyor, PHPUnit testleri başarısız oluyor
  • Eksik php-curl: HTTP istekleri yapılamıyor, paket güncellemeleri başarısız oluyor
  • Eksik php-zip: Composer paketleri çıkaramıyor: ext-zip eksik

Tüm eklentilerin doğru şekilde yüklendiğini doğrulayın:

php -m | grep -E "(mbstring|xml|bcmath|curl|zip|gd)"

Her eklenti adını listelenmiş olarak görmelisiniz. Eğer herhangi biri eksikse, apt install komutunu tekrar edin.

Üretim Eklemesi: Önbellekleme için php-redis ve oturum depolama için php-memcached yükleyin. Bunlar zorunlu değildir ancak performansı önemli ölçüde artırır: sudo apt install php-redis php-memcached.

PHP eklentileri yüklendiğine göre, veritabanını kurmaya hazırsınız.

Adım 2 — Güvenli Bir Veritabanı Yapılandırması Oluşturma

Laravel’in veritabanı entegrasyonunu göstermek için örnek bir seyahat listesi uygulaması oluşturacağız. Bu uygulama, ziyaret durumu ile birlikte seyahat destinasyonlarını saklayacak ve Laravel’in Eloquent ORM ve veritabanı bağlantısını sergileyecek.

Veritabanı Güvenliği En İyi Uygulamaları

Üretim ortamlarında, her zaman şu güvenlik ilkelerine uyun:

  • Minimum gerekli ayrıcalıklara sahip özel veritabanı kullanıcıları oluşturun
  • Güçlü ve benzersiz şifreler kullanın
  • MySQL’in kimlik doğrulama eklentisi uyumluluğunu etkinleştir
  • Veritabanı erişimi için uygun güvenlik duvarı kurallarını yapılandırın

Güvenlik Notu: caching_sha2_authentication yöntemi (MySQL 8.0 varsayılanı) belirli yapılandırmalarla PHP 7.4+ gerektirir. Eski PHP sürümleriyle uyumluluk veya daha basit bir kurulum için mysql_native_password kimlik doğrulamasını kullanacağız.

Veritabanı ve Kullanıcı Oluşturma

MySQL'e root kullanıcısı olarak bağlan:

sudo mysql

Uygulama veritabanını oluştur:

CREATE DATABASE travellist CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Karakter Seti: utf8mb4 kullanmak, modern web uygulamaları için gerekli olan emoji ve uluslararası karakterler de dahil olmak üzere tam Unicode desteği sağlar.

Güvenli kimlik doğrulama ile özel bir veritabanı kullanıcısı oluşturun:

CREATE USER 'travellist_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_secure_password_here';

Güvenlik İyileştirmesi: travellist_user kullanıcısı sadece 'localhost' üzerinden bağlantılarla sınırlıdır. Bu, herhangi bir sunucudan uzak bağlantılara izin verecek '%' kullanımına kıyasla bilinçli bir güvenlik artırımıdır. Uzak erişim varsayılan olarak artık devre dışıdır. Başka bir sunucudan MySQL’e bağlanmanız gerekiyorsa, kullanıcının farklı bir sunucuyla oluşturulması (örneğin, 'travellist_user'@'%') ve MySQL’in bind-address ile firewall ayarlarının güncellenmesi yoluyla uzak erişimi açıkça yapılandırmanız gerekir.

Parola Güvenliği: your_secure_password_here ifadesini büyük harf, küçük harf, rakam ve özel karakterler içeren güçlü bir parola ile değiştirin. Güvenli parolalar oluşturmak ve saklamak için bir parola yöneticisi kullanmayı düşünün.

Kullanıcıya uygun yetkileri ver:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON travellist.* TO 'travellist_user'@'localhost';

FLUSH PRIVILEGES;

En Az Ayrıcalık Prensibi: Uygulama için yalnızca gerekli olan özel izinleri veririz, genel ayrıcalıklar vermez. Bu, uygulama ele geçirilirse potansiyel zararı sınırlar.

MySQL konsolundan çıkın:

exit

Veritabanı Bağlantısı Test Ediliyor

Veritabanı kullanıcı izinlerini test edin:

mysql -u travellist_user -p

Bağlantı Testi: -p parametresi parola girilmesini ister. Bu, veritabanı kullanıcınızın kimlik doğrulaması yapıp veritabanına erişebileceğini doğrular.

Veritabanı erişimini doğrulayın:

SHOW DATABASES;

Beklenen çıktı:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| travellist        |
+--------------------+
2 rows in set (0.01 sec)

Uygulama Tablosu Oluşturma

places tablosunu uygun indeksleme ve kısıtlamalarla oluşturun:

USE travellist;



CREATE TABLE places (

    id INT AUTO_INCREMENT PRIMARY KEY,

    name VARCHAR(255) NOT NULL,

    visited BOOLEAN DEFAULT FALSE,

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    INDEX idx_visited (visited),

    INDEX idx_name (name)

);

Veritabanı Tasarımı: Denetim izleri için created_at ve updated_at zaman damgalarını ekledik ve daha iyi performans için sık sorgulanan sütunlara indeksler ekledik.

Örnek Verilerle Dolduruluyor

Örnek seyahat destinasyonları ekleyin:

INSERT INTO places (name, visited) VALUES 

('Tokyo', FALSE),

('Budapest', TRUE),

('Nairobi', FALSE),

('Berlin', TRUE),

('Lisbon', TRUE),

('Denver', FALSE),

('Moscow', FALSE),

('Oslo', FALSE),

('Rio de Janeiro', TRUE),

('Cincinnati', FALSE),

('Helsinki', FALSE);

Verileri doğrulayın:

SELECT * FROM places ORDER BY visited DESC, name ASC;

Beklenen çıktı:

+----+---------------+---------+---------------------+---------------------+
| id | name          | visited | created_at          | updated_at          |
+----+---------------+---------+---------------------+---------------------+
|  2 | Budapest      |       1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  4 | Berlin        |       1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  5 | Lisbon        |       1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  9 | Rio de Janeiro|       1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  1 | Tokyo         |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  3 | Nairobi       |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  6 | Denver        |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  7 | Moscow        |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
|  8 | Oslo          |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
| 10 | Cincinnati    |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
| 11 | Helsinki      |       0 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
+----+---------------+---------+---------------------+---------------------+
11 rows in set (0.00 sec)

MySQL'den Çık

exit

Veritabanınız artık Laravel entegrasyonu için hazır. Sonraki adım olarak Laravel uygulamasını oluşturacağız.

Adım 3 — Yeni Bir Laravel Uygulaması Oluşturma

PHP bağımlılıklarını yöneten ve Laravel yükleyicisini sağlayan Composer kullanarak bir Laravel uygulaması oluşturacağız. Bu yöntem, tüm gerekli bağımlılıklarla birlikte en son kararlı sürümü almanızı sağlar.

Laravel Sürümü: Bu kılavuz, PHP 8.2+ gerektiren mevcut LTS sürümü olan Laravel 11.x'i kullanmaktadır. Laravel 11, saniye başına oran sınırlaması, geliştirilmiş model dönüşümleri ve sadeleştirilmiş dizin yapısı sunar. Üretim ortamlarında her zaman 18 ay hata düzeltmeleri ve 2 yıl güvenlik güncellemeleri alan LTS sürümlerini kullanın.

Laravel'i Composer ile Kurmak

Ana dizininize gidin:

cd ~

Yeni bir Laravel uygulaması oluşturun:

composer create-project laravel/laravel travellist

Composer Seçenekleri: --prefer-dist bayrağı, kaynak kodu yerine kararlı sürümleri indirir; bu, üretim ortamları için daha hızlı ve daha güvenilirdir.

Beklenen çıktı:

Creating a "laravel/laravel" project at "./travellist"
Installing laravel/laravel (v11.31.0)
  - Installing laravel/laravel (v11.31.0): Downloading (100%)         
Created project in travellist
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 80 installs, 0 updates, 0 removals
  - Installing symfony/polyfill-ctype (v1.28.0): Downloading (100%)         
  - Installing phpoption/phpoption (1.9.0): Downloading (100%)         
  - Installing vlucas/phpdotenv (v5.5.0): Downloading (100%)         
  - Installing symfony/css-selector (v6.3.0): Downloading (100%)     
...

Laravel Kurulumunu Doğrulama

Uygulama dizinine gidin ve Laravel’in komut satırı arayüzünü test edin:

cd travellist

php artisan --version

Şu şekilde bir çıktı göreceksiniz:

Laravel Framework 11.31.0

Tam küçük sürüm numarası (11.x), ne zaman kurduğunuza bağlı olarak değişecektir, ancak Laravel 11’e sahip olduğunuzu doğrulamak için sürümün "11" ile başlamasını sağlayın.

Artisan komut satırı aracını test edin:

php artisan list

Artisan CLI: Laravel’in Artisan komut satırı arayüzü, veritabanı geçişleri, rota önbelleğe alma ve kuyruk yönetimi gibi yaygın görevler için 50’den fazla yerleşik komut sunar.

Bu, Laravel'in doğru şekilde kurulduğunu doğrular. Bundan sonra, uygulamayı veritabanınız ve ortamınız için yapılandıracağız.

Adım 4 — Laravel Ortamını Yapılandırma

Laravel, farklı ortamlarda yapılandırmayı yönetmek için ortam değişkenlerini kullanır. .env dosyası, varsayılan yapılandırma dosyalarının üzerine yazan hassas bilgiler ve ortama özgü ayarlar içerir.

Güvenlik Uyarısı: .env dosyasını sürüm kontrolüne asla eklemeyin. Bu dosya, veritabanı kimlik bilgilerini, API anahtarlarını ve diğer hassas bilgileri içerir. Laravel, .gitignore aracılığıyla bunu otomatik olarak Git'ten hariç tutar.

Laravel Yapılandırmasını Anlamak

Laravel, hiyerarşik bir yapılandırma sistemi izler:

  1. Varsayılan değerler config/ dizinindeki dosyalarda
  2. Çevresel değişkenler .env dosyasında (en yüksek öncelik)
  3. Artisan komutlarıyla çalışma zamanı yapılandırması

Ortam Değişkenlerini Yapılandırma

Düzenlemek için .env dosyasını açın:

nano .env

Değiştirmeniz Gereken Yapılandırma

.env dosyasını açın ve bu veritabanı değerlerini Adım 2 ile eşleyecek şekilde güncelleyin:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=your_secure_password_here

your_secure_password_here kısmını 2. adımda belirlediğiniz şifreyle değiştirin.

Gözden Geçirmeniz Gereken Yapılandırma

Bunları ortamınıza göre güncelleyin:

APP_NAME="Travel List Application"
APP_ENV=local              # Change to "production" when deploying
APP_DEBUG=true             # MUST be false in production (exposes sensitive data)
APP_URL=http://your_domain_or_ip

LOG_LEVEL=debug            # Use "error" in production to reduce log size

Varsayılan olarak bırakabileceğiniz yapılandırma

Şimdilik bu şekilde çalışıyor:

SESSION_DRIVER=file        # Upgrade to redis/memcached for multiple servers
CACHE_DRIVER=file          # Upgrade to redis for better performance
QUEUE_CONNECTION=sync      # Upgrade to redis/database for background jobs

Ortam Özel Ayarları:

  • Geliştirme: APP_DEBUG=true, APP_ENV=local
  • Prodüksiyon: APP_DEBUG=false, APP_ENV=production
  • Test Ediliyor: APP_DEBUG=true, APP_ENV=testing

Uygulama Anahtarı Oluşturuluyor

Laravel, şifreleme için benzersiz bir uygulama anahtarı gerektirir. Artisan kullanarak oluşturun:

php artisan key:generate

Uygulama Anahtarı: Bu anahtar çerezleri, oturumları ve diğer hassas verileri şifrelemek için kullanılır. Laravel, mevcut bir anahtar yoksa otomatik olarak güvenli bir anahtar oluşturur.

Laravel Veritabanı Bağlantısını Doğrulama

Veritabanı yapılandırmanızı doğrulayın:

php artisan tinker --execute="DB::connection()->getPdo();"

Beklenen çıktı:

=> PDO {#1234}

Veritabanı Testi: Bu komut, migration çalıştırmadan veritabanı bağlantısını test eder. Başarılı olursa, bir PDO nesnesi döndürülür.

Üretim İçin Optimizasyon

Üretim ortamları için, bu optimizasyon komutlarını çalıştırın:

php artisan config:cache

php artisan route:cache

php artisan view:cache

Performans Optimizasyonu: Bu komutlar, üretim ortamlarında uygulama performansını artırmak için yapılandırmaları, rotaları ve görünümleri önbelleğe alır.

Laravel uygulamanız artık yapılandırıldı. Sonraki adım olarak, uygulamanızı sunmak için Nginx'i kuracağız.

Adım 5 — Laravel için Nginx'i Yapılandırma

Nginx'in Laravel uygulamalarını verimli bir şekilde sunabilmesi için doğru şekilde yapılandırılması gerekir. Güvenlik başlıkları, performans optimizasyonları ve uygun dosya izinleri ile üretime hazır bir yapılandırma kuracağız.

Uygulamayı Web Dizinine Taşımak

Laravel uygulamasını standart web dizinine taşıyın:

sudo mv ~/travellist /var/www/travellist

Web Dizini: /var/www, Ubuntu'da web uygulamaları için standart konumdur. Bu, daha iyi güvenlik izolasyonu sağlar ve Linux dosya sistemi hiyerarşi standartlarına uyar.

Doğru Dosya İzinlerini Ayarlamak

Laravel'in yazılabilir dizinleri için sahiplik ve izinleri yapılandırın:

sudo chown -R www-data:www-data /var/www/travellist

sudo chmod -R 755 /var/www/travellist

sudo chmod -R 775 /var/www/travellist/storage

sudo chmod -R 775 /var/www/travellist/bootstrap/cache

İzin Stratejisi:

  • Dizinler için 755 (sahibi: okuma/yazma/çalıştırma, grup/diğerleri: okuma/çalıştırma)
  • Laravel’in yazılabilir dizinleri (storage, cache) için 775
  • www-data sahipliği, Nginx’in dosyaları okuyabilmesini ve depolamaya yazabilmesini sağlar

Nginx Sanal Sunucu Oluşturma

Yeni bir sanal sunucu yapılandırması oluşturun:

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

Üretime Hazır Nginx Yapılandırması

Laravel için bu optimize edilmiş yapılandırmayı kullanın:

server {
    listen 80;
    listen [::]:80;
    server_name your_domain_or_ip;
    root /var/www/travellist/public;
    index index.php index.html index.htm;

    # Security Headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    add_header Content-Security-Policy "default-src 'self' http: https: data: blob;" always;

    # Gzip Compression
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_proxied expired no-cache no-store private must-revalidate auth;
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss;

    # Handle Laravel Routes
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

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

    # Static Files Caching
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # Security: Deny access to hidden files
    location ~ /\. {
        deny all;
    }

    # Security: Deny access to sensitive files
    location ~ /(\.env|\.git|composer\.(json|lock)|package\.json) {
        deny all;
    }

    # Favicon and robots.txt
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }
}

Konfigürasyon Özellikleri:

  • Güvenlik Başlıkları: XSS koruması, içerik türü keşfi önleme, çerçeve seçenekleri
  • Gzip Sıkıştırma: Bant genişliği kullanımını azaltır ve yükleme sürelerini iyileştirir
  • Statik Dosya Önbellekleme: CSS, JS ve görsellerin performansını optimize eder
  • PHP-FPM Soketi: TCP'ye göre daha iyi performans için Unix soketi kullanır

PHP-FPM Soket Yolu: Konfigürasyon, PHP 8.2 kurulumumuza uygun olarak php8.2-fpm.sock kullanıyor. Farklı bir PHP sürümü kurduysanız, bu yolu güncelleyin. Soketinizi doğrulamak için: ls /var/run/php/, php8.2-fpm.sock veya php8.3-fpm.sock gibi mevcut soketleri gösterecektir. Soket adı her zaman kurulu PHP sürümünüzle eşleşir.

Sanal Sunucuyu Etkinleştirme

Siteyi etkinleştirmek için sembolik bir bağlantı oluşturun:

sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/

Site Yönetimi: Sembolik bağlantı, Nginx'in siteyi sunmasını sağlar. Bir siteyi devre dışı bırakmak için yapılandırma dosyasını silmeden sites-enabled/ dizininden bağlantıyı kaldırın.

Nginx'i Test Etme ve Yeniden Yükleme

Yapılandırmayı sözdizimi hataları için test edin:

sudo nginx -t

Beklenen çıktı:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Değişiklikleri uygulamak için Nginx'i yeniden yükleyin:

sudo systemctl reload nginx

Kurulumu Doğrulama

Uygulamanıza bir tarayıcıda erişin:

http://your_domain_or_ip

Beklenen Sonuç: Laravel’in karşılama sayfasını görmelisiniz, bu Nginx’in Laravel uygulamanızı düzgün şekilde sunduğunu doğrular.

Laravel uygulamanız şimdi Nginx üzerinde çalışıyor. Bir sonraki adım olarak, uygulamayı veritabanınızdaki verileri gösterecek şekilde özelleştireceğiz.

Adım 6 — Seyahat Listesi Uygulamasını Oluşturma

Şimdi, veritabanınızdaki seyahat destinasyonlarını gösteren fonksiyonel bir Laravel uygulaması oluşturacağız. Bu, Laravel’in MVC mimarisini, veritabanı bağlantısını ve Blade şablonlamayı göstermektedir.

Laravel’in MVC Mimarisi’ni Anlamak

Laravel, Model-Görünüm-Kontrolcü (MVC) desenini takip eder:

  • Model: Verileri ve iş mantığını temsil eder
  • Görünüm: Sunum ve kullanıcı arayüzünü yönetir
  • Denetleyici: Kullanıcı girdilerini yönetir ve Model ile Görünüm arasındaki koordinasyonu sağlar

Rota Oluşturma

Veritabanınızı sorgulamak için ana rota dosyasını düzenleyin:

nano /var/www/travellist/routes/web.php

Varsayılan yönlendirmeyi bu veritabanı tabanlı uygulama ile değiştirin:

<?php

use Illuminate\Support\Facades\DB;

Route::get('/', function () {
    $visited = DB::select('SELECT * FROM places WHERE visited = ?', [1]);
    $togo = DB::select('SELECT * FROM places WHERE visited = ?', [0]);
    
    return view('travellist', [
        'visited' => $visited,
        'togo' => $togo
    ]);
});

Veritabanı Sorguları: SQL enjeksiyon saldırılarını önlemek için parametreli sorgular kullanıyoruz. Laravel’in sorgu oluşturucusu, kullanıcı girdisini otomatik olarak güvenli hale getirir.

Blade Şablonu Oluşturma

Seyahat listeniz için duyarlı bir Blade şablonu oluşturun:

nano /var/www/travellist/resources/views/travellist.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My Travel Bucket List</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
        .section { margin: 30px 0; padding: 20px; border-radius: 8px; }
        .visited { background-color: #d4edda; border-left: 4px solid #28a745; }
        .togo { background-color: #fff3cd; border-left: 4px solid #ffc107; }
        h1 { color: #333; text-align: center; }
        h2 { color: #666; margin-top: 0; }
        ul { list-style: none; padding: 0; }
        li { padding: 8px 0; border-bottom: 1px solid #eee; }
        .count { font-weight: bold; color: #666; }
    </style>
</head>
<body>
    <h1>🌍 My Travel Bucket List</h1>
    
    <div class="section visited">
        <h2>✅ Places I've Visited ({{ count($visited) }})</h2>
        @if(count($visited) > 0)
            <ul>
                @foreach($visited as $place)
                    <li>{{ $place->name }}</li>
                @endforeach
            </ul>
        @else
            <p>No places visited yet. Time to start traveling!</p>
        @endif
    </div>
    
    <div class="section togo">
        <h2>🎯 Places I Want to Visit ({{ count($togo) }})</h2>
        @if(count($togo) > 0)
            <ul>
                @foreach($togo as $place)
                    <li>{{ $place->name }}</li>
                @endforeach
            </ul>
        @else
            <p>All destinations visited! Time to add more places to your bucket list.</p>
        @endif
    </div>
</body>
</html>

Blade Şablonlama: Laravel’in Blade motoru, koşullar, döngüler ve bileşen mirası gibi güçlü şablonlama özellikleri sunar. @if, @foreach ve {{ }} sözdizimi, şablonları temiz ve okunabilir hale getirir.

Uygulamayı Test Etmek

Uygulamanıza bir tarayıcıda erişin:

http://your_domain_or_ip

Beklenen Sonuç: Veritabanınızdaki ziyaret edilmiş ve ziyaret edilmemiş destinasyonları, sayılarla birlikte ve duyarlı tasarıma sahip stilize edilmiş bir seyahat listesi olarak görmelisiniz.

Veritabanı Bağlantısını Doğrulama

Uygulamanızın veritabanına düzgün şekilde bağlandığını test edin:

cd /var/www/travellist

php artisan tinker --execute="echo 'Database connection: ' . (DB::connection()->getPdo() ? 'Success' : 'Failed');"

Veritabanı Doğrulaması: Bu komut, veritabanı bağlantısını test eder ve Laravel'in MySQL ile başarılı bir şekilde iletişim kurabildiğini doğrular.

Laravel uygulamanız artık veritabanı entegrasyonu ile tamamen çalışır durumda!

Adım 7 — Let’s Encrypt ile SSL Yapılandırması

Üretim siteleri güvenlik ve SEO için HTTPS gerektirir. Let’s Encrypt ücretsiz SSL sertifikaları sağlar.

SSL için Önkoşullar

Certbot'u çalıştırmadan önce doğrulayın:

  1. Alan adı sunucunuza yönlendiriyor: dig +short your_domain.com komutunu çalıştırın - sunucunuzun IP adresini döndürmelidir
  2. Port 80 erişilebilir: Let’s Encrypt, HTTPS sertifikalarını vermeden önce HTTP üzerinden doğrulama yapar
  3. Nginx çalışıyor: sudo systemctl status nginx ile kontrol edin

Eğer alan adınız henüz sunucuya yönlendirilmemişse, şunu alırsınız: Challenge failed for domain your_domain.com. Önce DNS’inizi düzeltin.

Certbot'u Yüklemek

Certbot ve Nginx eklentisini yükleyin:

sudo apt update

sudo apt install certbot python3-certbot-nginx

SSL Sertifikası Alma

Alan adınızla Certbot'u çalıştırın:

sudo certbot --nginx -d your_domain.com -d www.your_domain.com

Certbot şunları yapacaktır:

  1. Alan adı üzerinde kontrolünüz olduğunu doğrulayın
  2. SSL sertifikaları oluştur
  3. Nginx yapılandırmanızı HTTPS kullanacak şekilde değiştirin
  4. HTTP→HTTPS yönlendirmesi ekle

“HTTP trafiğini HTTPS’e yönlendirip yönlendirmemeyi seçin” şeklinde bir uyarı verildiğinde, otomatik HTTPS uygulaması için 2 (Yönlendir) seçeneğini işaretleyin.

Certbot'un Değiştirdikleri

Değişiklikleri görmek için Nginx konfigürasyonunuzu kontrol edin:

sudo cat /etc/nginx/sites-available/travellist

Certbot bu satırları ekledi:

listen 443 ssl; # SSL port
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;

Otomatik Yenilemeyi Test Etme

Let’s Encrypt sertifikaları 90 gün sonra sona erer. Otomatik yenilemeyi test edin:

sudo certbot renew --dry-run

Eğer başarılı olursa, şunu göreceksiniz: Tebrikler, tüm simüle edilmiş yenilemeler başarılı oldu. Sistem, sertifikaları süresi dolmadan önce otomatik olarak bir systemd zamanlayıcısı aracılığıyla yenileyecektir.

Adım 8 — Üretim Optimizasyonları

Laravel Performans Optimizasyonu

Üretime geçmeden önce bu önbellek komutlarını çalıştırın. Her biri Laravel’in farklı bir bölümünü önbelleğe alır:

cd /var/www/travellist



# Cache configuration files (15-25ms faster per request)

php artisan config:cache



# Cache route definitions (10-15ms faster per request)

php artisan route:cache



# Pre-compile Blade templates (5-10ms faster per request)

php artisan view:cache



# Optimize autoloader (faster class loading)

php artisan optimize

Bunları Ne Zaman Çalıştırmalı: Her kod dağıtımından sonra. Eğer rotaları veya yapılandırmayı değiştirirseniz, önce önbelleği temizleyin: php artisan cache:clear.

Geliştirmede Çalıştırmayın: Önbellekleme, .env değişikliklerinin uygulanmasını engeller. Önbelleği sadece üretimde kullanın.

Nginx Performans Ayarı

Bu iyileştirmeleri Nginx yapılandırmanıza ekleyin:

# Add to server block
client_max_body_size 20M;
client_body_timeout 60s;
client_header_timeout 60s;
keepalive_timeout 65s;
send_timeout 60s;

# FastCGI optimizations
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;

PHP-FPM Optimizasyonu

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

PHP-FPM Yapılandırma Yolu: PHP 8.2 için /etc/php/8.2/fpm/pool.d/www.conf yolunu kullanın. Eğer PHP 8.3 yüklediyseniz, bunun yerine /etc/php/8.3/fpm/pool.d/www.conf yolunu kullanın. Yol deseni her zaman /etc/php/VERSION/fpm/pool.d/www.conf şeklindedir.

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

PHP-FPM Çalışanlarını Hesaplama

Her PHP-FPM çalışanı yaklaşık 30-50MB RAM kullanır. Maksimum çalışan sayısını hesaplayın:

max_children = (Total RAM - System RAM) / 50MB

2GB sunucu için (sistem giderlerinden sonra 1.5GB kullanılabilir):

max_children = 1500MB / 50MB = 30 workers maximum

Hesapladığınız değerlerle yapılandırmayı güncelleyin:

; For 2GB RAM server (adjust based on your RAM)
pm = dynamic
pm.max_children = 30              ; Maximum workers (calculated above)
pm.start_servers = 8              ; 25% of max_children
pm.min_spare_servers = 5          ; Minimum idle workers
pm.max_spare_servers = 15         ; Maximum idle workers (50% of max_children)
pm.max_requests = 1000            ; Restart worker after 1000 requests (prevents memory leaks, industry standard)

1GB RAM için: pm.max_children=15 olarak ayarlayın
4GB RAM için: pm.max_children=60 olarak ayarlayın

PHP-FPM'i yeniden başlat:

PHP-FPM Servis Adı: Servis adı PHP versiyonunuzla eşleşir. PHP 8.2 için php8.2-fpm kullanın. PHP 8.3 için php8.3-fpm kullanın. Yüklü sürümünüzü kontrol etmek için systemctl list-units | grep php-fpm komutunu kullanın.

sudo systemctl restart php8.2-fpm

Yaygın Sorunları Giderme

Veritabanı Bağlantı Hataları

Hata: SQLSTATE[HY000] [2002] Böyle bir dosya veya dizin yok

Temel Neden: Laravel, MySQL TCP için yapılandırılmışken soket bağlantısı kurmaya çalışıyor veya soket yolu yanlış.

Tanısal Adımlar:

# Check MySQL service status

sudo systemctl status mysql



# Verify MySQL is listening

sudo netstat -tlnp | grep mysql



# Test direct connection

mysql -u travellist_user -p -h 127.0.0.1

Çözüm:

nano /var/www/travellist/.env

Veritabanı yapılandırmasını güncelle:

# Change from unix socket to TCP
DB_HOST=127.0.0.1
DB_PORT=3306

# Or specify socket path explicitly
DB_HOST=localhost
DB_SOCKET=/var/run/mysqld/mysqld.sock

Doğrulama: Değişikliklerden sonra Laravel’in konfigürasyon önbelleğini temizleyin:

php artisan config:clear

php artisan config:cache

İzin Hataları

Hata: İzin reddedildi depolama veya önbellek dizinleri için

Temel Neden: Web sunucusu (www-data), Laravel’in yazılabilir dizinlerine yazma izinlerine sahip değil.

Gerçek Dünya Senaryosu: Bu durum genellikle Git üzerinden dağıtım yaptıktan sonra meydana gelir; dosyalar www-data yerine kullanıcınızın izinlerini alır.

Tam Çözüm:

# Fix ownership

sudo chown -R www-data:www-data /var/www/travellist



# Set base permissions

sudo find /var/www/travellist -type d -exec chmod 755 {} \;

sudo find /var/www/travellist -type f -exec chmod 644 {} \;



# Set writable directories

sudo chmod -R 775 /var/www/travellist/storage

sudo chmod -R 775 /var/www/travellist/bootstrap/cache



# If using ACLs for development team access

sudo setfacl -R -m u:www-data:rwx /var/www/travellist/storage

sudo setfacl -R -m u:www-data:rwx /var/www/travellist/bootstrap/cache

Önleme: Dağıtım betiğine ekleyin:

#!/bin/bash
chown -R www-data:www-data /var/www/travellist
chmod -R 755 /var/www/travellist
chmod -R 775 /var/www/travellist/storage /var/www/travellist/bootstrap/cache

Nginx 502 Hatalı Ağ Geçidi

Hata: 502 Bad Gateway uygulamaya erişirken

Temel Neden: PHP-FPM servisi durdu, çökme oldu veya soket yolu uyuşmuyor.

Tanısal Adımlar:

# Check PHP-FPM service (adjust version as needed)

sudo systemctl status php8.2-fpm



# Check for socket file

ls -la /var/run/php/



# Review PHP-FPM error log

sudo tail -f /var/log/php8.2-fpm.log



# Check Nginx error log for specifics

sudo tail -f /var/log/nginx/error.log

Yaygın Nedenler ve Çözümler:

1. PHP-FPM Servisi Kapalı:

sudo systemctl start php8.2-fpm

sudo systemctl enable php8.2-fpm

2. Soket Yolu Uyumsuzluğu:

# Find actual socket

ls /var/run/php/



# Update Nginx config

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

# Change: fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;



# Test and reload

sudo nginx -t

sudo systemctl reload nginx

3. PHP-FPM Kaynak Tükenmesi (tüm çalışanlar meşgul):

# Check active processes

sudo ps aux | grep php-fpm | wc -l



# Review pool configuration

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



# Increase max_children for high traffic

pm.max_children = 50  # from 20

pm.start_servers = 10  # from 5

pm.min_spare_servers = 10

pm.max_spare_servers = 20



sudo systemctl restart php8.2-fpm

Laravel Uygulama Anahtarı Eksik

Hata: Uygulama şifreleme anahtarı belirtilmemiş

Temel Neden: .env dosyasında APP_KEY eksik veya dağıtım sırasında bozulmuş.

Çözüm:

cd /var/www/travellist

php artisan key:generate



# Verify key was generated

grep APP_KEY .env



# Clear and rebuild cache

php artisan config:clear

php artisan config:cache

Üretim Dağıtımı Tuzakları: Üretimde asla anahtarları yeniden oluşturmayın—bu, tüm şifrelenmiş verileri geçersiz kılar. Bunun yerine, önceki .env dosyanızdan veya yedekten APP_KEY kopyalayın.

Composer Bellek Dışı

Hata: PHP Ölümcül hata: İzin verilen bellek boyutu aşıldı

Temel Neden: Composer, bağımlılık çözümlemesi sırasında önemli miktarda bellek gerektirir.

Çözüm:

# Temporary memory increase

php -d memory_limit=512M /usr/bin/composer install



# Or set permanently

export COMPOSER_MEMORY_LIMIT=-1

composer install



# For production, use --optimize-autoloader

composer install --no-dev --optimize-autoloader

Dağıtım Sonrası Oturum/Önbellek Çalışmıyor

Belirti: Kullanıcılar rastgele oturumu kapatıyor, önbelleğe alınan veriler kalıcı değil.

Temel Neden: Dağıtım sırasında dosya sistemi önbelleği temizlendi veya izinler yanlış.

Çözüm:

# Clear all caches

php artisan cache:clear

php artisan config:clear

php artisan view:clear

php artisan route:clear



# Rebuild optimized caches

php artisan config:cache

php artisan route:cache

php artisan view:cache



# Fix storage permissions

sudo chmod -R 775 /var/www/travellist/storage

sudo chown -R www-data:www-data /var/www/travellist/storage

Üretim için En İyi Uygulama: Dağıtımlar ve birden fazla sunucu arasında bu sorunlardan kaçınmak için dosya tabanlı depolama yerine oturumlar/önbellek için Redis veya Memcached kullanın.

Sıkça Sorulan Sorular

Laravel için LEMP ve LAMP arasındaki fark nedir?

LEMP (Linux, Nginx, MySQL, PHP) ve LAMP (Linux, Apache, MySQL, PHP) Laravel için geçerli iki yığın olup, modern uygulamalar için LEMP ölçülebilir şekilde daha üstün performans sunar. Ölçülen farklar:

Performans Karşılaştırması:

  • Eşzamanlı bağlantılar: Nginx 10.000+ bağlantıyı yönetir, Apache ise ~1.000 (10 kat iyileşme)
  • Bellek verimliliği: Bağlantı başına 2,5MB vs 6-8MB (yüzde 60 daha düşük)
  • Statik dosya sunumu: 15.000 istek/s vs 5.000 istek/s (3 kat daha hızlı)
  • Tepki süresi: 50-80ms vs 150-250ms (yüzde 50-70 daha hızlı)

Mimari Avantajları: Nginx’in olay odaklı modeli, bellek kullanımında lineer artış olmadan yatay olarak ölçeklenir, bu da onu Laravel’in varlık ağırlıklı modern uygulamaları için ideal kılar. Laravel ekosistemi (Sail, Forge, Vapor) Nginx üzerinde standartlaşmıştır, bu da daha iyi topluluk desteği ve dokümantasyon sağlar.

LAMP ne zaman kullanılır: Dizin başına yapılandırma veya eski uygulama uyumluluğu için .htaccess gerekiyorsa Apache'yi düşünün. Aksi takdirde, LEMP üretim standardıdır.

Laravel uygulamamda Nginx üzerinde SSL nasıl etkinleştirilir?

Ücretsiz SSL sertifikaları için Certbot ile Let’s Encrypt kullanın:

# Install Certbot

sudo apt install certbot python3-certbot-nginx



# Obtain and configure SSL

sudo certbot --nginx -d your_domain.com -d www.your_domain.com



# Test automatic renewal

sudo certbot renew --dry-run

Certbot otomatik olarak:

  • Let’s Encrypt’ten SSL sertifikası alır
  • Nginx'i SSL ayarlarıyla yapılandırır
  • HTTP'den HTTPS'ye yönlendirmeyi ayarlar
  • Otomatik yenilemeyi etkinleştirir (sertifikalar her 90 günde bir yenilenir)

Performans Etkisi: SSL'i etkinleştirdikten sonra, sayfa yüklemelerini %30-50 daha hızlı hale getirmek için Nginx yapılandırmanızda HTTP/2'yi etkinleştirmeyi düşünün:

listen 443 ssl http2;
listen [::]:443 ssl http2;

Ubuntu'da Laravel klasörlerinin hangi izinlere sahip olması gerekir?

Laravel'in doğru şekilde çalışması için belirli izinlere ihtiyacı vardır:

Dizin/DosyaİzinMülkiyetAmaç
Uygulama kökü
755
www-data:www-data
Web sunucusu okuma erişimi
storage/
775
www-data:www-data
Kayıtlar, önbellek, oturumlar (yazma)
bootstrap/cache/
775
www-data:www-data
Çerçeve önbelleği (yazma)
.env
644
www-data:www-data
Ortam yapılandırması (okuma)

Doğru izinleri uygulayın:

sudo chown -R www-data:www-data /var/www/travellist

sudo find /var/www/travellist -type d -exec chmod 755 {} \;

sudo find /var/www/travellist -type f -exec chmod 644 {} \;

sudo chmod -R 775 /var/www/travellist/storage

sudo chmod -R 775 /var/www/travellist/bootstrap/cache

Güvenlik Notu: 777 izinleri asla ayarlamayın—bu, güvenlik açıkları oluşturur. Yazılabilir dizinler için uygun sahiplikle birlikte 775 kullanın.

Laravel Nginx kurulumunda 403/404 hatalarını nasıl düzeltebilirim?

403 Yasak Hataları:

# 1. Check document root points to /public

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

# Verify: root /var/www/travellist/public;



# 2. Verify index.php exists

ls -la /var/www/travellist/public/index.php



# 3. Fix permissions

sudo chown -R www-data:www-data /var/www/travellist

sudo chmod 755 /var/www/travellist/public



# 4. Check Nginx user

ps aux | grep nginx

# Should run as www-data

Laravel Rotalarında 404 Hataları:

# 1. Verify try_files directive

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

# Should have: try_files $uri $uri/ /index.php?$query_string;



# 2. Test Nginx config

sudo nginx -t



# 3. Check Laravel routes

cd /var/www/travellist

php artisan route:list



# 4. Clear route cache

php artisan route:clear

php artisan route:cache

Gerçek Hayatta Karşılaşılan Tuzağa Düşme: Belge kökünde /public dizinini unutmak, Laravel’in yanlış giriş noktasını sunmasına ve kaynak kodun açığa çıkmasına neden olur.

Yapılandırma değişikliklerinden sonra Nginx ve PHP-FPM'i nasıl yeniden başlatabilirim?

Yapılandırma değişiklikleri için:

# Nginx - graceful reload (no downtime)

sudo nginx -t  # Always test first

sudo systemctl reload nginx



# PHP-FPM - adjust version as needed

sudo systemctl restart php8.2-fpm

Hizmet yönetimi komutları:

# Check service status

sudo systemctl status nginx

sudo systemctl status php8.2-fpm



# Enable auto-start on boot

sudo systemctl enable nginx

sudo systemctl enable php8.2-fpm



# View real-time logs

sudo journalctl -u nginx -f

sudo journalctl -u php8.2-fpm -f

Üretim En İyi Uygulama: Nginx için reload (sıfır kesinti) ve PHP-FPM için sadece gerektiğinde restart kullanın. PHP-FPM için, kesintiyi en aza indirmek amacıyla reload seçeneği varsa bunu göz önünde bulundurun.

Bu eğitim tüm Ubuntu sürümleriyle uyumlu mu?

Evet, bu eğitim, Ubuntu LTS ve mevcut sürümlerde çalışan sürümden bağımsız komutlar ve yapılandırmalar kullanmaktadır. Temel bileşenler (Nginx, MySQL, Laravel) Ubuntu sürümleri arasında tutarlı bir davranış sergiler.

Versiyona özel hususlar:

  • PHP sürümleri: Ubuntu’nun varsayılan sürümüne bakılmaksızın gerekli PHP 8.2+ sürümünü yükleyin
  • Servis isimleri: PHP-FPM servis isimleri yüklü sürümü yansıtır (ör. php8.2-fpm)
  • Socket yolları: PHP-FPM soketinizi belirlemek için /var/run/php/ klasörünü kontrol edin
  • Yapılandırma yolları: Yolları PHP sürümünüze göre ayarlayın (ör. /etc/php/8.2/)

Sisteminizi tanımlamak için:

# Check Ubuntu version

lsb_release -a



# Check installed PHP version

php -v



# Find PHP-FPM socket

ls /var/run/php/



# Check PHP-FPM service name

systemctl list-units | grep php

Laravel uygulama performansını nasıl izlerim?

Laravel'in Dahili Araçları:

# Install Telescope for development/staging

composer require laravel/telescope --dev

php artisan telescope:install

php artisan migrate



# Access at: http://your_domain/telescope



# For queue monitoring

composer require laravel/horizon

php artisan horizon:install

Sunucu Seviyesinde İzleme:

# Real-time process monitoring

htop



# Nginx request monitoring

sudo tail -f /var/log/nginx/access.log



# PHP-FPM status

sudo systemctl status php8.2-fpm



# Laravel logs

tail -f /var/www/travellist/storage/logs/laravel.log

İzlenecek Performans Metrikleri:

  • Ortalama yanıt süresi: Önbelleğe alınmış içerik için < 200ms, dinamik içerik için < 500ms
  • Veritabanı sorgu süresi: Sorgu başına < 100ms (Telescope ile kontrol edin)
  • Hafıza kullanımı: PHP-FPM çalışanları her biri 128MB'den az kullanmalıdır
  • CPU kullanımı: Normal yük altında ortalama %70'in altında olmalıdır

Üretim İzleme: Kapsamlı izleme için New Relic, Datadog gibi APM araçlarını ya da Grafana + Prometheus gibi açık kaynak alternatiflerini düşünün.

Bu kuruluma yerine Laravel Sail'i Nginx ile mi kullanmalıyım?

Laravel Sail (Docker tabanlı geliştirme ortamı) ve yerel LEMP farklı amaçlara hizmet eder:

Laravel Sail'i şu durumlarda kullanın:

  • Takımlar arasında tutarlı ortamlarla yerel geliştirme yapmak
  • Ana sistemden izole olma ihtiyacı
  • Sistem düzeyinde yapılandırma olmadan hızlı kurulum istiyor
  • Birden fazla Laravel projesi üzerinde aynı anda çalışmak

Yerel LEMP'i (bu eğitim) kullanın:

  • Üretim sunucularına dağıtım
  • Maksimum performans için optimize etme (Docker %5-15 ek yük ekler)
  • Mevcut altyapıyı yönetmek
  • Her bileşen üzerinde ince ayar kontrolü gerek
  • Kaynak kısıtlı VPS sunucularıyla çalışmak

Hibrit Yaklaşım: Birçok ekip geliştirme için Sail’i kullanır ve üretim için yerel LEMP üzerine dağıtır. Bu, geliştirme kolaylığını üretim performansıyla birleştirir.

Performans Karşılaştırması:

  • Yerel LEMP: 100 iste/s temel değer
  • Laravel Sail: 85-90 istek/s (Docker ağ ek yükü)
  • Bellek: Yerel kurulum, konteynerli kurulumdan yaklaşık 150MB daha az kullanır

Nginx ile Laravel'i bir alt dizine nasıl kurarım?

Laravel'i bir alt dizinde çalıştırmak için (örneğin, example.com/myapp):

location /myapp {
    alias /var/www/travellist/public;
    try_files $uri $uri/ @myapp;
    
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        include fastcgi_params;
    }
}

location @myapp {
    rewrite /myapp/(.*)$ /myapp/index.php?/$1 last;
}

Laravel’in .env dosyasını güncelleyin:

APP_URL=http://your_domain.com/myapp

Not: Birçok Laravel özelliği (varlık derleme, yönlendirmeler) kök seviyesinde dağıtımı varsayar. Daha temiz bir yapılandırma için bunun yerine bir alt alan adı (myapp.example.com) kullanmayı düşünün.

Sonuç

Artık Ubuntu üzerinde güvenli ve sağlam bir Laravel uygulamasını kurdunuz ve LEMP yığınının (Linux, Nginx, MySQL ve PHP-FPM) gücünden faydalandınız. Bu öğretici, her bileşenin kurulum ve yapılandırmasını adım adım rehberlik etti, veritabanı erişimi, dosya izinleri ve SSL entegrasyonu için güçlü güvenlik önlemlerinin uygulanmasını gösterdi ve ayrıca kararlı ve performanslı bir web altyapısı sürdürmek için en iyi uygulamaları paylaştı.

Bu süreçte, Nginx ve PHP-FPM ayarlarını optimize etmeyi, gelişmiş Laravel önbellekleme özelliklerini etkinleştirmeyi ve SSL, sistem izleme ve sorun giderme için üretim hazır iş akışları oluşturmayı öğrendiniz. Bu teknikleri uygulayarak, Laravel ortamınızın ölçeklenebilir büyüme, güvenilir çalışma ve modern Ubuntu sistemlerinde en iyi sınıf güvenlik için iyi bir şekilde hazır hale gelmesini sağladınız.

Sonraki Adımlar

  • Veritabanı Göçleri: Veritabanı şeması yönetimi için Laravel’in göç sistemini kullanın
  • Kimlik Doğrulama: Laravel’in dahili kimlik doğrulama sistemini uygulayın
  • API Geliştirme: Laravel’in API kaynaklarını kullanarak RESTful API’ler oluşturun
  • Önbellekleme: Daha iyi performans için Redis veya Memcached uygulayın
  • İzleme: Uygulama izleme ve günlük kaydı ayarlayın

Ek Kaynaklar

  • Laravel Belgeleri
  • Nginx Yapılandırma Rehberi
  • MySQL Performans Optimizasyonu
  • Ubuntu'ya Linux, Nginx, MySQL, PHP (LEMP yığını) nasıl kurulur
  • Linux-Console.net'te LEMP 1-Tık Kurulum Nasıl Kullanılır
  • CentOS 8 Üzerine Linux, Nginx, MySQL, PHP (LEMP yığını) Nasıl Kurulur

Laravel uygulamanız artık uygun güvenlik, performans iyileştirmeleri ve izleme yetenekleriyle üretim kullanımı için hazır.

Linux-Console.net Topluluğu ile öğrenme sürecine katıldığınız için teşekkürler.