Giriş
İnternet dünyasında, internet kullanıcılarının dünya çapındaki ağda (world wide web) dinamik içeriğe erişmesini sağlayan bir çözüm oluşturmak için birkaç teknoloji bir araya gelir. LEMP yığını bu çözümlerden biridir. Yüksek performanslı ve dinamik web siteleri için eksiksiz bir sunucu çözümü oluşturan dört teknolojiyi bir araya getirir. LEMP; Linux, Nginx, MySQL ve PHP kelimelerinin baş harflerinden oluşan bir kısaltmadır. Linux, sunucu işletim sistemidir. Nginx (Engine-X olarak telaffuz edilir, bu nedenle kısaltmadaki E harfidir) web sunucusu yazılımıdır. Ardından, MySQL, web sitesi ve kullanıcı verilerini tutan veritabanı sistemidir. PHP ise dinamik işleme için sunucu tarafı betik dilidir.
Bu eğitimde, bir LEMP yığınını nasıl kuracağınız ve yapılandıracağınız konusunda size rehberlik edecek ve her şeyin beklendiği gibi çalıştığını kontrol edeceğiz. Hadi başlayalım!
Adım 1: Sunucunuzu Ubuntu 20.04 ile yapılandırma
Ubuntu 20.04, Linux tabanlı bir İşletim Sistemidir. Birkaç Linux tabanlı sunucu işletim sistemi mevcuttur, buna ücretsiz ve premium olanlar da dahildir. Bu kılavuzun odak noktası, ücretsiz ve açık kaynaklı olan Ubuntu 20.04'tür. Bu adım, LEMP yığını kısaltmasındaki ilk gereksinim olan L harfini karşılar. Sonraki adımlara geçmek için VPS'inizde gerçek bir Ubuntu 20.04 kurulumuna sahip olmalısınız. Şu konudaki kılavuzumuzu takip edebilirsiniz: Ubuntu Sunucunuzu kurma. İsteğe bağlı olarak, bu kılavuzu yerel bilgisayarınızda takip etmek isterseniz, Ubuntu 20.04 sunucu kurulum imajını doğrudan Ubuntu web sitesinden indirebilirsiniz. Sudo izinleri gerektiren birkaç komut çalıştıracağımız için, sudo yetkilerine sahip normal bir root olmayan kullanıcı yapılandırmalısınız.
Adım 2: Nginx Sunucusunu Kurma ve Yapılandırma
Web Sunucuları, web sayfaları gibi içerikleri web sitesi ziyaretçilerine sunmamızı sağlar. Nginx, geliştiriciler tarafından tercih edilen en iyi beş açık kaynaklı web sunucusu arasında yer alan popüler bir web sunucusudur. Bu adım, LEMP yığınındaki ikinci gereksinim olan Nginx için E harfini karşılar. Ubuntu, bu kılavuzda kullanacağımız paketleri alacağımız varsayılan bir paket deposuna sahiptir. Ubuntu, paketlerini yönetmek için apt veya dpkg kullanan Debian tabanlıdır. Varsayılan depodaki paketler için apt kullanacağız.
Genel bir kural olarak, bir Linux sisteminde herhangi bir kuruluma başlamadan önce güncelleme komutunu çalıştırmalısınız. Terminale aşağıdaki komutu girerek başlayın:
|
1 |
sudo apt update |
Güncelleme yaptıktan sonra, şimdi aşağıdaki komutla Nginx'i kurabilirsiniz:
|
1 |
sudo apt install nginx |
Kurulum tamamlandıktan sonra Nginx otomatik olarak çalışmaya başlar. Bir sonraki adım, trafiğe izin vermek için güvenlik duvarını yapılandırmaktır. Ubuntu, güvenlik duvarlarının yapılandırılması için ufw (Uncomplicated Firewall - Kolay Güvenlik Duvarı) paketini kullanır. Kurulumdan sonra Nginx, kendisini ufw'ye bir hizmet olarak kaydeder. Ubuntu, sistem açılışında Güvenlik Duvarı hizmetini otomatik olarak başlatır, ancak emin olmak için etkinleştirmek üzere aşağıdaki komutu yazın:
|
1 |
sudo ufw enable |
ufw'nin izin verdiği uygulama yapılandırmasını listelemek için aşağıdaki komutu girin:
|
1 |
sudo ufw app list |
Aşağıda, yukarıdaki komutun çıktısını gösteren bir ekran görüntüsü yer almaktadır:

