Shared Hosting'den VPS'ye Geçiş: Debian ve NGINX ile Wordpress Hosting

Shared Hosting'den VPS'ye Geçiş: Debian ve NGINX ile Wordpress Hosting

- 7 mins

Shared Hosting’den VPS’ye Geçiş: Debian ve NGINX ile Wordpress Hosting

Kendi e-ticaret sitemi kurarken ilk başta bir Paylaşımlı Hosting (Shared-Hosting) kullanmıştım. Günün sonunda bana verilen CPanel yardımıyla sunucuyu yönetmek ve kontrol etmek ne kadar kolay olsa da bir zaman sonra çok yavaşlamıştı. Ben de VPS kiralayarak bu sorunu çözmek istedim.

Sunucu işletim sistemi olarak Debian’ı seçtim, çünkü gayet güvenilir bir linux distro’su. İstek yönetme işi için de Nginx kullandım. Ayrıca Wordpress’in çalışması için PHP ve bir de SQL veritabanı gerekiyor, veritabanı için de MariaDB kullandım.

Temel Yapı Diagramı

Temel olarak kurmak istediğim yapı; Domain -> DNS -> VPS -> NGINX -> PHP-FPM -> Wordpress -> MariaDB şeklinde.

Halihazırda var olan domain alan adının DNS Girdisine ekleyeceğim ‘A’ yönlendirmesi ile VPS’in Public IP’si girdisiyle gelecek trafiği NGINX ile işleyip, var olan php instance’ı ile wordpress çalıştırıp MariaDB veritabanından veri okuma/yazma işlemi yaptım.

Gelelim bunu nasıl yaptığıma

VPS ve Debian Sunucusunun Hazırlanması

İlk adım olarak VPS kiraladım. Bu sunucunun Türkiye’de barındırılacak olmasına öncelik gösterdim. Malum, herşeyin hızlı olması önemli. Ayrıca paylaşımlı hostinglerdeki gibi CPanel hosting kontrol paneli tarzında bir şey kullanmadım. Her şeyi ben yönettim.

VPS kiralama işlemi bittiğinde elde edilen SSH verileriyle Remote Bilgisayar’a bağlandım.

Bu proje yazısı bağlamında domain olarak ‘deneme.com’, IP olarak da ‘203.123.123.123’ kullanacağım.

İlk önce sistemi güncelledim:

apt update
apt upgrade -y

Ardından NGINX’i kurdum:

apt install nginx -y

Sonrasında nginx servisinin çalışıp çalışmadığını kontrol etmek için:

systemctl status nginx

çalıştırdım.

NGINX Check

Sonrasında ‘http://203.123.123.123’ adresine gittiğimde nginx default yönlendirmeli karşılama sayfasını gördüm.

nginx tamam.

PHP-FPM Kurulumu

NGINX ile kullanılabilecek bir fast-cgi yöneticisi olan php-fpm i kurdum.

apt install php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip php-intl -y

Yükleme bittiğinde php versiyonunu ‘php -v’ ile kontrol ettim. Ayrıca PHP-FPM Soketini de görmek için:

ls /run/php

çalıştırdım.

MariaDB Kurulumu

Veritabanını:

apt install mariadb-server -y

ile kurdum ve hemen yeni veritabanı oluşturdum:

CREATE DATABASE deneme

Sonrasında ‘mariadb’ komutu ile cli ekranına girip:

CREATE USER 'admin'@'localhost' IDENTIFIED BY 'guclu_parola_123'

kullanıcısını oluşturdum.

Buradaki admin kullanıcı adı ve şifresini paylaşımlı hostingden aldığım backuptaki ‘wp-config.php’ dosyasının admin parametrelerini kullanarak oluşturdum.

Sonrasında bu oluşturduğum kullanıcıya yeni veritabanı üzerindeki bütün yetkileri vermek için:

GRANT ALL PRIVILEGES ON deneme.* TO 'admin'@'localhost';
FLUSH PRIVILEGES;
EXIT;

çalıştırdım.

FTP Sunucusu İle Elimdeki Backup Dosyalarını Kullanma

