Linux ortamında her dağıtım farklı bir çizgide ilerleyebiliyor. Bu makaleyi önceden Ubuntu için yazmıştım. Fakat Fedora’ya geçince elden geçirmek gerekti.

Haydi başlayalım.

Ne kadar uğraşsam da her kurulum sonrası Apache ve MariaDB’yi yeniden, kendi çalışma mantığıma göre yeniden kurmam gerekiyor.

Veri Yollarım

Kendi çalışma mantığım derken; benim bilgisayarım normalden bir farklı yapılandırılmış durumda. Aşağıdaki gibi bir disk paylaşımı var.

├─ /boot/efi
│  /
├─ /home
├─ /var/lib/flatpak
├─ /C
└─ /D

/ -> Root dizini her kurulumda formatlanırken diğer dizinlere hiç dokunmuyorum. Bu yöntemle / -> Root dizini altında kıymetli verileri tutmuyorum.

/C dizininde web siteleriyle ilgili yaptığım işleri tutuyorum.

/C/www -> localhost yani PHP dosyalarını tuttuğum yolum iken
/C/www-db -> veritabanı dosyalarının tutulduğu yol oluyor.

Bu sebeple her kurulumdan sonra dosya Apache ve MariaDB veri yollarını değiştirmem gerekiyor. İlaveten kullandığım PHP sürümü ve kütüphaneler de ayrı bir baş ağrısı. İşte sırf bu yüzden kendime bu dökümanı hazırladım.

Apache ve PHP Kurulumu

Kurulumda xdebug, curl, gd, imagick, intl, mbstring, mysql, xml kütüphanelerini de etkinleştiriyorum.

Fedora 39 ile gelen PHP sürümü yeterince güncel (8.2 ile geliyor) ve benim yazdığım kodlar da bu sürümleri hedefliyor. Bu sebeple ek depo eklemeye gerek yok görünüyor. Yine de ek depo eklemek isteyenler computingforgeeks.com makalesine bakabilir.

Önce sistemimizi güncelliyoruz ve varsa bekleyen güncellemeleri/yükseltmeleri kuruyoruz. Gerekiyorsa bilgisayarı yeniden başlatıyoruz.

sudo dnf update --refresh

Sonrasında paket kurulumuna geçiyorum. Temel dosyaları kuruyorum.

sudo dnf install curl httpd

Ben denediğimde bu iki paket için de kurulu dedi. Belli ki başka bağımlılıklarla kurulmuş.

Sonrasında PHP ve ilintili modülleri kuruyorum.

sudo dnf install php-common php-fpm php-cli php-common php-mysqlnd php-opcache php-readline php-curl php-gd php-imagick php-intl php-mbstring php-xdebug php-xml

Ubuntu altında rewrite suexec include modüllerini elle etkinleştirmek gerekiyordu. Fedora altında bu modüller zaten etkin geliyormuş.

PHP Ayarları

PHP ile ilgili özelleştirilmiş ayarlarımı yapmak için php.ini dosyasını açıyorum.

sudo gedit /etc/php.ini

Ben genel olarak şu değişiklikleri yapıyorum. Bir kısmı tamamen tercih ve ayar meselesi.

;short_open_tag = Off
short_open_tag = On

;error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING

;display_errors = Off
display_errors = On

;memory_limit = 128M
memory_limit = 512M

;post_max_size = 8M
post_max_size = 200M

;upload_max_filesize = 2M
upload_max_filesize = 200M

;max_file_uploads = 20
max_file_uploads = 100

Çoğu paylaşımlı sunucuda bu değer (allow_url_fopen) kapalı oluyor. Bu sebeple curl kullanmak zorunda kalıyorum ve local ayarlarımı da buna uyumlu tutuyorum.

Buraya kadar olan ayarların etki etmesi için Apache’yi yeniden başlatıyoruz.

sudo service httpd restart

Tarayıcıya http://localhost veya 127.0.1.1 yazdığımızda karşımıza “Fedora Webserver Test Page” öntanımlı sayfası çıkıyorsa Apache çalışıyor demektir.

Apache Veriyolu Değişimi

Şimdi Apache yolumuzu değiştirelim.

sudo gedit /etc/httpd/conf/httpd.conf

Aşağıdaki tanımlamaları buluyoruz ve yorum haline getiriyoruz. İlerde lazım olabilir diye silmiyoruz. Yıldızlarla gösterilen çeşitli değerler demek. Hepsini yorum haline getiriyoruz.