Gördüğünüz gibi, Nginx zaten ufw'ye kayıtlıdır ve aşağıda açıklandığı gibi üç profile sahiptir:
- Nginx Full – hem port 80'i hem de 443'ü açar. Port 80 normal/şifrelenmemiş trafik, yani HTTP içindir. Port 443 ise TLS/SSL şifreli trafik, yani https içindir.
- Nginx HTTP – yalnızca port 80'i açar – şifrelenmemiş trafik.
- Nginx HTTPS – yalnızca port 443'ü açar – TLS/SSL şifreli trafik.
Nginx ufw'ye otomatik olarak kaydolurken, siz kendiniz izin verene kadar sunucunuza hiçbir trafiğe izin verilmez. Profillerin tümüne veya herhangi birine izin vermeyi seçebilirsiniz, ancak web sunucunuz için yapılandırdığınız trafiğe yine de izin verecek en kısıtlayıcı profile izin vermeniz daha iyidir. Bu eğitimde SSL yapılandırmadığımız için, yalnızca port 80 üzerinden HTTP trafiğine izin vereceğiz. Merak ediyorsanız, Certbot kullanarak Let's Encrypt'ten Nginx sunucusunda SSL yapılandırma hakkında bir kılavuzumuz bulunmaktadır.
Aşağıdaki komutu girerek port 80 üzerindeki trafiği etkinleştirelim:
|
1 |
sudo ufw allow 'Nginx HTTP' |
Değişikliğin başarılı olduğunu doğrulamak için aşağıdaki komutu yazın:
|
1 |
sudo ufw status |

Komutun çalıştırılmasından elde edilen yukarıdaki çıktı, HTTP trafiğine artık izin verildiğini göstermektedir. Tarayıcıda alan adınıza veya sunucunuzun genel IP'sine erişerek sunucunun çalışıp çalışmadığını kontrol edebilirsiniz. Bir alan adı yapılandırmadıysanız ve sunucunuzun genel IP adresinden emin değilseniz, bunu curl kullanarak aşağıdaki komutu çalıştırarak bulabilirsiniz:
|
1 |
curl -4 icanhazip.com |
Yukarıdaki komutun çıktısı olan genel IP adresinizi tarayıcınızın adres çubuğuna kopyalayın. Sayfayı yüklediğinizde, varsayılan Nginx karşılama sayfasını göreceksiniz:

Yukarıdaki sayfa, Nginx'i başarıyla kurduğunuzu gösterir.
Adım 3: MySQL Veritabanı Yönetim Sisteminin Kurulması
Veri yönetimi, her dinamik web sitesinin çok önemli bir parçasıdır. MySQL, bir web sitesinin verilerini depolayan ve yöneten bir veritabanı yönetim sistemidir. Bu adım, LEMP yığınındaki üçüncü gereksinim olan M harfini karşılar. MySQL'i kurmak için aşağıdaki komutu girin:
|
1 |
sudo apt install mysql-server |
MySQL kurulumu tamamlandıktan sonra, kullanıma hazır hale gelmeden önce onu yapılandırmalısınız. Yapılandırmanın bir parçası, veritabanı sunucusunun güvenliğini sağlamayı içerir. MySQL, şifreleri güvenli hale getirme ve ayarlama konusunda size rehberlik edecek bir betikle birlikte gelir. Aşağıdaki komut betiği başlatır:
|
1 |
sudo mysql_secure_installation |

Betik, VALIDATE PASSWORD bileşenini kurmak isteyip istemediğinizi veya bileşeni etkinleştirmeden devam etmek için herhangi bir tuşa basıp basmayacağınızı sorar.
VALIDATE PASSWORD bileşeni, veritabanı sunucunuzdaki belirli bir kullanıcı için girdiğiniz şifrenin belirli bir kritere uyup uymadığını kontrol etmek için kullanılan bir özelliktir. Uzunluk, sayısal karakterler, büyük veya küçük harflerin varlığı gibi şeyleri kontrol edecek şekilde yapılandırabilirsiniz. Etkinleştirilmemişse, istediğiniz herhangi bir şifreyi yapılandırabilirsiniz. Ancak etkinleştirilirse, belirttiğiniz kriterlere uyan bir şifre kullanmanız gerekir. Bunu etkinleştirmek, Ubuntu için phpMyAdmin paketi gibi MySQL kullanıcı kimlik bilgilerini otomatik olarak yapılandıran paketlerle sorunlara neden olabilir. Etkinleştirip etkinleştirmemek kişisel bir seçimdir. Etkinleştirmeseniz bile veritabanınız güvendedir, sadece güçlü ve benzersiz şifreler kullandığınızdan emin olun.
Bileşeni etkinleştirmek için Y tuşuna bastıysanız, betik sizden bir şifre doğrulama düzeyi seçmenizi isteyecektir:

