25 Kasım 2015 Çarşamba

DigitalOcean Taşınma Maceram

Bir süredir barındırma sunucum bana maliyetli gelmeye başlamıştı. Malum dolar 3 TL bulunca ve sadece WHM için 40 TL civarında verince yok artık dedim ve DigitalOcean'a (DO) transfer olmaya kadar verdim. Aslında öncesinde "Linode mi (ek IP alınabiliyor) DigitalOcean mı" diye araştırınca ve Linode eski müşterilerinden bazı olumsuz yorumlar alında DO'ya transferde karar kıldık. Taşınma ile ilgili tüm notlarımı ihtiyacı olanlar için paylaşacağım.

Taşınmaya karar verdiyseniz DigitalOcean kayıt referans linkimi kullanabilirsiniz :)
https://m.do.co/c/b7276c06e18e

Öncelikle ihtiyaçları belirleyelim:

  1. Özel nameserver tanımlama
  2. Ubuntu 14.04 LEMP (Linux, Nginx, Php, MySQL)
  3. DNS Yönetimi (DO üzerinde)
  4. Ioncube Loader Kurulumu
  5. Çoklu alan adı tanımlama
  6. MySQL'e Erişim ve Eski Verileri Taşımak
  7. Yandex.Kurumsal için MX ayarları
  8. PHP Cli ve Cron
  9. .htaccess ve Nginx Sorunsalına Çözüm
  10. Wordpress ve Nginx İlişkisi
  11. SSH Key Eklenmesi
  12. Rsync ile Sunucudan Sunucuya Dosya Aktarımı (yeni)
  13. SSL tanımlanması (Let's Encrypt) (yeni)
  14. Bonus (Shell Scriptler) (yeni)
  15. Nginx Versiyonu Gizlemek ve Server Header Bilgisini Değiştirmek (yeni)
  16. Kaynaklar

1. Özel NameServer Tanımlama

Öncelikle mevcut sitelerin ana domainini taşımak yerine sadece ns kaydını oluşturarak birkaç test domaini taşımayı tercih ettim. Bu arada hem bazı konuları test etmiş hem de alışmış olacaktırm. İlk iş kendi özel NS bilgilerimi oluşturmak. Aslında DO'nun NS kullanacağız ama whois'de kendi domainimiz görünecek.

Domain firmasından NameServer Oluştur diyerek DO'nun aşağıdaki NS'lerine atadığı IP adreslerini kendi oluşturduğum NS'lere atadım.

ping ns1.digitalocean.com
ping ns2.digitalocean.com
ping ns3.digitalocean.com

Bunlardan aldığım IP adreslerini kendi domainimde oluşturduğum ns'lere sırasıyla atadım. Tabi aktif olabilmesi için aynı atama işlemini mevcut sunucumdaki DNS üzerinde de geçici olarak yaptım. En son taşınacak domain NS tanımlı domain olacağı için bu işlemi en son DO üzerinde yapacağız.

2. Ubuntu 14.04 LEMP Kurulumu

Aslında bu işlem DO'da oldukça basit, Droplet oluştururken droplet adı, lokasyonu ve işletim sistemi seçim sekmesinin yanındaki One Click App'a tıklayıp aşağıdan LEMP seçmeniz ve kullandığınız linux sistemdeki SSH Keys girdikten sonra (ssh-keygen -y ile oluşturulabilir) Create tıklamanız yeterli. SSH Keys önemli bir adım çünkü onunla sunucumuza bağlanıp bazı ayarları orda yapacağız.

3. DNS Yönetimi

Öncelikle ilgili domain için Domain firmasında NS ayarlarını 1. adımda tanımlanan NS'leri girmelisiniz. Aksi halde oluşturulan Droplet'e yönlendirme yapılmamış olacaktır.

Tanımlama işlemi sonrası DO paneline giriş yaptıktan sonra Networks > Domain sekmesine tıklayın. Açılan ekrana domain adını www olmadan girin ve 2. adımda oluşturduğunuz Droplet'i seçin.

Burda bazı detayları belirtmek istiyorum. Domain ilk tanımlandığında domain.com şeklinde kullanılabilir. Eğer www.domain.com şeklinde kullanmak istiyorsanız CNAME sekmesine tıklayıp:
Enter Name: www         Enter Hostname: domaininiz.com.
ardından Create CNAME Record tıklayınız. Domainin sonundaki noktayı unutmamalısınız. Bir süre sonra domaininizi www.domain.com olarak kullanabildiğinizi göreceksiniz.

4. Ioncube Loader Kurulumu

SSH Key ile root olarak sunucumuza aşağıdaki gibi giriş yapıyoruz:
ssh root@ip-adresim -i ~/.ssh/id_rsa.pub
Benim LEMP'de php 5.5.9 sürümü kurulu geldi. Sistem ise 64 bit'ti. Eğer farklı bir sürüm Ubuntu veya PHP kullanıyorsanız ona göre ilgili komutları düzeltmeniz gerekebilir.

Ioncube'yi indirip açıyorum ve ardından PHP Extension dizinine gönderiyorum. Son olarak nginx ve php servislerini yeniden başlatıyorum:
wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar -zxvf ioncube_loaders_lin_x86-64.tar.gz
cp ioncube/ioncube_loader_lin_5.5.so /usr/lib/php5/20121212
chmod 644 /usr/lib/php5/20121212/ioncube_loader_lin_5.5.so
Bu adımdan sonra php.ini'nin düzenlenmesi gerekiyor:
nano /etc/php5/fpm/php.ini
nano ile php.ini açtıktan sonra standarta uymak için "Module Settings" üstündeki alana aşağıdaki satırı ekliyoruz:
zend_extension=/usr/lib/php5/20121212/ioncube_loader_lin_5.5.so
CTRL + X ile çıkış yaparken "kaydedeyim mi?" sorusuna da "Y" dedikten sonra php.ini düzenleme işlemimiz tamamlanıyor. Ardından servislerin yeniden başlatılması ile işlemimiz tamamlanıyor.
service php5-fpm restart
service nginx restart
NOT: DO'nun dökümantasyonlarında bazı kolaylıklar sağlanmaya çalışılmış ama CLI komutlarında php5-fpm yerine php kullanılmış ve sonrasında php5-cli kurayım mı? diye dönüşler alabilirsiniz, heyecanlanmadan dökümana devam edin.

5. Çoklu alan adı tanımlama

Ben nginx'in varsayılan dizini yerine /var/www/ dizinini kullanmayı tercih ediyorum. Yazımız ona göre devam edecek. Öncelikle 2 domain için klasörleri oluşturalım:
mkdir -p /var/www/domain1.com/html
mkdir -p /var/www/domain2.com/html
Ardından domainler için SSH ile giriş yaptığımız kullanıcıya yetki atamalarını yapalım:
chown -R $USER:$USER /var/www/domain1.com/html
chown -R $USER:$USER /var/www/domain2.com/html
Son olarak /var/www/ klasörünün  chmod'unu ayarlayalım:
chmod -R 755 /var/www
Varsayılan klasöre bir phpinfo() bilgisini veren index.php atalım:
echo '<?php phpinfo(); ?>' > /var/www/domain1.com/html/index.php
echo '<?php phpinfo(); ?>' > /var/www/domain2.com/html/index.php
Şimdi sıra nginx tarafındaki ayarları yapmaya geldi. Öncelikle varsayılan ayar dosyasını eklediğimiz domainler için kopyalayalım:
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/domain1.com
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/domain2.com
Ve ayar dosyasını nano ile açarak gerekli düzenlemeleri iki domain için de yapalım. İlk domain ile ikinci domain arasındaki fark default_server ve altındaki satırdaki default_server ipv6only=on kısımlarının olmaması. Buraya dikkat edilmez ise nginx'i yeniden başlattığınızda hata alırsınız:
nano /etc/nginx/sites-available/domain1.com
Domain1.com için Aşağıdaki ayarları uyguluyoruz (çıkış için CTRL + X ve Y ile kaydediyoruz):
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    root /var/www/domain1.com/html;
    index index.html index.htm index.php;
    server_name domain1.com www.domain1.com;
    client_max_body_size 50M;
    location / {
        try_files $uri $uri/ =404;
    }
}
Domain2.com için:
server {
    listen 80;
    listen [::]:80;
    root /var/www/domain2.com/html;
    index index.html index.htm index.php;
    server_name domain2.com www.domain2.com;
    client_max_body_size 50M;
    location / {
        try_files $uri $uri/ =404;
    }
}

