Categories
Açık Kaynak İşletim Sistemleri PHP Programlama Yazılım

Ubuntu’da PHP Geliştirme Ortamı Kurmak 2021

Bu yazıyı yazdıktan sonra biraz Docker kullanma fırsatım oldu. Sonunda şu karara vardım; Docker kullanmak varken aşağıda anlattığım yolu izlemek büyük saçmalık. Oturun iki üç gün Docker öğrenin hayatınız kolaylaşsın.


Kurulumuna başlamadan önce kullanacağımız alet çantasına bir bakınalım. Bu yazıda bir LEMP stack tabanlı yani Linux, Nginx, MySQL ve PHP yığınının kurulumunu anlatacağım.

  • Nginx : Özetle kullanıcıdan gelen istekleri yönetmeye yarayan web sunucu yazılımı. Apache kullanımı günden güne düştüğü için seçimimi Nginx tarafında kullandım.
  • MySQL : Açık kaynak kodlu ilişkisel veritabanı.
  • PHP : Geliştirme yapacağımız yazılım dili.
  • Curl : Çeşitli protokolleri kullanarak veri transferi yapmaya sağlayan yazılımdır.
  • Composer : PHP paketleri için paket yönetimi yazılımı.
  • Git : Sürüm kontrol sistemi.

Her şeyden önce yazılım depolarımızı (repo/repository) güncelleyelim ki kullandığımız tüm yazılımlar güncel olsun. Aşağıdaki komutu uçbirimimize (terminal) yazdıktan sonra kök kullanıcı (root) parolamızı girelim. Eğer bu işlemi ilk kez yapıyorsanız parolamızın yazarken gözükmediğini fark edeceksiniz. Merak etmeyin bu sadece güvenlik için alınmış bir önlemdir. Yazdıktan sonra Enter tuşuyla onaylayın.

sudo apt update

  1. Nginx Kurulumu

Tüm repolarımız güncel olduğuna göre Nginx kurulumuna başlayalım. Komutların sonunda -y eki gelen uyarıları onayladığımız anlamına geliyor.

sudo apt install nginx -y

Eğer Nginx kurulumumuz başarılı olduysa tarayıcımızın adres çubuğuna localhost yazdığımızda şu sayfayı görmemiz gerekir. Bu sayfa Nginx yapılandırması ile birlikte gelen test sayfasıdır.

Nginx’in Varsayılan Sayfası

2. MySQL Kurulumu

Önce şu komutla MySQL motorunu kuralım.

sudo apt install mysql-server -y

Kurduktan sonra gereksiz tabloları silmek ve veritabanı güvenliğini sağlamak için şu komutu çalıştıralım.

sudo mysql_secure_installation

Birinci Adım

Karşımıza gelen bu ekranda şifrelerimizin gücünün kontrol edilmesini kabul edip, etmediğimizi soruyor. Y tuşu ile kabul edelim.

İkinci Adım

İkinci adımda ise kullanmak istediğimiz şifrenin (aslında ileride bu şifreyle bir işimiz olmayacak) hangi güçlük seviyesinde olmasını isteidğimizi soruyor. Zaten yerel bilgisayarımız olduğundan 0 ve enter tuşuna basıp, en düşük güç seviyesini seçiyoruz. Bu seçenek 8 karakterli herhangi bir şifreyi kabul edecektir. ‘New Password’ ve ‘Re-enter new password’ kısımlarında şifrelerimiz gözükmeyecektir. Endişelenmeyin, gözükmese de şifrenizi girebiliyorsunuz. Buralara 12345678 şeklinde basit bir yazıp, enter tuşuna basın. Ardından şifrenizin gücünü bize söylecektir. Yukarıdaki örnekte 100 üzerinden 50 puan verdi. Verdiğimiz şifre ile devam edip etmek istemediğimizi soracaktır. ‘y’ ardından enter tuşuna basıp devam ediyoruz.

Üçüncü Adım

Varsayılan olarak gelen anonymous kullanıcısını silmek isteyip, istemediğimizi soruyor. Önce ‘y’ ardından enter tuşuna basıp devam edelim.

Dördüncü Adım

MySQL sunucusuna, bilgisayarınız dışında başka bir yerden bağlanabilmesini engellemek isteyip, istemediğinizi soruyor. ‘y’ ardından enter tuşuna basıp, engelleyelim.

Beşinci Adım

Varsayılan olarak gelen test veritabanını silmek isteyip, istemediğimizi soruyor. Önce ‘y’ ardından enter tuşuna basıp devam edelim.

Altıncı Adım

Yaptığımız değişikliklerin hemen etkin olması için ayrıcalık tablosunu güncelleyim mi diye soruyor. Önce ‘y’ ardından enter tuşuna basıp devam edelim.