Betik 3 düzeyde şifre doğrulaması sunar. LOW düzeyi, şifrenizin yalnızca 8 veya daha fazla karakter içermesini gerektirir. MEDIUM düzeyi, şifrenizin büyük harf, küçük harf ve özel karakterlerin bir karışımı olması gereken 8 veya daha fazla karakter içermesini gerektirir. STRONG düzeyi, büyük harf, küçük harf, özel karakterler ve kelimelerin bir karışımı olması gereken, yaygın sözlük kelimelerine dayanmaması gereken, aksi takdirde hatalarla karşılaşacağınız 8 veya daha fazla karakterden oluşan karmaşık bir şifre gerektirir. Düşük düzeyle devam edelim, 0 yazın ve enter tuşuna basın.
Betik, şifreyi girmenizi ve tekrar girmenizi ister:

Yazdığınız şifreyi root şifreniz olarak kabul etmek için y yazıp enter tuşuna basın. Sonraki istemler, MySQL sunucusunun güvenliğini artırmak içindir. Her MySQL kurulumuyla birlikte gelen varsayılan anonim kullanıcıları kaldırarak, uzak bir bağlantıdan root girişini devre dışı bırakarak ve test veritabanlarını kaldırarak başlar. Son istem, komutların yürürlüğe girmesi için yetkiler tablosunu yeniden yüklemenizi ister. Tüm istemler için y yazın ve enter tuşuna basın:

İlk güvenlik yapılandırması tamamlandı.
Aşağıdaki komutu çalıştırarak kurduğunuz MySQL sürümünü kontrol edebilirsiniz:
|
1 |
sudo mysql –V |
İşte bu eğitim için kullandığımız sürüm:
![]()
MySQL 5.7 ve sonraki sürümlerini çalıştıran Ubuntu sistemleri için root kullanıcısı, şifreyle değil auth_socket eklentisini kullanarak kimlik doğrulaması yapacak şekilde yapılandırılmıştır. Bu daha yüksek güvenlik sağlar, ancak phpMyAdmin paketi gibi harici paketlerde sorun yaratabilir. auth_socket eklentisini kullanmaya devam etmeyi tercih ediyorsanız Adım 4'e geçin.
Bunun yerine bir şifre kullanarak bağlanmak istiyorsanız, kimlik doğrulama yöntemini mysql_native_password kullanacak şekilde yapılandırmalısınız.
Aşağıdaki komutu girerek MySQL istemini başlatın:
|
1 |
sudo mysql |
MySQL birkaç varsayılan veritabanıyla birlikte gelir. Terminalinizde aşağıdaki sorguyu girerek varsayılan veritabanlarının listesini görüntüleyebilirsiniz:
|
1 |
show databases; |

mysql adlı veritabanı, MySQL ile ilgili birkaç yapılandırmayı depolar. Bu veritabanında, kullanıcı ayrıntılarını ve her birinin kimlik doğrulama yöntemini içeren users adlı bir tablo bulunur. Bir tablodan bilgi almak, değiştirmek ve silmek için SQL sorgularını kullanabiliriz. Her kullanıcının hangi kimlik doğrulama yöntemini kullandığına ilişkin ayrıntıları almak için terminalinizde aşağıdaki sorguyu girin:
|
1 |
SELECT user, authentication_string, plugin, host FROM mysql.user; |

Yukarıdaki çıktı, root kullanıcısının aslında auth_socket eklentisini kullanarak kimlik doğrulaması yaptığını göstermektedir. Root kullanıcısının kimlik doğrulama yöntemini değiştirmek için terminalinize aşağıdaki ifadeyi girin. Önceki bir adımda belirlediğimiz orta seviye şifre gücüyle eşleşecek şekilde değiştirmeyi unutmayın, aksi takdirde hataya neden olur:
|
1 |
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypassword'; |
Sorgu başarıyla yürütüldükten sonra, değişikliklerin hemen yürürlüğe girmesi için flush privileges komutunu çalıştırın:
|
1 |
FLUSH PRIVILEGES; |
Değişikliklerin yürürlüğe girip girmediğini kontrol etmek için aşağıdaki select ifadesini tekrar çalıştırın:
|
1 |
SELECT user,authentication_string,plugin,host FROM mysql.user; |

