Takip et

Gereksinimler

Symfony, PHP tabanlı, modern ve güçlü web uygulamaları geliştirmek için kullanılan popüler bir framework’tür. Üretim ortamına dağıt

Symfony, PHP tabanlı, modern ve güçlü web uygulamaları geliştirmek için kullanılan popüler bir framework’tür. Üretim ortamına dağıtımı ise genellikle dikkatli bir planlama ve doğru yapılandırma gerektirir. Bu rehberde, bir Symfony 4 uygulamasını Ubuntu 18.04 işletim sistemi üzerinde LEMP (Linux, Nginx, MySQL/MariaDB, PHP-FPM) yığını kullanarak üretim ortamına nasıl dağıtacağınızı adım adım öğreneceksiniz.

LEMP, yüksek performans ve kaynak verimliliği sunan güçlü bir kombinasyondur. Nginx hafif yapısıyla statik içerik sunumunda ve PHP-FPM ile dinamik içerik işlemede oldukça etkilidir. Ubuntu 18.04 ise uzun süreli destek (LTS) sunan stabil bir işletim sistemidir.

Gereksinimler

Bu rehbere başlamadan önce aşağıdaki maddelere sahip olduğunuzdan emin olun:

  • Ubuntu 18.04 yüklü bir sunucu (VPS veya fiziksel).
  • SSH erişimi olan bir kullanıcı (sudo yetkileri önerilir).
  • Temel Linux komut satırı bilgisi.
  • Üretim ortamına dağıtılmaya hazır bir Symfony 4 uygulaması.

1. Sunucu Hazırlığı ve LEMP Kurulumu

İlk adım, sunucunuzu güncelleyip gerekli LEMP bileşenlerini kurmaktır.

Sistem Güncellemesi

Sunucunuzdaki paket listelerini güncelleyin ve yüklü paketleri en son sürümlerine yükseltin:

sudo apt update
sudo apt upgrade -y

Nginx Kurulumu

Nginx, web sunucusu olarak görev yapacak ve gelen HTTP isteklerini işleyecektir.

sudo apt install nginx -y

Kurulumdan sonra Nginx’in çalıştığını kontrol edebilirsiniz:

sudo systemctl status nginx

Tarayıcınızdan sunucunuzun IP adresine giderek “Welcome to Nginx!” sayfasını görmeniz gerekir.

MySQL veya MariaDB Kurulumu

Veritabanı olarak MySQL veya MariaDB kullanabilirsiniz. Bu rehberde MariaDB’yi tercih edeceğiz, zira MySQL ile büyük ölçüde uyumludur ve açık kaynak topluluğu tarafından desteklenir.

sudo apt install mariadb-server mariadb-client -y

Kurulumdan sonra veritabanı sunucunuzu güvence altına almak için güvenlik betiğini çalıştırın:

sudo mysql_secure_installation

Bu betik size root şifresi belirleme, anonim kullanıcıları kaldırma, root’un uzaktan girişini engelleme ve test veritabanını kaldırma gibi konularda sorular soracaktır. Genellikle tüm sorulara ‘Y’ (Evet) yanıtı vermeniz önerilir.

PHP-FPM Kurulumu

Symfony, PHP ile çalıştığı için PHP’nin kendisini ve Nginx ile iletişim kurmasını sağlayacak PHP-FPM’i (FastCGI Process Manager) kurmamız gerekiyor. Symfony 4 genellikle PHP 7.2 veya üstünü gerektirir. Ubuntu 18.04’ün varsayılan depolarında PHP 7.2 bulunur. Daha yeni bir PHP sürümü (7.3, 7.4) kullanmak isterseniz, bir PPA (Personal Package Archive) eklemeniz gerekebilir. Bu rehberde PHP 7.2 kullanacağız.

sudo apt install php-fpm php-mysql php-mbstring php-xml php-zip php-intl php-gd php-curl php-json php-common -y

Gereksinimleriniz doğrultusunda ek PHP uzantıları yüklemeniz gerekebilir. Örneğin, Doctrine ile çalışıyorsanız php-pdo veya YAML dosyaları için php-yaml.

Kurulumdan sonra PHP-FPM’in çalıştığını kontrol edin:

sudo systemctl status php7.2-fpm

2. Symfony Uygulamasının Sunucuya Aktarımı