< Directory />
    * * *
< /Directory>

DocumentRoot "/var/www/html"

< Directory "/var/www">
    * * *
< /Directory>

< Directory "/var/www/html">
    * * *
< /Directory>

(< işaretinin sonundaki boşlukları boşlukları düzenlemeniz gerekebilir) sonrasında şu direktifi ekliyoruz

DocumentRoot /C/www  
< Directory "/C/www">
	Options Indexes FollowSymLinks
	AllowOverride All
	Order allow,deny
	allow from all
	Require all granted
< /Directory>

welcome.conf dosyasını açıyoruz ve içindeki tüm değerlerin önüne yıldız koyup yorum haline getiriyoruz. Bu tanımlamaya ihtiyacımız yok.

sudo gedit /etc/httpd/conf.d/welcome.conf

Yeniden başlatıp localhost görüntülemeye çalıştığımızda muhtemelen permission hatası verecektir.

Nautilus ile /C dizinine uygun ayarları veriyoruz.

Sonrasında selinux baş ağrısından kurtuluyoruz.

Geçici çözüm istersek

selinuxenabled
sudo setenforce 0

Kalıcı çözüm istersek

#C dizininin httpd_sys_content_t SELinux etiketini denetle
ls -Z /C

#Etiket uygun değilse etiketi değiştir
#/C dizini ve içeriğindekilerin etiketini httpd_sys_content_t olarak ayarla
sudo chcon -R -t httpd_sys_content_t /C

#Apache'nin C dizine erişim izinlerini denetle. Listede /C olmalı.
sudo semanage fcontext -l | grep "/C"

#Yoksa Apache için tanımlama ekleyelim
sudo semanage fcontext -a -t httpd_sys_content_t "/C(/.*)?"

#Apache'nin C dizine erişim izinlerini yeniden denetle
sudo semanage fcontext -l | grep "/C"

#Herşey yolundaysa, etiket değişikliklerini uygulama
sudo restorecon -Rv /C

# MariaDB veriyolu için tanımlama var mı diye bak
sudo semanage fcontext -l | grep "/C/www-db"

# Yoksa, MariaDB veriyolu için de tanımlama ekle
sudo semanage fcontext -a -t mysqld_db_t "/C/www-db(/.*)?"

#MariaDB veriyoluna erişim izinlerini yeniden denetle
sudo semanage fcontext -l | grep "/C/www-db"

#Herşey yolundaysa, etiket değişikliklerini uygulama
sudo restorecon -Rv /C/www-db

#Site bazında bu kuralı uygulamak gerekiyor gibi???
sudo restorecon -R /C/www/sabri/kitaphaber.com.tr/public_html/

Komutların ne işe yaradığı üstlerine yazdım.

Sonrasında sunucuyu tekrar başlatıyoruz.

sudo service httpd restart

http://localhost/ adresine tıkladığımızda dosyalarımız artık görünüyorsa büyük bir deveye hendek atlattık demektir.

Şimdi bir test dosyası oluşturup phpinfo() bakabiliriz.

MySQL/MariaDB Kurulumu

Fedora altındaki MariaDB sürümleri zaten güncel olduğu için depo ayarlamaya gerek kalmıyor. Yine çok güncel bir sürümü denemeniz gerekiyorsa MariaDB Vakfı tarafından sağlanan ve mariadb.org/download adresinde bulunan depoları kullanabilirsiniz.

Kuruluma başlayalım. MariaDB vurgusu yaptığımı umarım fark edersiniz. MySQL’in sürümleri Fedora altında paketlenmiş olarak bulunmuyor.

sudo dnf install mariadb-server 
sudo systemctl start mariadb

SQL yapılandırmak ve root şifresi belirlemek için aşağıdaki komutu çalıştırıyoruz.

sudo mysql_secure_installation

Çıkan sorulara makul şekilde cevap veriyoruz. Root parolasını değiştirme kısmında Yes deyip yeni parolayı belirliyoruz.

Change the root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!

Diğerleri için de aşağıdaki tercihleri kullandım.

Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] n
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

MySQL/MariaDB Veriyolu Değişimi

Benim için asıl çile şifre değiştirdikten sonra başlıyor: veriyolunu değiştirmek.

Veritabanlarını /C/www-db altında tutmayı tercih ettiğimi söylemiştim.

Gelin şimdi de veriyolunu değiştirelim.

