Bayram EKER
3 min readOct 6, 2020

--

HTTPS ile Docker üzerinde Apache sunucusu

Neden Docker SSL

Diğer birçok şirket gibi biz de geliştirme ortamı için Docker kullanıyoruz. Bunu müşteriler için testler ve önizleme için de kullanıyoruz. Bize tüm ortamlarda sunucu yapılandırmasını birleştirme imkanı veriyor. LAMP yığınını çalıştırmayı kolaylaştırmak için, tek bir uygulama için birden fazla kapsayıcı düzenlemek üzere docker-compose kullanıyoruz.

SSL şu anda İnternette standart oldu. Kullanmamak kötü bir izlenim. Güvenliği önemsemeseniz bile, web tarayıcılarında bazı web API’leri vardır, bunlar https iletişimi kullanmıyorsanız kullanılamaz. Yerel olarak geliştiricilerin SSL’e ihtiyacı yoktur – çoğu durumda localhost, https ana bilgisayarlarıyla aynı şekilde ele alınır. Ancak uygulamanızı testler için veya bir istemci için önizleme olarak dağıttığınızda ve İnternet üzerinden kullanılabilir olduğunda, HTTPS ile iletişimi yönetebilmelisiniz.

Gördüğünüz gibi, docker konteynırlarımızda HTTPS iletişimini etkinleştirmek çok önemlidir.

Ana Bilgisayar için HTTPS yapılandırması

Şimdi SSL yapılandırmasına geçmeliyiz. Cerbot ile oluşturulan letsencrypt sertifikasını kullanacağız. Certbot’u ana bilgisayara yüklememiz gerekiyor:

sudo apt-get update

sudo apt-get install software-properties-common

sudo add-apt-repository universe

sudo add-apt-repository ppa:certbot/certbot

sudo apt-get update

sudo apt-get install certbot python-certbot-apache

Artık sertifika oluşturmak için certbot’u kullanabiliriz. Bunun için otomatik olarak bir sanal konak yapılandırması da oluşturabiliriz. Komutla başlıyoruz:

sudo certbot – apache

Hangi alanı kullanmak istediğimizi seçmemiz istenecektir. Doğru olanı seçin. Bundan sonra, sanal bir ana bilgisayarın yapılandırması sorulacak – HTTP’yi HTTPS’ye yönlendirmeden seçeneği seçin. Normalde muhtemelen tüm HTTP trafiğini HTTPS’ye yönlendirirsiniz, ancak sunum amacıyla bunu yapmayız.

Komut dosyaları bittiğinde, SSL yapılandırması ile /etc/apache2/sites-available/test-https-docker.com-le-ssl.conf’u bulabilmeniz gerekir. Şimdi https://test-https-docker.com’u açtığımızda ower sayfasını görecektik. Ayrıca, http://test-https-docker.com hala çalışmalıdır.

Yaptığımız şeyi özetleyelim:

Certbot’u kurduk ve ana sunucu üzerindeki etki alanımız için SSL sertifikası oluşturduk. Konteynırda aynı sertifikaları kullandık.

Konteynırın 80 ve 443 numaralı bağlantı noktalarını ana bilgisayardaki seçili bağlantı noktalarına eşledik. Apache’yi bir ana bilgisayar üzerinde proxy olarak yapılandırdık ve HTTP ve HTTPS’yi eşlenen bağlantı noktalarına yönlendirdik.

Kapsayıcıya birimler olarak sertifikaları ve apache yapılandırma dosyalarını ekledik.

Eşleştirdiğimiz birimlere ve bağlantı noktalarına giden yolları tanımlamak için .env dosyasını kullandık. Bu bize birden çok ortam için bir yapılandırmada esneklik sağlar.

Bu, ana bilgisayardaki son https yapılandırmamızdır:

<IfModule mod_ssl.c>

<VirtualHost *:443>

. ServerName test-https-docker.com

. ServerAdmin webmaster@test-https-docker.com

. CustomLog /var/www/log/test-https-docker.com/custom.log combined

. ErrorLog /var/www/log/test-https-docker.com/errors.log

. ProxyPass. “/” “https://127.0.0.1:14443/”

. ProxyPassReverse “/” “https://127.0.0.1:14443/”

SSLProxyEngine On

SSLProxyVerify none

SSLProxyCheckPeerCN off

SSLProxyCheckPeerName off

SSLProxyCheckPeerExpire off

ProxyPreserveHost On

SSLCertificateFile /etc/letsencrypt/live/test-https-docker.com/fullchain.pem

SSLCertificateKeyFile /etc/letsencrypt/live/test-https-docker.com/privkey.pem

Include /etc/letsencrypt/options-ssl-apache.conf

</VirtualHost>

This is our HTTP configuration on host:

VirtualHost *:80>

. ServerName test-https-docker.com

. ServerAdmin webmaster@test-https-docker.com

. CustomLog /var/www/log/test-https-docker.com/custom.log combined

. ErrorLog /var/www/log/test-https-docker.com/errors.log

. ProxyPreserveHost On

. ProxyPass. “/” “http://127.0.0.1:14080/”

. ProxyPassReverse “/” “http://127.0.0.1:14080/”

</VirtualHost>

Here is our apache configuration on container, kept in /srv/www/web_apps/test_https/code/docker/000-default.conf:

<VirtualHost *:80>

. ServerName test-https-docker.com

. ServerAdmin webmaster@test-https-docker.com

. DocumentRoot /var/www/html

. ErrorLog ${APACHE_LOG_DIR}/error.log

. CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

<IfModule mod_ssl.c>

<VirtualHost *:443>

. ServerName test-https-docker.com

. ServerAdmin webmaster@test-https-docker.com

. DocumentRoot /var/www/html

. ErrorLog ${APACHE_LOG_DIR}/error.log

. CustomLog ${APACHE_LOG_DIR}/access.log combined

. SSLCertificateFile /var/imported/ssl/fullchain.pem

. SSLCertificateKeyFile /var/imported/ssl/privkey.pem

. SSLEngine on

</VirtualHost>

</IfModule>

This is content of .env file from /srv/www/web_apps/test_https/code

HOST_HTTP_PORT=14080

APACHE_LOG_VOLUME=/srv/www/web_apps/test_https/apache_log

HOST_HTTPS_PORT=14443

SSL_VOLUME=/srv/www/web_apps/test_https/ssl

APACHE_CONF=./docker/000-default.conf

This is our docker-compose.yml kept in /srv/www/web_apps/test_https/code

version: ‘3.1'

services:

. webserver:

. image: php:7.3-apache

. restart: always

. volumes:

. – ./:/var/www/html

. – ${APACHE_LOG_VOLUME}:/var/log/apache2

. – ${APACHE_CONF}:/etc/apache2/sites-available/000-default.conf

. – ${SSL_VOLUME}:/var/imported/ssl

. ports:

. – “${HOST_HTTP_PORT}:80"

. – “${HOST_HTTPS_PORT}:443"

--

--

No responses yet