Laravel için LEMP Stack Kurulum Rehberi

268

LEMP (Linux, Nginx, MySQL, PHP), LAMP yığınının (Linux, Apache, MySQL, PHP) bir türevidir. Tek fark, LEMP'in Nginx kullanması, LAMP'ın ise Apache kullanmasıdır. Nginx Apache'den çok daha hızlı ve genellikle daha güvenlidir. Ayrıca NGINX'in yükselen bir popülarite grafiği olduğunu da düşünürsek destek ve dokümantasyon konusunda da sıkıntı yaşamayacağınızı düşünebiliriz.

Kaynak: Netcraft

Kaynak: Netcraft

Laravel projeleri için de ekseriyetle VPS (Virtual Private Server) tercih edildiği için, hizmeti satın aldığınızda size seçtiğiniz işletim sisteminin olduğu, içine hiçbir uygulamanın yüklenmediği bir sanal sunucu verirler. Haliyle ihtiyacınız olan uygulamaları kurup, konfigürasyonlarını yapmak ve çalışır hale getirmek de bize kalıyor.

Bu rehberi de hem kendime daha sonra ihtiyaç halinde kötü hazırlanmış olan rehberlerle cebelleşmemek için hem de temiz bir kurulum yapmak isteyenler için elimden geldiğince iyi, tane tane açıklamalarla hazırlamak istedim.

Rehberi, Ubuntu kurulu bir VPS hizmeti aldığınızı varsayarak hazırlıyorum. Diğer işletim sistemlerinde adımlarda ya da komutlarda farklılıklar olabilir.


NGINX ve MariaDB Kurulumu

Kaynakları güncelleyip NGINX ve MariaDB'i kuralım.

$ sudo apt update && sudo apt install -y nginx mariadb-server

MariaDB'in Konfigürasyonunu yapalım

MySQL kurulumu için ilk kurulum işlemini çalıştırın. Varsayılan olarak, ayarlanmamış olan bir root şifresi isteyecektir, bu nedenle Enter tuşuna basın.

Daha sonra root şifresi ayarlamak isteyip istemediğinizi soracaktır, N'ye ve ENTER'a basın. İstemlerin geri kalanı için varsayılanları kabul etmek üzere enter tuşuna basın.

$ sudo mysql_secure_installation

Daha sonra kurulumun düzgün bir şekilde yapılıp yapılmadığını test edip veritabanına daha sonra kullanacağımız veribananını ve kullanıcıyı ekleyeyim.

$ sudo mariadb

MariaDB'e girdikten sonra yeni bir veritabanı oluşturalım. example_db yeni oluşturacağımız veritabanının adı olacak. O yüzden eğer projenize uygun bir isimle bunu değiştirirseniz, sonraki aşamalarda da gerekli değişiklikleri yapmayı unutmayın.

CREATE DATABASE example_db;

Oluşturduğumuz veritabanı için yeni bir kullanıcı ekleyip, yeni kullanıcıya yetkilerini verelim. Sakın bu adımı atlayıp root kullanıcı ile veritabanı işlemlerini (CRUD) yapmayım. Unutmayın, artık local'de değiliz. Tahmin edeceğiniz üzere username ve password yeni kullanıcımızın kullanıcı adı ve şifresi olacak. Sakın aceleci davranıp "123456" gibi bir şifre belirmeyin.

GRANT ALL ON example_db.* TO 'username'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Kullanıcıyı oluşturduktan sonra yetkilendirmeleri güncelleyip MariaDB'den çıkalım.

FLUSH PRIVILEGES;
exit

Şimdi oluşturduğumuz yeni kullanıcıyla MariaDB'i açalım. Bir problem olmamışsa belirlediğiniz kullanıcı adı ve şifreyle giriş yapabilmeniz gerekiyor.

$ mariadb -u username -p

Daha önceden oluşturduğumuz veritabanına erişebildiğimizden emin olalım.

SHOW DATABASES;
USE example_db;

Şimdi, daha sonra kurulumun testi için kullanacağımız bir tablo oluşturup, içine test verisini kaydedelim.

CREATE TABLE table1(column1 varchar(255));
INSERT INTO table1 VALUES("Database connection established successfully");
exit

Eğer MardiaDB oluşturduğumuz veritabanını seçmemize ve içine bu tablo ve test verisini eklememize izin veriyorsa şu ana kadar işler yolunda gitmiş demektir.

PHP Kurulumu

Veritabanında sonra sıra PHP kurulumuna geldi. Laravel için CURL ve XML eklentilerini de yüklemeyi unutmayalım. Olur da yüklediğiniz eklentiler, projeniz için eksik kalırsa endişelenmeyin. Sadece PHP'yi kurup ondan sonra istediğiniz her eklentiyi, her aşamada yükleme şansınız var. Projenize özel, eksik olan eklentiye göre yapacağınız ufak bir Google aramasıyla ihtiyacınız olan eklentiyi sunucuya bağlanıp kurmanız en fazla 40-50 saniye sürecektir diye tahmin ediyorum. 

$ sudo apt install -y php-fpm php-mysql php-curl php-xml

NGINX Konfigürasyonu

İlk adım olarak -büyük ihtimalle- işletim sistemimizde kurulu olan firewall'a sitemiz için kullanacağımız HTTP ve HTTPS trafiğine izin vermesini söyleyeceğiz.

$ sudo ufw allow http
$ sudo ufw allow https

Daha sonra sitemizin dosyalarını upload/push edeceğimiz klasörümüzü oluşturalım. Bu rehberde example.com örneği üzerinden anlatılanları kendi projeniz için klasöre vereceğiniz isimlerle değiştirmeyi unutmayın. Klasörümüzü /var/www klasörünün içine oluşturuyoruz. Normalde böyle bir zorunluluğumuz yok, istediğimiz klasörü projemiz için kullanabiliriz ama düzenli olmakta fayda var. Yapacağınız bir güncelleme için 2 ay sonra klasörler içinde boğuşarak vakit kaybetmeyin.