NOT: Varsayılan ayarlarda daha fazla seçenek var bu nedenle sadece koyu belirtilen kısımları da düzenleyerek kaydedebilirsiniz. Aktarımlarda sıkıntı olmaması için client max body 50M olarak ekledim.

Ayarların linkini oluşturuyoruz:
ln -s /etc/nginx/sites-available/domain1.com /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/domain2.com /etc/nginx/sites-enabled/
Nginx varsayılan ayarlarını siliyoruz:
rm /etc/nginx/sites-enabled/default
Nginx config dosyasını aşağıdaki gibi açıp server_names_hash_bucket_size 64; satırının başındaki # işaretini kaldırıp aktif ediyoruz ve çıkış kaydediyoruz:
nano /etc/nginx/nginx.conf
Son olarak nginx'i yeniden başlatıyoruz:
service nginx restart
Sıra geldi sitemizi test etmeye: www.domain1.com :)

NOT: Eğer yeniden başlatma sırasında "fail" hatası alırsanız yukarıdaki adımları tekrar kontrol etmeniz ve gerekli düzeltmeyi yapmanız gerekecektir. İlk denememde hem yazı yazıp hem de denediğim için ben aldım :)

BONUS: Eğer herhangi bir hata ile karşılaşırsanız detayını öğrenmek için:
nginx -c /etc/nginx/nginx.conf -t

