Manuel sunucu kurulumları zaman alıcı, hataya açık ve sıkıcı olabilir. Özellikle bir WordPress sitesini LEMP (Linux, Nginx, MySQL, PHP-FPM) yığınıyla AWS üzerine kurarken bu süreç daha da karmaşıklaşır. Peki, bu karmaşıklığı tamamen otomatikleştirmek, SSL sertifikasını bile tek bir komutla entegre etmek mümkün olsaydı ne düşünürdünüz? İşte bu makale, AWS üzerinde güçlü, güvenli ve performanslı bir WordPress LEMP sunucusunu Ansible kullanarak nasıl tamamen otomatik bir şekilde kuracağınızı adım adım açıklıyor.
Bir web sitesi kurmak günümüzde her zamankinden daha kolay, ancak performanstan, güvenlikten ve sürdürülebilirlikten ödün vermeden bunu başarmak hala önemli bir meydan okuma. Geleneksel olarak, bir WordPress sitesi için sunucu ortamı kurmak, birçok manuel adımı içeren uzun bir süreçtir: işletim sistemi kurulumu, web sunucusu (Apache veya Nginx), veritabanı (MySQL/MariaDB), PHP ve ilgili kütüphanelerin konfigürasyonu, ardından WordPress’in kendisinin kurulumu ve son olarak SSL sertifikasının entegrasyonu. Her bir adımda potansiyel hata noktaları bulunur ve bu süreç, özellikle birden fazla sunucu yönetiyorsanız veya sık sık yeni ortamlar kurmanız gerekiyorsa, hızla bir kabusa dönüşebilir.
İşte bu noktada otomasyon devreye girer ve manuel süreçlerin tüm dezavantajlarını ortadan kaldırır. Ansible gibi araçlarla sunucu kurulumunu otomatik hale getirmek, zamandan tasarruf etmenizi sağlamakla kalmaz, aynı zamanda insan kaynaklı hataları minimize eder. Her kurulumun aynı şekilde, aynı konfigürasyonlarla yapılmasını garanti eder, bu da tutarlılık ve güvenilirlik anlamına gelir. Örneğin, yeni bir test ortamı kurmanız gerektiğinde veya mevcut sunucunuzda bir sorun oluştuğunda hızla yeni bir sunucu ayağa kaldırabilirsiniz. Bu yetenek, iş sürekliliği ve felaket kurtarma senaryolarında hayati önem taşır.
LEMP yığını (Linux, Nginx, MySQL, PHP-FPM), özellikle yüksek trafikli WordPress siteleri için mükemmel bir seçimdir. Nginx, hafifliği ve eş zamanlı bağlantıları yüksek verimlilikle yönetebilme yeteneği sayesinde, Apache’ye kıyasla genellikle daha iyi performans sunar. PHP-FPM (FastCGI Process Manager) ise PHP uygulamalarının daha hızlı çalışmasını sağlayarak WordPress performansını doğrudan artırır. AWS (Amazon Web Services) platformu ise bu yığını barındırmak için sınırsız esneklik, ölçeklenebilirlik ve küresel erişim sunar. İhtiyaçlarınıza göre sunucu kaynaklarını kolayca ayarlayabilir, yük dengeleme veya otomatik ölçeklendirme gibi ileri düzey özellikleri sorunsuz bir şekilde entegre edebilirsiniz. Son olarak, SSL sertifikası (HTTPS), yalnızca site güvenliği için değil, aynı zamanda arama motoru optimizasyonu (SEO) ve kullanıcı güveni için de vazgeçilmezdir. Otomatik SSL entegrasyonu, web sitenizin modern web standartlarına uygun olmasını garantiler. Bu kombinasyonla, manuel kurulumların getirdiği baş ağrılarından kurtularak, sadece web sitenizin içeriğine ve büyümesine odaklanabilirsiniz.
Temel Taşlar: LEMP, AWS ve Ansible Kavramlarına Hızlı Bir Bakış
Tam otomatik bir WordPress LEMP sunucusu kurma yolculuğuna çıkmadan önce, projemizin temel yapı taşlarını oluşturan teknolojileri anlamak önemlidir. Bu bölümde, LEMP yığını, AWS bulut platformu ve Ansible otomasyon aracının ne anlama geldiğini ve neden bu proje için ideal olduklarını keşfedeceğiz.
LEMP Nedir ve Neden WordPress İçin İdealdir?
LEMP, dört ana açık kaynak yazılım bileşeninin baş harflerinden oluşan bir akronimdir: Linux (işletim sistemi), Enginx (web sunucusu, “Engine-X” olarak telaffuz edilir), MySQL/MariaDB (veritabanı yönetim sistemi) ve PHP-FPM (PHP FastCGI Process Manager). Bu yığın, dinamik web uygulamaları sunmak için güçlü, esnek ve yüksek performanslı bir ortam sağlar.
- Linux: Sağlamlığı, güvenliği ve geniş topluluk desteğiyle bilinen açık kaynaklı bir işletim sistemidir. Ubuntu Server gibi dağıtımlar, LEMP yığını için popüler ve güvenilir bir temel oluşturur.
- Nginx: Geleneksel web sunucusu Apache’ye alternatif olarak ortaya çıkmıştır. Nginx, olay tabanlı (event-driven) mimarisi sayesinde, yüksek eş zamanlı bağlantı sayılarını düşük bellek tüketimiyle işleyebilir. Bu, özellikle WordPress gibi dinamik ve içerik yoğun sitelerde, ziyaretçi yükü arttığında bile sitenizin hızlı ve duyarlı kalmasını sağlar. Nginx ayrıca bir ters proxy (reverse proxy) olarak da kullanılabilir, bu da önbellekleme ve yük dengeleme gibi ileri düzey konfigürasyonlara olanak tanır.
- MySQL/MariaDB: Dünya genelinde en popüler açık kaynak ilişkisel veritabanı yönetim sistemidir. WordPress, tüm site içeriğini, kullanıcı bilgilerini ve ayarlarını bu veritabanında depolar. MariaDB, MySQL’in topluluk tarafından geliştirilen bir fork’udur ve genellikle MySQL’e kıyasla daha iyi performans ve ek özellikler sunar.
- PHP-FPM: PHP’nin web sunucusuyla etkileşime girmesini sağlayan FastCGI uygulamasının bir yöneticisidir. Geleneksel PHP modüllerine göre daha verimli kaynak kullanımı ve daha iyi performans sunar. Nginx doğrudan PHP’yi çalıştıramadığı için, PHP-FPM, Nginx’in PHP betiklerini işlemesi için bir arayüz görevi görür, her PHP isteği için ayrı bir işlem havuzu (pool) oluşturarak izolasyon ve daha iyi performans sağlar.
WordPress, PHP ve MySQL’e dayandığı için LEMP yığınıyla mükemmel bir uyum içindedir. Nginx’in hızlı statik içerik sunumu ve PHP-FPM’in dinamik içeriği etkin bir şekilde işlemesi, WordPress sitenizin ziyaretçiler için hızlı ve akıcı bir deneyim sunmasını sağlar.
AWS (Amazon Web Services) Bize Ne Sunuyor?
AWS, dünyanın en kapsamlı ve yaygın olarak benimsenen bulut platformudur. Sunuculardan (EC2) veritabanlarına, depolamadan ağ hizmetlerine kadar binlerce farklı hizmet sunar. Projemiz için özellikle önemli olan AWS hizmetleri şunlardır:
- Amazon EC2 (Elastic Compute Cloud): AWS’nin sanal sunucu hizmetidir. İhtiyacınız olan işlem gücünü, belleği ve depolama alanını seçerek saniyeler içinde bir Linux sunucusu başlatabilirsiniz. Esnekliği sayesinde, sunucunuzun boyutunu ve özelliklerini kolayca değiştirebilirsiniz.
- Amazon VPC (Virtual Private Cloud): Kendi sanal ağınızı AWS üzerinde oluşturmanızı sağlar. Bu sayede sunucularınızın ağ yapılandırmasını, IP adres aralıklarını, alt ağları ve yönlendirme tablolarını kontrol edebilirsiniz. Güvenli ve izole bir ortam sunar.
- AWS Security Groups: Sanal güvenlik duvarlarıdır. EC2 örneklerinize gelen ve giden trafiği kontrol etmenizi sağlar. Yalnızca belirli portlardan (örn. SSH için 22, HTTP için 80, HTTPS için 443) ve belirli IP adreslerinden gelen bağlantılara izin vererek sunucunuzu güvende tutabilirsiniz.
- Elastic IP: Dinamik IP adreslerinin aksine, bir Elastic IP adresi AWS hesabınıza atanır ve bir EC2 örneği yeniden başlatılsa bile değişmez. Bu, alan adınızı kalıcı bir IP adresine yönlendirmenizi sağlar.
AWS, “kullandığın kadar öde” modeliyle çalışır, bu da başlangıç maliyetlerini düşürür ve sadece kullandığınız kaynaklar için ödeme yaparsınız. Bu, özellikle küçük ve orta ölçekli işletmeler için maliyet etkin bir çözümdür.
Ansible ile Otomasyonun Gücü
Ansible, BT otomasyonu, konfigürasyon yönetimi ve uygulama dağıtımı için tasarlanmış açık kaynaklı bir araçtır. Python ile yazılmıştır ve en büyük avantajlarından biri, yönetilen sunucularda herhangi bir aracı (agent) kurma gereksinimi olmamasıdır. Bunun yerine, SSH protokolü üzerinden sunuculara bağlanır ve komutları çalıştırır.
Ansible’ın temel özellikleri:
- Agentless (Aracısız): Hedef sunucularda özel bir yazılım çalıştırmanıza gerek kalmaz. Bu, kurulumu basitleştirir ve güvenlik risklerini azaltır.
- Basit ve Okunabilir: Konfigürasyonlar, playbook’lar adı verilen YAML dosyaları aracılığıyla tanımlanır. Bu dosyalar oldukça okunabilir ve insan dostudur.
- İdempotent (Tekrar Tekrar Uygulanabilir): Bir Ansible playbook’unu birden çok kez çalıştırmak, her zaman aynı sonuca yol açar. Yani, bir kaynak zaten istenen durumdaysa, Ansible herhangi bir değişiklik yapmaz. Bu, konfigürasyonlarınızı güvenle uygulamanızı sağlar.
-
Modüler Yapı: Ansible, çok sayıda yerleşik modülle gelir (örn.
apt,yum,service,copy,template). Bu modüller, çeşitli görevleri gerçekleştirmek için kullanılabilir.
Ansible ile, bir sunucunun kurulumunu, yazılım paketlerini, konfigürasyon dosyalarını ve hatta bir WordPress sitesini uçtan uca tamamen otomatik hale getirebilirsiniz. Bu, manuel müdahaleye olan ihtiyacı ortadan kaldırır ve sunucu yönetimini daha verimli ve hatasız hale getirir.
AWS Ortamının Hazırlanması ve Ansible Kurulumu: Adım Adım
Otomatik LEMP sunucunuzu kurmaya başlamadan önce, temel AWS altyapısını hazırlamamız ve Ansible’ı yerel makinemize kurmamız gerekiyor. Bu adımlar, playbook’umuzun sorunsuz bir şekilde çalışabilmesi için kritik öneme sahiptir.
AWS EC2 Sanal Sunucu Oluşturma
İlk olarak, WordPress sitemizi barındıracak sanal sunucuyu (EC2 instance) AWS üzerinde yapılandıracağız.
- AWS Hesabı Oluşturma/Giriş Yapma: AWS yönetim konsoluna giriş yapın. Henüz bir hesabınız yoksa, AWS Free Tier ile ücretsiz bir hesap oluşturabilirsiniz.
- EC2 Hizmetine Gitme: Konsol arama çubuğuna “EC2” yazın ve hizmeti seçin. Ardından sol menüden “Instances” (Örnekler) seçeneğine tıklayın ve “Launch instances” (Örnekleri başlat) düğmesine basın.
- AMI (Amazon Machine Image) Seçimi: “Ubuntu Server 22.04 LTS (HVM), SSD Volume Type” gibi güncel bir Ubuntu AMI seçin. Bu, LEMP yığını için popüler ve iyi desteklenen bir temeldir.
- Instance Tipi Seçimi: Free Tier kapsamında “t2.micro” veya “t3.micro” gibi bir tipi seçebilirsiniz. Gerçek bir site için, trafiğe bağlı olarak daha güçlü bir tip (örn. “t3.medium”) tercih edilebilir.
-
Ağ Yapılandırması (Network Settings):
- VPC: Varsayılan VPC’yi kullanabilir veya kendi VPC’nizi oluşturabilirsiniz.
- Subnet: Public Subnet’i seçin, böylece sunucunuz internetten erişilebilir olur.
- Auto-assign Public IP: “Enable” (Etkinleştir) olduğundan emin olun, böylece sunucunuza bir genel IP adresi atanır.
-
Security Group (Güvenlik Grubu): Yeni bir güvenlik grubu oluşturun veya mevcut bir tanesini kullanın. Bu güvenlik grubu için aşağıdaki kuralları ekleyin:
- SSH (Port 22): Kendi IP adresinizden (veya
0.0.0.0/0test amaçlı, ancak üretim için önerilmez) erişime izin verin. - HTTP (Port 80):
0.0.0.0/0(Her yerden) erişime izin verin. - HTTPS (Port 443):
0.0.0.0/0(Her yerden) erişime izin verin.
- SSH (Port 22): Kendi IP adresinizden (veya
- Depolama (Storage): Varsayılan depolama (8GB GP2 SSD) çoğu WordPress sitesi için yeterlidir. İhtiyacınıza göre artırabilirsiniz.
-
Key Pair (Anahtar Çifti) Oluşturma: Sunucunuza SSH ile bağlanmak için bir anahtar çifti oluşturmanız gerekecek. “Create new key pair” (Yeni anahtar çifti oluştur) seçeneğini seçin, bir isim verin ve
.pemdosyasını bilgisayarınıza indirin. Bu dosyayı güvende tutun, çünkü sunucuya erişim için tek yolunuz bu olacaktır. - Başlatma: “Launch instance” düğmesine tıklayarak sunucunuzu başlatın. Birkaç dakika içinde sunucunuz hazır olacaktır. Sunucunuzun genel IP adresini veya DNS adını not edin.
- Elastic IP Ataması (Opsiyonel ama Önerilir): EC2 kontrol panelinde “Elastic IPs” bölümüne gidin ve yeni bir Elastic IP adresi tahsis edin. Bu IP adresini yeni başlattığınız EC2 örneğine atayın. Böylece, sunucunuz yeniden başlatılsa bile IP adresi değişmeyecektir.
Yerel Makinenizde Ansible Kurulumu
Şimdi sıra yerel geliştirme makinemizde Ansible’ı kurmaya geldi. Ansible, Python ile çalıştığı için, sisteminizde Python ve pip (Python paket yöneticisi) kurulu olmalıdır.
-
Python ve pip Kurulumu (Gerekliyse):
Çoğu Linux ve macOS sisteminde Python ve pip önceden yüklüdür. Kontrol etmek için:
python3 --version pip3 --versionEğer kurulu değillerse, işletim sisteminize göre kurun. Ubuntu için:
sudo apt update sudo apt install python3 python3-pip -
Ansible Kurulumu:
pip kullanarak Ansible'ı kolayca kurabilirsiniz:
pip3 install ansibleKurulumun başarılı olup olmadığını kontrol etmek için:
ansible --version -
SSH Anahtarının Hazır Olması:
AWS'den indirdiğiniz
.pemdosyasını SSH anahtar dizininize (~/.ssh/) taşıyın ve izinlerini ayarlayın:mv /path/to/your/key.pem ~/.ssh/your-key-name.pem chmod 400 ~/.ssh/your-key-name.pem -
SSH Yapılandırması (Opsiyonel ama Tavsiye Edilir):
~/.ssh/configdosyanızı düzenleyerek veya oluşturarak sunucunuza daha kolay bağlanabilirsiniz. Bu, Ansible'ın da anahtarınızı otomatik olarak bulmasına yardımcı olur.Host your_aws_server HostName YOUR_EC2_PUBLIC_IP_OR_DNS User ubuntu IdentityFile ~/.ssh/your-key-name.pem StrictHostKeyChecking no # Sadece ilk bağlantıda kolaylık için, sonra kaldırılmalı veya yes yapılmalıYOUR_EC2_PUBLIC_IP_OR_DNSyerine EC2 sunucunuzun Genel IP adresini veya DNS adını,your-key-name.pemyerine anahtar dosyanızın adını yazın. Artık sunucunuzassh your_aws_serverkomutuyla bağlanabilirsiniz.
Bu adımlarla, AWS üzerinde bir sanal sunucu oluşturduk ve Ansible'ı yerel makinemize kurarak sunucuya bağlanmaya hazır hale getirdik. Şimdi sıra, LEMP yığınını ve WordPress'i otomatik olarak kuracak Ansible playbook'umuzu yazmaya geldi.
Ansible Playbook ile Otomatik LEMP Yığını ve WordPress Kurulumu
Şimdi işin kalbine, yani Ansible playbook'larına odaklanma zamanı. Bu bölüm, LEMP bileşenlerini ve WordPress'i otomatik olarak kurmak için adım adım bir Ansible playbook'u nasıl oluşturacağımızı detaylandıracaktır. Amacımız, tek bir Ansible komutuyla bir sunucuyu sıfırdan çalışan bir WordPress sitesine dönüştürmektir.
Ansible Envanter Dosyasının Oluşturulması
Ansible'ın hangi sunucuları yöneteceğini bilmesi için bir envanter dosyasına ihtiyacı vardır. Genellikle bu dosya hosts veya inventory.ini olarak adlandırılır. Projenizin ana dizininde bu dosyayı oluşturalım:
# hosts dosyası
[webservers]
your_aws_server ansible_host=YOUR_EC2_PUBLIC_IP_OR_DNS ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/your-key-name.pem
[all:vars]
ansible_python_interpreter=/usr/bin/python3
Yukarıdaki dosyada:
-
[webservers]: Bu, bir grup sunucuyu tanımlar. Playbook'unuzda bu grubu hedefleyebilirsiniz. -
your_aws_server: Sunucunuz için verdiğiniz takma addır. -
ansible_host: EC2 sunucunuzun genel IP adresi veya DNS adı. -
ansible_user: SSH bağlantısı için kullanılacak kullanıcı adı (Ubuntu AMI'leri için genellikleubuntu). -
ansible_ssh_private_key_file: AWS'den indirdiğiniz.pemdosyasının yolu. -
[all:vars]: Tüm sunucular için global değişkenleri tanımlar. Burada Python yorumlayıcısının yolunu belirtiyoruz.
Bu dosya ile Ansible, sunucunuza nasıl bağlanacağını bilecek.
Temel LEMP Yığını Kurulum Playbook'u
Şimdi lemp-wordpress.yml adında bir Ansible playbook dosyası oluşturalım. Bu playbook, tüm LEMP bileşenlerini kuracak ve WordPress için veritabanını ve dosyaları ayarlayacaktır.
---
- name: WordPress LEMP Sunucusu Kurulumu
hosts: webservers
become: yes # Tüm görevleri root yetkileriyle çalıştır
vars:
mysql_root_password: "YOUR_MARIADB_ROOT_PASSWORD" # Güçlü bir şifre belirleyin
wordpress_db_name: "wordpress_db"
wordpress_db_user: "wordpress_user"
wordpress_db_password: "YOUR_WORDPRESS_DB_PASSWORD" # Güçlü bir şifre belirleyin
wordpress_site_name: "example.com" # Alan adınızı girin
wordpress_install_path: "/var/www/{{ wordpress_site_name }}"
tasks:
- name: Sistem paketlerini güncelle
apt:
update_cache: yes
upgrade: dist
- name: Gerekli LEMP paketlerini ve PHP eklentilerini kur
apt:
name:
- nginx
- mariadb-server
- php-fpm
- php-mysql
- php-cli
- php-curl
- php-gd
- php-mbstring
- php-xml
- php-zip
state: present
- name: MariaDB hizmetinin başladığından ve etkin olduğundan emin ol
service:
name: mariadb
state: started
enabled: yes
- name: MariaDB root şifresini ayarla ve gereksiz test veritabanlarını kaldır
community.mysql.mysql_user:
name: root
password: "{{ mysql_root_password }}"
host: "{{ item }}"
state: present
login_unix_socket: /var/run/mysqld/mysqld.sock
loop:
- "{{ ansible_hostname }}"
- 127.0.0.1
- ::1
- community.mysql.mysql_db:
name: test
state: absent
login_user: root
login_password: "{{ mysql_root_password }}"
- name: WordPress veritabanını oluştur
community.mysql.mysql_db:
name: "{{ wordpress_db_name }}"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
- name: WordPress veritabanı kullanıcısını oluştur ve yetkileri ver
community.mysql.mysql_user:
name: "{{ wordpress_db_user }}"
password: "{{ wordpress_db_password }}"
priv: "{{ wordpress_db_name }}.*:ALL"
state: present
login_user: root
login_password: "{{ mysql_root_password }}"
- name: Nginx hizmetinin başladığından ve etkin olduğundan emin ol
service:
name: nginx
state: started
enabled: yes
- name: PHP-FPM hizmetinin başladığından ve etkin olduğundan emin ol
service:
name: php{{ ansible_facts['php_fpm']['version']['major'] }}-fpm
state: started
enabled: yes
vars:
ansible_php_fpm_version: "{{ lookup('pipe', 'php-fpm -v | head -n 1 | cut -d \' \' -f 2 | cut -d \'.\' -f 1-2') }}" # PHP-FPM versiyonunu otomatik bul
- name: Nginx varsayılan siteyi kaldır
file:
path: /etc/nginx/sites-enabled/default
state: absent
notify: Reload Nginx
- name: WordPress dizinini oluştur
ansible.builtin.file:
path: "{{ wordpress_install_path }}"
state: directory
mode: '0755'
owner: www-data
group: www-data
- name: WordPress'i indir ve çıkar
ansible.builtin.unarchive:
src: https://wordpress.org/latest.tar.gz
dest: "{{ wordpress_install_path }}"
remote_src: yes
extra_opts: [--strip-components=1] # Alt klasörden çıkar
owner: www-data
group: www-data
- name: WordPress wp-config.php dosyasını oluştur
template:
src: templates/wp-config.php.j2 # Daha sonra oluşturacağımız template dosyası
dest: "{{ wordpress_install_path }}/wp-config.php"
owner: www-data
group: www-data
mode: '0644'
notify: Restart Nginx
- name: Nginx için WordPress site yapılandırma dosyasını kopyala
template:
src: templates/nginx_wordpress.conf.j2 # Daha sonra oluşturacağımız template dosyası
dest: "/etc/nginx/sites-available/{{ wordpress_site_name }}"
owner: root
group: root
mode: '0644'
notify: Reload Nginx
- name: Nginx site yapılandırmasını etkinleştir
file:
src: "/etc/nginx/sites-available/{{ wordpress_site_name }}"
dest: "/etc/nginx/sites-enabled/{{ wordpress_site_name }}"
state: link
notify: Reload Nginx
handlers:
- name: Reload Nginx
service:
name: nginx
state: reloaded
- name: Restart Nginx
service:
name: nginx
state: restarted
- name: Restart PHP-FPM
service:
name: php{{ ansible_facts['php_fpm']['version']['major'] }}-fpm
state: restarted
Not: YOUR_MARIADB_ROOT_PASSWORD, YOUR_WORDPRESS_DB_PASSWORD ve example.com gibi değişkenleri kendi değerlerinizle değiştirin. Güvenlik için güçlü, karmaşık şifreler kullanmanız önemlidir.
Template Dosyalarının Oluşturulması
Playbook'umuzda iki template dosyasına (.j2 uzantılı) atıfta bulunduk: wp-config.php.j2 ve nginx_wordpress.conf.j2. Bunları playbook dosyanızla aynı dizinde "templates" adında bir klasör oluşturup içine yerleştirin.
1. templates/wp-config.php.j2:
Database settings - You can get this info from your web host //
/** The name of the database for WordPress */
define( 'DB_NAME', '{{ wordpress_db_name }}' );
/** MySQL database username */
define( 'DB_USER', '{{ wordpress_db_user }}' );
/** MySQL database password */
define( 'DB_PASSWORD', '{{ wordpress_db_password }}' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
/**#@+
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
*
* @since 2.6.0
*/
define('AUTH_KEY', '{{ lookup('community.general.random_string', length=64, special=True) }}');
define('SECURE_AUTH_KEY', '{{ lookup('community.general.random_string', length=64, special=True) }}');
define('LOGGED_IN_KEY', '{{ lookup('community.general.random_string', length=64, special=True) }}');
define('NONCE_KEY', '{{ lookup('community.general.random_string', length=64, special=True) }}');
define('AUTH_SALT', '{{ lookup('community.general.random_string', length=64, special=True) }}');
define('SECURE_AUTH_SALT', '{{ lookup('community.general.random_string', length=64, special=True) }}');
define('LOGGED_IN_SALT', '{{ lookup('community.general.random_string', length=64, special=True) }}');
define('NONCE_SALT', '{{ lookup('community.general.random_string', length=64, special=True) }}');
/**#@-*/
/**
* WordPress Database Table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*/
$table_prefix = 'wp_'; // You might want to change this for security
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the documentation.
*
* @link https://wordpress.org/support/article/debugging-in-wordpress/
*/
define( 'WP_DEBUG', false );
/* Add any custom values between this line and the "Happy blogging!" line. */
/* That's all, stop editing! Happy blogging. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
Bu template, Ansible değişkenlerini kullanarak veritabanı bilgilerini otomatik olarak dolduracak ve community.general.random_string lookup plugin'i ile WordPress güvenlik anahtarlarını rastgele oluşturacaktır. Bu, kurulumunuzu daha güvenli hale getirir.
2. templates/nginx_wordpress.conf.j2:
server {
listen 80;
listen [::]:80;
server_name {{ wordpress_site_name }} www.{{ wordpress_site_name }};
root {{ wordpress_install_path }};
index index.php index.html index.htm;
error_log /var/log/nginx/{{ wordpress_site_name }}_error.log error;
access_log /var/log/nginx/{{ wordpress_site_name }}_access.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php{{ ansible_facts['php_fpm']['version']['major'] }}-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Statik dosyalar için önbellekleme
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg|eot)$ {
expires 365d;
log_not_found off;
}
# favicon.ico için log kaydı tutma
location = /favicon.ico {
log_not_found off;
access_log off;
}
# robots.txt için log kaydı tutma
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# PHP FPM ile güvenlik
location ~ /\.ht {
deny all;
}
# .git gibi gizli dosyaları engelle
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# WordPress güvenlik kuralları
location ~* /(?:wp-content|wp-includes|wp-json)/.*\.php$ {
deny all;
}
}
Bu Nginx yapılandırması, WordPress'i doğru şekilde çalıştırmak için gerekli tüm ayarları içerir: PHP-FPM ile entegrasyon, rewrite kuralları, statik dosya önbelleklemesi ve temel güvenlik optimizasyonları. ansible_facts['php_fpm']['version']['major'] değişkeni, sunucudaki kurulu PHP-FPM sürümünü dinamik olarak bulup kullanacaktır.
Playbook'u ve template dosyalarını hazırladıktan sonra, tek yapmanız gereken Ansible'ı çalıştırmak:
ansible-playbook -i hosts lemp-wordpress.yml
Bu komut, tüm görevleri sırayla gerçekleştirecek ve sunucunuzu otomatik olarak yapılandıracaktır. Kurulum tamamlandığında, web tarayıcınızdan alan adınızı (veya EC2 genel IP adresinizi) ziyaret ederek WordPress kurulum sihirbazını görmelisiniz.
Certbot ile Otomatik SSL (HTTPS) Entegrasyonu
Web güvenliği günümüzde bir tercih değil, bir zorunluluktur. SSL (Secure Sockets Layer) sertifikaları, web siteniz ile ziyaretçileriniz arasındaki iletişimi şifreleyerek hassas bilgilerin korunmasını sağlar. Ayrıca, HTTPS (SSL kullanan HTTP), arama motoru sıralamalarında (SEO) bir avantaj sunar ve modern tarayıcılar, SSL olmayan siteleri "Güvenli Değil" olarak işaretleyerek kullanıcı güvenini zedeler. Bu bölümde, ücretsiz ve otomatik SSL sertifikaları sağlayan Certbot ve Let's Encrypt'i Ansible ile nasıl entegre edeceğimizi göreceğiz.
SSL Neden Vazgeçilmezdir?
Bir web sitesi için SSL sertifikası kullanmanın birçok önemli nedeni vardır:
- Veri Şifreleme: SSL, sunucu ile istemci (tarayıcı) arasındaki tüm veri akışını şifreler. Bu, özellikle kullanıcı adı, şifre, kredi kartı bilgileri gibi hassas verilerin iletimi sırasında önemlidir ve üçüncü tarafların bu verilere erişmesini engeller.
- Veri Bütünlüğü: SSL, iletilen verilerin değiştirilmediğini garanti eder. Bu, kötü niyetli saldırganların veriyi manipüle etmesini önler.
- Kimlik Doğrulama: SSL sertifikaları, bir web sitesinin iddia ettiği gibi olduğunu doğrular. Bu, kullanıcıların sahte siteler yerine gerçek siteye bağlandığından emin olmalarını sağlar.
- SEO İyileştirmesi: Google gibi arama motorları, HTTPS kullanan sitelere sıralamalarda hafif bir avantaj tanır. Bu, sitenizin daha fazla organik trafik çekmesine yardımcı olabilir.
- Kullanıcı Güveni: Tarayıcılarda görünen kilit simgesi ve "Güvenli" etiketi, kullanıcılara sitenizin güvenli olduğunu gösterir ve bu da onların sitenizle etkileşim kurma olasılığını artırır. SSL olmayan sitelerde görülen "Güvenli Değil" uyarısı ise kullanıcıları uzaklaştırabilir.
Bu nedenlerden dolayı, herhangi bir modern web sitesi için SSL bir zorunluluk haline gelmiştir. Let's Encrypt, bu ihtiyacı ücretsiz ve otomatik sertifikalarla karşılayarak erişimi herkes için kolaylaştırmıştır.
Certbot ve Let's Encrypt ile SSL Kurulumu
Certbot, Let's Encrypt sertifikalarını sunucularınıza kurmak ve yönetmek için geliştirilmiş kullanımı kolay bir araçtır. Ansible playbook'umuza Certbot kurulumunu ve sertifika edinme adımlarını ekleyelim.
Mevcut lemp-wordpress.yml playbook dosyanızı düzenleyerek SSL ile ilgili görevleri ekleyebilirsiniz. İşte bu görevlerin nasıl görüneceği:
---
- name: WordPress LEMP Sunucusu ve SSL Kurulumu
hosts: webservers
become: yes
vars:
# ... (önceki değişkenler buraya)
wordpress_site_email: "admin@example.com" # Certbot için kullanılacak geçerli bir e-posta adresi
tasks:
# ... (önceki LEMP ve WordPress kurulum görevleri buraya)
- name: Certbot'u kur
apt:
name:
- certbot
- python3-certbot-nginx
state: present
- name: Certbot ile SSL sertifikasını al ve Nginx'i yapılandır
ansible.builtin.command: "certbot --nginx --non-interactive --agree-tos -m {{ wordpress_site_email }} -d {{ wordpress_site_name }} -d www.{{ wordpress_site_name }}"
args:
creates: "/etc/letsencrypt/live/{{ wordpress_site_name }}/fullchain.pem" # Sadece sertifika henüz alınmadıysa çalıştır
notify: Restart Nginx
- name: Certbot otomatik yenileme cron işini test et
ansible.builtin.cron:
name: "Certbot renew"
minute: "0"
hour: "3"
day: "*"
weekday: "*"
job: "certbot renew --quiet"
state: present
Bu yeni görevler dizisi aşağıdaki adımları gerçekleştirecektir:
-
Certbot ve Nginx Eklentisini Kurma:
certbotvepython3-certbot-nginxpaketleri, Ubuntu'nun varsayılan depolarından kurulur.python3-certbot-nginx, Certbot'un Nginx konfigürasyonunu otomatik olarak değiştirmesine olanak tanıyan eklentidir. -
SSL Sertifikasını Alma:
ansible.builtin.commandmodülü kullanılarakcertbotkomutu çalıştırılır.-
--nginx: Certbot'a Nginx ile entegrasyon yapmasını söyler. -
--non-interactive: Kullanıcıdan herhangi bir etkileşim beklemeden komutun çalışmasını sağlar. -
--agree-tos: Let's Encrypt hizmet şartlarını otomatik olarak kabul eder. -
-m {{ wordpress_site_email }}: Sertifika bildirimleri için kullanılacak e-posta adresini belirtir. -
-d {{ wordpress_site_name }} -d www.{{ wordpress_site_name }}: Sertifikanın geçerli olacağı alan adlarını belirtir. Hem ana alan adı hem dewwwalt alan adı için sertifika almanız önerilir. -
args: creates: ...: Bu, Ansible'ın bir görevi yalnızca belirtilen dosya henüz yoksa çalıştırmasını sağlayan bir özelliktir. Böylece, playbook'u tekrar çalıştırdığınızda zaten mevcut olan bir sertifikayı yeniden almaya çalışmaz. -
notify: Restart Nginx: Sertifika başarıyla alındıktan ve Nginx konfigürasyonu güncellendikten sonra Nginx hizmetinin yeniden başlatılmasını tetikler.
-
-
Otomatik Yenileme Cron İşi Oluşturma: Let's Encrypt sertifikaları 90 gün geçerlidir ve düzenli olarak yenilenmeleri gerekir. Certbot, bu yenileme işlemini otomatikleştiren bir mekanizma sağlar.
ansible.builtin.cronmodülü ile her gün sabah 3'te çalışan bir cron işi ayarlarız.certbot renew --quietkomutu, yalnızca sertifikaların yenilenmesi gerekiyorsa sessizce yenileme yapar. Bu sayede sitenizin SSL sertifikasının süresi hiçbir zaman dolmaz.
Bu görevleri playbook'unuza ekledikten sonra, alan adınızın AWS EC2 sunucunuzun genel IP adresine doğru şekilde yönlendirildiğinden emin olun (DNS kayıtlarınızı güncelleyin). A kaydı oluşturarak ana alan adınızı ve CNAME kaydı oluşturarak www alt alan adınızı yönlendirebilirsiniz. Ardından, playbook'u tekrar çalıştırın:
ansible-playbook -i hosts lemp-wordpress.yml
Playbook başarıyla tamamlandığında, web sitenizi tarayıcınızdan ziyaret ettiğinizde URL'nin başında bir kilit simgesi görmelisiniz, bu da SSL sertifikanızın doğru şekilde entegre edildiğini gösterir. Bu otomasyon sayesinde, manuel SSL kurulumu ve yenileme zahmetinden tamamen kurtulmuş olursunuz.
Performans, Güvenlik ve Mobil Uyum İçin İpuçları
WordPress sitenizi kurmak sadece başlangıçtır. Gerçek dünya senaryolarında başarılı olmak için sitenizin performansını, güvenliğini ve mobil uyumluluğunu optimize etmeniz gerekir. Bu bölümde, sitenizi daha iyi hale getirecek ileri düzey ipuçlarını ve Ansible ile nasıl otomatikleştirebileceğinizi keşfedeceğiz.
WordPress Optimizasyonu ve Güvenlik Best Practice'leri
Bir WordPress sitesinin performansını ve güvenliğini artırmak, kullanıcı deneyimi ve SEO için kritik öneme sahiptir. İşte uygulayabileceğiniz bazı stratejiler:
- Önbellekleme (Caching): En büyük performans artırıcıdır. W3 Total Cache veya WP Super Cache gibi eklentiler, dinamik WordPress sayfalarını statik HTML dosyalarına dönüştürerek sunucu yükünü azaltır ve sayfa yükleme sürelerini hızlandırır. Nginx'in kendi fastcgi_cache mekanizmasını da kullanabilirsiniz. Ansible ile Nginx yapılandırmanıza önbellekleme direktifleri ekleyebilirsiniz.
- Resim Optimizasyonu: Yüksek çözünürlüklü, sıkıştırılmamış resimler sitenizi yavaşlatır. Smush veya EWWW Image Optimizer gibi eklentilerle resimleri otomatik olarak sıkıştırın ve WebP formatına dönüştürün.
- Veritabanı Optimizasyonu: WordPress veritabanı zamanla şişebilir. WP-Optimize gibi eklentiler, gereksiz revizyonları, spam yorumları ve geçici verileri temizleyerek veritabanı boyutunu küçültür ve sorgu performansını artırır.
- Güvenlik Eklentileri: Wordfence Security, Sucuri Security gibi eklentiler kötü amaçlı yazılımları tarar, güvenlik duvarı sağlar, kaba kuvvet saldırılarını engeller ve sitenizi güvende tutar. Ansible ile bu eklentileri (CLI kullanarak) otomatik olarak kurabilir ve varsayılan ayarlarını yapılandırabilirsiniz.
-
Güncel Tutma: WordPress çekirdeği, temalar ve eklentileri düzenli olarak güncellemek, güvenlik açıklarını kapatmak ve performans iyileştirmelerinden yararlanmak için hayati öneme sahiptir. Ansible ile düzenli olarak WordPress CLI (
wp-cli) kullanarak güncelleme görevleri çalıştırabilirsiniz. - DDoS Koruması ve CDN: Cloudflare gibi CDN (İçerik Dağıtım Ağı) hizmetleri, sitenizin statik içeriğini coğrafi olarak yakın sunuculardan sunarak yükleme sürelerini hızlandırır ve DDoS (Dağıtık Hizmet Reddi) saldırılarına karşı bir kalkan görevi görür. Bu entegrasyonlar genellikle DNS seviyesinde yapılır ve Ansible ile DNS kayıtlarınızı yöneten bir playbook yazılabilir.
Mobil Uyumlu Tasarım ve Sunucu İlişkisi
Mobil cihazlardan gelen trafik, günümüzde web trafiğinin büyük bir kısmını oluşturmaktadır. Bu nedenle, web sitenizin mobil uyumlu olması sadece iyi bir pratik değil, aynı zamanda SEO için de kritik bir faktördür.
- Responsive Temalar: WordPress için mobil uyumlu (responsive) temalar seçmek esastır. Bu temalar, farklı ekran boyutlarına ve çözünürlüklerine otomatik olarak uyum sağlar. Temanızın mobil uyumlu olduğundan emin olun.
- Hızlı Yükleme Süreleri: Mobil cihazlarda internet bağlantısı hızı değişebilir. Bu nedenle, sunucunuzun sitenizi hızlı bir şekilde sunması hayati önem taşır. LEMP yığınının performans optimizasyonları (Nginx, PHP-FPM, önbellekleme) burada devreye girer. Hızlı bir sunucu, mobil kullanıcı deneyimini doğrudan etkiler.
-
Media Query Örnekleri: Bir web sitesinin mobil uyumlu olmasını sağlayan temel CSS tekniği
@mediakurallarıdır. Bu kurallar, ekran boyutuna göre farklı stil tanımlamaları yapmanızı sağlar. İşte basit bir örnek:/* Genel stil tanımlamaları */ .container { width: 960px; margin: 0 auto; padding: 20px; } .main-navigation ul { display: flex; justify-content: space-around; } /* Mobil cihazlar için (ekran genişliği 768 pikselden az) */ @media screen and (max-width: 768px) { .container { width: 100%; /* Mobil cihazlarda tam genişlik */ padding: 10px; } .main-navigation ul { flex-direction: column; /* Menü öğelerini alt alta sırala */ text-align: center; } .main-navigation li { margin-bottom: 10px; } }
Bu örnekte, tarayıcı genişliği 768 pikselin altına düştüğünde,.containerelementinin genişliği değişir ve menü (.main-navigation ul) dikey olarak sıralanır. WordPress temaları genellikle bu tür kuralları içerir, ancak kendi özel CSS'inizi ekliyorsanız bu prensibi akılda tutmalısınız.
Otomatik Yedekleme Stratejileri
Felaketler her zaman beklenmedik anlarda gelir. Bu nedenle, düzenli ve otomatik yedeklemeler, sitenizin verilerinin güvende olduğundan emin olmanın tek yoludur.
-
Veritabanı Yedeklemesi: MariaDB'nin
mysqldumpkomutu ile veritabanınızı bir dosyaya yedekleyebilirsiniz. Ansible ile bu komutu düzenli olarak çalıştıran bir görev oluşturup yedekleme dosyasını uzak bir depolama alanına (örn. AWS S3) gönderebilirsiniz.- name: MariaDB veritabanını yedekle community.mysql.mysql_db: name: "{{ wordpress_db_name }}" state: dump target: "/tmp/{{ wordpress_db_name }}_$(date +%%Y%%m%%d%%H%%M).sql" login_user: root login_password: "{{ mysql_root_password }}" - name: Yedekleme dosyasını S3'e yükle (örnek, AWS CLI kurulu olmalı) ansible.builtin.command: "aws s3 cp /tmp/{{ wordpress_db_name }}_$(date +%%Y%%m%%d%%H%%M).sql s3://your-s3-bucket-name/backups/" args: removes: "/tmp/{{ wordpress_db_name }}_$(date +%%Y%%m%%d%%H%%M).sql" # Yükledikten sonra yerelden sil -
Dosya Yedeklemesi: WordPress dosyalarını (
wp-contentklasörü dahil) düzenli olarak yedeklemek de önemlidir.tarkomutu ile tüm site dizinini sıkıştırabilir ve yine AWS S3 gibi güvenli bir konuma yükleyebilirsiniz. - AWS S3 Entegrasyonu: AWS S3, web sitenizin yedeklerini depolamak için ideal, uygun maliyetli ve yüksek düzeyde dayanıklı bir depolama çözümüdür. Ansible ile AWS CLI'yı kullanarak yedekleme dosyalarını S3'e otomatik olarak yükleyebilirsiniz. Bir cron görevi ile bu Ansible playbook'u düzenli olarak çalıştırarak tam otomatik bir yedekleme sistemi kurabilirsiniz.
Bu ileri düzey ipuçları ve otomasyon stratejileri, WordPress sitenizin sadece çalışır durumda olmasını değil, aynı zamanda yüksek performanslı, güvenli ve sürdürülebilir olmasını sağlayacaktır.
Sonuç ve Sıkça Sorulan Sorular
Bu makale boyunca, AWS üzerinde bir WordPress LEMP sunucusunu Ansible ile tamamen otomatik bir şekilde nasıl kuracağımızı, SSL sertifikasını nasıl entegre edeceğimizi ve ardından performans, güvenlik ve mobil uyumluluk için ileri düzey ipuçlarını nasıl uygulayacağımızı öğrendik. Manuel kurulumların getirdiği karmaşıklığı ve hata payını ortadan kaldırarak, dağıtım süreçlerimizi hızlandırmak ve tutarlılığı artırmak için otomasyonun gücünden faydalandık.
Ansible'ın deklaratif yapısı ve idempotence özelliği sayesinde, sunucu yapılandırmanızı bir kod olarak tanımlayabilir ve bu kodu tekrar tekrar, güvenle çalıştırabilirsiniz. Bu, DevOps yaklaşımlarının temelini oluşturur ve günümüzün modern BT altyapı yönetiminde vazgeçilmez bir araç haline gelmiştir. Artık sunucularınızı birkaç dakika içinde sıfırdan kurabilir, SSL'inizi entegre edebilir ve hatta yedekleme işlemlerinizi otomatikleştirerek iş yükünüzü önemli ölçüde azaltabilirsiniz. Bu yaklaşım, sadece zamandan ve emekten tasarruf sağlamakla kalmaz, aynı zamanda altyapınızın daha güvenli, daha kararlı ve daha ölçeklenebilir olmasını da garanti eder.
Umarız bu rehber, kendi otomatik WordPress LEMP sunucunuzu AWS üzerinde başarıyla kurmanıza yardımcı olmuştur. Unutmayın, otomasyon sürekli bir süreçtir; playbook'larınızı geliştirmeye ve yeni özellikler eklemeye devam edin!
Sıkça Sorulan Sorular
-
LEMP yerine LAMP kullanmak mümkün mü?
Evet, elbette mümkün. LAMP (Linux, Apache, MySQL, PHP) yığını da WordPress için oldukça popüler ve yaygın olarak kullanılan bir kombinasyondur. Apache'nin
.htaccessdosyaları gibi bazı özellikleri, WordPress eklentileriyle daha iyi entegrasyon sağlayabilir. Ancak Nginx (LEMP'teki "E"), özellikle yüksek trafikli sitelerde ve statik içerik sunumunda genellikle daha iyi performans ve kaynak verimliliği sunar. Tercihiniz Apache yönündeyse, Ansible playbook'unuzdaki Nginx ile ilgili görevleri Apache kurulumu ve yapılandırmasıyla değiştirmeniz gerekir. -
Ansible playbook'larımı nasıl sürüm kontrolünde tutarım?
Ansible playbook'larınızı, envanter dosyalarınızı ve template'lerinizi Git gibi bir sürüm kontrol sisteminde (örn. GitHub, GitLab, Bitbucket) saklamanız şiddetle tavsiye edilir. Bu, değişiklikleri takip etmenizi, farklı versiyonlar arasında geçiş yapmanızı, ekip içinde işbirliği yapmanızı ve bir sorun durumunda kolayca önceki bir sürüme geri dönmenizi sağlar. Her bir değişiklik için anlamlı commit mesajları kullanmak da iyi bir pratik olacaktır.
-
Birden fazla WordPress sitesi kurabilir miyim?
Evet, kesinlikle. Ansible playbook'unuzu, Nginx'te birden fazla
serverbloğu ve her site için ayrı veritabanı/kullanıcı oluşturacak şekilde genişletebilirsiniz. Bu, Ansible'daki döngüler (loops) ve değişkenler kullanılarak kolayca yapılabilir. Her site için farklı değişken dosyaları (group_varsveyahost_vars) kullanarak konfigürasyonları ayırabilirsiniz. Ayrıca, WordPress'in multisite özelliğini de düşünebilirsiniz. -
SSL sertifikası neden otomatik yenilenmeli?
Let's Encrypt tarafından sağlanan SSL sertifikaları, ücretsiz olmaları karşılığında 90 günlük kısa bir geçerlilik süresine sahiptir. Bu süre zarfında sertifika yenilenmezse, siteniz tekrar "Güvenli Değil" uyarısı gösterecek ve ziyaretçileriniz siteye erişimde sorun yaşayacaktır. Certbot'un otomatik yenileme özelliği sayesinde bu manuel yenileme derdinden kurtulur ve sitenizin kesintisiz HTTPS erişimi sağlamaya devam ettiğinden emin olursunuz. Yenileme işlemi genellikle son 30 gün içinde yapılır.
-
AWS dışında başka bulut sağlayıcılarda bu yöntem geçerli mi?
Evet, genel olarak bu yöntem AWS dışında DigitalOcean, Google Cloud Platform (GCP), Microsoft Azure gibi diğer bulut sağlayıcılarda da geçerlidir. Ansible, SSH üzerinden çalıştığı için altta yatan bulut platformundan bağımsızdır. Tek fark, sunucu (instance) oluşturma adımları ve Ansible envanter dosyasında sunucuya bağlanmak için kullanacağınız kimlik doğrulama bilgileri (genel IP, kullanıcı adı ve SSH anahtarı) olacaktır. Playbook'un çoğu kısmı (paket kurulumu, Nginx/MariaDB/PHP konfigürasyonu) aynı kalacaktır.
