LEMP açılım olarak Linux, (E)N-ginx, Mariadb, PHP araçlarının baş harflerinden meydana gelmektedir. Bu kurulum boyunca bahsi geçen linux distrosu Centos 8 olacaktır. Nginx, Mariadb ve PHP için son versiyonları kullanılacaktır.

Yapılacak tüm işlemler root üzerinden anlatılmıştır. Asıl kurulum işlemlerine başlamadan önce Centos’un güncellemelerinin yapıldığından emin olmak için şu komutu kullanalım.

# dnf -y update

Sistemin güncel olduğuna emin olduğumuza göre bundan sonra yapacağımız işlemlerde selinux tarafındaki ayarlarla uğraşmamak için bu tarafı “disabled” hale getireceğiz. SELinux dosya ve dizin bazında izinleri yönetmemizi sağlayan bir servis ve güvenliği önemli derecede yükseltiyor. Ancak kurulumlar sırasında mümkün mertebe kullanılmaması, bir kurulum tamamlandıktan sonra açılarak gerekli ayarların yapılandırılarak kullanılmasından yanayım. Kapatmak için şu komutları kullanacağız.

# setenforce 0
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

İlk komut ile makine çalıştığı sürece selinux’u devre dışı bırakmış oluyoruz. Ancak bu komutla bıraktığımız takdirde makine yeniden başladığında selinux anında devreye girecektir. Bunun için ikinci satırdaki kodu kullanıyoruz. Bu kod ile selinux’un açılışta baktığı config dosyasında “disabled” etmiş oluyoruz.

Güvenlik ile ilgili ayarları devre dışı bıraktığımıza göre nginx tarafındaki kuruluma geçebiliriz. Burada sistemdeki tanımlanmış nginx versiyonu ile devam edeceğiz.

# dnf -y install epel*
# dnf -y install nginx

Kurulum tamamlandıktan sonra firewall servisinden ilgili izinleri vermemiz gerekiyor.

# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload

Bu işlemden sonra servisi başlatıp başlangıçta çalışacak şekilde ayarlıyoruz.

# systemctl enable --now nginx
# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-07-25 23:48:34 +03; 10s ago
  Process: 24938 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 24935 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 24933 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 24940 (nginx)
   CGroup: /system.slice/nginx.service
           ├─24940 nginx: master process /usr/sbin/nginx
           ├─24941 nginx: worker process
           ├─24942 nginx: worker process
           ├─24943 nginx: worker process
           └─24944 nginx: worker process

Jul 25 23:48:34 lemp systemd[1]: Starting The nginx HTTP and reverse proxy server...
Jul 25 23:48:34 lemp nginx[24935]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Jul 25 23:48:34 lemp nginx[24935]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Jul 25 23:48:34 lemp systemd[1]: Started The nginx HTTP and reverse proxy server.

Veritabanı tarafında Mariadb kullanacağız. Burada Mysql yerine Mariadb kullanıyor olmamızın sebebi performans ile ilişkilidir. Mariadb Mysql’in temel alınarak üretilmiş bir veritabanı olmasına rağmen performans konusunda Mysql’den çok daha etkindir. Kurulumu için direkt depolardaki versiyonu kullanabiliriz.

# dnf -y install mariadb mariadb-server
# systemctl enable --now mariadb

Kurulum sonrasında direkt servisi aktif edip çalışır hale getirerek mysql_secure_installation komutu ile root parolasını atayabiliriz. Bu tarafta şimdilik bir işlem yapamaycağız.

PHP tarafında kullanmak istediğiniz versiyona göre yükleme yapabilirsiniz. Depodaki versiyonları şu komut aracılığı ile kontrol edebilirsiniz.

dnf module list php

Bu sayede dnf tarafında tanımlanmış php modullerini görebilirsiniz. Gelen listede “Stream” kısmında yanında [d] olan varsayılan olarak tanımlanmış modüldür. Bunu değiştirmek istiyorsanız şu adımları izlemeniz gerekiyor.

dnf module reset php
dnf module enable php:version