SON NOT: Eğer 3., 4., .. domain eklenecek ise Domain2.com'da yaptığınız işlemi tekrarlamalısınız.

6. MySQL'e Erişim ve Eski Verileri Taşımak

Öncelikle PHPMyAdmin indirip domainlerimizden birine taşıyalım. Sonraki adımlarda ise kullanıcı oluşturulması, mevcut DB eski sunucudan yine PHPMyAdmin yardımıyla yedeklenmesi ve yeni sunucumuza yüklenmesi var:
wget https://files.phpmyadmin.net/phpMyAdmin/4.5.2/phpMyAdmin-4.5.2-all-languages.tar.gz
tar -zxvf phpMyAdmin-4.5.2-all-languages.tar.gz
mv phpMyAdmin-4.5.2-all-languages pma
mv pma/ /var/www/domain1.com/html/
Mevcut MySQL servisimizin root şifresi ssh ile ilk login olduğumuzda motd ekranında yazıyordu. Tekrar bakalım:
cat /etc/motd.tail
Öncelikle mysql'e bağlanıp kullanıcı ve şifresini, database ve yetkilerini oluşturalım. Yetkileri ayarlayıp uyguladıktan sonra da çıkış yapalım. Koyu alanları değiştirmelisiniz:
mysql -u root -p'root şifreniz'
CREATE DATABASE IF NOT EXISTS domain1;
CREATE USER 'domain1'@'localhost' IDENTIFIED BY 'sifre';
GRANT ALL PRIVILEGES ON domain1.* TO 'domain1'@'localhost';
FLUSH PRIVILEGES;
quit;
Artık eski sunucumuzdan PHPMyAdmin ile SQL yedeğini alıp aktarımı domain1.com/pma/ adresine oluşturduğumuz kullanıcı ile giriş yaparak oluşturabiliriz.


NOT: Şifre oluşturmak için http://passcreator.com/ sitesini kullanabilirsiniz.

7. Yandex.Kurumsal için MX ayarları

Aslında DNS Yönetimi ile arasında bir fark yok. Networks > Domain kısmından giriş yapıp Domain eklenmediyse ekleyip, eklendiyse seçip üstteki MX sekmesine tıklıyoruz ve ardından aşağıdaki gibi sonunda nokta'yı unutmadan ekliyoruz.
Enter Hostname: mx.yandex.net.         Enter Priority: 10