Önce mysql/mariadb servisini/hizmetini kapatıyoruz.

sudo service mysql stop
sudo service mariadb stop
sudo pkill -9 mysqld
sudo pkill -9 mariadbd

Sonra veritabanlarını taşıyacağımız hedef klasörü oluşturuyoruz. Sonrasında veritabanı dosyalarımızı hedef dizine taşıyoruz ve en son olarak hedef dizindeki dosyaları listeliyoruz.

Yani şu komutları veriyoruz:

sudo mkdir -p /C/www-db
sudo cp -R /var/lib/mysql/* /C/www-db/
sudo chown -R mysql:mysql /C/www-db
sudo ls -lZ /C/www-db

Veritabanı dosyalarımızı yeni dizine taşıdık fakat MariaDB ayarlarının tutulduğu conf dosyamızı henüz düzenlemedik. Onu da düzenliyoruz.

sudo gedit /etc/my.cnf.d/mariadb-server.cnf

Dosyanın içinde arıyoruz ve datadir değerini /C/www-db olarak değiştiriyoruz.

bind-address = 127.0.0.1 gibi bir tanımlama görürsek önüne # işareti koyup yorum haline getiriyoruz.

En sonunda MariaDB servislerini yeniden başlatıyoruz.

sudo service mysql restart
sudo service mariadb restart

En son yeni bir veritabanı ve veritabanı içinde tablo oluşturup, bu tabloların yeni oluşturduğumuz veritabanı yoluna kayıt olup olmadıklarına bakmakta yarar var.

Sunucu çalıştırılamazsa aşağıdaki komutla hataya bakmak gerekiyor.

journalctl -xeu mariadb.service

Hata eğer Can’t Create Test File ise /C/ dizinine de diğer kullanıcılar için erişim izni vermek gerekiyor.

Projeler Üstünde Çalışmak

Yereldeki projeye http://localhost/Proje şeklinde erişmek yerine http://proje.xyz şeklinde erişmek çok daha mantıklı. Bu sebeple küçük bir kaç ayar yapıyoruz.

Önce hosts dosyamızı düzenliyoruz.

sudo gedit /etc/hosts

Açılan dosyadan 127.0.0.1 localhost altına projemizi ekliyoruz

127.0.1.1 benimyeniprojem.xyz

Dosyayı kaydediyoruz ve yine uçbirimden şu komutu çalıştırarak Apache’ye sitemiz hakkında bilgi veriyoruz.

sudo gedit /etc/httpd/conf.d/sitelerim.conf

Açılan boş dosyaya aşağıdaki tanımlamaları ekliyoruz

< virtualhost *:80>
ServerName benimyeniprojem.xyz
DocumentRoot /benim/yeni/projemin/yolu/
CustomLog /benim/yeni/projemin/yolu/log/access.log common
ErrorLog /benim/yeni/projemin/yolu/log/error.log
< /virtualhost>

Farkındaysanız, < etiketin ile slash işareti arasında boşluk var, o kısmı düzenlersiniz. Projelerin Log dosyalarını ayrı tutmanız kolaylık sağlayabilir. Yine de CustomLog ve ErrorLog tanımlamalarını kullanmak zorunda değilsiniz. Sonrasında doğal olarak dosyayı kaydediyoruz ve Apache sunucumuzu yeniden başlatıyoruz

sudo service httpd restart

Log dosyaları için tanımladığınız klasör yerindeyse ve projeler için tanımladığınız klasör yolu doğruysa Apache hatasız yeniden başlayacaktır.

Artık tarayıcınızın adres satırına http://benimyeniprojem.xyz yazarak PHP projenize erişebilirsiniz.

Fedora Kaynakça:
– Makalenin Ubuntu versiyonu: https://www.yakusha.net/ubuntu-altinda-apache-mysql-mariadb-php-kurulumu-ve-veriyolu-degisimi/
– SELinux komutları için ChatGPT
– https://www.howtofixthis.com/categories/apache-linux/forbidden-you-donot-have-permission-to-access-message-on-centos-7
– https://forums.fedoraforum.org/showthread.php?328962-httpd-shows-Test-Page-but-doesn-t-execute-php-code
– https://docs.fedoraproject.org/en-US/quick-docs/installing-mysql-mariadb/
– https://stackoverflow.com/questions/20627084/permission-denied-var-www-abc-htaccess-pcfg-openfile-unable-to-check-htacces

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir