Vagrant ile LEMP Geliştirme Ortamı

Merhaba arkadaşlar,

Önceki yazımda XAMPP ile PHP geliştirme ortamını nasıl kurabileceğinizden bahsetmiştim. Şimdi ortamı biraz daha geliştireceğiz çünkü XAMPP’ın bize yetmeyeceği durumlar olabilir. Örnek veriyorum MySQL değil de MongoDB kullanmak istiyoruzdur, NodeJS’e ihtiyacınız vardır yada farklı bir şeylere ihtiyacınız vardır. Bu yazımda sanal makinamızı bir sunucu gibi kullanmaktan bahsedecek ve bir sunucuda yapabileceğimiz tüm her şeyi sanal makinemizde nasıl otomatik olarak yapabileceğinizi göstereceğim.

Öncelikle ortamı sağlayabilmemiz için Vagrant ve ORACLE VirtualBox‘a ihtiyacımız olacak. Vagrant, VirtualBox üzerinden sanal makine oluşturup gerekli yazılımların kurulumunu sağlamakta bize yardımcı olacak. Sanal makine için gerekli komutları yazımda anlatacağım fakat belirtmek isterim ki yazıyı yazma amacım Vagrant’ın kullanımından çok LEMP ortamını sağlayabilmek olduğu için sadece bize yetecek temel komutları göstereceğim.

 

VAGRANT

vagrant

Vagrant sanal makine oluşturup, bu makineyi konsol ile yönetebilmenizi sağlar. Nasıl olur bu diyorsanız olay şöyle işliyor. Elinizde Ubuntu 16.04 işletim sisteminin kurulu olduğu bir sunucu olduğunu ve bu sisteme nginx kurmak istediğinizi hayal edin. Ne yapmanız gerekiyor? Öncelikle sunucuya bağlanırsınız sonrasında konsol üzerinden nginx’i indirir ve eğer varsa gerekli ayarlamaları yaparsınız. Aslında yaptığınız işlemler bir arayüze ihtiyaç duymadan konsol üzerinden çalıştırılan komutlardan ibaret. Vagrant bize bunu sağlıyor işte. Bilgisayarınızda sanal bir makine oluşturarak ona bir işletim sistemi indirmesini söylüyorsunuz ve sonrasında yapacağı işlemleri Vagrant’a bir dosya ile bildiriyorsunuz(Vagrantfile). Vagrant teker teker istediğiniz işlemleri yaparak makinenizi ayağa kaldırıyor ve size işletim sisteminizden bağımsız bir yazılım geliştirme ortamı sunuyor. Yazdığınız dosyayı takım arkadaşlarınızla da paylaşarak aynı ortama sahip olabiliyor, ‘Bende çalışıyordu sende neden çalışmıyor??’ tarzında yakınmalardan da kurtuluyorsunuz. Hatta ilerde projenizi geliştirip insanlara sunmaya başladığınız zaman kuracağınız sunucu da sanal bilgisayarınızla aynı özelliklere sahip olacağı için farklılıklardan kurtulacaksın ve hataları en aza indireceksiniz.

 

ORACLE VirtualBox

virtualbox

VirtualBox bilgisayara ait fiziki özellikleri(ekran kartı, hdd, vs) yazılımsal olarak taklit edip, sanal bir makine üzerinde işletim sistemi kurmanızı sağlayan bir programdır. Sanal makinede yaptığınız işlemler bilgisayarınızı etkilememektedir. Biz Vagrant ile sanal makinemizi kontrol edeceğiz. Herhangi bir şekilde arayüzüyle ilgilenmemize gerek yok. Kurmanız yeterli.

 

Temel Vagrant Komutları

Basit bir sanal makine oluşturmak için gerekli olan temel komutları listeleyelim şimdi.

vagrant init {kutu-adı}

Vagrantfile dosyasını bulunduğunuz dizinde oluşturacak komuttur. Sıfırdan yazacağınız Vagrantfile dosyası için hazır bir şablon sağlamaktadır. Eğer halihazırda elinizde bir Vagrantfile dosyası varsa bu komutu kullanmanıza gerek yoktur. Komutun ilk parametresi kutu adıdır. Kutu adıdan kastın nedir diye sorarsanız şöyle açıklayabilirim. Vagrant’ın kendi sitesinde kullanabileceğiniz işletim sistemi imajları bulunmaktadır. Listeden istediğiniz dosyayı seçerek, kutu adı olarak girdiğiniz zaman eğer sisteminizde bu imaj yoksa Vagrant bu imajı indirecek ve Vagrantfile dosyasına ekleyecektir, eğer önceki kutularınızda kullandığınız bir imaj ise yani imajı önceden indirmişseniz sadece Vagrantfile dosyasını düzenleyecektir.

İstediğiniz herhangi bir imaj dosyasını verdiğim adreste kolayca bulabilirsiniz. Biz yazımızda LEMP’i elle kuracak olmamıza rağmen verdiğim adreste LEMP kurulu gelen bir imaj dosyası bulmanız muhtemel. Sadece LEMP değil başka ihtiyaçlarınızı karşılayacak imajları da burada bulabilirsiniz. Ek olarak kutuların yayınlanma tarihlerine bakarsanız çoğu kutunun gün içinde güncelleme aldığını ve kutuların sürekli güncel olduğunu görebilirsiniz.

vagrant up

Makinenizi ayağa kaldıracak komuttur. Kapalı olan sanal bilgisayarınızın güç tuşuna basmış olduğunuzu düşünebilirsiniz. Bilgisayarınızı açmakla kalmayacak olup, oluşturduğumuz Vagrantfile dosyası içerisindeki komutları çalıştırır.

vagrant ssh

Makinenizin açıldıktan sonra makineye konsol ile bağlanabileceğiniz komuttur. Nasıl bir sunucuya bağlanırken ssh root@10.10.10.10 tarzında bir komut kullanıyorsak bu komut da aynı şekilde sanal makinemize bağlanmamızı sağlayacaktır.

vagrant halt

Makinenizi kapatacak komuttur.

vagrant destroy

Makine ve makineye bağlı dosyaları siler. Eğer makineyi kaldırmak istiyorsanız kullanmanız gerekmektedir çünkü çalıştığımız klasörü silmeniz sanal bilgisayarı kaldırmanız için yeterli olmayacaktır.

 

Ortamın Kurulması

/* Ben bunları biliyorum bana hazır LEMP kodlarını versene diyorsanız en sondaki paragrafa atlayabilirsiniz. */

Çalışacağımız dizine girip vagrant init ubuntu/xenial64 komutuyla Vagrantfile dosyasını oluşturuyoruz ve Ubuntu 16.04 sürümünün inmesini bekliyoruz. Vagrantfile dosyasının hemen yanına bir tane klasör açıyoruz ve içerisine bootstrap.sh ve nginx_vhost adında iki tane dosya yerleştiriyoruz. Şuan elimizde şöyle bir klasör yapısı olması gerekiyor.

Vagrantfile dosyamız da şöyle bir hazır kodlar ile gelecek.

# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "ubuntu/xenial64"

  # Disable automatic box update checking. If you disable this, then
  # boxes will only be checked for updates when the user runs
  # `vagrant box outdated`. This is not recommended.
  # config.vm.box_check_update = false

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine and only allow access
  # via 127.0.0.1 to disable public access
  # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"

  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  # config.vm.network "public_network"

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  # end
  #
  # View the documentation for the provider you are using for more
  # information on available options.

  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end

Bu üç dosyayı ve bir klasörü düzgünce ayarladıysanız şimdi Vagrant’ı yapılandırmaya geçebiliriz.

Altta yapacağımız tüm işlemler configure methodunun içinde zaten yer alıyor. Yorum satırlarını kaldırarak yada verdiğim kodları direkt ekleyerek devam edebilirsiniz. Ekleyeceğiniz kodların bu blokta olduğundan emin olun.

Vagrantfile dosyamızı oluşturduk ve kullanacağımız işletim sistemini içerisine dahil ettik. Şimdi sanal makineye ulaşabilmek için bir ip adresi tanımlayacağız sonrasında makinedeki HTTP portunu yönlendireceğiz.

config.vm.network "forwarded_port", guest: 80, host: 80
config.vm.network "private_network", ip: "127.0.0.1"

Artık localhost adresinden makinemizdeki HTTP portuna ulaşabileceğiz. Eğer guest‘i değiştirirseniz localhost:SAYI şeklinde de makinenize ulaşabilirsiniz. Ben keyfi olarak böyle bıraktım, siz istiyorsanız farklı şekilde kullanabilirsiniz.

Sonrasında dizinimizde bulunan dosyaları makine içinde göstermemiz gerekiyor. Yani iki tarafın senkronize olmasını sağlamamız lazım. Altta gördüğünüz kod ile bilgisayarımızda şuan bulunduğunuz dizin ile sanal makinemizdeki /vagrant klasörünün senkronize olmasını sağlayacağız.

config.vm.synced_folder "./", "/vagrant", disabled: true

Makinemizle ilgili yapacağımız son şey ise gerekli yazılımları yüklemek ve gereken ayarları yapmak olacak. Bunun için öncelikle yazılımları yükleyeceğimiz bootstrap.sh dosyasını Vagrant’a bildirmemiz gerekiyor.

