CentOS 7 LAMP Kurulumu
Tags: centos, lamp
Published: 2023-03-13 13:57:38

Aşağıdaki yönergeleri izleyerek panelsiz bir web server kurulumu gerçekleştirebilirsiniz;

**Sunucu Konfigürasyonu**

- **L**inux (CentOS 7)
- **A**pache 2.4
- **M**ariaDB 10.5
- **P**HP 8.1

Ek bileşenler;

- Certbot
- Composer
- PhpMyAdmin

Genel olarak gerekli olan bazı paketlerin kurulumunu yapmak ve sistemi güncellemekle başlayalım.

```
yum -y install epel-release yum-utils wget curl screen nano zip unzip git iptables iptables-services
yum -y update
```

**NetworkManager**'i devre dışı bırakalım.

```
systemctl stop NetworkManager
systemctl disable NetworkManager
```

Network konfigürasyon dosyanızın ifcfg-ens192 olduğunu varsayıyorum, eth0 da olabilir, bunu network yapınıza göre düzenlersiniz. Veyahut, dosyanızı nano ile açıp sonuna NM_CONTROLLED=no ekleyebilirsiniz.

```
echo "NM_CONTROLLED=no" >> /etc/sysconfig/network-scripts/ifcfg-ens192
```

**Network** servisini başlatalım.

```
systemctl enable network
systemctl start network
```

_(isteğe bağlı)_ **Firewalld** servisini devre dışı bırakıp, iptables servisini aktif edip, varsayılan kuralları temizleyelim. 

```
systemctl stop firewalld
systemctl disable firewalld
systemctl enable iptables
systemctl start iptables
iptables -L
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
service iptables save
```

[SELinux'u kapatalım](https://dev.to/gurkanbicer/selinux-nasil-kapatilir-1ieh). 

```
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
```

Reboot işlemi uygulayalım.

```
reboot
```

## Apache

Apache 2.4'ü yükleyelim.

```
yum -y install httpd httpd-itk httpd-tools mod_ssl
```

Apache servislerini başlatalım.

```
systemctl start httpd
systemctl enable httpd
```

## PHP

PHP ve FPM'i yüklemek için repo'yu belirleyelim.

```
yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum -y --disablerepo="*" --enablerepo="remi-safe" list php[7-9][0-9].x86_64
yum-config-manager --enable remi-php81
```

PHP, FPM ve kütüphaneleri yükleyelim. 

```
yum -y install php php-fpm php-cli php-mysqlnd php-common php-devel php-enchant php-gd php-imap php-intl php-json php-mbstring php-odbc php-pdo php-pgsql php-soap php-ldap php-tidy php-xml php-xmlrpc php-opcache php-pecl-mcrypt
```

PHP-FPM servisini başlatalım.

```
systemctl enable php-fpm
systemctl start php-fpm
```

`/var/www/html` dizini altında bir info.php dosyası oluşturup `<?php phpinfo(); ?>` komutunu bu dosyaya ekleyip, tarayıcınızdan http://**SUNUCUIPADRESI**/info.php adresine giriş yapın. Eğer hem erişim sağlayıp hem de PHP info bilgisini görebiliyorsanız, PHP ve Apache başarıyla kurulmuş demektir. 

## MariaDB (MySQL)

MariaDB 10.5 için repo dosyasını oluşturalım.

```
nano /etc/yum.repos.d/MariaDB.repo
```

Dosya içerisine aşağıdakileri girip, kaydedelim.

```
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.5/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1
```

MariaDB servisini yükleyelim.

```
yum -y install mariadb-server mariadb
```

MariaDB servisini başlatalım.

```
systemctl enable mariadb
systemctl start mariadb
```

MySQL kurulumunu konfigüre edelim.

```
mysql_secure_installation
```

İlk kurulumda root şifresi bulunmamaktadır. Direkt olarak Enter'layıp devam ediyoruz. Diğer soruların yanıtları karşılarında **Y** ve **n** olarak belirlidir. Bu işlemleri uygulayalım. 

_MySQL root şifrenizi bi yere kaydedin ve unutmayın :)_

```
Enter current password for root (enter for none): ENTER
Switch to unix_socket authentication [Y/n]: n
Change the root password? [Y/n]: Y
New password: 
Re-enter new password:
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: Y
Remove test database and access to it? [Y/n]: Y
Reload privilege tables now? [Y/n]: Y
```

## Kurulumu Özelleştirelim