$ sudo mkdir -p /var/www/example.com

Bu klasörümüze gereken kullanıcı yetkilerini verelim. $USER değişkeniyle sisteme giriş yaptığınız kullanıcının adını atamış olursunuz. Bunu daha sonra "www-data" gibi bir kullanıcı adıyla değiştirmek isterseniz yine aynı komutu kullanabilirsiniz.

$ sudo chown -R $USER:$USER /var/www/example.com

Bir sonraki adımda NGINX'e sitemizi ve bu site için hangi klasöre bakması gerektiğini söylememiz gerekiyor. Bunun için "sites-available" klasörünün içinde sitemiz için bir konfigürasyon dosyası oluşturmamız gerekiyor.

$ sudo nano /etc/nginx/sites-available/example.com

Yukarıdaki komut ile linux içindeki metin editörlerinden biri olan nano ile bu dosyayı boş olarak açıyoruz. Daha sonra bu dosyanın içini dikkatli bir şekilde doldurmamız gerekiyor.

server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    root /var/www/example.com/public;

    charset utf-8;

    location / {
    try_files $uri $uri/ /index.php?$query_string;
    }
    
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    access_log /var/log/example.com.log;
    error_log /var/log/example.com.error.log;
}

Bu adımda yukarıda verilenler hakkında bir kaç hatırlatma yapmak istiyorum. server_name için domainimizi yazıyoruz. Ayırca dikkat ettiyseniz sitemiz için demin oluşturduğumuz klasörü de root olarak ekledik ama direkt kök klasörü yazıp bırakmadık. Henüz içinde olmasa bile public klasörümüzün içine yönlendirdik çünkü Laravel uygulamanızı yüklemek için varsayılan olarak public klasörüne bakar. 

Ayrıca location ~ \.php$ konfigürasyonu için bir şeyi hatırlatmak istiyorum. Dikkat ettiyseniz biz PHP kurulumu yaparken herhangi versiyon seçmedik. O sırada işletim sistemimizin repository indexindeki son versiyon hangisiyse sistem onu kurdu. Ben bu yazıyı yazdığım sırada PHP 8.3 versiyonu beta aşamasındaydı. Olur da sizin bu rehberi takip ettiğiniz sırada yüklenen versiyon yükselmişse, konfigürasyonunuzu fastcgi_pass unix:/run/php/php8.1-fpm.sock; şeklinde değil de fastcgi_pass unix:/run/php/php8.3-fpm.sock; (düşük bir ihtimal olsa da eğer klasör yapısı değişmemişse...) olarak kaydetmeyi unutmayın. Sonra sunucu PHP dosyalarını neden render etmiyor diye hata aramakla vakit kaybetmeyin.

Daha sonra oluşturduğumuz bu konfigürasyon dosyasının bir linkini etkinleştirilen siteler (sites-enabled) klasörüne ekleyelim ki NGINX çalıştığı zaman hangi konfigürasyon dosyalarını da çalıştıracağını anlasın.

$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Linki ekledikten sonra yeni ayarların devreye girebilmesi için NGINX servisini yeniden başlatıyoruz.

$ sudo systemctl restart nginx.service

Kurulumun Testini Yapalım

Yaptığımız kurulumda bir sorun olmadıysa public klasöründe oluşturacağımız bir PHP dosyasının düzgün bir şekilde NGINX tarafından yönlendirilip, veritabanına bağlandıktan sonra PHP tarafından problemsiz bir şekilde render edilmesi gerekiyor. Yine nano ile bir dosya oluşturalım.

$ nano /var/www/example.com/public/testdb.php

Aşağıdaki kodu da yeni oluşturduğumuz dosyanın içine yapıştıralım. Veritabanı için gerekli düzenlemeleri yapmayı unutmayın. Oluşturduğunuz veritabanının adını, kullanıcı adını ve şifresini doğru girdiğinizden emin olun.

<?php
$mysqli = new mysqli("localhost", "username", "password", "example_db");

if (mysqli_connect_errno()) {
    printf("Connection failed: %s\n", mysqli_connect_error());
    exit();
}

$query = "SELECT column1 FROM table1";

if($result = $mysqli->query($query)) {
    while($row = $result->fetch_row()){
        printf("%s\n", $row[0]);
    }
    $result->close();
}

$mysqli->close();
?>

Dosyayı açmak için http://example.com/testdb.php adresine gidin. Eğer bir problem yaşanmamışsa "Database connection established successfully" ifadesini görmeniz gerekmekte. Tebrikler, artık olması gerektiği gibi çalıştığından emin olduğunuz bir LEMP stack'iniz var.

Sonuç

Her ne kadar karışık gibi görünse de emin olun rehberi atlamadan okuduğunuzda bu işlemlerin göründü kadar zor olmadığını anlayacaksınız. Ayrıca eklemek istediğim başka bir şey daha var. Yazının başında da sözünü ettiğim gibi bu işlemleri bir VPS ile yapıyor olma ihtimaliniz oldukça yüksek. VULTR, DigitalOcean gibi birçok şirket uzun zamandan beri ücresiz SSL hizmeti de veriyor. Eğer hosting şirketiniz böyle bir hizmet veriyorsa SAKIN "SSL olmadan da site çalışıyor" deyip bu seçeneği es geçmeyin. Genelde bu şirketler sertifikalar için yapmanız gereken yüklemeler ve modifikasyonlarla ilgili bir rehber de yayınlıyorlar. Mutlaka onlara da gözatmayı unutmayın.