Ubuntu sunucuda Nginx ve Php-fpm nasıl kurulur? Webserver ve SSL ayarları nasıl yapılır?

Ubuntu sunucuları, güvenlikleriyle, sistem kaynaklarını çok ekonomik kullanmalarıyla ve özelleştirilebilir yapılarıyla çok fazla tercih edilmekte. Bu yüzden, özellikle ben güvenlik kısmının üst düzeyde olması sebebiyle tercih ediyorum ve bu yazımda webserver olarak kullanabileceğimiz nginx + php-fpm yapılandırmasını anlatıyorum. Ayrıca bu yazımda örnek bir domain yapılandırması yapacağız bunun yanında https ve ssl sertifikalarını oluşturacağız ve bu domaini internetde ulaşılabilir bir pozisyonda çalıştıracağız.

Öncelikle ubuntu sunucusunun kurulmuş olduğunu ssh panelini açtığınızı varsayarak kurulum talimatlarına başlıyorum. Öncelikle işlemleri yaparken zorlanmamak için ssh terminalinde aşağıdaki komutu çalıştırarak root yetkisine geçelim (şifre istediğinde root şifrenizi girin):

su

Bu aşamada artık root yetkimiz mevcut olacak ve sudo parametresini girmeden komutları çalıştırabileceğiz. Öncelikle ubuntu sunucusunu güncelleyerek başlıyoruz. Bu olası riskleri en aza indirecek, güvenlik güncellemelerini ve performans iyileştirmelerini almamızı sağlayacaktır. Aşağıdaki komutu çalıştırarak ubuntu sunucunuzu güncelleyin (onay isterse y yazarak onaylayın):

apt update
apt upgrade

Bu adımdan sonra ihtiyacımız olan nginx ve php-fpm kurulumunu yapalım.

NGINX ve PHP kurulumu

Aşağıdaki komutu çalıştırarak nginx ve php-fpm kurulumunu yapıyoruz (onay isterse y yazarak onaylayın):

apt install nginx php-fpm

Bu işlemden sonra nginx ve php-fpm kurulumu tamamlanmış olacak.

=== PHP-fpm kurulumunu kontrol edelim:

Kurulum sonunda hangi php versiyonunun kurulduğunu görebilirsiniz ancak yinede aşağıdaki kodu çalıştırarak hangi php versiyonunun kurulduğunu öğrenmemiz gerek, çünkü php-fpm sunucunu başlatırken, durumunu kontrol ederken yada kapatırken versiyon numarasını yazarak komutları çalıştırmamız gerekiyor. Php versiyonunu öğrenmek için aşağıdaki komutu çalıştırın:

php -v

Örnek çıkan sonuç bu şekilde olacaktır:

root@ubuntu-s-1vcpu-512mb-10gb-fra1-01:~# php -v
PHP 8.1.2-1ubuntu2.10 (cli) (built: Jan 16 2023 15:19:49) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.2-1ubuntu2.10, Copyright (c), by Zend Technologies

Örnek çıktıdaki PHP 8.1 alan bizim sunucumuzda kurulu olan php versiyonudur (sizde farklı versiyon olabilir) ve php sunucusunun çalışıp çalışmadığını aşağıdaki kodu çalıştırarak kontrol edelim:

systemctl status php8.1-fpm

Örnek çıktı aşağıdaki gibi olmalı:

Göreceğiniz gibi php-fpm sunucu şuan çalışıyor ve kullanıma hazır.

=== Php.ini yapılanıdırması (cgi.fix_pathinfo)

Ancak bu aşamada php.ini dosyasında küçük bir ayar yapmamız gerekiyor. Bu php’nin nginx ile başarılı şekilde iletişim kurması için gerekli. Aşağıdaki komutu kullanarak kurmuş olduğumuz php versiyonunda bulunan php.ini ayar dosyasını açalım. Burdaki versiyon numarası kısmına sizde kurulan php versiyonunu yazmayı unutmayın (eğer siz bu dokümanı okurken yeni php versiyonu çıkarsa diye)

nano /etc/php/8.1/fpm/php.ini

Bu ayar dosyasında aşağıdaki parametreyi bulun:

cgi.fix_pathinfo

cgi.fix_pathinfo bool 0|1: CGI için gerçek PATH_INFO/PATH_TRANSLATED desteği sağlar. PHP’nin önceki davranışı SCRIPT_FILENAME’e PATH_TRANSLATED atamak ve PATH_INFO’yu kaale almamaktı. PATH_INFO hakkında daha ayrıntılı bilgi edinmek için CGI belirtimine bakınız. Bu yönergeye 1 atamakla PHP CGI’nin CGICGI belirtimine uygun olarak dosya arama yollarını düzeltmesi sağlanmış olur. Sıfır atandığında ise PHP’nin önceki davranışı etkin olur. Öntanımlı değer sıfırdır. Betiklerinizi PATH_TRANSLATED değil SCRIPT_FILENAME kullanması için düzeltmelisiniz.