config.vm.provision "shell" do |s|
  s.path = "provision/bootstrap.sh"
end

Artık bootstrap.sh dosyasını ayarlamaya geçebiliriz. Dosyamızı yazmaya sistemimizi güncelleyerek başlıyoruz.

#!/bin/bash

echo "(Setting up your Vagrant box...)"

echo "(Updating apt-get...)"
sudo apt-get update > /dev/null 2>&1

Not: /dev/null 2>&1 ile yazılımlar yüklenirken karşımıza çıkacak yazıları engelleyebilir ve echo ile bilgi amaçlı konsol çıktısı üretebiliriz.

Nginx, MySQL, PHP ve PHP’ye bağlı gerekli modülleri yükleyerek, MySQL yapılandırmasını yapacağız.

# MySQL
echo "(Preparing for MySQL Installation...)"
sudo apt-get install -y debconf-utils > /dev/null 2>&1
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password root"
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password root"

# MySql Server
echo "(Installing MySQL...)"
sudo apt-get install -y mysql-server > /dev/null 2>&1

# Php Modules
echo "(Installing PHP and MySQL module...)"
sudo apt-get install -y php-fpm php-mysql php-curl php7.0-xml php7.0-intl php7.0-gd php7.0-mbstring > /dev/null 2>&1

Makinemiz açıldığında nginx’in de otomatik yapılandırılmış gelmesini istediğimiz için provision klasöründe bulunan nginx_vhost dosyasını gerekli dizinlere kopyalıyoruz.

# Nginx Config
echo "(Overwriting default Nginx config)"
sudo rm -rf /etc/nginx/sites-available/default > /dev/null 2>&1
sudo cp /vagrant/provision/nginx_vhost /etc/nginx/sites-available/default > /dev/null 2>&1
sudo cp /vagrant/provision/nginx_vhost /etc/nginx/sites-enabled/default > /dev/null 2>&1

nginx_vhost dosyamızı da şöyle paylaşıyorum. Normalde Laravel’le çalışmak üzere ayarlanmış fakat siz istediğiniz gibi düzenleyerek kendinize uygun hale getirebilirsiniz.

server {
    listen 80;
    server_name localhost;

    root /vagrant/public;
    index index.php index.html index.htm index.nginx-debian.html;

    # Important for VirtualBox
    sendfile off;

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

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

    location ~ /\.ht {
        deny all;
    }
}

Nginx ve PHP kullanıcılarını, yetki sorunu yaşamamak için www-data‘dan bizim kullanacağımız ubuntu kullanıcısına çeviriyorum ve yaptığım işlemlerin geçerli olabilmesi için ikisini yeniden başlatıyorum.

# Change Nginx user config
echo "(Changing Nginx user config)"
sudo sed -i -e 's/www-data/ubuntu/g' /etc/nginx/nginx.conf

# Change Php User for permissions
echo "(Changing PHP User)"
sudo sed -i -e 's/www-data/ubuntu/g' /etc/php/7.0/fpm/pool.d/www.conf

# Restarting Nginx for config to take effect
echo "(Restarting Nginx for changes to take effect...)"
sudo service nginx restart > /dev/null 2>&1

# Restarting Php for config to take effect
echo "(Restarting Php for config to take effect)"
sudo service php7.0-fpm restart > /dev/null 2>&1

Son olarak kullanıcımızın parolasını belirliyorum. Olur da lazım olur.

# Setting User
echo "(Setting Ubuntu (user) password to \"vagrant\"...)"
echo "ubuntu:vagrant" | chpasswd

Artık makinemizi açabiliriz. Bulunduğumuz dizinde vagrant up komutunu çalıştırıyoruz ve makinemiz yazdığımız kodlara göre yüklemeleri yapıyor ve sistemi hazırlıyor.

Kodları değiştirerek istediğiniz yazılımları kurabilir, ayarlamaları yapabilir, sunucuya istediğiniz gibi hükmedebilirsiniz. Sunucu elinizin altında sonuç olarak, artık ne yapacağınız size kalmış.

Şunu da söylemem gerek ki geliştirme ortamı için artık Vagrant dışında bir şey kullanmıyorum. Vagrant her türlü işimi görüyor. Bir kere kullandıktan sonra sizin de alışacağınıza ve sağladığı imkanları beğeneceğinize eminim.

Bu arada üst tarafa bahsettiğim hazır dosyaları şurada forkladığım bir repository’de bulabilirsiniz. İstediğiniz yere atıp makineyi up’layın ve keyfinize bakın.

İyi kodlamalar.

 

Add comment

Kategoriler

Etiketler