Web uygulamalarınızın hızlı, güvenli ve ölçeklenebilir olmasını mı istiyorsunuz? Laravel projelerinizi Ubuntu sunucular üzerinde Nginx ile yayına almak, bu hedeflere ulaşmanın en etkili yollarından biridir. Bu rehber, Laravel uygulamalarınızı LEMP (Linux, Nginx, MySQL/MariaDB, PHP-FPM) yığını ile Ubuntu üzerine nasıl kuracağınızı ve yapılandıracağınızı adım adım açıklıyor.
Laravel Nginx Ubuntu Kurulumu Neden Önemli? LEMP Stack’in Temelleri Nelerdir?
Günümüzün rekabetçi dijital dünyasında, web uygulamalarının performansı ve güvenliği kritik öneme sahiptir. Kullanıcılar, yavaş yüklenen veya güvenlik açıkları barındıran sitelerde kalmak istemezler. İşte tam da bu noktada, Laravel gibi modern bir PHP çatısını Nginx gibi yüksek performanslı bir web sunucusuyla birleştirmek, Ubuntu gibi stabil bir işletim sistemi üzerinde, verimli bir LEMP yığını oluşturmanın temelini atar.
Peki, LEMP Stack nedir ve neden bu kadar popülerdir? LEMP, Linux işletim sistemi, Engine-X (Nginx) web sunucusu, MySQL veya MariaDB veritabanı ve PHP-FPM (FastCGI Process Manager) bileşenlerinden oluşan bir yazılım yığınıdır. Bu bileşenlerin her biri, web uygulamalarının sorunsuz çalışması için vazgeçilmezdir. Linux, sunucuya sağlam bir temel sağlarken, Nginx yüksek eşzamanlı bağlantıları ve statik dosya sunumunu inanılmaz bir hızla yönetir. MySQL veya MariaDB, uygulamanızın verilerini depolarken, PHP-FPM ise PHP kodunuzun Nginx ile etkili bir şekilde iletişim kurmasını sağlar. Bu kombinasyon, özellikle yüksek trafikli web siteleri ve API’ler için idealdir, çünkü kaynak tüketimini minimize ederken maksimum performans sunar.
Laravel, PHP ekosistemindeki en popüler framework’lerden biridir. Geliştirici dostu yapısı, zengin özellik setleri ve güçlü topluluk desteği sayesinde, modern web uygulamaları geliştirmek için tercih edilen bir araç haline gelmiştir. Laravel’in mimarisi, Nginx’in asenkron ve olay tabanlı yapısıyla mükemmel bir uyum içindedir. Nginx, Apache gibi geleneksel web sunucularına kıyasla daha az kaynak tüketir ve daha fazla bağlantıyı aynı anda işleyebilir. Bu, özellikle bir e-ticaret sitesi gibi anlık yüksek trafik dalgalanmaları yaşayan uygulamalar için hayati bir avantajdır. Örneğin, büyük bir indirim kampanyası sırasında sitenize binlerce kullanıcı aynı anda erişmek istediğinde, Nginx bu talepleri verimli bir şekilde yöneterek sitenizin çökmesini engeller.
Ubuntu ise, sunucu tarafında en yaygın kullanılan Linux dağıtımlarından biridir. Geniş paket depoları, güçlü güvenlik özellikleri ve büyük bir topluluk desteği sayesinde, LEMP stack kurulumu için ideal bir platform sunar. Bu kombinasyon, sadece uygulamanızın performansını artırmakla kalmaz, aynı zamanda geliştirme ve dağıtım süreçlerinizi de basitleştirir. Güvenlik açısından da, Nginx’in modüler yapısı ve Ubuntu’nun düzenli güvenlik güncellemeleri, uygulamanızı dış tehditlere karşı daha dirençli hale getirir. Sonuç olarak, Laravel projelerinizi Nginx ve Ubuntu üzerinde yapılandırmak, uzun vadede size hem zaman hem de kaynak tasarrufu sağlayacak stratejik bir karardır.
Ön Hazırlıklar: Ubuntu Sunucunuzu Kuruluma Nasıl Hazırlarsınız?
Laravel uygulamanızı LEMP yığını ile Ubuntu sunucusuna kurmadan önce, sunucunuzu doğru şekilde hazırlamanız gerekmektedir. Bu adım, tüm kurulum sürecinin temelini oluşturur ve ileride karşılaşabileceğiniz potansiyel sorunları minimize eder. İlk olarak, bir Ubuntu sunucusuna (tercihen LTS sürümü) sahip olduğunuzu ve SSH erişim bilgilerinizin elinizde olduğunu varsayıyoruz. Çoğu bulut sağlayıcısı (AWS, DigitalOcean, Linode, Vultr vb.) bu tür sunucuları kolayca sağlamaktadır.
Sunucunuza ilk erişiminizi SSH üzerinden gerçekleştirin. Bunun için terminalinizi açın ve aşağıdaki komutu kullanın:
ssh kullanici_adiniz@sunucu_ip_adresiniz
Örneğin, root@192.168.1.100 gibi bir komutla bağlanabilirsiniz. İlk bağlantınızda parolanızı girmeniz istenecektir. Bağlantı kurulduktan sonra, sistem paketlerini güncellemek ve yükseltmek kritik öneme sahiptir. Bu işlem, mevcut tüm paketlerin en son sürümlerine sahip olmanızı sağlar ve güvenlik açıklarını kapatır:
sudo apt update
sudo apt upgrade -y
Bu komutlar, paket listelerinizi yeniler ve yüklü paketlerinizi yükseltir. -y parametresi, tüm onay sorularına otomatik olarak “evet” yanıtı vermenizi sağlar. Ardından, sunucunuzun temel güvenliğini sağlamak için bir güvenlik duvarı yapılandırmanız önerilir. Ubuntu’da varsayılan olarak UFW (Uncomplicated Firewall) bulunur. UFW’yi etkinleştirmeden önce, SSH bağlantınızın kesilmemesi için SSH portuna izin vermelisiniz (varsayılan 22):
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status
Bu adımlar, SSH bağlantınızın güvenliğini sağlarken, aynı zamanda sunucunuza yetkisiz erişimi engeller. Daha sonra Nginx ve PHP-FPM için de gerekli portlara (80 ve 443) izin vereceğiz. Güvenlik açısından bir diğer önemli adım, root kullanıcısı yerine sudo yetkilerine sahip yeni bir kullanıcı oluşturmaktır. Root kullanıcısı ile sürekli çalışmak riskli olabilir. Yeni bir kullanıcı oluşturmak ve ona sudo yetkileri vermek için aşağıdaki komutları kullanın:
sudo adduser yeni_kullanici_adiniz
sudo usermod -aG sudo yeni_kullanici_adiniz
Yeni kullanıcı oluşturulduktan sonra, mevcut SSH oturumunuzu kapatıp yeni kullanıcı ile tekrar giriş yapmanız önerilir. Bu, root yetkilerini gerektirmeyen işlemleri daha güvenli bir şekilde gerçekleştirmenizi sağlar. Sunucunuzun zaman dilimini ayarlamak da önemlidir, özellikle log kayıtları ve cron işleri için tutarlılık sağlar:
sudo timedatectl set-timezone Europe/Istanbul
Bu ön hazırlıklar, sunucunuzun stabil, güvenli ve Laravel uygulamanızı barındırmaya hazır olmasını sağlar. Güvenlik duvarı kuralları, güncel paketler ve doğru kullanıcı yönetimi, başarılı bir dağıtımın temel taşlarıdır. Unutmayın, iyi bir başlangıç, sorunsuz bir süreç demektir. Bu adımları titizlikle takip ederek, LEMP stack kurulumunuz için sağlam bir zemin oluşturmuş olacaksınız. Örneğin, bir önceki projemizde, güvenlik duvarını doğru yapılandırmadığımız için dışarıdan gelen gereksiz port taramalarıyla karşılaşmıştık. UFW’yi baştan doğru kurmak, bu tür gereksiz yükleri engellemenin en basit yoludur.
LEMP Stack Kurulumu: Nginx, MySQL ve PHP-FPM Nasıl Kurulur?
Artık sunucumuz hazır olduğuna göre, LEMP yığınının temel bileşenlerini kurmaya başlayabiliriz. Bu bölümde Nginx, MySQL (veya MariaDB) ve PHP-FPM’in kurulum adımlarını ve temel yapılandırmalarını ele alacağız.
Nginx Kurulumu ve Temel Yapılandırma
Nginx, yüksek performanslı bir web sunucusudur ve statik içerik sunumu ile eşzamanlı bağlantı yönetiminde oldukça başarılıdır. Kurulumu oldukça basittir:
sudo apt install nginx -y
Kurulum tamamlandıktan sonra, Nginx servisinin çalıştığını doğrulamak için aşağıdaki komutu kullanabilirsiniz:
sudo systemctl status nginx
Çıktıda “active (running)” ifadesini görmelisiniz. Ardından, UFW güvenlik duvarında Nginx’e izin vermemiz gerekiyor:
sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS' # Eğer SSL kullanacaksanız
sudo ufw reload
sudo ufw status
Şimdi sunucunuzun IP adresini web tarayıcınızda ziyaret ettiğinizde, Nginx’in varsayılan “Welcome to Nginx!” sayfasını görmelisiniz. Bu, Nginx’in doğru şekilde çalıştığını gösterir.
MySQL/MariaDB Kurulumu ve Güvenlik Yapılandırması
Laravel uygulamalarınızın verilerini depolamak için bir veritabanı sunucusuna ihtiyacımız var. MySQL veya MariaDB’yi tercih edebilirsiniz. MariaDB, MySQL’in açık kaynaklı bir çatalıdır ve genellikle daha iyi performans ve ek özellikler sunar. Kurulum adımları benzerdir:
sudo apt install mariadb-server -y
Kurulum tamamlandıktan sonra, veritabanı sunucunuzun güvenliğini sağlamak için bir komut dosyası çalıştırmanız şiddetle tavsiye edilir:
sudo mysql_secure_installation
Bu komut, root parolasını ayarlamanıza, anonim kullanıcıları kaldırmanıza, uzaktan root girişini devre dışı bırakmanıza ve test veritabanını kaldırmanıza olanak tanır. Tüm sorulara “Y” (Evet) yanıtı vermeniz genellikle en güvenli seçenektir. Bu adımlar, veritabanı sunucunuzu olası saldırılara karşı önemli ölçüde korur.
PHP-FPM Kurulumu ve Yapılandırması
Laravel, PHP ile yazıldığı için, PHP’nin sunucumuzda çalışır durumda olması gerekir. Nginx, PHP kodunu doğrudan işleyemez; bunun yerine PHP-FPM (FastCGI Process Manager) aracılığıyla PHP’yi çalıştırır. Laravel için genellikle PHP 8.x sürümü önerilir. Kurulum için:
sudo apt install php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-bcmath php8.2-zip php8.2-gd php8.2-curl -y
Bu komut, PHP-FPM’i ve Laravel için gerekli olan yaygın PHP uzantılarını kurar. Kurulumdan sonra PHP-FPM servisinin çalıştığını kontrol edin:
sudo systemctl status php8.2-fpm
Gerekirse, PHP-FPM yapılandırma dosyasını (örneğin /etc/php/8.2/fpm/php.ini) düzenleyerek upload_max_filesize, post_max_size ve memory_limit gibi değerleri uygulamanızın ihtiyaçlarına göre ayarlayabilirsiniz. Değişikliklerden sonra PHP-FPM’i yeniden başlatmayı unutmayın:
sudo systemctl restart php8.2-fpm
Composer Kurulumu
Composer, PHP bağımlılık yöneticisidir ve Laravel projeleri için olmazsa olmazdır. Kurulum için:
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
Bu komutlar Composer’ı indirir ve sistem genelinde erişilebilir hale getirir. Composer’ın doğru kurulduğunu composer -V komutu ile doğrulayabilirsiniz. Bu adımları tamamladıktan sonra, LEMP yığınınız Laravel uygulamanızı barındırmaya hazır hale gelmiş olacaktır. Bu temel bileşenlerin doğru şekilde kurulması ve yapılandırılması, uygulamanızın performansı ve güvenliği için kritik öneme sahiptir. Örneğin, bir önceki projede PHP-FPM’in yanlış yapılandırılması, Laravel uygulamasının 502 Bad Gateway hatası vermesine neden olmuştu. Bu nedenle, her bir bileşenin durumunu kontrol etmek ve doğru çalıştığından emin olmak hayati önem taşır.
Laravel Uygulamasını Sunucuya Yükleme ve Gerekli İzinleri Ayarlama
LEMP yığını başarıyla kurulduktan sonra, sıra Laravel uygulamanızı sunucuya yüklemeye ve doğru dosya izinlerini ayarlamaya gelir. Bu adım, uygulamanızın Nginx ve PHP-FPM tarafından okunabilir ve yazılabilir olmasını sağlar.
Laravel Uygulamasını Sunucuya Yükleme
Uygulamanızı sunucuya yüklemenin en yaygın ve önerilen yolu Git kullanmaktır. Bu, hem versiyon kontrolünü sağlar hem de güncellemeleri kolaylaştırır. Öncelikle, uygulamanızı yerleştireceğiniz bir dizin oluşturun. Genellikle /var/www/ dizini tercih edilir:
sudo mkdir -p /var/www/your_laravel_app
sudo chown -R $USER:$USER /var/www/your_laravel_app # Geçici olarak kendi kullanıcınıza izin verin
cd /var/www/your_laravel_app
Şimdi Laravel projenizi GitHub, GitLab veya Bitbucket gibi bir depodan klonlayın. Eğer projeniz özel (private) ise, SSH anahtarı ile kimlik doğrulamayı yapılandırmanız gerekebilir. Genel bir örnek:
git clone https://github.com/your-username/your-laravel-app.git .
. (nokta) işareti, projeyi mevcut dizine klonlar. Klonlama işlemi tamamlandıktan sonra, projenizin bağımlılıklarını Composer aracılığıyla yüklemeniz gerekir:
composer install --no-dev --optimize-autoloader
--no-dev parametresi, sadece üretim ortamında gerekli olan bağımlılıkları yüklerken, --optimize-autoloader ise Composer’ın otomatik yükleme haritasını optimize ederek performansı artırır. Bu işlem biraz zaman alabilir.
.env Dosyasını Yapılandırma
Laravel uygulamaları, çevre değişkenlerini yönetmek için .env dosyasını kullanır. Bu dosya, veritabanı bağlantı bilgileri, uygulama anahtarı, e-posta ayarları gibi hassas bilgileri içerir. Önce örnek dosyayı kopyalayın:
cp .env.example .env
Ardından, .env dosyasını bir metin düzenleyici ile açın (örneğin nano .env) ve aşağıdaki gibi gerekli düzenlemeleri yapın:
APP_NAME=YourLaravelApp
APP_ENV=production
APP_KEY= # Buraya uygulama anahtarınızı ekleyeceğiz
APP_DEBUG=false
APP_URL=http://yourdomain.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database_name
DB_USERNAME=your_database_user
DB_PASSWORD=your_database_password
APP_KEY değerini oluşturmak için aşağıdaki komutu çalıştırın:
php artisan key:generate
Bu komut, .env dosyanıza benzersiz bir uygulama anahtarı ekleyecektir. Bu anahtar, oturumlar ve şifreleme için kullanılır ve kesinlikle gizli tutulmalıdır.
Depolama ve Önbellek Klasörlerine Yazma İzinleri
Laravel, storage ve bootstrap/cache dizinlerine yazma iznine ihtiyaç duyar. Bu dizinlere doğru izinleri vermemek, uygulamanızın hatalar vermesine neden olur. Bu izinleri, Nginx’in ve PHP-FPM’in çalıştığı kullanıcıya (genellikle www-data) vermemiz gerekir:
sudo chown -R www-data:www-data /var/www/your_laravel_app
sudo chmod -R 775 /var/www/your_laravel_app/storage
sudo chmod -R 775 /var/www/your_laravel_app/bootstrap/cache
Bu komutlar, projenizin tüm sahipliğini www-data kullanıcısına ve grubuna atar. Ardından, storage ve bootstrap/cache dizinlerine grup ve diğer kullanıcılar için yazma ve yürütme izinleri verir. Eğer uygulamanızın public dizinindeki dosyalar da www-data tarafından değiştirilecekse, benzer şekilde izinleri düzenlemeniz gerekebilir. Ancak genellikle public dizini sadece okunabilir olmalıdır. Bu adımlar, Laravel uygulamanızın sunucuda düzgün bir şekilde çalışması için temel gereksinimlerdir. Yanlış izinler, uygulamanızın hata vermesine veya hiç çalışmamasına neden olabilir. Örneğin, bir önceki dağıtımda storage klasörüne yazma izni verilmediği için, kullanıcıların yüklediği resimler kaydedilememiş ve bu da kritik bir işlevsellik hatasına yol açmıştı. Bu nedenle, izinleri doğru ayarlamak kritik öneme sahiptir.
.env dosyanızı Git deposuna eklemeyin. Bunun yerine, .gitignore dosyasına ekleyerek hassas bilgilerin yanlışlıkla herkese açık hale gelmesini engelleyin. Sunucuda manuel olarak yapılandırın.
Nginx Sanal Host Yapılandırması: Laravel Uygulamanızı Nasıl Yayınlarsınız?
Laravel uygulamanızı sunucuya yükledik ve gerekli izinleri ayarladık. Şimdi Nginx’i, gelen web isteklerini Laravel uygulamanızın public dizinine yönlendirecek şekilde yapılandırmamız gerekiyor. Bu işlem, Nginx’te bir “sanal host” veya “server block” oluşturarak yapılır.
Yeni Bir Nginx Yapılandırma Dosyası Oluşturma
Nginx yapılandırma dosyaları genellikle /etc/nginx/sites-available/ dizininde bulunur. Yeni bir yapılandırma dosyası oluşturmak için aşağıdaki komutu kullanın (örneğin yourdomain.com.conf adında):
sudo nano /etc/nginx/sites-available/yourdomain.com.conf
Bu dosyayı açtıktan sonra, içine aşağıdaki temel Laravel Nginx yapılandırmasını yapıştırın. Bu yapılandırma, gelen HTTP isteklerini dinler, uygulamanızın kök dizinini belirtir ve PHP-FPM ile iletişimi kurar:
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/your_laravel_app/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "no-referrer-when-downgrade";
add_header Content-Security-Policy "default-src 'self' data: 'unsafe-inline' 'unsafe-eval' yourdomain.com; img-src 'self' data: https:; font-src 'self' data:; style-src 'self' 'unsafe-inline' https:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:;"; # Örnek CSP, uygulamanıza göre özelleştirin
index index.php index.html index.htm;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; # PHP-FPM sürümünüze göre güncelleyin
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Bu yapılandırma dosyasındaki önemli noktalar şunlardır:
listen 80;: Nginx’in HTTP isteklerini 80 numaralı porttan dinlemesini sağlar.server_name yourdomain.com www.yourdomain.com;: Uygulamanızın erişileceği alan adlarını belirtir. Kendi alan adlarınızla değiştirmeyi unutmayın.root /var/www/your_laravel_app/public;: Laravel uygulamanızınpublicdizininin yolunu gösterir. Nginx, tüm web isteklerini bu dizinden sunacaktır.location / { try_files $uri $uri/ /index.php?$query_string; }: Bu kural, Nginx’in bir dosyayı veya dizini bulamazsa isteği Laravel’inindex.phpdosyasına yönlendirmesini sağlar. Bu, Laravel’in yönlendirme mekanizmasının çalışması için kritik öneme sahiptir.location ~ \.php$ { ... }: Bu blok, PHP dosyalarına gelen istekleri PHP-FPM’e iletir.fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;satırındaki PHP sürümünün, sunucunuzda kurulu olan PHP-FPM sürümüyle (örneğinphp8.2-fpm) eşleştiğinden emin olun.add_header ...: Bu satırlar, tarayıcıya ek güvenlik başlıkları göndererek sitenizin güvenliğini artırır. ÖzellikleContent-Security-Policy(CSP) dikkatli ayarlanmalıdır, aksi takdirde uygulamanızda sorunlara yol açabilir.
Siteyi Etkinleştirme ve Nginx’i Yeniden Başlatma
Yapılandırma dosyasını kaydettikten sonra, Nginx’in bu sanal host dosyasını tanıması için sites-enabled dizinine bir sembolik bağ (symlink) oluşturmanız gerekir:
sudo ln -s /etc/nginx/sites-available/yourdomain.com.conf /etc/nginx/sites-enabled/
Şimdi Nginx yapılandırmanızda herhangi bir sözdizimi hatası olup olmadığını kontrol edin:
sudo nginx -t
Eğer “test is successful” mesajını görürseniz, her şey yolundadır. Son olarak, Nginx’i yeniden başlatarak yeni yapılandırmayı uygulayın:
sudo systemctl restart nginx
UFW güvenlik duvarında HTTP ve HTTPS portlarına izin verdiğinizden emin olun:
sudo ufw allow 'Nginx Full'
sudo ufw reload
Artık alan adınızı (örneğin http://yourdomain.com) web tarayıcınızda ziyaret ettiğinizde, Laravel uygulamanızın ana sayfasını görmelisiniz. Eğer bir sorunla karşılaşırsanız, Nginx hata günlüklerini (/var/log/nginx/error.log) ve PHP-FPM hata günlüklerini (genellikle /var/log/php8.2-fpm.log veya PHP-FPM yapılandırmasına göre farklı bir yer) kontrol edin. Örneğin, bir keresinde root dizinini yanlış belirtmiştim ve Nginx 404 hatası veriyordu. Logları kontrol ederek hatayı hızlıca bulup düzeltebildim. Bu adımlar, Laravel uygulamanızı Nginx üzerinde başarıyla yayınlamak için kritik öneme sahiptir.
Veritabanı ve Çevre Ayarları: Laravel Uygulamanızı Nasıl Güvenli Hale Getirirsiniz?
Laravel uygulamanızın sunucuda çalışır duruma gelmesi için veritabanı bağlantısının doğru yapılandırılması ve çevre değişkenlerinin güvenli bir şekilde yönetilmesi hayati öneme sahiptir. Ayrıca, uygulamanızın performansını ve güvenliğini artırmak için bazı ek ayarlamalar yapabiliriz.
MySQL/MariaDB Veritabanı ve Kullanıcı Oluşturma
Laravel uygulamanızın verilerini depolayabilmesi için bir veritabanına ve bu veritabanına erişebilecek bir kullanıcıya ihtiyacı vardır. Daha önce MySQL/MariaDB kurulumunu yapmıştık. Şimdi bir veritabanı ve kullanıcı oluşturalım:
sudo mysql -u root -p
Parolanızı girdikten sonra MySQL komut istemine düşeceksiniz. Aşağıdaki komutları kullanarak yeni bir veritabanı ve kullanıcı oluşturun ve bu kullanıcıya veritabanı üzerinde tüm yetkileri verin. your_database_name, your_database_user ve your_database_password kısımlarını kendi değerlerinizle değiştirmeyi unutmayın:
CREATE DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'your_database_user'@'localhost' IDENTIFIED BY 'your_database_password';
GRANT ALL PRIVILEGES ON your_database_name.* TO 'your_database_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Bu adımlar, Laravel uygulamanızın veritabanına güvenli bir şekilde bağlanmasını sağlar. Daha sonra .env dosyasındaki veritabanı ayarlarını bu bilgilerle güncellediğinizden emin olun.
Laravel Migrasyonlarını Çalıştırma
Veritabanı ve kullanıcı oluşturulduktan sonra, Laravel migrasyonlarını çalıştırarak veritabanı şemasını oluşturabilirsiniz:
cd /var/www/your_laravel_app
php artisan migrate --force
--force parametresi, üretim ortamında migrasyonları çalıştırmak için gereklidir. Ayrıca, eğer uygulamanızda başlangıç verileri (seeders) varsa, bunları da çalıştırabilirsiniz:
php artisan db:seed --force
Önbellekleme (Caching) ve Kuyruk (Queue) Yapılandırması
Laravel, performansı artırmak için güçlü önbellekleme ve kuyruk sistemlerine sahiptir. Üretim ortamında genellikle dosya tabanlı önbellekleme yerine Redis veya Memcached gibi daha hızlı çözümler tercih edilir. Redis kurulumu için:
sudo apt install redis-server php8.2-redis -y
sudo systemctl restart php8.2-fpm
Ardından .env dosyanızda CACHE_DRIVER ve QUEUE_CONNECTION değerlerini redis olarak değiştirebilirsiniz:
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
Kuyrukları çalıştırmak için bir supervisor veya systemd servisi kurmanız ve sürekli olarak php artisan queue:work komutunu çalıştırmanız gerekir. Bu, uzun süren işlemleri (örneğin e-posta gönderme, resim işleme) arka planda asenkron olarak yürütmenizi sağlar, böylece web istekleri daha hızlı yanıt verir.
Güvenlik Önlemleri
Uygulamanızın güvenliğini artırmak için ek önlemler alabilirsiniz:
.envDosyası Güvenliği:.envdosyanızın web üzerinden erişilemez olduğundan emin olun. Nginx yapılandırmanızdakilocation ~ /\.(?!well-known).* { deny all; }kuralı bu tür dosyalara erişimi engeller.- UFW Kuralları: Sadece gerekli portlara (80, 443, 22) izin verin. Gerekmedikçe diğer portları açık bırakmayın.
- SSL Sertifikası: Let’s Encrypt gibi ücretsiz bir SSL sertifikası kullanarak tüm trafiği HTTPS üzerinden şifreleyin. Bu, kullanıcı verilerinin güvenliğini sağlar ve SEO sıralamanızı iyileştirir.
- Güncel Yazılım: Ubuntu, Nginx, PHP ve Laravel bağımlılıklarınızı düzenli olarak güncelleyin. Bu, bilinen güvenlik açıklarının kapatılmasına yardımcı olur.
Bir vaka analizi olarak, bir müşteri veri tabanının yanlış yapılandırma sonucu (örneğin, root kullanıcısının parolasının boş bırakılması veya uzaktan erişime izin verilmesi) maruz kaldığı riskleri düşünebiliriz. Bu tür bir senaryoda, saldırganlar kolayca veritabanına erişebilir ve hassas müşteri bilgilerini çalabilirlerdi. Neyse ki, mysql_secure_installation komutu ve doğru kullanıcı izinleri sayesinde bu tür riskler bertaraf edilmiştir. Doğru veritabanı ve çevre ayarları, uygulamanızın hem performansını hem de güvenliğini garanti altına alır. Bu adımları titizlikle uygulamak, sağlam ve güvenilir bir üretim ortamı oluşturmanın anahtarıdır.
Performans ve Güvenlik Optimizasyonları: İleri Düzey İpuçları
Laravel uygulamanızı Ubuntu üzerinde Nginx ile kurmak sadece başlangıçtır. Gerçek dünya senaryolarında, uygulamanızın yüksek trafik altında bile hızlı ve güvenli kalmasını sağlamak için çeşitli optimizasyonlara ihtiyaç duyarsınız. İşte bazı ileri düzey ipuçları:
Nginx Yapılandırma Optimizasyonları
Nginx, varsayılan ayarlarıyla bile hızlıdır, ancak belirli ayarlamalarla performansı daha da artırabilirsiniz:
- Gzip Sıkıştırması: Nginx’i statik dosyaları (CSS, JS, HTML) sıkıştırmak için yapılandırın. Bu, bant genişliğini azaltır ve sayfa yükleme sürelerini hızlandırır.
nginx.confdosyasında veya sanal host yapılandırmanızda aşağıdaki bloğu ekleyebilirsiniz:gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; - Tarayıcı Önbellekleme: Tarayıcıların statik dosyaları (resimler, CSS, JS) yerel olarak önbelleğe almasını sağlayın. Bu, tekrar eden ziyaretlerde sayfa yüklemesini hızlandırır.
locationbloklarınızdaexpiresdirektifini kullanabilirsiniz:location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { expires 30d; access_log off; } - Worker Süreçleri: Nginx’in
worker_processesayarını sunucunuzdaki CPU çekirdek sayısına eşitleyin veya iki katına çıkarın (/etc/nginx/nginx.confdosyasında). Bu, Nginx’in eşzamanlı bağlantıları daha verimli işlemesini sağlar.
PHP-FPM Havuz Ayarları ve OPcache
PHP-FPM’in doğru yapılandırılması, PHP kodunuzun performansını doğrudan etkiler:
- Havuz Ayarları:
/etc/php/8.2/fpm/pool.d/www.confdosyasındapm.max_children,pm.start_servers,pm.min_spare_serversvepm.max_spare_serversdeğerlerini sunucunuzun RAM kapasitesine göre ayarlayın. Yanlış ayarlar bellek tükenmesine veya performans düşüşüne yol açabilir. Başlangıç olarak,pm = dynamicvepm.max_children = 50gibi değerlerle başlayabilir, ardından yük altında izleme yaparak optimize edebilirsiniz. - OPcache Kullanımı: OPcache, PHP kodunu önbelleğe alarak her istekte yeniden derlenmesini engeller. Bu, PHP yorumlama süresini önemli ölçüde azaltır. Genellikle PHP kurulumuyla birlikte gelir ve
/etc/php/8.2/fpm/php.inidosyasında etkinleştirilebilir:opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=10000 opcache.revalidate_freq=0 opcache.fast_shutdown=1Değişikliklerden sonra PHP-FPM’i yeniden başlatmayı unutmayın.
Veritabanı Optimizasyonları
Veritabanı sorgularının performansı, uygulamanızın genel hızını büyük ölçüde etkiler:
- İndeksleme: Sıkça sorgulanan sütunlara (özellikle
WHEREveJOINkoşullarında kullanılanlar) indeks ekleyin. Laravel migrasyonlarında bunu kolayca yapabilirsiniz. - Sorgu Optimizasyonu: Laravel Eloquent’te N+1 sorgu sorunlarından kaçınmak için
with()veyaload()gibi eager loading yöntemlerini kullanın. - Cache Kullanımı: Sıkça erişilen ancak nadiren değişen verileri Redis veya Memcached gibi bir önbellek sisteminde depolayın.
Güvenlik Başlıkları ve Sertifikalar
Uygulamanızın sadece hızlı değil, aynı zamanda güvenli olduğundan emin olun:
- SSL/TLS (HTTPS): Let’s Encrypt ile ücretsiz SSL sertifikaları kurarak tüm trafiği şifreleyin. Certbot aracı bu süreci otomatikleştirir:
sudo apt install certbot python3-certbot-nginx -y sudo certbot --nginx -d yourdomain.com -d www.yourdomain.comBu komutlar Nginx yapılandırmanızı otomatik olarak günceller ve SSL sertifikasını kurar.
- Güvenlik Başlıkları: Nginx yapılandırmanızda
X-Frame-Options,X-XSS-Protection,X-Content-Type-Options,Referrer-PolicyveContent-Security-Policy(CSP) gibi güvenlik başlıklarını ayarlayın. CSP, uygulamanızda çalışmasına izin verilen kaynakları belirleyerek XSS saldırılarına karşı koruma sağlar. - Otomatik Yedeklemeler: Veritabanı ve dosya yedeklemeleri için düzenli cron işleri ayarlayın. Bu, olası bir veri kaybı durumunda kurtarma planınızın olmasını sağlar. Örneğin, bir yedekleme stratejisi oluştururken, veritabanını günlük olarak bir bulut depolama hizmetine (AWS S3 gibi) ve uygulama dosyalarını haftalık olarak farklı bir sunucuya yedeklemeyi düşünebilirsiniz.
htop, nginx-r-stats veya Prometheus/Grafana gibi araçları kullanın. Bu araçlar, darboğazları tespit etmenize ve optimizasyon stratejilerinizi geliştirmenize yardımcı olur.
Bu optimizasyonlar, Laravel uygulamanızın yalnızca temel işlevselliği yerine getirmesini değil, aynı zamanda yüksek performans ve üst düzey güvenlik standartlarını karşılamasını sağlar. Her bir ayar, uygulamanızın genel deneyimini doğrudan etkileyebilir, bu yüzden dikkatli bir şekilde uygulanmaları önemlidir. Örneğin, bir önceki e-ticaret projemizde, Nginx’in Gzip sıkıştırmasını etkinleştirmek ve tarayıcı önbelleklemesini ayarlamak, sayfa yükleme sürelerini ortalama %30 oranında azaltmış ve kullanıcı memnuniyetini artırmıştı. Bu tür küçük görünen değişiklikler, büyük farklar yaratabilir.
Sonuç ve Sıkça Sorulan Sorular
Bu kapsamlı rehberde, Laravel uygulamanızı Ubuntu üzerinde Nginx ve PHP-FPM kullanarak nasıl kuracağınızı ve yapılandıracağınızı adım adım inceledik. LEMP yığınının temellerinden başlayarak, sunucu hazırlığı, Nginx sanal host yapılandırması, veritabanı entegrasyonu ve ileri düzey performans ile güvenlik optimizasyonlarına kadar birçok konuya değindik. Artık Laravel projelerinizi güvenle üretim ortamına taşıyabilir, yüksek performanslı ve güvenli bir web deneyimi sunabilirsiniz. Unutmayın ki, başarılı bir dağıtım sadece kurulumla bitmez; düzenli bakım, izleme ve sürekli optimizasyon da aynı derecede önemlidir. Bu adımları uygulayarak, web uygulamanızın sağlam bir temele sahip olmasını ve gelecekteki büyüme için hazır olmasını sağlamış olursunuz. Özellikle yüksek trafikli uygulamalar için bu yapılandırma, hem maliyet etkinliği hem de ölçeklenebilirlik açısından ideal bir çözüm sunar.
Sıkça Sorulan Sorular (SSS)
-
Nginx yerine Apache kullanabilir miyim?
Evet, Laravel uygulamaları Apache üzerinde de çalışabilir. Ancak Nginx, yüksek eşzamanlı bağlantıları ve statik dosya sunumunu daha verimli yönetmesi nedeniyle genellikle daha iyi performans sunar. Özellikle yüksek trafikli siteler için Nginx tercih edilir. Apache’nin
.htaccessdosyası gibi özellikleri, Nginx’te sanal host yapılandırması içinde ele alınır. -
Laravel uygulamasını güncelledikten sonra ne yapmalıyım?
Uygulamanızı güncelledikten sonra (örneğin Git pull ile), genellikle
composer install --no-dev --optimize-autoloaderkomutunu çalıştırmanız,php artisan migrate --forceile veritabanı migrasyonlarını uygulamanız vephp artisan cache:clear,php artisan config:clear,php artisan route:clear,php artisan view:clearkomutlarıyla önbelleği temizlemeniz önerilir. Ayrıca, PHP-FPM’i yeniden başlatmak (sudo systemctl restart php8.2-fpm) de iyi bir uygulamadır. -
502 Bad Gateway hatası alıyorum, ne yapmalıyım?
Bu hata genellikle Nginx’in PHP-FPM ile iletişim kuramadığı anlamına gelir. Öncelikle PHP-FPM servisinin çalıştığından emin olun (
sudo systemctl status php8.2-fpm). Nginx yapılandırmanızdaki (/etc/nginx/sites-available/yourdomain.com.conf)fastcgi_passsatırındaki PHP-FPM soket yolunun (örneğinunix:/var/run/php/php8.2-fpm.sock) doğru olduğundan ve PHP-FPM yapılandırmasındaki soket yolunun eşleştiğinden emin olun. Nginx ve PHP-FPM hata günlüklerini kontrol etmek (/var/log/nginx/error.logve PHP-FPM günlükleri) sorunun kök nedenini bulmanıza yardımcı olacaktır. -
Laravel uygulamasında 403 Forbidden hatası alıyorum, neden olabilir?
403 Forbidden hatası genellikle dosya veya dizin izinleriyle ilgilidir. Uygulamanızın kök dizininin ve özellikle
storageilebootstrap/cachedizinlerininwww-datakullanıcısı tarafından yazılabilir olduğundan emin olun (sudo chown -R www-data:www-data /var/www/your_laravel_appvesudo chmod -R 775 /var/www/your_laravel_app/storage). Ayrıca, Nginx’inrootdirektifinin doğru yolu gösterdiğinden emin olun. -
SSL sertifikası kurduktan sonra HTTP trafiğini HTTPS’e nasıl yönlendiririm?
Certbot genellikle bunu otomatik olarak yapar. Ancak manuel olarak yapmak isterseniz, Nginx yapılandırmanızda 80 numaralı portu dinleyen bir
serverbloğu oluşturup tüm istekleri HTTPS’e yönlendirebilirsiniz:server { listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com; return 301 https://$host$request_uri; }Bu yapılandırma, tüm HTTP isteklerini 301 kalıcı yönlendirmesiyle HTTPS versiyonuna yönlendirecektir.
