Bu konu için sunucu sağlayıcısı olarak upcloud’u tercih ettim, neden diye sorarsanız hali hazırda yüklü kredim olduğu için, sunucuya debian 11 yükleyip ssh ile bağlanalım.
Ayrıca tüm konuyu root kullanıcısında tamamlayacağım, kimse gelipte yok efendim niye ek kullanıcı açmadın, güvenli değil ssh key neden yüklemedin diye başlamasın, gidipte şifrenizi 123 yapmadıktan sonra kimse sunucunuza dadanmayacak, zaten nginx kendini www-data kullanıcısı üzerinde çalıştırıyor.
İlk önce apt ile sunucuyu güncelleyelim:
apt update && apt upgrade -y
Güncelleme bittikten sonra nginx ve genellikle kullanılan php modüllerini yükleyelim:
apt install nginx php-fpm php-mbstring php-mysql php-json php-curl php-common php-imagick php-zip php-xml -y
Şimdi nginxi konfigure edelim:
/etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
fastcgi_intercept_errors on;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_client_certificate /etc/nginx/certs/Cloudflare_CA.crt;
ssl_verify_client on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
set_real_ip_from 127.0.0.1;
##Cloudflare Real IP
#real_ip_header CF-Connecting-IP;
real_ip_header X-FORWARDED-FOR;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
Daha sonrasında cloudflare sertifikasını aşağıdaki komut ile /etc/nginx/certs klasörüne indirelim:
cd /etc/nginx && mkdir certs && cd certs && wget https://developers.cloudflare.com/cloudflare-one/static/documentation/connections/Cloudflare_CA.crt
Şimdi ise sıra web sitesinin konfigurasyonunu nginx eklemeye geldi, bu örnekte izmir.dev alan adını kullanacağım.
/etc/nginx/sites-available/
Klasörü içerisine “izmir.dev” isimli bir dosya oluşturup konfigurasyonu aşağıdaki gibi yapacağım:
upstream php {
server unix:/tmp/php-cgi.socket;
server 127.0.0.1:9000;
}
server {
listen 127.0.0.1:80;
server_name www.izmir.dev izmir.dev;
root /home/web/izmir.dev;
index index.php;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header NEL '{"report_to":"default","max_age":31536000,"include_subdomains":true}' always;
add_header Feature-Policy "accelerometer 'none'; camera 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; payment 'none'; usb 'none'" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}
Yukarıda yaptığım yaptığımız konfigurasyon örnek olarak kullanacağım wordpress için yeterli.
Daha sonra aşağıdaki komut ile konfigurasyonun kısayolunu oluşturalım.
ln -s /etc/nginx/sites-available/izmir.dev /etc/nginx/sites-enabled/
Kısayolu oluşturduktan sonra aşağıdaki komut ile web sitemizin klasörünü oluşturup wordpress dosyalarını yükleyelim:
mkdir /home/web/ && cd /home/web && mkdir izmir.dev && wget https://tr.wordpress.org/latest-tr_TR.tar.gz && tar -zxvf latest-tr_TR.tar.gz && rm latest-tr_TR.tar.gz && mv wordpress/* /home/web/izmir.dev/ && rm -rf /home/web/wordpress
Daha sonra veritabanı için kullanacağımız MariaDB (MySQL forku) sunucusunu indirelim:
apt install mariadb-server -y
MariaDB yüklemesi bittikten sonra aşağıdaki komut ile konfigure edelim:
mysql_secure_installation
Switch to unix_socket authentication [Y/n]: n
Change the root password? [Y/n]: Y (Daha sonrasında veritabanı için şifre soracak)
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
ve unutmadan mariadb ve nginx i yeniden başlatalım:
systemctl restart nginx && systemctl restart mariadb
Daha sonrasında
mysql -u root -p
komutu ile mysql terminaline giriş yapalım, burada mysql_secure_installation
komutunun Change the root password?
bölümünde belirlediğimiz şifreyi soracak.
CREATE DATABASE izmir_db;
Komutu ile izmir_db
veritabanını oluşturalım
CREATE USER 'izmir_db'@'localhost' IDENTIFIED BY 'şifre';
Komutu ile izmir_db
kullanıcısını oluşturalım.
Daha sonra bu kullanıcıya izmir_db
yi yönetebilmesi için yetki verelim:
GRANT ALL PRIVILEGES ON izmir_db.* TO 'izmir_db'@'localhost';
ve yetki listesini yenileyelim
FLUSH PRIVILEGES;
Daha sonra quit
yazarak veritabanı terminalinden çıkalım.
Wordpress kurulumunu tamamlamak ve web sitesini dışarı çıkarmak için cloudflare tunnel konfigurasyonuna geçelim. (Cloudflare hesabı oluşturup alan adınızı cloudflare’a bağlamanız gerekir.)
Maalesef Cloudflare daha Debian 11/bullseye için cloudflared desteği sunmadığı için Debian 10 sürümünü yükleyeceğiz.
apt install curl -y
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/ buster main' |
tee /etc/apt/sources.list.d/cloudflare-main.list
curl https://pkg.cloudflare.com/cloudflare-main.gpg -o /usr/share/keyrings/cloudflare-main.gpg
apt update && apt upgrade -y
Yukarıdaki komutlar ile Cloudflare repositorylerini apt a ekleyelim.
apt install cloudflared -y
Komutu ile cloudflared paketini yükleyelim.
cloudflared tunnel login
Komutu ile cloudflared’ye hesabımıza erişim izni vereceğiz, komutu yazdıktan sonra beliren URLyi tarayıcımıza yapıştırıp izin vereceğimiz alan adını seçelim.
ve şimdi aşağıdaki komut ile tünel oluşturalım:
cloudflared tunnel create tunel1
Daha sonrasında aşağıdaki komut ile tünele subdomain bağlayalım:
cloudflared tunnel route dns tunel1 tunnel1
Artık tunel1.izmir.dev
alan adı bu tünele yönelecektir, tabi ondan önce yapmamız gereken ayarlar var.
/root/.cloudflared
klasörüne girip config.yml
isimli bir dosya oluşturup konfigure edelim.
tunnel: <Buraya aynı klasördeki json dosyasının ismini yazın (.json olmadan)>
credentials-file: /root/.cloudflared/<Buraya aynı klasördeki json dosyasının ismini yazın>.json
originRequest:
disableChunkedEncoding: true
ingress:
- service: http://127.0.0.1:80
Konfigurasyon dosyamız şuanda tünele gelen tüm bağlantıları 127.0.0.1:80 adresine yani web sunucumuza yönlendiriyor.
apt install screen -y
komutuyla screen paketini yükleyelim ve ardından screen -S cloudflared -dm cloudflared tunnel run
komutu ile tuneli başlatalım.
Şimdi sıra alan adını web sunucusuna bağlamaya, cloudflare dns alanına giriş yapıp ardından tunnel1.izmir.dev e cname kayıdı yapalım
ve cname kayıtlarını da yaptıktan sonra web sitesi kuruluma hazır.