İsterseniz bir de CNAME kaydı girerek mail.domain1.com yazıldığında yandex.mail'e yönlendirebilirsiniz. CNAME sekmesine tıklayıp:
Enter Name: mail         Enter Hostname: domain.mail.yandex.net.

8. PHP Cli ve Cron

Bir sitemde belirli periyotlarda cron ile çalışan php scriptim var. Resim oluşturup bunu Twitter'a gönderiyor. Ubuntu LEMP kurduğumuz için php5-fpm yüklü olarak gelir fakat cron için php-cli yüklememiz gerekir. Bunun için:
apt-get install php5-cli
Ardından crontab'ı açıp (ilk açışta editör sorar, nano tercih ediyorum):
crontab -e
Altına öğlen 12:00'da çalışacak php satırını ekliyorum. Siz süresi işleminize göre düzenleyebilirsiniz. Detaylı cron yazılması ile ilgili kaynak kodlarına bakabilirsiniz.
0 12 * * * /usr/bin/php -q /var/www/domain1.com/html/cron.php

9. .htaccess ve Nginx Sorunsalına Çözüm

Apache'den aşina olduğumuz ve birçok projemizde kullandığımız .htaccess Nginx'de haklı sebeplerden dolayı kullanılmamakta. Buna her sitenin config dosyasına yazarak çözüm bulmaktadır. Öncelik mevcut .htaccess çevirimini aşağıdaki adresten yapın:
http://www.anilcetin.com/convert-apache-htaccess-to-nginx/
Ardından ilgili domainin config dosyasını nano ile aşağıdaki gibi açın:
nano /etc/nginx/sites-available/domain1.com
Çevrilen kodları koyu olarak örnekte gösterildiği yere yapıştırın:
location / {
        try_files $uri $uri/ =404;
        #.htaccess
        if (!-f $request_filename){
                set $rule_0 1$rule_0;
        }
        if (!-d $request_filename){
                set $rule_0 2$rule_0;
        }
        if ($rule_0 = "21"){
                rewrite ^/(.*)$ /index.php?domain=$1 last;
        }
        rewrite ^/sorgu?domain=(.*)$ /index.php?domain=$1 last;
}
Son olarak nginx'i reload etmeniz yeterli:
service nginx reload 
Herhangi bir hata (fail) alırsanız 5. maddenin BONUS'undan faydalanabilirsiniz.

10. Wordpress ve Nginx İlişkisi

Wordpress'i eğer seo url yöntemiyle kullanıyorsanız ki büyük ihtimalle öyledir bu durumda Nginx config de bunu belirtmeniz ve bulunamayan dosya/klasör isteklerini index.php parametre olarak gönderilmesini sağlamanız lazım. Bunun için öncelikle nginx'in o domain için olan config dosyasını açın:
nano /etc/nginx/sites-available/domain1.com
Ardından aşağıdaki satırı:
try_files $uri $uri/ =404;
aşağıdaki gibi değiştin:
try_files $uri $uri/ /index.php?$args;
Değişikliklerin aktif olabilmesi için:
service nginx reload

NOT: Wordpress'i eğer alt klasöre kuruyorsanız ilgili klasörü de /wp/index.php?$args şeklinde belirtmelisiniz.

Nginx config dosyasında yapılabilecek daha birçok ayar mevcut. Detaylar için kaynakta yer alan nginx linkini inceleyebilirsiniz.

11. SSH Key Eklenmesi

Droplet'inize SSH Key'i ilk kurulum sırasında eklemediyseniz aşağıdaki gibi öncelikle ssh-key oluşturmalısınız:
ssh-keygen
İkinci adım olarak xclip ile oluşturduğunuz ssh anahtarını (key) kopyalayabilirsiniz:
xclip -sel clip .ssh/id_rsa.pub
Son adım olarak kopyaladığınız anahtarı sunucunuza root ile giriş yaptıktan sonra aşağıdaki gibi dosyayı açıp kaydedin. Eğer ikinci bir ssh anahtar ekleyecekseniz mevcut anahtarın alt satırına eklemeniz yeterli:
nano .ssh/authorized_keys

