Shared Hosting'den VPS'ye Geçiş: Debian ve NGINX ile Wordpress Hosting
- 7 minsShared 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.

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:

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;
- VPS’in IP adresine ‘A’ girdisi ekledim.
- Ayrıca ‘www.deneme.com’ için de CNAME girdisi ekledim.
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.