Şimdi MySQL’i kurduğumuza göre ilk girişimşzş yapalım. MySQL’in root kullanıcısı auth_socket doğrulama eklentisi kullandığından sudo (yönetici) yetkisi olan kullanıcılarla girmeye çalıştığımızda parola sormayacaktır. Güvenlik nedenleri ve kazaların önüne geçmek adına kod tarafına tüm tablolara erişebilen ve tüm yetkilere sahip root kullanıcı vermek yerine veritabanı özelinde yetkilere sahip bir kullanıcı tanımlamak daha düzgün bir yöntem olacaktır. Bunun için önce bir veritabanı oluşturalım. Bu komut tüm unicode karakterleri destekleyen bir veritabanı açacağında daha sonra Türkçe karakterler, emojiler vs. gibi verileri tutarken sıkıntı yaşamayacağız.

CREATE DATABASE ornek_veritabani CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Şimdi bu veritabanımızı erişecek kullanıcıyı oluşturalım.

CREATE USER 'kullanici_adi'@'localhost' IDENTIFIED BY 'parola';

Not : MySQL 8 ile birlikte varsayılan doğrulama eklentisi caching_sha2_authentication olarak değişmiştir. PHP 7.4 altı sürümler kullanıyorsanız veritabanı oluştururken mysql_native_password doğrulama eklentisini kullanmalısınız. Bunun için yukarıdaki komut yerine şu komutu kullanın.

CREATE USER 'kullanici_adi'@'%' IDENTIFIED WITH mysql_native_password BY 'parola';

3. PHP Kurulumu

Şu anda en güncel PHP sürümü PHP 8 olmasına rağmen henüz Ubuntu 20.04 yazılım depolarında (repolarında) en güncel sürüm PHP 7.4’dir. Bunu şu adresten kontrol edebilirsiniz. Eğer yazılım deposundaki sürüm PHP 8 ile güncellenmişse aşağıdaki adımı geçebilirsiniz. Bu yazıyı yazdığım tarihte daha güncel bir repo olan ondrej/php reposunu sistemimize ekleyelim.

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

Artık PHP ve sık kullanılan PHP eklentileri yüklemeye hazırız.

sudo apt install php php-mysql php-cli php-mbstring php-gd php-xml php-zip php-fpm php-curl -y

  • php-cli : php kodlarının komut satırında çalıştırılmasını sağlar. Composer için gereklidir.
  • php-mysql : MySQL işlemleri için gereklidir.
  • php-mbstring : Latin alfabesi dışındaki karakterlerin PHP’de ifade edilebilmesini sağlar.
  • php-gd : Görselleri düzenlemek için GD kütüphanesi desteğini getirir.
  • php-xml : XML işlemleri için gereklidir.
  • php-zip : Zip arşivi desteği için gereklidir.
  • php-fpm : PHP işlemlerinin yönetim aracıdır.
  • php-curl : Farklı yazılımların değişik protokollerde iletişim kurmasına yarar.

PHP 8 kurduk ancak bazen eski projeler için önceki PHP sürümlerine ihtiyaç duyabiliyoruz. Bu sebeple bir de PHP 7.4’ü yükleyelim. Siz istediğiniz sürümü aşağıdaki komutu düzenleyerek yükleyebilirsiniz. Eğer böyle bir ihtiyacınız yoksa bu adımı atlayabilirsiniz.

sudo apt install php7.4 php7.4-mysql php7.4-cli php7.4-mbstring php7.4-gd php7.4-xml php7.4-zip php7.4-fpm php7.4-curl -y

Varsayılan PHP sürümünü (Komut satırından PHP çağrıldığında çalışan) şöyle değiştirlebiliriz.

sudo update-alternatives --set php /usr/bin/php7.4

Varsayılan PHP sürümünü şu komutla öğrenebiliriz.

php -v

Not : Yukarıdaki komut ile yaptığınız sürüm değişikliklerinde sadece sistem üzerinde yapılan php çağrılarında değiştirdiğiniz PHP sürümü yanıt verir. Eğer sitelerinizin PHP sürümünü değiştirmek istiyorsanız. Sitenizin Nginx yapılandırması üzeirnden PHP sürümünü değiştirip, Nginx servisini yeniden başlatmalısınız. Bu konuda bir fikriniz yoksa ilerleyen adımları okumaya devam edin.

4. Nginx’i PHP için Yapılandırmak

Nginx bir web sunucu yazılımıdır. Yani gelen HTTP isteklerini karşılayıp bunlara göre HTML, jpg, png gibi yanıtlar verir. Bu Nginx’in yanıt verebilmesi için yorumlanmış sonuçların ona verilmesi gerektiği anlamına gelir. Yani Nginx Java, PHP, Go gibi dillere yapılan isteklerle ne yapılacağını bilmez. Tek başına sadece HTML gibi statik sonuçları döndürebilir. Bizim örneğimizde Nginx’e gelen PHP isteklerinin PHP-FPM’e iletilmesini sağlayacağız. Böylelikle sadece statik dosyaları değil aynı zamanda PHP’den dönen verileride kullanıcılara gösterebileceğiz.

Erişim isteklerinin yerel bilgisayarımıza gelmesini istiyorsak bilgisayarımızdaki host dosyasınına örnek sitemizin adresini eklemeliyiz. Böylelikle bilgisayarımızda çalışan Nginx istekleri yakalayabilecek. Bunun için aşağıdaki kodla host dosyamızı text editör ile açalım. Yerel bilgisayarımızda geliştirme için kullanacağımız alanadlarının uzantısını Chrome ve Firefox .dev’i sürekli HTTPS’e yönlendirdiği için .dev yerine .test olarak seçmemiz gerekiyor. Gösterdiğim şekilde deneme.test adlı site adresimizi ekleyip, kayıt edelim.