### PHP.ini

Varsayılan php.ini dosyası yolu aşağıdaki gibidir ve nano ile bu dosyayı açıp konfigürasyonu düzenleyebilirsiniz.

```
nano /etc/php.ini
```

1GB ram bellek üzeri sunucular için önerilen konfigürasyon; 

```
memory_limit 256M
post_max_size 100M
upload_max_filesize 100M
max_execution_time 300
max_input_time 300
```

### Htaccess

`/etc/httpd/conf/httpd.conf` dosyasını nano ile açın. CTRL + W ile `<Directory "/var/www/html">` şeklinde aratın. 

İlgili blok içerisinde `AllowOverride None` satırını `AllowOverride All` olarak değiştirin. 
 
### PhpMyAdmin

Aşağıdaki komutları çalıştırarak phpMyAdmin'i varsayılan dizin altına pma dizin ismiyle kurabilirsiniz.

```
cd /var/www/html
mkdir -p pma
cd pma
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
unzip phpMyAdmin-5.2.1-all-languages.zip
mv phpMyAdmin-5.2.1-all-languages/* .
rm -rf phpMyAdmin-5.2.1-all-languages* 
mkdir -p tmp
chown -R apache:apache *
```

http://**IPADRESI**/pma/ şeklinde phpMyAdmin sayfasına ulaşabilirsiniz.

Ancak, bu URL brute-force ataklara maruz kalabilir. Bu nedenle bu sayfaya ek bir parola koruması eklemek gerekir.

İlgili dizin içerisinde bir kullanıcı oluşturalım ve şifre belirleyelim.

```
htpasswd -c .htpasswd admin
```

Daha sonra yine aynı dizine bir .htaccess dosyası oluşturalım ve aşağıdaki konfigürasyonu ekleyelim.

```
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /var/www/html/pma/.htpasswd
Require valid-user
```

Şimdi http://**IPADRESI**/pma/ şeklinde ulaşmak istediğinizde ekstra bir korumaya sahip olacaktır.

### Certbot

Let's Encrypt sertifikası kurulumları gerçekleştirmek için certbot paketini kuralım.

```
yum -y install certbot python2-certbot-apache
```

### MPM-ITK

Apache'de kullanıcıların isteklerini virtualhost bazlı ayırmak için mpm-itk'yı aktif edelim. Nano ile 00-mpm-itk.conf dosyasını açalım.

```
nano /etc/httpd/conf.modules.d/00-mpm-itk.conf
```

mod_mpm_itk.so dosyasının başındaki # işaretini kaldıralım.

```
LoadModule mpm_itk_module modules/mod_mpm_itk.so
```

Ardından, httpd servisini yeniden başlatalım.

```
systemctl restart httpd
```

### Composer

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
```

### Varsayılan PHP-FPM Pool

Aşağıdaki php-fpm konfigürasyonu `/var/www/html` dizini içerisindeki PHP dosyalarını ve isteklerini karşılamak için düzenlenmiştir. `/etc/php-fpm.d/www.conf` dosyasını açın ve içerisini boşaltıp aşağıdaki konfigürasyonları ekleyin. Dosyayı kaydettikten sonra **php-fpm** servisini resetleyin.

```
[www]

user = apache
group = apache
listen = /var/run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
listen.mode = 0666
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_value[session.save_path]    = /var/lib/php/session
php_value[opcache.file_cache]   = /var/lib/php/opcache
```

### Varsayılan VirtualHost

`/etc/httpd/conf.d` dizini altına **00_default.conf** isminde bir dosya oluşturun ve aşağıdaki konfigürasyonu tanımlayın. Daha sonrasında `httpd -t` komutunu uygulayarak konfigürasyonu test edin. Eğer sorun yoksa, **httpd** servisini yeniden başlatın.

```
<VirtualHost _default_:80>
	DocumentRoot "/var/www/html"
	DirectoryIndex index.php index.html index.htm

	<Directory "/var/www/html"> 
               # allow from all 
               Order deny,allow 
               Options +FollowSymLinks +SymLinksIfOwnerMatch -Indexes 
               Require all granted 
               AllowOverride All 
               php_admin_value open_basedir /var/www/html 
       </Directory> 

       ErrorLog /var/log/httpd/error_log 
       LogLevel warn 
       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
       CustomLog /var/log/httpd/access_log combined

       SuexecUserGroup apache apache
       AssignUserId apache apache
 
       <FilesMatch \.php$>
           <If "-f %{REQUEST_FILENAME}">
           SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://./"
           </If>
	</FilesMatch>