NOT: Eğer erişim sıkıntısı yaşıyorsanız DO paneline login olarak şifrenizi sıfırlayabilirsiniz. Yeni şifreniz mail adresinize gelecektir. İlk girişte değiştirmeniz istenir.


12. Rsync ile Sunucudan Sunucuya Dosya Aktarımı
Bilindiği üzere Rsync ile hem sunucudan sunucuya hem de aynı sunucu veya bilgisayar'da klasör eşitlemesi yapabilirsiniz. Bu yöntem ile sıkıştırılması uzun süren, kısıtlı yer nedeniyle aktarım sorunları yaşayan ve en önemlisi de sunucuların hız avantajını kullanarak direk birebir aktarım yapmak için kullanabilirsiniz. Ben en kısa yoldan yapılmasını göstereceğim, isterseniz ssh-key oluşturup daha güvenli bir bağlantı sağlamanız mümkün.
rsync -avzh * [email protected]:/var/www/oyunlarturk.com/html/
Kaynak kısmında detaylı dökümantasyonun yer aldığı url var.

13. SSL tanımlanması (Let's Encrypt)

Bilindiği üzere ISRG tarafından oluşturulmuş Let's Encrypt açık kaynak sertifika otoritesidir. Mozilla, Akamai, CISCO gibi güçlü sponsorlar tarafından desteklenmektedir. Şuan için Debian tabanlı linux dağıtımları tarafından kullanılabilmektedir. Basit ve hızlıca sertifikalarınızı oluşturabilirsiniz. Bende Ubuntu 14.04 Server üzerinde kurulumla ilgili basit bir döküman hazırladım. Öncelikle Let's Encrypt'i github üzerinden indirip hazır hale getirelim:
apt-get install git
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
Şimdi sıra SSL sertifikamızı oluşturmaya geldi. Ben otomatik kurulumda hatalar aldığım için direkt domain üzerinden kurulumu yaptım ve sorunsuz olarak çalıştı:
/root/letsencrypt/letsencrypt-auto certonly --webroot -w /var/www/domain1.com/html -d domain1.com -d www.domain1.com
Eğer herhangi bir hata almazsanız size nginx ayarlarında belirtmeniz gereken yolu verecektir. Bunu benim gibi tek tek domain ayarları oluşturduğunuzu varsayarak ilgili dosyaya aşağıdaki gibi eklemenizi tavsiye ediyorum:
server {
        listen 443 ssl;
        ....
        ssl_certificate /etc/letsencrypt/live/domain1.com/fullchain.pem;        ssl_certificate_key /etc/letsencrypt/live/domain1.com/privkey.pem;        ....
}
Sonrasında nginx'i ayarlarını yeniden yükleyerek aktif edebilirsiniz:
service nginx reload
Herhangi bir hata almanız durumunda 5. maddenin BONUS'unda belirttiğimiz hata kontrol komutu ile hatalı satırı bulabilirsiniz.

(yeni) 3 ay sonra (bende de olduğu gibi) SSL lisansınızın süresi doldu :) Şimdi lisans yenileme zamanı..
/root/letsencrypt/letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/var/www/domain1.com/html -d domain1.com -d www.domain1.com

14. Bonus (Shell Scriptler):

1- Domain Ekle: https://clbin.com/SYzJC (yeni)
2- MySQL veritabanı oluştur: https://clbin.com/TgKVd (yeni)
3- SSL Oluştur: https://clbin.com/uLX2r (yeni)
4- Timout Sorununa çözüm: https://easyengine.io/tutorials/php/increase-script-execution-time/
5- Nginx Webserver Güvenliği üzerine: http://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html

Shell scriptleri "chmod +x dosya" ile çalıştırılabilir yaptıktan sonra "./dosya.sh parametre" şeklinde çalıştırılabileceğini belirtmeme gerek yok sanırım :)

NOT: Shell scriptler örnek olması için oluşturulmuştur. Lütfen kullanım öncesi inceleyiniz. Tüm sorumluluk kullanan kişiye aittir.

15. Nginx Versiyonu Gizlemek ve Server Header Bilgisini Değiştirmek

16. Kaynaklar:

0 yorum:

Yorum Gönder