Gürkan Biçer
Posted on March 13, 2023
Aşağıdaki yönergeleri izleyerek panelsiz bir web server kurulumu gerçekleştirebilirsiniz;
Sunucu Konfigürasyonu
- Linux (CentOS 7)
- Apache 2.4
- MariaDB 10.5
- PHP 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
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
Posted on March 13, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.