Çıktıdan anlaşılacağı üzere, root kullanıcısı artık mysql_native_password kullanarak kimlik doğrulaması yapacaktır. exit yazıp enter tuşuna basarak mysql isteminden çıkabilirsiniz.
Aşağıdaki komutu girerek belirlediğiniz şifreyle giriş yapmayı deneyebilirsiniz:
|
1 |
mysql -u root –p |
İstem sizden şifrenizi isteyecektir. Şifre eşleşirse MySQL istemini göreceksiniz. Sunucunuzu MySQL ile başarıyla kurdunuz. Ardından, MySQL isteminden çıkın.
Adım 4: PHP Kurulumu ve Nginx'in PHP İşlemcisini Kullanacak Şekilde Yapılandırılması
PHP, PHP: Hypertext Preprocessor ifadesinin kısaltmasıdır. Web siteleri ve web uygulamaları için yaygın olarak kullanılan açık kaynaklı bir sunucu tarafı betik dilidir. PHP, LEMP yığınındaki dördüncü gereksinimi karşılar. PHP, bir web sitesinde dinamik içerik oluşturulmasına yardımcı olur. Web sayfalarınız ile veritabanı sistemi arasında bir aracı olarak kullanılabilir. Veritabanından verileri okur ve web sitenizin ziyaretçilerine sunar. Ayrıca veritabanına veri ekleyebilir, güncelleyebilir ve silebilir.
Nginx, diğer web sunucuları gibi yerel PHP işleme eklentilerine sahip değildir, bu nedenle istekleri işlenmek üzere Nginx'ten PHP'ye iletmek için php-fpm'yi kurmalısınız. İlk olarak, Ubuntu topluluğu tarafından sürdürülen ücretsiz ve açık kaynaklı yazılımları barındıran Ubuntu universe deposunu ekleyin. Terminalinize aşağıdaki komutu girin:
|
1 |
sudo add-apt-repository universe |
Ardından, aşağıdaki komutu kullanarak PHP'nin MySQL ile iletişim kurmasını sağlamak için php-fpm paketini php-mysql yardımcı paketiyle birlikte kurun:
|
1 |
sudo apt install php-fpm php-mysql |
Bu kılavuzun yazıldığı sırada, yukarıdaki komutla yüklenen PHP sürümü 7.2.24'tür. Dolayısıyla php-fpm7.2 paketini yükler. Sunucu bloklarını güncellerken bunu aklınızda bulundurun ve doğru sürümü girdiğinizden emin olun, aksi takdirde sayfanız yüklenmez.
Aşağıdaki komutu girerek PHP sürümünü kontrol edebilirsiniz:
|
1 |
php -v |