Bu kısmı aşağıdaki gibi 0 olacak şekilde değiştirin, ayrı olarak başında ; işareti varsa kaldırın:

cgi.fix_pathinfo=0

Sonrasında nanoyu kaydedip kapatın (CTRL+x sonra y ile onaylayıp enter yapın)

Önemli php ayarımızı yaptık, şimdi php’yi yeniden başlatarak ayarların aktif olmasını sağlayalım:

systemctl restart php8.1-fpm

Sonraki aşamaya geçip nginx webserver durumunu kontrol edebiliriz.

=== NGINX webserver durumunu kontrol edelim

Aşağıdaki komutu çalıştırarak nginx webserver’in çalışıp çalışmadığını yani sorunsuz kurulup kurulmadığını kontrol edelim

systemctl status nginx

Sonuç aşağıdaki gibiyse nginx sunucusu da çalışıyor demektir.

Nginx ve php-fpm sunucularının çalıştığını onayladığımıza göre bir domain belirleyerek nginx tanımlamasını yapıp çalıştırabilirz.

Yeni web sitesi ve domain kurulumu

Öncelikle kuracağınız domainin sunucu IP sine yönlendirildiğini varsayıyorum. Ben cloudflare kullandığım için örnek aşağıdaki gibi bir A kaydı ekliyorum. Siz hangi domain firmasını kullanıyorsanız DNS ayar kısmından A kaydı ekleyerek sunucu IPsini girin.

Şimdi domaine sunucuyu işaret ettiğimize göre sunucu tarafında nginx web sunucusunu ayarlayarak yeni domaini tanımlayalım.

=== Ubuntu yeni kullanıcı ekleme

Domaini tanımlamadan önce ubuntu üzerinde bu domain ve dosyalarıyla ilişkili bir kullanıcı oluşturuyoruz. Böylece site dosyalarının barındırılacağı alanıda tayin etmiş olacağız. Aşağıdaki komutu kullanarak yeni kullanıcıyı oluşturalım: (testsorucevap ismini kendinize göre düzenleyin, örnek domain ismine yakın olsunki karışıklık çıkmasın)

adduser testsorucevap

Komutu çalıştırdıktan sonra sizden şifre ve bir kaç bilgi isteyecek, onları sırasıyla girebilirsiniz, sonuç olarak kullanıcı ekleme işlemini bitirip kullanıcı klasörü içerisinde public_html adında yeni bir klasör oluşturacağız. Bu klasörde site dosyalarımız yer alacak.

Örnek komut: testsorucevap ismi önceki adımda oluşturduğunuz kullanıcı adı olacak

mkdir /home/testsorucevap/public_html

İçerisinede bir php dosyası oluşturalım, çalışıp çalışmadığını kontrol edebilmemiz için:

nano /home/testsorucevap/public_html/info.php

içerisine aşağıdaki kodu yazıp kaydedip çıkın (ctrl+x, y+Enter).

<?php
phpinfo();
?>

Bu işlemlerden sonra site dosyalarının ulaşılabilir olması için grup ve kullanıcı izinlerini aşağıdaki kod yardımı ile düzeltiyoruz. Böylece nginx site dosyalarını işlemeye başlayabilir: (sadece testsorucevap kısımlarını kendinize göre düzenleyin)

chown -R www-data:testsorucevap /home/testsorucevap

=== Nginx için domain (site) ekleme

Yeni domain için nginx içerisinde site isminde (örnek: testsorucevap) yeni bir dosya oluşturalım:

nano /etc/nginx/sites-enabled/testsorucevap.conf

Açılan ekrana aşağıdaki ayar kodlarını ekleyelim ancak içerisindeki domain isimlerini ve site root yolu kısımlarını kendinize göre düzenleyin ve kaydedin (ctrl+x, y+Enter):

Uyarı: php versiyonunuza göre bu kısmıda kendi versiyonunuza göre düzenleyin: php8.1

server {
	listen 80;
	listen [::]:80;

	server_name test.sorucevap.com;

	root /home/testsorucevap/public_html;
	index index.html index.php;

	# pass PHP scripts to FastCGI server
	#
	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/run/php/php8.1-fpm.sock;
	}
	
	location / {
		try_files $uri $uri/ =404;
	}
}

Bu işlemden sonra site konfigürasyonuda tamamlanmış olacak. Bu adımda nginx sunucusuna restart atarak ayarların aktif olmasını sağlamamız gerekiyor, bunun için aşağıdaki komutu çalıştırın:

nginx -t

#yada

systemctl restart nginx

Şimdi sitemizin çalışıp çalışmadığını kontrol etmek için bir tarayıcı açıp aşağıdaki gibi url yi test ediyoruz: http://test.sorucevap.com/info.php

Bu adıma kadar sorunsuz şekilde geldiyseniz, sunucumuz çalışıyor demektir ve php yapılandırmasıda sorunsuz çalışıyordur. Tebrikler artık http ile erişebileceğiniz bir siteniz var, ancak güvenlik sebebiyle sitenizi https yapısına taşımanız gerekiyor. Sonraki bölümde sunucuda ssl oluşturmayı ve nginx ile kolayca entegre etmeyi ele alacağız.

Ubuntu sunucuda SSL kurulumu

http protokolünü güvenli olan https protokolü ile değiştirmemiz gerekiyor. Bunun sebebi çoğu tarayıcının eski http bağlantılarını tehlikeli olarak görmesi. Bu yüzden sunucu taraflı şifreleme ile kullanıcı bilgilerini korumayı amaçlayan https internet bağlantı protokolünün kullanımını mecbur kılıyor. Hem sitenizi kullanan kişilerin güvenliği hemde yeni nesil tarayıcıların sitenizi tehlikeli olarak nitelendirmemesi için ubuntu sunucuda ssl yapılandırmasını yapmanızı şiddetle tavsiye ediyorum. Bu anlamda nginx ile kullanacağımız ssl protokolünün kurulumunu ve ayarlamalarını anlatacağım.

Öncelikle aşağıdaki komutu çalıştırarak ssl için gerekli olan uygulamaları kuralım:

sudo apt install certbot python3-certbot-nginx

Buradaki Certbot ile Let’s Encrypt’ ssl sertifikası oluşturacağız, diğer uygulama ilede bu sertifikanın nginx yapılandırmasına otomatik olarak yansıtılmasını sağlayacağız. Kurulumu tamamladığınızı varsayıyorum ve sonraki adımda domainimize özel ssl sertifikası oluşturmaya başlıyoruz, örnek komut aşağıdaki gibi olacaktır, bunu kendinize göre düzenleyin ve çalıştırın:

sudo certbot --nginx -d test.sorucevap.com

İlk kez sertifika oluşturuyorsanız sizden email adresinizi isteyebilir. Sonraki adımlarda y ile onay verip enter diyerek ssl sertifikasının oluşturulmasını bitirin. Örnek sonuç aşağıdaki gibi görünecek:

root@ubuntu-s-1vcpu-512mb-10gb-fra1-01:/# certbot --nginx -d test.sorucevap.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): [email protected]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
Account registered.
Requesting a certificate for test.sorucevap.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/test.sorucevap.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/test.sorucevap.com/privkey.pem
This certificate expires on 2023-05-19.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for test.sorucevap.comto /etc/nginx/sites-enabled/testsorucevap.conf
Congratulations! You have successfully enabled HTTPS on https://test.sorucevap.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

İşlemin sonucu yukarıda da gördüğünüz gibi başarılı oldu (Congratulations! You have successfully enabled HTTPS on). Artık sitenize girdiğinizde yada yenilediğinizde sizi direkt olarak https li bağlantıya gönderecek. Sizin tekrar nginx site ayar dosyasını açıp düzenlemenize gerek yoktur.

https ve ssl sertifikalı sitenizin keyfini çıkartabilirsiniz. ama tamamen bitirmeden önce bir kaç işimiz daha var.

SSL sertifikalarını otomatik uzatın

Yukarıdaki işlemlerle oluşturduğumuz Let’s Encrypt sertifikalarının 3 aylık bir ömrü bulunuyor. Bunu oluşturduğumuz sertifikanın sonuçlarından yada sitenize girdiğinizde göreceğiniz ssl sertifikasında görebilirsiniz. Her 3 ayda bir girip yeni sertifika oluşturma zahmetinde bulunmamak için certbot uygulamasının bir özelliği olan otomatik sertifika kontrolünü kullanarak zamanı bitmek üzere olan sertifikaları yenileyeceğiz. Bu otonom ile oluşturulan yeni sertifika gerekirse nginx ayarlarını da güncelleyecek. Normalde bu özellik çalışır durumda olur ancak yinede kontrol etmekte yarar var. Aşağıdaki komutu çalıştırarak çıktıyı kontrol edin:

systemctl status certbot.timer

Örnek çıktı aşağıdaki gibiyse içiniz rahat olsun, bu zamanlayıcı her gün iki kere sertifikanızı kontrol ederek 30 günden az ise yeniden oluşturup ayarlarınızı güncelliyor. Böylece bir daha sertifika oluşturma derdiniz kalmıyor. Örnek çıktı:

