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 enableHTTPS 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ındakipm.max_children,pm.start_serversgibi 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.inidosyası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.