</VirtualHost>

<VirtualHost _default_:443>
       DocumentRoot "/var/www/html"
       DirectoryIndex index.php index.html index.htm

       <Directory "/var/www/html">
               # allow from all
               Order deny,allow
               Options +FollowSymLinks +SymLinksIfOwnerMatch -Indexes
               Require all granted
               AllowOverride All
               php_admin_value open_basedir /var/www/html
       </Directory>

       ErrorLog /var/log/httpd/error_log
       LogLevel warn
       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
       CustomLog /var/log/httpd/access_ssl_log combined
       
       SuexecUserGroup apache apache
       AssignUserId apache apache

       <FilesMatch \.php$>
           <If "-f %{REQUEST_FILENAME}">
                SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://./"
           </If>
       </FilesMatch>

       SSLEngine on
       SSLProtocol all -SSLv2 -SSLv3
       SSLCertificateFile /etc/pki/tls/certs/localhost.crt
       SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
       #SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
       #SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
</VirtualHost>
```

### Yeni Site Tanımlama

Öncelikle kullanıcı tanımlayalım ve gerekli klasörleri oluşturup, yetkilerini düzenleyelim. 

```
adduser example
sudo -u example mkdir -p /home/example/public
sudo -u example mkdir -p /home/example/tmp
sudo -u example mkdir -p /home/example/session
sudo -u example mkdir -p /home/example/opcache
chmod -R +s /home/example
chmod -R 0755 /home/example
```

Daha sonra PHP-FPM konfigürasyonu ekleyip, kullanıcıya özel socket oluşturalım.

```
cd /etc/php-fpm.d
nano example.conf
```

**PHP-FPM Konfigürasyonu;**

```
[example]
user = example
group = example
listen = /var/run/php-fpm/example.sock
listen.owner = example
listen.group = example
listen.mode = 0666
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/example-slow.log
env[TMP] = /home/example/tmp
env[TMPDIR] = /home/example/tmp
env[TEMP] = /home/example/tmp
php_value[session.save_path] = /home/example/session
php_value[opcache.file_cache] = /home/example/opcache
php_value[upload_tmp_dir] = /home/example/tmp
```

PHP-FPM servisini yeniden başlatalım.

```
systemctl restart php-fpm
```

Daha sonra apache virtualhost konfigürasyonu oluşturalım.

```
cd /etc/httpd/conf.d
nano 01_example.conf
```

**HTTP Konfigürasyonu;**

```
<VirtualHost *:80>
	ServerName example.com
	ServerAlias www.example.com
	DocumentRoot "/home/example/public"
	DirectoryIndex index.php index.html index.htm

	<Directory "/home/example/public"> 
               # allow from all 
               Order deny,allow 
               Options +FollowSymLinks +SymLinksIfOwnerMatch -Indexes 
               Require all granted 
               AllowOverride All 
               php_admin_value open_basedir /home/example
        </Directory> 

        ErrorLog /var/log/httpd/example.com-error_log 
        LogLevel warn 
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
        CustomLog /var/log/httpd/example.com-access_log combined

        SuexecUserGroup example example 
        AssignUserId example example
 
        <FilesMatch \.php$>
           <If "-f %{REQUEST_FILENAME}">
                SetHandler "proxy:unix:/var/run/php-fpm/example.sock|fcgi://./"
	   </If>      
        </FilesMatch>       
</VirtualHost>
```

Ardından httpd servisini yeniden başlatalım.

```
systemctl restart httpd
```

Dilerseniz **hosts** dosyanıza IP adresi ve domain ekleyip test edebilirsiniz, dilerseniz de DNS yönlendirmesi gerçekleştirebilirsiniz.

### SSL Kurulumu

DNS yönlendirmesi gerçekleştirdiyseniz SSL sertifikası da ilgili siteler için ücretsiz Let's Encrypt SSL sertifikası da kurabilirsiniz.

```
certbot --apache -d example.com -d www.example.com
```

#### Otomatik SSL Sertifikası Yenileme

Crontab'ı açıp aşağıdaki cron satırını ekleyerek SSL sertifika yenileme işlemlerini cron servisine bırakabilirsiniz.

```
crontab -e
```

**Cron;**

```
* */12 * * * root /usr/bin/certbot renew >/dev/null 2>&1
```