root@ubuntu-s-1vcpu-512mb-10gb-fra1-01:/# systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Sat 2023-02-18 16:36:20 UTC; 3h 14min ago
    Trigger: Sun 2023-02-19 03:08:23 UTC; 7h left
   Triggers: ● certbot.service

Feb 18 16:36:20 ubuntu-s-1vcpu-512mb-10gb-fra1-01 systemd[1]: Started Run certbot twice daily.

Örnek bir simülasyon çalıştırarak işi garantiyede alabilirsiniz, aşağıdaki komutu çalıştırın ve sonuçlara bakın, herhangi bir hata almıyorsanız herşey başarılı şekilde tamamlandı demektir, yinede ilerde bir hata oluşması durumunda girdiğiniz email adresine bilgilendirme yapılır ve hatadan yada sertifika durumunuzdan haberdar edilirsiniz:

certbot renew --dry-run

Örnek başarılı bir çıktı aşağıdaki gibi görünür

root@ubuntu-s-1vcpu-512mb-10gb-fra1-01:/# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/test.sorucevap.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for test.sorucevap.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/test.sorucevap.com/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Göreceğiniz gibi simülasyonda başarılı şekilde yerine getirildi, bu herşeyin yolunda olduğunu gösteriyor. Bu aşamadan sonra siteniz güvenli bağlantı protokolü ile çalışır ve bütün dünyada erişilebilir durumda olacaktır. Sonraki aşamalarda ihtiyacınız olacak ekstra uygulamaları kolayca kurarak sunucunuzu yapılandırabilirsiniz.

Ubuntu Sunucuda Nginx ve Php-fpm Kurulumu

Her şeyden önce, sunucunuza ssh üzerinden bağlanmanız gerekmektedir. Aşağıdaki adımlar Ubuntu sunucuda Nginx ve Php-fpm kurulumu için izlenebilir.

Nginx Kurulumu

Öncelikle mevcut paketlerin güncellenmesi gerekecektir. Terminal veya ssh komutu ile bu işlemi gerçekleştirebiliriz.

sudo apt update

Daha sonra Nginx’i kurabiliriz.

sudo apt install nginx

Bu noktada, Nginx’in başarılı bir şekilde kurulduğunu ve çalıştığını kontrol edebiliriz.

sudo systemctl status nginx

PHP-FPM Kurulumu

PHP-FPM (FastCGI Process Manager), PHP’i hızlı ve etkin bir şekilde işlemek için kullanılan bir araçtır. Aşağıdaki komut ile PHP ve PHP-FPM’i kurabiliriz.

sudo apt install php-fpm

Her ikisi de kurulduktan sonra, PHP-FPM’in çalıştığını kontrol edebiliriz.

sudo systemctl status php7.2-fpm

Webserver ve SSL Ayarları

Nginx Yapılandırma

Nginx yapılandırma dosyaları genellikle /etc/nginx/sites-available/ dizininde yer alır ve her bir domain için ayrı bir yapılandırma dosyası oluşturabiliriz.

sudo nano /etc/nginx/sites-available/your_domain

Açılan düzenleyicide, aşağıdaki kodu yerleştirip kaydedebiliriz.

server {
    listen 80;
    server_name your_domain www.your_domain;

    location / {
        proxy_pass http://localhost:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Daha sonra yapılandırma dosyasını sites-enabled dizinine symlink yapabiliriz.

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

SSL Ayarları ve HTTPS’i Aktifleştirme

Let’s Encrypt SSL sertifikasını almak ve HTTPS’yi aktifleştirmek için Certbot aracını kullanabiliriz.

sudo apt install python-certbot-nginx

Daha sonra Certbot’u kullanarak SSL sertifikası alabiliriz.

sudo certbot --nginx -d your_domain -d www.your_domain

Bu işlemlerin tamamlanmasıyla birlikte Nginx’i yeniden başlatabilir ve yapılandırmaların doğruluğunu kontrol edebiliriz.

sudo systemctl restart nginx

TERİMLER:

Nginx: Açık kaynaklı bir web sunucusu ve ters proxy sunucusu.

PHP-FPM: PHP’nin hızlı ve etkin bir şekilde işlenmesi için kullanılan bir araç.

Certbot: Let’s Encrypt CA tarafından sağlanan SSL sertifikalarını kolayca almayı sağlayan bir araç.

SSH: Güvenli bir kanal üzerinden ağ hizmetlerini kullanmayı sağlayan bir protokol.

HTTPS: HTTP’nin SSL ve TLS protokolleri üzerinden güvenli bir versiyonu.

Let’s Encrypt: Ücretsiz SSL sertifikaları sunan ve genellikle Certbot ile kullanılan bir Certificate Authority (CA).