Elimdeki dosyaları upload etmek için FTP sunucusu kullanmak istedim. Her ne kadar SSH ile dosya transferi yapılabilse de ileride gerekebilecek dosya alışverişleri için FTP sunucusu kurdum.

FTP Sunucusu olarak ‘vsftpd (Very Secure FTP Daemon)’ kullandım.

apt install vsftpd

Ayrıca gelen trafiği filtrelemek için kullanımı kolay olan ‘Uncomplicated Firewall (ufw)’ kullandım.

apt install ufw # Bu paket otomatik yüklenmişti, güncellemiş oldum :)

İlk başta Firewall yapılandırmasında ssh portunu ekliyorum.

ufw allow ssh

Sonrasında FTP portlarını da ekliyorum:

ufw allow 20,21,990/tcp

FTP den Uzak Bilgisayara dosya yüklerken bir yandan da FTP kontrolü yapabilmek için FTP istemcisine sunucudan gelen X dosyasını Y portuna bağlanarak gönder! mesajı sonrasında belirlenen bir port olmalı, bunu rastgele ya da sırasıyla FTP Sunucusu seçiyor. Firewall’dan geçebilmesi lazım.

Bunun için;

ufw allow 40000:50000/tcp # Port 40000 den 50000 e kadar olan bütün TCP portlarını geçir.

Firewall tamamdır, sırada Firewall’u aktif edip FTP sunucusunu konfigüre etmek kaldı.

ufw enable # Firewall'u aktif et!!

vsftpd Yapılandırması

Ana konfigürasyon dosyası ‘/etc/vsftpd.conf’.

Burada birkaç değişiklik yapmak gerek:

listen=YES # Gelen FTP IPv4 bağlantılarını dinle

connect_from_port_20=YES # FTP'nin aktif mod bağlantılarını geleneksel 20 portu üzerinden yapıldığı için bunu da dinle

anonymous_enable=NO # Anonim kullanıcı istemiyorum

local_enable=YES # Localde olan Linux kullanıcılarının da giriş yapabilmesini istiyorum

write_enable=YES # FTP Kullanıcılarının dosya yükleme ya da değiştirme işlemlerini yapması için yetki veriyorum

chroot_local_user=YES # FTP kullanıcısının sistemde istediği dizinlere giremesin diye engellemek istiyorum

allow_writeable_chroot=YES # chroot edilen kullanıcının kendi alanında yazma veya güncelleme yapabilmesi için gerekiyor



pasv_enable=YES # Passive Modu açıyorum

pasv_min_port=40000 # Daha önce de bahsettiğim dosya yüklerken kullanılacak olan pasif port'un minimum değeri

pasv_max_port=50000 # Burada da maximum değeri tanımlıyorum



userlist_enable=YES # Kullanıcı listesini aktif ediyorum

userlist_file=/etc/vsftpd.userlist # Kullanıcı listesinin bulunduğu dosyayı belirliyorum

userlist_deny=NO # Userlist i blacklist gibi kullanmasın, kullanıcıları reddetmesin diye 'NO' kullanıyorum

Epey bi konfigürasyon yaptıktan sonra FTP sunucusu hazır.

adduser ftp_user

Kullandığım FileZilla FTP istemcisiyle bağlanmaya çalıştığımda hata aldım:

FTP Error

Kullanıcıyı ekledikten sonra da ‘ftp_user’ yazısını userlist dosyasına yazmayı unuttum.

echo 'ftp_user' | sudo tee -a /etc/vsftpd.userlist # Dosyanın sonuna 'ftp_user' yazısı ekledim

Her şey tamam

FTP sunucusunu yeniden başlattıktan sonra Backup dosyamı FTP kullanarak yükleyebilirim.

systemctl restart vsftpd
systemctl enable vsftpd # Sunucu açıldığında otomatik başlaması için 'enable' ediyorum

Backup Dosyasını Yükleme

FTP sunucusuna bir client ile bağlanıp giriş dizini yedeğini VPS de bulunan ‘/var/www/deneme.com’ klasörüne yükledim.

