Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 Üzerinde Çerçevesiz Yaklaşım
Giriş
Web uygulamalarının temelini oluşturan sunucu altyapıları, günümüzde birçok farklı kombinasyonla karşımıza çıkmaktadır. Bunlardan en bilineni ve yaygın olanı LAMP (Linux, Apache, MySQL, PHP) yığınıdır. Ancak bu makalede, PHP yerine Python programlama dilini kullanarak bir LAMP benzeri bir sunucu yığını (Linux, Apache, MySQL, Python) kurulumunu ele alacağız. Özellikle, Ubuntu 14.04 gibi daha eski ancak hala belirli projelerde veya öğrenme amaçlı kullanılan bir işletim sistemi üzerinde, herhangi bir web framework’ü (Django, Flask vb.) kullanmadan, temel CGI (Common Gateway Interface) ve WSGI (Web Server Gateway Interface) yaklaşımlarıyla Python uygulamalarını Apache üzerinde nasıl çalıştıracağımızı adım adım inceleyeceğiz.
Bu “çerçevesiz” yaklaşım, web sunucusu ile uygulama arasındaki etkileşimin temel mekaniklerini anlamak isteyenler için oldukça faydalıdır. Framework’ler birçok soyutlama ve kolaylık sağlarken, bu kurulum süreci bize HTTP isteklerinin nasıl işlendiğini, veritabanı bağlantılarının nasıl kurulduğunu ve Python kodunun sunucu ortamında nasıl yürütüldüğünü derinlemesine kavrama fırsatı sunar. Ubuntu 14.04 seçimi, eski sistemlerle çalışmak zorunda kalan veya bu spesifik sürümdeki paket yönetimini öğrenmek isteyen kullanıcılar için rehber niteliğindedir.
Ön Gereksinimler
Bu makaledeki adımları uygulayabilmek için aşağıdaki ön gereksinimlere sahip olmanız gerekmektedir:
* Ubuntu 14.04 Sunucusu: Fiziksel bir sunucu, sanal makine (VMware, VirtualBox) veya bulut tabanlı bir sunucu (AWS EC2, DigitalOcean Droplet vb.) olabilir.
* SSH Erişimi: Sunucunuza uzaktan bağlanmak için bir SSH istemcisi (Putty, OpenSSH vb.) veya doğrudan terminal erişimi.
* Sudo Yetkileri: Kurulum ve yapılandırma işlemleri için sudo komutunu kullanabilecek bir kullanıcı hesabına sahip olmak.
* Temel Linux Komut Bilgisi: Dosya sistemi navigasyonu, dosya düzenleme (nano, vi vb.) gibi temel komutlara aşina olmak.
1. Sistemi Güncelleme
Herhangi bir yazılım kurulumuna başlamadan önce, sistem paket listelerini güncellemek ve kurulu paketleri en son sürümlerine yükseltmek iyi bir uygulamadır. Bu, bağımlılık sorunlarını önlemeye yardımcı olur ve sistemin kararlı kalmasını sağlar.
Terminalinizi açın ve aşağıdaki komutları çalıştırın:
sudo apt-get update
sudo apt-get upgrade -y
* sudo apt-get update: Depo indekslerini günceller. Yani, hangi paketin hangi sürümünün mevcut olduğu bilgisini yeniler.
* sudo apt-get upgrade -y: Mevcut kurulu paketleri en son sürümlerine yükseltir. -y bayrağı, tüm sorulara otomatik olarak “evet” yanıtı verir.
2. Apache Web Sunucusu Kurulumu
Apache HTTP Sunucusu, dünyanın en popüler web sunucularından biridir ve web sayfalarını ve uygulamaları kullanıcılara sunmak için kullanılır.
Apache’yi kurmak için aşağıdaki komutu çalıştırın:
sudo apt-get install apache2 -y
Kurulum tamamlandıktan sonra Apache servisi otomatik olarak başlayacaktır. Servisin durumunu kontrol etmek için:
sudo service apache2 status
Çıktıda apache2 is running veya benzeri bir ifade görmelisiniz.
Güvenlik Duvarı Ayarları (UFW):
Eğer sunucunuzda UFW (Uncomplicated Firewall) etkinse, Apache’nin dışarıdan erişilebilir olması için HTTP (80) ve HTTPS (443) portlarına izin vermeniz gerekir.
sudo ufw app list
Bu komut, UFW tarafından tanınan uygulama profillerini listeler. Genellikle Apache, Apache Full ve Apache Secure profilleri bulunur.
* Apache: Sadece 80 portuna (HTTP) izin verir.
* Apache Full: Hem 80 (HTTP) hem de 443 (HTTPS) portlarına izin verir.
* Apache Secure: Sadece 443 portuna (HTTPS) izin verir.
Bizim durumumuzda, şimdilik sadece HTTP erişimi için Apache profilini kullanabiliriz, ancak ileride HTTPS kullanmayı düşünüyorsanız Apache Full daha iyidir:
sudo ufw allow 'Apache Full'
sudo ufw enable # Eğer UFW etkin değilse etkinleştirin
sudo ufw status # Kuralların uygulandığını kontrol edin
Apache Testi:
Tarayıcınızda sunucunuzun IP adresini (örneğin http://your_server_ip) ziyaret ederek Apache’nin varsayılan “It works!” sayfasını görmelisiniz. Bu, Apache’nin başarıyla çalıştığını gösterir.
Apache’nin varsayılan kök dizini /var/www/html‘dir. Tüm web içeriğiniz bu dizin altında yer alacaktır. Ana yapılandırma dosyası /etc/apache2/apache2.conf ve sanal host tanımları /etc/apache2/sites-available/ dizinindedir. Varsayılan site /etc/apache2/sites-available/000-default.conf olarak tanımlıdır.
3. MySQL Veritabanı Sunucusu Kurulumu
MySQL, açık kaynaklı ve dünyanın en popüler ilişkisel veritabanı yönetim sistemlerinden biridir. Veri depolama ve yönetimi için kullanılacaktır.
MySQL sunucusunu ve Python ile bağlantı kurmak için gerekli olan python-mysqldb modülünü kurmak için:
sudo apt-get install mysql-server python-mysqldb -y
Kurulum sırasında MySQL root kullanıcısı için bir parola belirlemeniz istenecektir. Bu parolayı güvenli bir yerde saklayın.
MySQL Güvenlik Ayarları:
MySQL kurulumunu daha güvenli hale getirmek için aşağıdaki komutu çalıştırın:
sudo mysql_secure_installation
Bu komut sizi bir dizi soruyla yönlendirecektir:
1. Enter current password for root (enter for none): MySQL root kullanıcısı için belirlediğiniz parolayı girin.
2. Change the root password? [Y/n]: Genellikle n (hayır) seçeneğini seçebilirsiniz, çünkü kurulum sırasında zaten bir parola belirledik.
3. Remove anonymous users? [Y/n]: Y (evet) seçeneğini seçin. Anonim kullanıcılar güvenlik açığı oluşturabilir.
4. Disallow root login remotely? [Y/n]: Y (evet) seçeneğini seçin. root kullanıcısının sadece yerel olarak bağlanabilmesi daha güvenlidir.
5. Remove test database and access to it? [Y/n]: Y (evet) seçeneğini seçin. Test veritabanı gereksizdir ve kaldırılmalıdır.
6. Reload privilege tables now? [Y/n]: Y (evet) seçeneğini seçin. Bu, yaptığınız değişikliklerin hemen etkili olmasını sağlar.
MySQL Testi:
MySQL sunucusuna root kullanıcısı ile bağlanarak kurulumu test edebilirsiniz:
mysql -u root -p
Parolanızı girdikten sonra MySQL komut istemine (mysql>) düşmelisiniz. Çıkmak için exit yazın.
Veritabanı ve Kullanıcı Oluşturma (Python için):
Uygulamalarınız için root kullanıcısını kullanmak yerine, özel bir veritabanı ve o veritabanına erişimi olan özel bir kullanıcı oluşturmak en iyi güvenlik uygulamasıdır.
mysql -u root -p
Parolanızı girin ve aşağıdaki SQL komutlarını çalıştırın:
CREATE DATABASE python_db DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE USER 'python_user'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON python_db.* TO 'python_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
* CREATE DATABASE python_db: python_db adında yeni bir veritabanı oluşturur.
* CREATE USER 'python_user'@'localhost' ...: localhost üzerinden bağlanabilecek python_user adında yeni bir kullanıcı oluşturur ve ona your_secure_password parolasını atar.
GRANT ALL PRIVILEGES ON python_db. TO 'python_user'@'localhost': python_user‘a python_db veritabanındaki tüm tablolara tam erişim yetkisi verir.
* FLUSH PRIVILEGES: Yetki tablolarını yeniden yükleyerek değişikliklerin hemen etkili olmasını sağlar.
4. Python Kurulumu ve Gerekli Modüller
Ubuntu 14.04, varsayılan olarak Python 2.7 ile gelir. Bu makalede, Apache ile entegrasyon için Python 2.7’yi kullanacağız.
Python geliştirme araçlarını ve pip (Python paket yöneticisi) kurmak için:
sudo apt-get install python python-dev python-pip -y
* python: Python 2.7 yorumlayıcısı.
* python-dev: Python başlık dosyalarını ve statik kütüphaneleri içerir, bu da bazı Python modüllerini derlemek için gereklidir.
* python-pip: Python paketlerini kolayca kurmanızı sağlayan pip aracını kurar.
python-mysqldb paketi daha önce mysql-server ile birlikte kuruldu, ancak pip ile de kurulabilir (genellikle sistem paket yöneticisi tercih edilir).
5. Apache’yi Python ile Yapılandırma
Apache’nin Python uygulamalarını çalıştırması için iki ana yöntem vardır: CGI (Common Gateway Interface) ve WSGI (Web Server Gateway Interface). CGI daha basittir ancak her istekte yeni bir Python yorumlayıcısı başlattığı için daha az performanslıdır. WSGI ise daha modern, performanslı ve framework’ler tarafından yaygın olarak kullanılan bir arayüzdür.
5.1. CGI (Common Gateway Interface) ile Python
CGI, web sunucusunun harici bir programı (bu durumda bir Python betiği) çalıştırması ve çıktısını istemciye geri göndermesi için standart bir protokoldür.
mod_cgi’yi Etkinleştirme:
Apache’nin CGI betiklerini çalıştırma yeteneğine sahip olması için mod_cgi modülünü etkinleştirmemiz gerekir:
sudo a2enmod cgi
Ardından Apache’yi yeniden başlatın:
sudo service apache2 restart
Apache Yapılandırması:
Şimdi, Apache’ye Python betiklerini nerede bulacağını ve nasıl çalıştıracağını söylememiz gerekiyor. Varsayılan sanal host dosyasını düzenleyelim (/etc/apache2/sites-available/000-default.conf):
sudo nano /etc/apache2/sites-available/000-default.conf
bloğunun içine aşağıdaki satırları ekleyin (genellikle DocumentRoot satırından sonra):
ScriptAlias /cgi-bin/ /var/www/html/cgi-bin/
Options +ExecCGI
AddHandler cgi-script .py
Order allow,deny
Allow from all
* ScriptAlias /cgi-bin/ /var/www/html/cgi-bin/: Apache’ye /cgi-bin/ URL’sine gelen isteklerin /var/www/html/cgi-bin/ dizinindeki betiklere yönlendirilmesi gerektiğini söyler.
* : Belirtilen dizin için özel yapılandırma ayarlarını tanımlar.
* Options +ExecCGI: Bu dizindeki betiklerin yürütülmesine izin verir.
* AddHandler cgi-script .py: .py uzantılı dosyaların CGI betikleri olarak işlenmesi gerektiğini belirtir.
Kaydedin ve çıkın (Ctrl+O, Enter, Ctrl+X).
Örnek Bir Python CGI Betiği Oluşturma:
Şimdi /var/www/html/cgi-bin/ dizinini oluşturalım ve içine basit bir Python CGI betiği ekleyelim:
sudo mkdir /var/www/html/cgi-bin
sudo nano /var/www/html/cgi-bin/test.py
Aşağıdaki içeriği dosyaya yapıştırın:
#!/usr/bin/python
print "Content-type: text/html\n"
print ""
print ""
print "Bu bir Python CGI betiğidir.
"
print "Sunucu zamanı: %s
" % __import__('datetime').datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print ""
* #!/usr/bin/python: Bu satır (shebang), betiğin hangi yorumlayıcı ile çalıştırılması gerektiğini belirtir. Ubuntu 14.04’te python genellikle /usr/bin/python‘a işaret eder.
* print "Content-type: text/html\n": CGI betiklerinin HTTP başlıklarını bu şekilde çıktıda vermesi gerekir. İki yeni satır (\n) başlıkları gövdeden ayırır.
Betiğe çalıştırma izni verin:
sudo chmod +x /var/www/html/cgi-bin/test.py
Apache’yi yeniden başlatın:
sudo service apache2 restart
Test Etme:
Tarayıcınızda http://your_server_ip/cgi-bin/test.py adresini ziyaret edin. “Merhaba, Python CGI!” başlığını ve sunucu zamanını görmelisiniz.
5.2. WSGI (Web Server Gateway Interface) ile Python
WSGI, Python web uygulamaları ile web sunucuları arasında standart bir arayüzdür. CGI’dan daha verimlidir çünkü Python yorumlayıcısını her istekte yeniden başlatmak yerine, uygulamayı sunucu sürecinde tutar. mod_wsgi Apache için en yaygın WSGI modülüdür.
mod_wsgi’yi Kurma ve Etkinleştirme:
sudo apt-get install libapache2-mod-wsgi -y
Kurulum genellikle mod_wsgi‘yi otomatik olarak etkinleştirir. Kontrol etmek için:
sudo a2enmod wsgi
Zaten etkinse, “Module wsgi already enabled” mesajını görürsünüz.
Apache’yi yeniden başlatın:
sudo service apache2 restart
Apache Yapılandırması:
Yine, varsayılan sanal host dosyasını düzenleyelim (/etc/apache2/sites-available/000-default.conf):
sudo nano /etc/apache2/sites-available/000-default.conf
bloğunun içine aşağıdaki satırları ekleyin (CGI yapılandırmasından sonra veya ayrı bir sanal host olarak):
# WSGI uygulaması için
WSGIScriptAlias /myapp /var/www/html/myapp/myapp.wsgi
WSGIDaemonProcess myapp user=www-data group=www-data processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup myapp
Order deny,allow
Allow from all
* WSGIScriptAlias /myapp /var/www/html/myapp/myapp.wsgi: /myapp URL’sine gelen istekleri /var/www/html/myapp/myapp.wsgi dosyasındaki WSGI uygulamasına yönlendirir.
* WSGIDaemonProcess myapp ...: myapp adında bir WSGI daemon süreci tanımlar. Bu süreç, Python uygulamasını çalıştırır ve Apache’den gelen istekleri işler. user=www-data ve group=www-data, uygulamanın Apache’nin çalıştığı kullanıcı ve grup altında çalışmasını sağlar.
* WSGIProcessGroup myapp: Bu WSGIScriptAlias için kullanılacak daemon sürecini belirtir.
* : WSGI uygulamasının bulunduğu dizine erişim izinlerini ayarlar.
Kaydedin ve çıkın.
Örnek Bir Python WSGI Uygulaması Oluşturma:
Uygulama dizinini oluşturalım ve içine myapp.wsgi dosyasını ekleyelim:
sudo mkdir /var/www/html/myapp
sudo nano /var/www/html/myapp/myapp.wsgi
Aşağıdaki içeriği dosyaya yapıştırın:
import sys
import datetime
Uygulama kodunun olduğu dizini sys.path'e ekleyin, böylece diğer modüller import edilebilir.
sys.path.insert(0, '/var/www/html/myapp')
def application(environ, start_response):
status = '200 OK'
headers = [('Content-type', 'text/html')]
start_response(status, headers)
html_content = """
Bu bir Python WSGI uygulamasıdır.
Sunucu zamanı: %s
""" % datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return [html_content]
WSGI uygulaması, application adında çağrılabilir (callable) bir nesne olmalıdır. Bu nesne, environ ve start_response adında iki argüman alır. environ HTTP isteği hakkında bilgileri (CGI değişkenleri gibi) içerirken, start_response HTTP durum kodunu ve başlıkları ayarlamak için kullanılan bir fonksiyondur.
Dosyaya okuma izni verin (çalıştırma izni gerekmez, çünkü Python yorumlayıcısı tarafından çağrılır):
sudo chmod 644 /var/www/html/myapp/myapp.wsgi
Apache’yi yeniden başlatın:
sudo service apache2 restart
Test Etme:
Tarayıcınızda http://your_server_ip/myapp adresini ziyaret edin. “Merhaba, Python WSGI!” başlığını ve sunucu zamanını görmelisiniz.
6. Python ve MySQL Entegrasyonu
Şimdi Python betiklerimizin MySQL veritabanımızla nasıl etkileşime gireceğini gösterelim. Daha önce python-mysqldb modülünü kurmuştuk.
Aşağıdaki örnek kodu, hem CGI hem de WSGI ortamında çalıştırabileceğiniz bir Python betiği olarak düşünebilirsiniz. Bu betik, MySQL veritabanına bağlanır, bir tablo oluşturur, veri ekler ve eklenen verileri okuyarak HTML çıktısı olarak gösterir.
sudo nano /var/www/html/cgi-bin/mysql_test.py # CGI için
Veya
sudo nano /var/www/html/myapp/mysql_test_wsgi.py # WSGI için
(WSGI için bu dosyayı myapp.wsgi içinde import edip kullanabilirsiniz.)
#!/usr/bin/python
-- coding: utf-8 --
import MySQLdb
import sys
import datetime
MySQL bağlantı bilgileri
DB_HOST = 'localhost'
DB_USER = 'python_user' # Daha önce oluşturduğumuz kullanıcı
DB_PASSWORD = 'your_secure_password' # Kullanıcının parolası
DB_NAME = 'python_db' # Daha önce oluşturduğumuz veritabanı
def get_html_response(content):
"""HTML içeriğini başlıklarla birlikte döndürür."""
return "Content-type: text/html; charset=utf-8\n\n" + \
"" + \
content + \
""
def application(environ=None, start_response=None): # WSGI uyumluluğu için
html_output = ""
db = None
try:
# Veritabanına bağlanma
db = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASSWORD, db=DB_NAME, charset='utf8')
cursor = db.cursor()
# Tablo oluşturma (varsa silip yeniden oluştur)
cursor.execute("DROP TABLE IF EXISTS users")
sql_create_table = """CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) CHARACTER SET utf8 COLLATE utf8_unicode_ci;"""
cursor.execute(sql_create_table)
html_output += "Tablo Oluşturuldu: users
"
# Veri ekleme
sql_insert = "INSERT INTO users (name, email) VALUES (%s, %s)"
cursor.execute(sql_insert, ('Alice Smith', 'alice@example.com'))
cursor.execute(sql_insert, ('Bob Johnson', 'bob@example.com'))
db.commit() # Değişiklikleri kaydet
html_output += "Veriler Eklendi
"
# Veri okuma
sql_select = "SELECT id, name, email, created_at FROM users"
cursor.execute(sql_select)
results = cursor.fetchall()
html_output += "Kullanıcılar Listesi
"
if results:
for row in results:
html_output += "- ID: %d, İsim: %s, Email: %s, Oluşturulma Tarihi: %s
" % \
(row[0], row[1], row[2], row[3].strftime("%Y-%m-%d %H:%M:%S"))
else:
html_output += "- Henüz kullanıcı bulunmuyor.
"
html_output += "
"
except MySQLdb.Error as e:
error_message = "Veritabanı Hatası: %s" % e
html_output += "%s
" % error_message
sys.stderr.write(error_message + "\n") # Hata loglarını Apache error loguna yaz
finally:
if db:
db.close()
if environ and start_response: # WSGI modunda çalışıyorsa
status = '200 OK'
headers = [('Content-type', 'text/html; charset=utf-8')]
start_response(status, headers)
return [html_output.encode('utf-8')] # Byte dizisi olarak döndür
else: # CGI modunda çalışıyorsa
print get_html_response(html_output).encode('utf-8')
if __name__ == '__main__':
# Bu blok, betik doğrudan çalıştırıldığında (CGI gibi) çalışır.
# WSGI modunda çalışırken, 'application' fonksiyonu doğrudan çağrılır.
application()
* charset='utf8': MySQL bağlantısında Türkçe karakter sorunlarını önlemek için bu parametreyi ekledik.
* encode('utf-8'): Python 2’de print ile stringleri doğrudan basarken veya WSGI’den döndürürken karakter kodlama sorunlarını önlemek için UTF-8’e dönüştürmek önemlidir.
* sys.stderr.write(): Hataları Apache’nin hata loglarına yazmak için kullanılır, bu da sorun gidermede yardımcı olur.
CGI Olarak Çalıştırma:
Eğer bu kodu /var/www/html/cgi-bin/mysql_test.py olarak kaydettiyseniz, çalıştırma izni verin:
sudo chmod +x /var/www/html/cgi-bin/mysql_test.py
sudo service apache2 restart
Tarayıcınızda http://your_server_ip/cgi-bin/mysql_test.py adresini ziyaret ederek test edin.
WSGI Olarak Çalıştırma:
Eğer bu kodu /var/www/html/myapp/mysql_test_wsgi.py olarak kaydettiyseniz, myapp.wsgi dosyanızı aşağıdaki gibi düzenleyerek bu uygulamayı çağırabilirsiniz:
import sys
import datetime
Yeni oluşturduğumuz MySQL test uygulamasını import edin
from mysql_test_wsgi import application as mysql_app # application fonksiyonunu mysql_app olarak import ediyoruz
sys.path.insert(0, '/var/www/html/myapp')
def application(environ, start_response):
# Basit bir yönlendirme yapabiliriz veya doğrudan mysql_app'i çağırabiliriz
if environ['PATH_INFO'] == '/mysql_test':
return mysql_app(environ, start_response)
else:
status = '200 OK'
headers = [('Content-type', 'text/html; charset=utf-8')]
start_response(status, headers)
html_content = """
Ana sayfa. MySQL Testi
Sunucu zamanı: %s
""" % datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return [html_content.encode('utf-8')]
mysql_test_wsgi.py dosyasını myapp.wsgi ile aynı dizine koyduğunuzdan emin olun.
Dosyaya okuma izni verin:
sudo chmod 644 /var/www/html/myapp/mysql_test_wsgi.py
sudo service apache2 restart
Tarayıcınızda http://your_server_ip/myapp/mysql_test adresini ziyaret ederek test edin.
7. Güvenlik İpuçları
Bir sunucu kurarken güvenlik her zaman öncelikli olmalıdır. İşte dikkat etmeniz gereken bazı temel güvenlik ipuçları:
* MySQL Root Parolası ve Kullanıcı Yetkileri: MySQL root kullanıcısının parolasını asla boş bırakmayın ve uzaktan erişimi devre dışı bırakın. Uygulamalarınız için root kullanıcısı yerine, sadece ihtiyaç duydukları veritabanlarına erişimi olan sınırlı yetkili kullanıcılar oluşturun.
* Apache Dizin İzinleri: /var/www/html ve altındaki dizinlerin dosya ve dizin izinlerini doğru ayarlayın. Genellikle web sunucusu kullanıcısının (www-data) yazma iznine ihtiyacı yoktur, sadece okuma izni yeterlidir. Betik dosyalarına çalıştırma izni (chmod +x) sadece CGI için gereklidir, WSGI için genellikle 644 izinleri yeterlidir.
* Güvenlik Duvarı (UFW): Sadece gerekli portlara (HTTP için 80, HTTPS için 443, SSH için 22) izin verin. Diğer tüm portları kapatın.
* SSL/TLS (HTTPS): Web sitenizi ve uygulamalarınızı şifrelemek için mutlaka HTTPS kullanın. Let’s Encrypt gibi hizmetlerle ücretsiz SSL sertifikaları alabilirsiniz. Ubuntu 14.04 üzerinde Let’s Encrypt kurulumu biraz daha zahmetli olabilir (örneğin certbot için daha yeni Python sürümleri gerekebilir), ancak mümkündür.
* Gereksiz Modülleri Kapatma: Apache’de kullanmadığınız modülleri (a2dismod) devre dışı bırakın. Bu, potansiyel güvenlik açıklarını azaltır.
* Sistemi Güncel Tutma: İşletim sisteminizi ve tüm yüklü paketleri düzenli olarak sudo apt-get update && sudo apt-get upgrade komutlarıyla güncel tutun. Bu, bilinen güvenlik açıklarına karşı yamaları almanızı sağlar.
* Hata Mesajlarını Kısıtlama: Üretim ortamında detaylı hata mesajlarını kullanıcıya göstermeyin. Bu, saldırganlara sisteminiz hakkında değerli bilgiler verebilir. Apache ve Python uygulamalarınızın hata loglarını (/var/log/apache2/error.log gibi) kontrol edin.
Sonuç
Bu makalede, Ubuntu 14.04 işletim sistemi üzerinde Apache, MySQL ve Python’dan oluşan bir web sunucusu yığınını herhangi bir web framework’ü kullanmadan nasıl kuracağımızı adım adım inceledik. Sistemi güncellemekten başlayarak Apache ve MySQL sunucularını kurduk, Python ortamını hazırladık ve son olarak Apache’yi hem CGI hem de WSGI modlarında Python uygulamalarını çalıştıracak şekilde yapılandırdık. Ayrıca, Python ile MySQL veritabanı entegrasyonunu gösteren bir örnek uygulama geliştirdik.
Bu “çerçevesiz” yaklaşım, web sunucusu ve uygulama arasındaki temel etkileşim mekanizmalarını anlamak için değerli bir deneyim sunar. CGI ve WSGI’nin nasıl çalıştığını kavramak, daha sonra Django veya Flask gibi framework’leri kullanırken size sağlam bir temel sağlayacaktır.
Artık temel bir LAMP (Python) sunucusuna sahipsiniz. Bir sonraki adımlarınız, uygulamanızı daha karmaşık hale getirmek, performans optimizasyonları yapmak, HTTPS kurmak veya bir Python web framework’üne geçiş yapmak olabilir. Unutmayın, bu makale Ubuntu 14.04’e özeldir ve daha yeni Ubuntu sürümlerinde bazı paket adları veya kurulum adımları farklılık gösterebilir. Ancak temel mantık ve kavramlar benzer kalacaktır.