sudo gedit /etc/hosts

Düzenlenmiş Hosts Dosyası

Sıra sitemizin dosyalarını nereye barındıracağımıza geldi. Ubuntu 20.04’de varsayılan Nginx yapılandırması /var/www/html dizinini kullanıyor. Tek site kullanışlı olsa da hem birden fazla projeyle çalışacağımzıdan hemde bu dizinin izinleri yüzünden içerisindeki dosyalarla uğraşamadığımız için ben /home/kullanıcı_adı/www/proje_adı dizinini kullanmayı daha pratik buluyorum. Bu dizini komut satırına komut yazarak oluşturabileceğiniz gibi ekran üzerinden de yapabiliriniz. Aşağıdaki komutta $USER parametresi sistemden kullanıcı adınızı çeker. Örneğin benim kulanıcı adım haydar olduğu için orada haydar yazıyor gibi düşünüebilirsiniz.

mkdir -p /home/$USER/www/deneme

Artık sitemizin Nginx yapılandırma dosyasını oluşturma vakti geldi. Nginx’de yapılandırma dosyaları /etc/nginx/sites-available/ dizininde bulunur. Bu dizine erişmek için yönetici yetkisi gereklidir. Komutumuzu girelim.

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

Aşağıdaki kodda haydar yazan yeri kendi kullanıcı adınızla değiştirdikten kopyalayıp ctrl+shift+v tuşları ile karşınızdaki ekrana yapıştırın. Ardından ctrl+x tuşuna bastıktan sonra yaptığınız değişikliği y tuşuna basarak kaydedin.

server {
    listen 80;
    server_name deneme.test www.deneme.test;
    root /home/haydar/www/deneme;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
     }

    location ~ /\.ht {
        deny all;
    }

}

Yukarıdaki server bloğunda yazılanların anlamlarına bir bakalım.

  • listen — Nginx’in hangi portları dinleyeceğini belirler. Varsayılan HTTP portu olan 80^i dinliyor.
  • root — Sitenin bulunduğu dizini belirler.
  • index — İndex dosyasının önceliğini belirler. Genelde bakım yapmakta kullanılabileceği için index.html, index.php’den daha önce yazılır.
  • server_name — Server bloğunun hangi adreslere cevap vermesi gerektiğini belirler. Public ip veya domain olabilir.
  • location / — try_files direktifini içeren ilk server bloğu, url isteğinde istenilen dosyalar ve sayfaların varlığını kontrol eder. Eğer bulamazsa 404 hata sayfası döndürür.
  • location ~ \.php$ — Bu blok Nginx’e hangi fastcgi-php.conf yapılandırma dosyası ve php7.4-fpm.sock dosyası ile hangi soketin php-fpm ile ilişkili olduğunu bildirir. Böylelikle Nginx
  • location ~ /\.ht — Eğer yanlışıkla site dizinine .ht dosyaları yüklenmişse ziyaretçilerin bu dosyaları görmesi engellenir. (ki Nginx zaten .htaccess dosyalarını okumaz)

Oluştuduğumuz Nginx yapılandırma dosyasını etkinleştirmek için Nginx’in sites-enabled klasörüne sembolik link oluşturalım.

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

Yaptığımız yapılandırma dosyasında bir sıkıntı var mı diye bakalım.

sudo nginx -t

Eğer hata alıyorsanız, hatada belirtilen satırı kontrol edip düzeltin. Hata almıyorsak yapılandırma dosyamızı Nginx’e yükleyelim.

sudo systemctl reload nginx

Şimdi test için html ve php sayfalarımızı oluşturalım.

nano /home/$USER/www/deneme/index.html

Şu kodu yapıştıralım. Yukarıda anlattığım gibi kayıt edelim.

<html>
  <head>
    <title>Deneme</title>
  </head>
  <body>
    <h1>Merhaba!</h1>

    <p>Bu bir testtir.</p>
  </body>
</html>

PHP testi için bir PHP sayfası oluşturalım;

nano /home/$USER/www/deneme/info.php

<?php
phpinfo();

Son olarak tarayıcımızda deneme.test ve deneme.test/info.php sayfalarına girip test edelim. Eğer sayfalar sorunsuz açılıyorsa yapılandırmayı doğru yapmışız demektir.

5. Curl Kurulumu

Aşağıdaki komutu uçbirimde çalıştıralım.

sudo apt install curl -y

6. Composer Kurulumu

Ardından composer kurulumuna başlayabiliriz. Aşağıdaki kodu teker uçbirminizde çalıştırın.

cd ~

curl -sS https://getcomposer.org/installer -o composer-setup.php

Fakat şu an composer kurulumu yapılmadı. Kurulum için son olarak şu komutu çalıştıralım.
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

7. Git Kurulumu

Git’i kurmak için şu komutu çalıştıralım.

sudo apt install git -y

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.