Uygulamanızı sunucuya aktarmak için Git, SCP veya FTP gibi yöntemler kullanabilirsiniz. Git, versiyon kontrolü ve kolay güncellemeler sağladığı için en çok tercih edilen yöntemdir.

Git ile Klonlama

Uygulamanızı sunucuda barındırmak istediğiniz bir dizine klonlayın. Genellikle /var/www/ dizini tercih edilir.

cd /var/www/
sudo git clone  
cd 

Örneğin: sudo git clone https://github.com/youruser/your-symfony-app.git myapp

Dizin İzinlerinin Ayarlanması

Web sunucunuzun (Nginx ve PHP-FPM) Symfony uygulamanızın var/cache ve var/log dizinlerine yazma iznine sahip olması gerekir. Nginx genellikle www-data kullanıcısı ve grubuyla çalışır.

sudo chown -R www-data:www-data var public
sudo chmod -R 775 var public

Bazı durumlarda, daha genel bir yaklaşım olarak, web sunucusu kullanıcısını (www-data) projenin grubuna ekleyip ACL (Access Control List) kullanmak daha güvenli olabilir:

sudo setfacl -R -m u:www-data:rwX -m u:whoami:rwX var public
sudo setfacl -dR -m u:www-data:rwX -m u:whoami:rwX var public

whoami komutu, şu anki SSH kullanıcınızın adını döndürür. Bu komutları çalıştırmak için acl paketinin yüklü olması gerekebilir: sudo apt install acl -y.

Composer Bağımlılıklarını Yükleme

Symfony projenizin bağımlılıklarını yüklemek için Composer’a ihtiyacınız var. Eğer yüklü değilse:

cd ~
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

Ardından projenizin kök dizininde bağımlılıkları yükleyin:

cd /var/www/
composer install --no-dev --optimize-autoloader

--no-dev geliştirme bağımlılıklarını yüklemez, --optimize-autoloader ise Composer’ın autoloader’ını daha hızlı çalışacak şekilde optimize eder.

Ortam Değişkenlerinin Ayarlanması (.env Dosyası)

Symfony, ortam değişkenlerini yönetmek için .env dosyasını kullanır. Üretim ortamı için bu dosyayı düzenlemeniz gerekecek. .env.dist dosyasını kopyalayarak başlayabilirsiniz:

cp .env .env.local

Şimdi .env.local dosyasını bir metin düzenleyici ile açın (örneğin nano):

nano .env.local

Burada aşağıdaki önemli değişiklikleri yapın:

  • APP_ENV=prod: Uygulamanın üretim modunda çalışmasını sağlar.
  • APP_DEBUG=0: Hata ayıklama modunu kapatır.
  • DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=5.7": Veritabanı bağlantı bilgilerinizi güncelleyin.
  • Diğer hassas API anahtarları veya servis URL’leri gibi üretim ortamına özel değerleri ayarlayın.

3. Veritabanı Yapılandırması ve Migrasyonlar

Veritabanı sunucunuzda uygulamanız için bir veritabanı ve kullanıcı oluşturmanız gerekir.

Veritabanı ve Kullanıcı Oluşturma

MariaDB’ye root kullanıcısı olarak bağlanın:

sudo mysql -u root -p

Şifrenizi girdikten sonra aşağıdaki SQL komutlarını çalıştırarak yeni bir veritabanı ve kullanıcı oluşturun:

CREATE DATABASE myapp_prod CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON myapp_prod.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

myapp_prod, myapp_user ve your_strong_password değerlerini kendi projenize uygun şekilde değiştirin.

Doctrine Migrasyonlarını Çalıştırma

Symfony uygulamanızın veritabanı şemasını oluşturmak ve güncel tutmak için Doctrine Migrations kullanıyorsanız, bunları üretim ortamında çalıştırmanız gerekir:

cd /var/www/
php bin/console doctrine:migrations:migrate --no-interaction

--no-interaction parametresi, her bir migrasyon için onay istemeden tüm bekleyen migrasyonları otomatik olarak çalıştırır.

4. Nginx Sanal Host Yapılandırması

Şimdi Nginx’i Symfony uygulamanıza gelen istekleri doğru şekilde yönlendirecek şekilde yapılandırmamız gerekiyor.

Nginx Yapılandırma Dosyası Oluşturma

Yeni bir Nginx sanal host yapılandırma dosyası oluşturun. Genellikle /etc/nginx/sites-available/ dizini kullanılır.

sudo nano /etc/nginx/sites-available/.conf