Bu noktada, tüm LEMP yığını bileşenleri kurulmuştur. Bundan sonra yapmanız gereken, Nginx'i istekleri PHP işlemcisine yönlendirecek şekilde yapılandırmaktır. Nginx'te yapılandırma sunucu blokları içinde yapılır. Sunucu blokları, Apache'nin sanal ana bilgisayarlarına (virtual hosts) eşdeğerdir. Daha fazla bilgi için Nginx sunucu blokları hakkındaki kılavuzumuza göz atabilirsiniz.
Bu kılavuz için, aynı ada sahip bir test.com alanı için bir sunucu bloğu oluşturalım; istediğiniz adı seçmekte özgürsünüz. Sunucu blokları /etc/nginx/sites-available/ dizininde yer alır. Aşağıdaki komutu girerek sunucu bloğu dosyasını oluşturmak için nano'yu kullanın:
|
1 |
sudo nano /etc/nginx/sites-available/test.com |
Dosyaya aşağıdaki betiği yazın:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
server { listen 80; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name test.com; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /\.ht { deny all; } } |
İşte her bir yönergenin ne işe yaradığına dair kısa bir açıklama:
- listen – Nginx'in dinleyeceği bağlantı noktasını (port) tanımlar. Varsayılan bağlantı noktası Port 80'dir, ancak SSL kurmuş olsaydınız 443 yazmanız gerekirdi.
- root – sitenin dizininin depolanacağı dizini içerir.
- index – Nginx'e, talep edildiğinde mevcut olmaları durumunda index.php dosyalarını sunmaya öncelik vermesini söyler.
- server_name – sunucu bloğunun adını tanımlar, sunucunuzun genel IP adresini veya alan adını barındırır.
- location/ – ilk konum bloğu try_files yönergesine sahiptir. Bir URI isteğiyle eşleşen dosyaların varlığını kontrol eder, bulunamazsa 404 hatası döndürülür.
- location ~ \.php$ – bu yönerge, Nginx isteklerini fastcgi-php.conf dosyası ve php-fpm ile hangi soketin ilişkilendirileceğini tanımlayan php7.2-fpm.sock dosyası aracılığıyla yönlendirerek PHP işlemesini yönetir. Bu komut php-fpm durumunu kontrol eder, biz sahip olduğumuz sürüm olan 7.2'yi belirtiyoruz. Hangi sürüme sahipseniz onunla kontrol ettiğinizden emin olun:
|
1 |
sudo service php7.2-fpm status |
- location ~ /\.ht – bu yönerge, Nginx tarafından işlenmeyen .htaccess dosyalarını yönetir. deny all yönergesi, ziyaretçilere hiçbir htaccess dosyasının sunulmamasını sağlar.
Betiği test.com dosyanıza ekledikten sonra, dosyayı kaydetmek için Ctrl + O tuşlarına basın ve ardından Enter tuşuna basın. Düzenleyiciyi kapatmak için Ctrl + X tuşlarına basın.
Ardından, /etc/nginx/sites-enabled dizinine sembolik bir bağlantı oluşturmak için aşağıdaki komutu girerek sunucu bloğunu etkinleştirmelisiniz:
|
1 |
sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/ |
Ardından, aşağıdaki komutu girerek varsayılan sunucu bloğunun sites-enabled ile olan bağlantısını kaldırın:
|
1 |
sudo unlink /etc/nginx/sites-enabled/default |
Aşağıdaki komutu girerek yeni yapılandırmanızı test edin:
|
1 |
sudo nginx -t |
Eğer sözdizimi uygunsa, aşağıdaki komutla Nginx'i yeniden yükleyin:
|
1 |
sudo systemctl reload nginx |
Bu adımda, LEMP yığınınız kuruldu ve yapılandırıldı. Bir sonraki adımda, çeşitli bileşenlerin düzgün bir şekilde bağlandığından emin olmak için bir test dosyası oluşturacağız.
Adım 5: LEMP Yığınınızı Test Etmek İçin Bir PHP Dosyası Oluşturma
Bu adımda, düzgün çalışıp çalışmadığını kontrol etmek için bir .php dosyası oluşturup bunu Nginx sunucusunda çalıştıracağız. Mevcut php paketlerini kontrol etmek için genel phpinfo() işlevini kullanacağız. Nano'da bir .php dosyası açmak için aşağıdaki komutu girin:
|
1 |
sudo nano /var/www/html/test.php |
Nano düzenleyicide aşağıdaki kod parçacığını yazın:
|
1 |
<?php phpinfo(); |
Dosyayı kaydedip kapatın. Tarayıcınızda yeni oluşturduğunuz sayfayı ziyaret etmek için alan adınızı veya IP adresinizi bulun ve aşağıdaki gibi gidin:
|
1 |
http://your_server_domain_or_IP/test.php |
PHP bilgi sayfasını görebilmeniz gerekir:

Yukarıdaki sayfa, Nginx'i başarıyla kurduğunuzu gösterir. Test için oluşturduğunuz dosya sunucunuz hakkında hassas ayrıntılar içerdiğinden, bu dosyayı kaldırmayı unutmamalısınız. Dosyayı kaldırmak için aşağıdaki komutu girin:
|
1 |
sudo rm /var/www/html/test.php |
Gelecekte yapılandırmalarınızı tekrar test etmeniz gerekirse, dosyayı her zaman yeniden oluşturabilirsiniz.
Sonuç
Bu öğreticide, mevcut en güçlü web uygulaması geliştirme yığınlarından biri olan Ubuntu 20.04 üzerinde bir LEMP yığını yapılandırdınız. Buradan sonra, mobil uygulamanız için hemen hemen her web sitesini, web uygulamasını veya sunucu tarafı mantığını barındırabilmelisiniz. Web sitenizin güvenli bir SSL bağlantısı üzerinden içerik sunmasını sağlamak için, göz atmanızı önerdiğimiz Nginx sunucusunda SSL sertifikalarını yapılandırma hakkında bir öğreticimiz bulunmaktadır.
Keyifli Çalışmalar!
Yorumlar
Henüz yorum yapılmamış. İlk siz olun.