Bu yazımda Symfony Yerel Web Sunucusu (ingilizce ismiyle Symfony Local Web Server) kullanımı hakkında bazı bilgiler vermeye çalıştım.
PHP web uygulamalarını geliştirme ortamında kullanmak için çeşitli yöntemler kullanıyoruz. Bunlardan öne çıkanları yerel makinemize kurduğumuz Apache, Nginx sunucuları üzerinde çalışan PHP; PHP’nin dahili web sunucusu, Docker kullanmak, Vagrant kullanmak, Laravel Valet kullanmak şeklinde sıralanabilir.
Bunların kendilerine göre avantajları ve dezavantajları mevcut. Örneğin PHP’nin dahili web sunucusu neredeyse mükemmel ancak; aynı anda tek bağlantı sağlaması, HTTP/2 desteğinin olmaması, SSL desteğinin olmaması, ortam değişkenleri değiştiğinde tekrar okumaması gibi sıralanabilir. Apache/Nginx çözümlerinde ise kurum, host bazlı ayarlamalar yapmak, ssl ayarı gibi çeşitli işlemler yapmak gerekli. Docker/Vagrant çözümlerinde ise kimi zaman kullanımı rahat değil, kimi zaman da yavaşlık sorunluları oluşuyor. Symfony sunucu uygulamalarınızı geliştirirken sizi daha üretken yapmak için kendi web sunucusunu sağlıyor.
Yayında kullanmak için uygun olmasa da web projelerinizi geliştirmek için er ya da geç ihtiyaçınızı olan HTTP/2, TLS/SSL, otomatik güvenlik sertifikaları üretimi, yerel domainler ve diğer bir çok özellikleri beraberinde sunar. Dahası bu sunucu Symfony’e özel değildir ve herhangi bir php uygulaması ve hatta HTML veya SPA (single page applications) ile de kullanabilirsiniz.
Kurulum ve detaylara girmeden önce bazı özelliklerini sıralayalım:
- Root kullanıcı olmanıza ihtiyaç yok
- Mümkün olduğu durumlarda PHP-FPM (olmadığı durumlarda PHP-CGI/PHP -S)
- HTTP2 desteği
- Tüm statik (HTML/JS/CSS) ve PHP projeler için uygun
- Aynı makinede kurulu birden fazla PHP versiyonu ile çalışabilme
- Uzun süre çalışacak herhangi bir komutu arka planda çalıştırma ve günlüklerini takip etme
Kurulum
Linux
Aşağıdaki kod satırını terminalinize yapıştırın.
1 |
wget https://get.symfony.com/cli/installer -O - | bash |
MACOS
Aşağıdaki kod satırını terminalinize yapıştırın.
1 |
curl -sS https://get.symfony.com/cli/installer | bash |
Windows
Aşağıdaki dosyayı indirin ve kurun.
1 |
https://get.symfony.com/cli/setup.exe |
Başlangıç
Symfony server her proje için bir kez başlatılır, bunun sonucu olarak her biri farklı bir portu dinleyen bir çok örneğini görebilirsiniz.
1 2 3 4 5 6 7 8 |
cd my-project/ symfony server:start [OK] Web server listening on http://127.0.0.1:.... # Verilen url’i tarayıcınızda açın veya aşağıdaki komutu çalıştırın. symfony open:local |
Sunucunun bu şekilde çalışması log mesajlarının konsolda gösterilmesini sağlar, bundan dolayı aynı zamanda terminalimizde diğer komutları çalıştıramazsınız. İsterseniz, Symfony sunucuyu arka planda çalıştırabilirsiniz.
1 2 3 4 5 6 7 8 9 |
cd my-project/ # sunucuyu arka planda çalıştır. symfony server:start -d # çalışmaya ve diğer komutları çalıştırmaya devam edin… # En son log mesajlarını göstermek symfony server:log |
PHP-FPM Aktifleştirme
Sunucu başladığında otomatik olarak ortak web/app.php
, web/app_dev.php
veya public/index.php
proje yapısını kontrol eder. Bunun gibi bir dosya bulunursa sunucu otomatik olarak PHP-FPM ile aktifleştirilir. Diğer türlü sunucu PHP-FPM olmadan başlayacak ve tarayıcınızda bir .php uzantılı dosyaya erişmeye çalıştığınızda Page not found
sayfası gösterecektir.
Hedef klasörde
index.html
ve ön kontrolcü olarakindex.php
her ikisi birden mevcutsa sunucu otomatik olarak PHP-FPM ile aktifleştirilecek ancak index.html önceliği alacaktır. Bunun anlamı bir index.html dosyasıpublic
veyaweb
içinde mevcut ise php uygulamanızı gösterecek index.php yerine gösterilecektir.
TLS / SSL Aktifleştirme
Uygulamalarınızın güvenli olan versiyonlarını geliştirme ortamınızda görüntülemek; sayfanızda kullandığınız HTTP ve HTTPS karmaşık içerikleri önceden belirlemek ve yalnızca HTTPS üzerinde çalışan kütüphanelerinizi (örneğin ödeme sistemleriyle ilgili bir stripe.js) çalıştırmak için önemlidir. Bu desteğin sağlanmaz bizi yayın ortamına biraz daha yaklaştırır. Geleneksel yöntemle bu oldukça uğraştırıcı ve karmaşık bir kurulumdur, fakat Symfony sunucusu her şeyi otomatik olarak gerçekleştirir. İlk olarak şu komutu çalıştırın.
1 |
symfony server:ca:install |
Bu komut bir yere sertifika yetkilisi yaratır ve bunu sisteminizde güvenli olarak kaydeder, bunu Firefox içine kaydeder (bu yalnızca Firefox web tarayıcısı için gereklidir) ve localhost
ve 127.0.0.1
için varsayılan bir sertifika oluşturur. Diğer bir deyişle gerekli şeyleri sizin için yapar.
Kullanıcı dizininizdeki .symfony/certs
dizinine göz attığınızda (MacOS için şu klasör ~/.symfony/certs
) şu dosyalarınızın listelendiğini göreceksiniz.
1 2 3 4 5 6 |
drwxr-xr-x 6 mahmutbayri staff 192B May 18 16:26 . drwxr-xr-x 11 mahmutbayri staff 352B May 19 11:28 .. -rw-r--r-- 1 mahmutbayri staff 3.9K May 18 16:26 default.p12 -r-------- 1 mahmutbayri staff 2.4K May 18 16:26 rootCA-key.pem -rw-r--r-- 1 mahmutbayri staff 1.7K May 18 16:26 rootCA.pem -rw-r--r-- 1 mahmutbayri staff 0B May 18 16:26 trusted |
Bilgisayarınızdaki uygulamayı HTTP yerine HTTPS olarak gezinmeden önce sunucusunu durdurup çalıştırarak tekrar başlatın (uygulama klasörünüzde symfony server:stop, symfony server:start).
Her Proje İçin Farklı PHP Yapılandırması
Farklı bir PHP versiyonunu seçme
Bilgisayarınızda birden fazla PHP versiyonu kurulu ise projenizin kök dizininde .php-version
isimli bir dosya yaratarak Symfony sunucusuna hangisini kullanması gerektiğini söyleyebilirsiniz.
1 2 3 4 5 6 7 |
cd my-project/ # bu php versiyonunu kullan echo 7.2 > .php-version # uygun olan herhangi bir 7.x versiyonunu kullan echo 7 > .php-version |
Symfony sunucusu dizin yapısını en üst kök klasörüne kadar tarar, böylece herhangi bir üst dizinde tanımlanmış PHP versiyonu o dizin altındaki projelerde kullanılabilir.
Eğer bilgisayarınızda yüklü tüm PHP versiyonlarını hatırlamıyorsanız aşağıdaki komutu çalıştırın.
1 |
symfony local:php:list |
Yüklü PHP versiyonlarını gösteren liste aşağıdaki şekilde listelenecek.
1 2 3 4 5 6 7 8 |
┌─────────┬────────────────────────────────────┬─────────┬──────────────────────────────────────┬─────────────────────────────────────┬─────────┬─────────┐ │ Version │ Directory │ PHP CLI │ PHP FPM │ PHP CGI │ Server │ System? │ ├─────────┼────────────────────────────────────┼─────────┼──────────────────────────────────────┼─────────────────────────────────────┼─────────┼─────────┤ │ 7.1.32 │ /usr/local/Cellar/php@7.1/7.1.32_1 │ bin/php │ sbin/php-fpm │ bin/php-cgi │ PHP FPM │ │ │ 7.2.30 │ /usr/local │ bin/php │ Cellar/php@7.2/7.2.30_1/sbin/php-fpm │ Cellar/php@7.2/7.2.30_1/bin/php-cgi │ PHP FPM │ * │ │ 7.3.9 │ /usr/local/Cellar/php/7.3.9_1 │ bin/php │ sbin/php-fpm │ bin/php-cgi │ PHP FPM │ │ │ 7.3.11 │ /usr │ bin/php │ sbin/php-fpm │ │ PHP FPM │ │ └─────────┴────────────────────────────────────┴─────────┴──────────────────────────────────────┴─────────────────────────────────────┴─────────┴─────────┘ |
Eğer macOS işletim sistemi kullanıyorsanız PHP yüklü olarak gelir. Daha farklı PHP versiyonları yüklemek isterseniz Homebrew ile kolayca yapabilirsiniz. Örneğin 7.4 versiyonunu yüklemek için brew install php@7.4
komutunu kullanabilirsiniz.
Proje bazlı PHP ayarlarını seçeneklerini değiştirme
Proje klasörünüzde php.ini
isminde bir dosya yaratarak her proje için PHP çalışma anı ayar seçeneklerinizi değiştirebilirsiniz. Yalnızca üzerine yazmak istediğiniz ayarı ekleyin.
1 2 3 4 5 6 7 |
cd my-project/ # bu proje yalnızca varsayılan PHP Timezone değerini değiştirir. cat php.ini [Date] date.timezone = Europe/Istanbul |
Komutları Farklı Bir PHP Versiyonu İle Çalıştırma
Farklı PHP versiyonlarında çalışıldığında, php
komutları için symfony
kapsayıcısını kullanmak kullanışlıdır. Bu projenize en uygun php versiyonunu seçmenize izin verir. Ayrıca ortam değişkenlerini de otomatik olarak yükler.
1 2 3 4 5 |
# Komut varsayılan PHP versiyonuyla çalışır. php -r "..." # Komut projede seçilen PHP versiyonu ile çalıştırılır veya seçilmemişse varsayılan PHP versiyonuyla çalıştırılır. symfony php -r "..." |
Yerel Alan İsimleri
Varsayılan olarak projeler 127.0.0.1
yerel IP’sinin rasgele portlarından erişilebilir. Ocak bazen onları bir alan ismi ile ilişkilendirmek tercih edilebilir.
- Aynı proje üzerinde sürekli çalışırken port numaralarının değişmesi fakat alan isimlerinin değişmesinden dolayı hatırlanabilir olması, daha rahat olması;
- Bazı uygulamaların davranışları onların alan isimleri veya alt alan isimlerine (subdomains) bağlı olması;
- OAuth2 için URL yönlendirmeleri gibi işlemleri için için kararlı adreslere sahip olmak
Yerel Proxy Kurulumu
Yerel domainler Symfony server tarafından sağlanan bir yerel proxy ile mümkündür. Eğer proxy ilk kez başlatışınız ise aşağıdaki konfigürasyonları yapmalısınız:
- İşletim sisteminizden
proxy settings
kısmını açın: - Otomatik Ara Sunucu Ayarları (Automatic Proxy Configuration) değerini takip eden URL’i ayarlarlayın.
http://127.0.0.1:7080/proxy.pac
Örnek olarak MacOS’daki değişiklik şu şekilde.
Şimdi proxy’i başlatmak için bu komutu çalıştırın. Bu komutu bulunduğunuz herhangi bir klasörde çalıştırabilirsiniz. Proje bazlı değildir.
1 |
symfony proxy:start |
Bazı tarayıcılar (Örneğin Chrome) proxy ayarının tekrar uygulanmasına ihtiyaç duyarlar (
chrome://net-internals/#proxy
sayfasındaRe-apply settings
butonuna tıklayarak) veya proxy’i başlattıktan sonra tarayıcıyı tekrar başlatarak. Aksi taktirdeThis webpage is not available error (ERR_NAME_NOT_RESOLVED)
hatası göreceksiniz.
Yerel Alan İsmi Tanımlama
Varsayılan olarak yerel domainler için Symfony .wip
(Work in Progress) önerir. Projeniniz için aşağıdaki gibi bir yerel domain tanımlayabilirsiniz:
1 2 |
cd my-project/ symfony proxy:domain:attach my-domain |
Eğer bir önceki kısımda açıklandığı gibi bir yerel proxy kurulumu yaptıysanız, yerel projenize özel domain ile erişmek isteriz https://my-domain.wip
adresininde gezinti yapabilirsiniz.
http://127.0.0.1:7080
adresini görüntüleyerek tüm yerel projelerinizi ve onların özel domainlerini ve port numaralarını listeleyebilirsiniz.
Konsol komutlarını çalıştırırken, https_proxy
ordam değişkeninizi özel alan adınızın çalıştırmak için kullanabilirsiniz.
1 |
https_proxy=http://127.0.0.1:7080 curl https://my-domain.wip |
Ortam değişkenlerinde büyük harf kullanmamıza rağmen
https_proxy
değişkenini küçük harfle kullanmamız gerekiyor.
.wip
yerine farklı bir domain grubu kullanmak isterseniz ~/.symfony/proxy.json
dosyasındaki tld
değerini değiştirebilirsiniz.
Tanımlamalarınızı ~/.symfony/proxy.json
dosya içeriğinden görebilirsiniz.
Uzun Süre Çalışan Komutlar
Front-end asetlerini derlemek gibi uzun süre çalışan komular terminali bloklar ve aynı terminalde başka komut çalıştıramazsınız. Symfony sunucusu run
komutuyla aşağıdaki gibi kapsayıcı içinde çalıştırabilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Webpack asetlerinin derlenmedi… ama bu arka planda yapılıyor ve terminali engellemiyor. symfony run -d yarn dev --watch # çalışmaya ve diğer komutları çalıştırmaya devam edin. # Eğer isterseniz zaman zaman logları takip edin. symfony server:log # komutun hala çalışıp çalışmadığını da kontrol edebiliriz. symfony server:status Web server listening on ... Command "yarn ..." running with PID ... # İşiniz bittiğinde web sunucuyu durdurulması ( ve tüm bağlantılı komutların) symfony server:stop |
symfony server:status
komutunu çalıştırdığınızda server:start ile başlattığınız tüm web sunucularınız, çalışmakta olan komutlar gibi bilgiler verilir.
1 2 3 4 5 6 7 8 9 |
symfony server:status Local Web Server Listening on https://127.0.0.1:8000 The Web server is using PHP FPM 7.2.30 Local Domains Workers Command /usr/bin/find -f a / running with PID 67759 Environment Variables None |
Bu yazımda geliştirici ortamlarında kullanılan symfony yerel web sunucusu hakkında genel bilgiler vermeye çalıştım. Bu araç yalnızca dosyalarınızı web tarayıcı üzerinden görüntüleyebileceğiniz bir araç değil aynı zamanda komutlarınızı çalıştırıp takip edeceğiniz, farklı php versiyonlarını proje bazlı veya komut bazlı kullanabileceğiniz çok faydalı bir araç. Aracın en büyük sorunu açık kaynaklı olmaması. Sunucu özellikleri Symfony CLI projesinin bir parçası. Açık kaynak kodlu olması projeyi inceleyerek öğrenmek için iyi olurdu.