Dosyanın içine aşağıdaki yapılandırmayı yapıştırın. Kendi proje adınıza, alan adınıza ve PHP-FPM sürümünüze göre düzenlemeyi unutmayın:

server {
    listen 80;
    server_name your_domain.com www.your_domain.com; # Alan adınızı buraya yazın
    root /var/www//public; # Symfony public dizini

    index index.php index.html;

    location / {
        # try_files ile önce dosya/dizin kontrolü, sonra Symfony front controller'a yönlendirme
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; # PHP-FPM soket yolu ve sürümü
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    }

    # Statik dosyalar için süre sonu başlıkları ekleme (performans için)
    location ~* \.(jpg|jpeg|gif|png|webp|ico|css|js|woff|woff2|ttf|svg|eot)$ {
        expires 30d;
        log_not_found off;
    }

    # .env veya benzeri hassas dosyaların doğrudan erişimini engelleme
    location ~ /\.env {
        deny all;
    }

    error_log /var/log/nginx/_error.log;
    access_log /var/log/nginx/_access.log;
}

your_domain.com kısmını kendi alan adınızla, kısmını projenizin dizin adıyla ve php7.2-fpm.sock kısmını kullandığınız PHP sürümüne göre güncelleyin (örn. php7.4-fpm.sock).

Yapılandırmayı Etkinleştirme

Oluşturduğunuz yapılandırma dosyasını sites-enabled dizinine sembolik link (symlink) oluşturarak etkinleştirin:

sudo ln -s /etc/nginx/sites-available/.conf /etc/nginx/sites-enabled/

Varsayılan Nginx yapılandırmasını devre dışı bırakmak iyi bir uygulamadır:

sudo unlink /etc/nginx/sites-enabled/default

Nginx Yapılandırmasını Test Etme ve Yeniden Başlatma

Nginx yapılandırmanızda bir hata olup olmadığını kontrol edin:

sudo nginx -t

Eğer “test is successful” mesajını alırsanız, Nginx’i yeniden başlatarak yeni yapılandırmayı uygulayın:

sudo systemctl reload nginx

Şimdi alan adınız üzerinden uygulamanıza erişmeyi deneyebilirsiniz.

5. Symfony Ortam Ayarları ve Cache Yönetimi

Uygulamanızın üretim ortamında en iyi performansı göstermesi için bazı Symfony özel ayarlarını yapmanız gerekir.

Cache Temizleme ve Isındırma (Warming Up)

Symfony, performansı artırmak için cache mekanizmasını kullanır. Üretim ortamında cache’i temizlemek ve yeniden oluşturmak önemlidir.

cd /var/www/
php bin/console cache:clear
php bin/console cache:warmup

Bu komutlar, uygulamanızın ilk isteğinde cache oluşturma yükünü ortadan kaldırarak daha hızlı yanıt vermesini sağlar.

Statik Varlıkların Yüklenmesi (Assets)

Eğer uygulamanızda statik varlıklar (CSS, JS, resimler) kullanıyorsanız ve bunları Symfony’nin public dizinine kopyalamanız gerekiyorsa:

php bin/console assets:install --symlink public

Eğer Webpack Encore kullanıyorsanız, varlıkları derlemek için aşağıdaki komutu çalıştırmanız gerekir:

npm install # Eğer node_modules yoksa
npm run build # Üretim için varlıkları derler

Bu adımları, projenizin kök dizininde (/var/www/) çalıştırmanız önemlidir.