NGINX Konfigürasyonu

NGINX kendi içerisindeki reverse-proxy’yi kullanıp 80 portundan wordpress siteme erişim sağlamak istiyorum. Çünkü ileride mail sunucus kurmak gibi planım var. Farklı portlardan farklı servislere erişmek istiyorum.

‘/etc/nginx/sites-available/deneme.com’ dosyası oluşturup konfigürasyona başladım:

server {
    listen 80; # 80 Portunu dinlemesini istiyorum
    listen [::]:80;

    server_name deneme.com www.deneme.com;

    root /var/www/deneme.com; # Ana dizini tanımlıyorum
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock; # Bütün php dosyalarına atılan istekleri fastcgi yöneticisi olan php-fpm e yönlendiriyorum.
    }
}

Sonrasında ‘/etc/nginx/sites-available/default’ dosyasını siliyorum ki nginx trafiği ‘/deneme.com’ dizinine yönlendirsin.

Son olarak ‘/etc/nginx/sites-available/deneme.com’ dosyasından sanal link oluşturup ‘/etc/nginx/sites-enabled’ dizisine ekliyorum

sudo ln -s /etc/nginx/sites-available/deneme.com /etc/nginx/sites-enabled/deneme.com

Bağlantı Zaman Aşımına Uğradı Hatası

Deneme yaptığımda konfigürasyon hatası yaptığımı farkettim. ‘server_name’ parametresini domain adım yerine IP den gelen isteklere cevap vermesi için ‘_’ karakteri olarak tanımlamam gerektiğini öğrendim.

server {
    listen 80; # 80 Portunu dinlemesini istiyorum
    listen [::]:80;

    server_name _; # Bu değişiklik sayesinde IP adresinden ulaşabileceğim

    root /var/www/deneme.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    }
}

Sonrasında yine erişemedim

UFW ile 80 Portuna İzin Verme

Firewall’un 80 portunu engellememesi için:

ufw allow 80/tcp

Komutunu kullandım. Sonrasında siteme erişebildim. (SQL veritabanını henüz restore edemediğim için wordpress hata ekranını gördüm)

MariaDB ile SQL Veritabanını İçeri Aktarma

Elimdeki sıkıştırılmış ‘sql.gz’ dosyasını ‘gunzip’ aracı kullanarak çıkardım.

Sonrasında:

cat /sql/dosya/yolu.sql | mariadb deneme

Komutuyla veritabanımı yedekten yüklemiş oldum.

Domain Konfigürasyonu

Şuan VPS’in IP adresini kullanarak siteme erişebiliyorum. Sırada DNS ayarlarıyla alan adımdan VPS’in IP’sine yönlendirme yapmakta.

Domain sağlayıcıma girdim ve;

Domain Konfigürasyonu Sonrası NGINX Config Değişikliği

/etc/nginx/sites-available/deneme.com

server_name deneme.com www.deneme.com; # Bir önceki konfigürasyondaki gibi güncelledim

SSL Sertifikası Entegrasyonu

nginx ile kullanmak için ‘Let’s Encrypt SSL’ sertifikasını entegre eden ‘certbot’ aracını kullandım.

certbot --nginx -d deneme.com

Komutu ile sertifika konfigürasyonunu yaptım. Araç otomatik olarak NGINX konfigürasyon dosyasına parametreler ekleyerek geçişi kolaylaştırıyor.

HTTPS protokolü 443/tcp portunu kullanıyor. Bu port için Firewall kaydı oluşturmam gerek.

ufw allow 443/tcp

Komutuyla Firewall a 443/TCP portu kaydı oluşturuyorum.

Proje Hakkında

Günün sonunda VPS makinemde Wordpress sitem çalışır halde ve alan adından siteme erişebiliyorum. Paylaşımlı hostinglerdeki gibi hız sorunları yaşamıyorum. İleride ‘cron’ kullanarak otomatik backup alma gibi fonksiyonları getireceğim. Benim için çok verimli bir geçiş oldu. Çok şey öğrendim.