Özgür Özer

Junior full stack developer

Nginx ve Let's Encrypt ile HTTP/2 (Ubuntu)

Bu yazıda Ubuntu sunucumuza Nginx kurmayı, Let’s Encrypt ile ücretsiz SSL oluşturmayı ve web sunucumuzu HTTP/2 protokolünde çalıştırmayı göreceğiz.

nginx, let's encrypt, http/2

Sunucumuza SSH ile bağlandıktan sonra işletim sistemimizi güncelliyoruz.

sudo apt-get update && apt-get upgrade

ubuntu'yu güncelleme

Nginx’i kuruyoruz.

sudo apt-get install nginx

nginx'i kurma

Tarayıcıdan sunucumuzun IP adresine giderek Nginx’in çalışıp çalışmadığını kontrol edebiliriz.

nginx çalışıyor

SSL sertifikalarını oluşturmadan önce alan adımızı satın aldığımız yerin DNS ayarlarından A kaydının değerine sunucumuzun IP adresini yazıp kaydetmemiz gerekiyor, aksi halde sertifikaları oluştururken hata alıyoruz.

a kaydını güncelleme

Nginx’i şimdilik durduruyoruz.

systemctl stop nginx

nginx'i durdurma

Let’s Encrypt’i indiriyoruz.

git clone https://github.com/letsencrypt/letsencrypt /letsencrypt

let's encrypt'i indirme

Alan adımız için SSL sertifikalarımızı oluşturuyoruz (yaklaşık 2 dakika).

/letsencrypt/letsencrypt-auto certonly --standalone --email mail@site.com -d site.com -d www.site.com

let's encrypt ile ssl sertifikaları oluşturma

Sertifikaların yollarını kaydedeceğimiz dosyayı oluşturuyoruz.

sudo vim /etc/nginx/snippets/ssl-site.com.conf

İçerisine aşağıdakileri yapıştırıp kaydediyoruz.

ssl_certificate /etc/letsencrypt/live/site.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site.com/privkey.pem;

sertifika dosyalarının yollarını kaydetme

Diffie-Hellman algoritması kullanarak PEM dosyamızı oluşturuyoruz (yaklaşık 2 dakika).

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

diffie-helman algoritmasıyla pem dosyası oluşturma

SSL ile ilgili güvenlik parametrelerini tutacağımız dosyayı oluşturuyoruz.

sudo vim /etc/nginx/snippets/ssl-params.conf

İçerisine aşağıdakileri yapıştırıp kaydediyoruz.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl güvenlik parametreleri

Alan adımızla ilgili ayarları tutacağımız dosyayı oluşturuyoruz.

sudo vim /etc/nginx/sites-available/site.com

İçerisine aşağıdakileri yapıştırıp kaydediyoruz.

server {
	listen 80;
	listen 443 ssl http2;
	server_name www.site.com;
	include /etc/nginx/snippets/ssl-site.com.conf;
	include /etc/nginx/snippets/ssl-params.conf;
	return 301 https://site.com$request_uri;
}
server {
	listen 80;
	server_name site.com;
	return 301 https://site.com$request_uri;
}
server {
	listen 443 ssl http2;
	server_name site.com;
	include /etc/nginx/snippets/ssl-site.com.conf;
	include /etc/nginx/snippets/ssl-params.conf;
	root /var/www/site.com/html;
}

alan adı ayarları

Alan adı ayarlarını aktif etmek için sembolik link oluşturuyoruz.

sudo ln -s /etc/nginx/sites-available/site.com /etc/nginx/sites-enabled/

Site dosyalarımızın barınacağı klasörü oluşturuyoruz.

sudo mkdir -p /var/www/site.com/html

Her şey tamam. Şimdi Nginx’i çalıştırabiliriz.

systemctl restart nginx

nginx'i çalıştırma

Sitemizin HTTP/2 protokolüne geçip geçmediğini şuradan öğrenebiliriz.

http/2 kontrol - keycdn

Veya Chrome’la, Safari’nin Network sekmesindeki Name, Status başlıklarına sağ tıklayıp Protocol seçeneğini aktif ederek girdiğimiz sitelerdeki tüm dosyaların hangi protokollerde çalıştığını görebiliriz.

http/2 kontrol - chrome

http/2 kontrol - safari

Ya da Firefox’ın Network sekmesindeki sol kısımdan herhangi bir satırı seçerek, sağ taraftaki Headers‘ın Version bölümünden o dosyanın hangi HTTP protokolünden geldiğini görebiliriz.

http/2 kontrol - firefox

Son olarak aşağıdaki sitelerden HTTP/1.1 ile HTTP/2 arasındaki farkı dinamik bir biçimde test edebiliriz.