İlk komut php servisi üzerindeki tanımlı modülü sıfırlar. İkinci komut ile ise yeniden atama yapabilirsiniz. Bu tarafta işlem yapmak gibi bir zorunluluğunuz yok ancak çalışacağınız yapı PHP 7.4 tarafında gereksinimleri varsa bunun için yukarıda bahsettiğim kontrolü yapmalı ve tanımlı olan modül PHP 7.4 değilse ona göre değiştirmelisiniz.

Yukarıdaki işlemleri yapmadan devam ediyorum. Varsayılan PHP modülü üzerinden aşağıdaki araçları yükleyeceğim.

dnf -y install php-fpm php-mysqlnd php-cli

Kurulum sonra konfigürasyon dosyalarında ayarlanması gereken bazı şeyler var. Öncelikle /etc/php.ini dosyası içerisindeki cgi.fix_pathinfo satırını düzelteceğiz.

cgi.fix_pathinfo=0

Bu ayardan sonra /etc/php-fpm.d/www.conf tarafında bazı satırları düzenlememiz gerekecek.

pm.min_spare_servers = 5
pm.max_spare_servers = 35

Yukarıdaki satırları dosya içerisinde arattığınızda zaten bu şekilde bulabilirsiniz. O durumda dokunmanıza gerek yok. Ancak listen kısmında kesinlikle işlem yapmanız gerekecek.

listen = /run/php-fpm/www.sock
listen = 127.0.0.1:9000

listen komutu standart olarak www.sock‘u hedef gösterecek şekilde gelecektir. Onu localhost’u dinleyecek şekilde değiştirmemiz gerekecek. Son olarak bu dosya içerisinde tanımlanmış olan apache kullanıcısını nginx olarak değiştireceğiz. Bunun için dosya vi ile açılı durumdayken command moda geçip şu regex’i kullanabilirsiniz.

%s/apache/nginx/g

Bu değişiklikleri yaptıktan sonra servisi başlatıp, başlangıçta çalışacak şekilde sabitleyebiliriz.

systemctl enable --now php-fpm

Şu aşamaya kadar hata almadıysak LEMP kurulumu tamamlanmış demektir. Burada deneme için bir site oluşturup onun üzerinden kontrol yapalım.

Öncelikle site yapmak için Nginx tarafında bir konfigürasyon dosyası oluşturmamız gerek. Nginx ana konfigürasyon dosyasına bu noktada bulaşmaya gerek yok. Ana konfigürasyon içerisinde /etc/nginx/conf.d dizinindeki konfigürasyonları import etmesini sağlayan bir komut bulunuyor. Bundan ötürü direkt bu konuma sıfır bir konfigürasyon dosyası oluşturuyoruz.

# cat /etc/nginx/conf.d/sergenaras.cloud.conf
server {
   server_name sergenaras.cloud;
   root /var/web/sergenaras.cloud/public_html;

   location / {
       index index.php;
   }

   location ~ \.php$ {
      include /etc/nginx/fastcgi_params;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   }
}

Burada dikkat edilmesi gerekenler server_name ve root kısımlarıdır. Bu kısımların doğru olduğundan emin olmak gerekiyor. Sistemde root satırında işaret ettiğimiz dizin olmayabilir. Bunu oluşturmak için şu komutu kullanalım.

mkdir -p /var/web/sergenaras.cloud/public_html

Oluşturduğumuz dizin içerisine php tarafındaki bilgileri getirecek bir dosya oluşturalım.

echo "<?php phpinfo(); ?>" > /var/web/sergenaras.cloud/public_html/index.php

Son olarak bu taraftaki bütün yetkileri nginx üzerinden sahiplendirelim.

chown -R nginx:nginx /var/web

Eğer bir yerde bir hata olmadıysa nginx servisini yeniden başlattıktan sonra sonuç olarak aşağıdaki çıktıyı elde edeceksiniz. Bu çıktıyı elde ettiğiniz vakit nginx tarafında konfigürasyonları düzeltmek suretiyle farklı şeyler yapabilirsiniz. Bundan sonraki yazıda bu konuda bir örnek yapacağım.