Güvenlik ve Performans İpuçları

  • Güvenlik Duvarı (UFW): Sunucunuzda sadece gerekli portları (SSH için 22, HTTP için 80, HTTPS için 443) açmak için UFW’yi (Uncomplicated Firewall) yapılandırın:
    sudo ufw allow OpenSSH
    sudo ufw allow 'Nginx HTTP'
    sudo ufw enable

    HTTPS kullanacaksanız sudo ufw allow 'Nginx HTTPS' komutunu da çalıştırmalısınız.

  • SSL/TLS (HTTPS): Uygulamanızın güvenliğini artırmak için ücretsiz bir SSL sertifikası (Let’s Encrypt) kurun. Certbot aracı bu süreci kolaylaştırır:
    sudo apt install certbot python-certbot-nginx -y
    sudo certbot --nginx -d your_domain.com -d www.your_domain.com
  • PHP-FPM Optimizasyonu: /etc/php/7.2/fpm/pool.d/www.conf (veya kullandığınız PHP sürümüne göre) dosyasındaki pm.max_children, pm.start_servers gibi değerleri sunucunuzun kaynaklarına göre ayarlayarak PHP-FPM performansını optimize edebilirsiniz.
  • Günlük Yönetimi: Uygulamanızın ve sunucunuzun günlük dosyalarını düzenli olarak kontrol edin (örn. /var/log/nginx/ ve /var/www//var/log/). Monolog gibi Symfony entegrasyonları ile özel günlük yapılandırmaları yapabilirsiniz.
  • Opcache: PHP’nin yerleşik Opcache modülünü etkinleştirerek PHP kodunuzun daha hızlı çalışmasını sağlayın. Genellikle PHP-FPM ile birlikte gelir ve varsayılan olarak etkindir. /etc/php/7.2/fpm/php.ini dosyasından ayarlarını kontrol edebilirsiniz.

Sonuç

Bu rehberde, bir Symfony 4 uygulamasını Ubuntu 18.04 üzerinde LEMP yığını kullanarak üretim ortamına nasıl dağıtacağınızı adım adım öğrendiniz. Sunucu hazırlığından başlayarak Nginx ve PHP-FPM yapılandırmasına, veritabanı kurulumundan Symfony özel ayarlarına kadar tüm kritik adımları ele aldık. Artık Symfony uygulamanızın üretimde güvenli ve performanslı bir şekilde çalışması için sağlam bir temeliniz var.

Sıkça Sorulan Sorular (SSS)

S: Nginx yapılandırmamda neden root /var/www//public; kullanıyorum?
C: Symfony’nin ön denetleyicisi (front controller) olan index.php dosyası public/ dizini altında bulunur. Nginx’in bu dizini kök dizin olarak bilmesi, uygulamanızın doğru şekilde çalışması için kritik öneme sahiptir. Böylece tüm istekler Symfony çekirdeği tarafından işlenir ve hassas proje dosyalarına doğrudan erişim engellenmiş olur.

S: .env.local dosyası yerine başka bir yöntem kullanabilir miyim?
C: Evet, .env.local dosyası geliştirme ve küçük üretim ortamları için uygundur. Ancak daha büyük ve güvenli ortamlar için, ortam değişkenlerini doğrudan sunucu seviyesinde (örneğin Nginx yapılandırmasında fastcgi_param APP_ENV prod; veya sistem genelinde /etc/environment dosyasında) tanımlamak veya bir sır yönetimi çözümü (Vault, AWS Secrets Manager vb.) kullanmak daha güvenli ve yönetilebilir olabilir.

S: Uygulamamın cache dizini neden www-data kullanıcısı tarafından yazılabilir olmalı?
C: Symfony, performansı artırmak için derlenmiş kodları, yapılandırmaları ve diğer geçici verileri var/cache dizininde saklar. Web sunucusu (Nginx ve PHP-FPM), bu dizine yazma iznine sahip olmalıdır ki uygulama cache dosyalarını oluşturabilsin, güncelleyebilsin ve silebilsin. Aksi takdirde, uygulama çalışırken izin hatalarıyla karşılaşırsınız.

S: Symfony 4 yerine Symfony 5 veya 6 dağıtmak için bu rehber kullanılabilir mi?
C: Evet, bu rehberdeki temel LEMP kurulumu ve Nginx/PHP-FPM yapılandırma adımları Symfony’nin diğer LTS sürümleri için de büyük ölçüde geçerlidir. Symfony sürümleri arasındaki temel farklar genellikle kod seviyesinde ve bazı komutlarda olabilir (örn. Webpack Encore için encore:build komutu). Ancak sunucu tarafı dağıtım mantığı aynı kalır.

S: Neden composer install --no-dev --optimize-autoloader kullanmalıyım?
C: --no-dev parametresi, geliştirme ortamında kullanılan (örneğin test araçları, hata ayıklama paketleri) bağımlılıkları yüklemez. Üretim ortamında bu paketlere ihtiyaç duyulmaz ve yüklenmeleri disk alanı israfına, potansiyel güvenlik açıklarına ve daha yavaş yükleme sürelerine neden olabilir. --optimize-autoloader ise Composer’ın autoloader’ını daha verimli hale getirir, bu da PHP’nin sınıfları daha hızlı bulmasını sağlayarak uygulamanızın performansını artırır.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.