{"id":34320,"date":"2025-11-15T04:40:50","date_gmt":"2025-11-15T01:40:50","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34320"},"modified":"2025-11-15T04:40:50","modified_gmt":"2025-11-15T01:40:50","slug":"apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/","title":{"rendered":"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m"},"content":{"rendered":"<p><body><\/p>\n<h2>Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Web uygulamalar\u0131n\u0131n temelini olu\u015fturan sunucu altyap\u0131lar\u0131, g\u00fcn\u00fcm\u00fczde bir\u00e7ok farkl\u0131 kombinasyonla kar\u015f\u0131m\u0131za \u00e7\u0131kmaktad\u0131r. Bunlardan en bilineni ve yayg\u0131n olan\u0131 LAMP (Linux, Apache, MySQL, PHP) y\u0131\u011f\u0131n\u0131d\u0131r. Ancak bu makalede, PHP yerine Python programlama dilini kullanarak bir LAMP benzeri bir sunucu y\u0131\u011f\u0131n\u0131 (Linux, Apache, MySQL, Python) kurulumunu ele alaca\u011f\u0131z. \u00d6zellikle, Ubuntu 14.04 gibi daha eski ancak hala belirli projelerde veya \u00f6\u011frenme ama\u00e7l\u0131 kullan\u0131lan bir i\u015fletim sistemi \u00fczerinde, herhangi bir web framework&#8217;\u00fc (Django, Flask vb.) kullanmadan, temel CGI (Common Gateway Interface) ve WSGI (Web Server Gateway Interface) yakla\u015f\u0131mlar\u0131yla Python uygulamalar\u0131n\u0131 Apache \u00fczerinde nas\u0131l \u00e7al\u0131\u015ft\u0131raca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<p>Bu &#8220;\u00e7er\u00e7evesiz&#8221; yakla\u015f\u0131m, web sunucusu ile uygulama aras\u0131ndaki etkile\u015fimin temel mekaniklerini anlamak isteyenler i\u00e7in olduk\u00e7a faydal\u0131d\u0131r. Framework&#8217;ler bir\u00e7ok soyutlama ve kolayl\u0131k sa\u011flarken, bu kurulum s\u00fcreci bize HTTP isteklerinin nas\u0131l i\u015flendi\u011fini, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131n nas\u0131l kuruldu\u011funu ve Python kodunun sunucu ortam\u0131nda nas\u0131l y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fcn\u00fc derinlemesine kavrama f\u0131rsat\u0131 sunar. Ubuntu 14.04 se\u00e7imi, eski sistemlerle \u00e7al\u0131\u015fmak zorunda kalan veya bu spesifik s\u00fcr\u00fcmdeki paket y\u00f6netimini \u00f6\u011frenmek isteyen kullan\u0131c\u0131lar i\u00e7in rehber niteli\u011findedir.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Bu makaledeki ad\u0131mlar\u0131 uygulayabilmek i\u00e7in a\u015fa\u011f\u0131daki \u00f6n gereksinimlere sahip olman\u0131z gerekmektedir:<br \/>\n*   <strong>Ubuntu 14.04 Sunucusu:<\/strong> Fiziksel bir sunucu, sanal makine (VMware, VirtualBox) veya bulut tabanl\u0131 bir sunucu (AWS EC2, DigitalOcean Droplet vb.) olabilir.<br \/>\n*   <strong>SSH Eri\u015fimi:<\/strong> Sunucunuza uzaktan ba\u011flanmak i\u00e7in bir SSH istemcisi (Putty, OpenSSH vb.) veya do\u011frudan terminal eri\u015fimi.<br \/>\n*   <strong>Sudo Yetkileri:<\/strong> Kurulum ve yap\u0131land\u0131rma i\u015flemleri i\u00e7in <code>sudo<\/code> komutunu kullanabilecek bir kullan\u0131c\u0131 hesab\u0131na sahip olmak.<br \/>\n*   <strong>Temel Linux Komut Bilgisi:<\/strong> Dosya sistemi navigasyonu, dosya d\u00fczenleme (<code>nano<\/code>, <code>vi<\/code> vb.) gibi temel komutlara a\u015fina olmak.<\/p>\n<h3>1. Sistemi G\u00fcncelleme<\/h3>\n<p>Herhangi bir yaz\u0131l\u0131m kurulumuna ba\u015flamadan \u00f6nce, sistem paket listelerini g\u00fcncellemek ve kurulu paketleri en son s\u00fcr\u00fcmlerine y\u00fckseltmek iyi bir uygulamad\u0131r. Bu, ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur ve sistemin kararl\u0131 kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Terminalinizi a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo apt-get update\nsudo apt-get upgrade -y<\/code><\/pre>\n<p>*   <code>sudo apt-get update<\/code>: Depo indekslerini g\u00fcnceller. Yani, hangi paketin hangi s\u00fcr\u00fcm\u00fcn\u00fcn mevcut oldu\u011fu bilgisini yeniler.<br \/>\n*   <code>sudo apt-get upgrade -y<\/code>: Mevcut kurulu paketleri en son s\u00fcr\u00fcmlerine y\u00fckseltir. <code>-y<\/code> bayra\u011f\u0131, t\u00fcm sorulara otomatik olarak &#8220;evet&#8221; yan\u0131t\u0131 verir.<\/p>\n<h3>2. Apache Web Sunucusu Kurulumu<\/h3>\n<p>Apache HTTP Sunucusu, d\u00fcnyan\u0131n en pop\u00fcler web sunucular\u0131ndan biridir ve web sayfalar\u0131n\u0131 ve uygulamalar\u0131 kullan\u0131c\u0131lara sunmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>Apache&#8217;yi kurmak i\u00e7in a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo apt-get install apache2 -y<\/code><\/pre>\n<p>Kurulum tamamland\u0131ktan sonra Apache servisi otomatik olarak ba\u015flayacakt\u0131r. Servisin durumunu kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo service apache2 status<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131da <code>apache2 is running<\/code> veya benzeri bir ifade g\u00f6rmelisiniz.<\/p>\n<p><strong>G\u00fcvenlik Duvar\u0131 Ayarlar\u0131 (UFW):<\/strong><br \/>\nE\u011fer sunucunuzda UFW (Uncomplicated Firewall) etkinse, Apache&#8217;nin d\u0131\u015far\u0131dan eri\u015filebilir olmas\u0131 i\u00e7in HTTP (80) ve HTTPS (443) portlar\u0131na izin vermeniz gerekir.<\/p>\n<pre><code class=\"language-bash\">sudo ufw app list<\/code><\/pre>\n<p>Bu komut, UFW taraf\u0131ndan tan\u0131nan uygulama profillerini listeler. Genellikle <code>Apache<\/code>, <code>Apache Full<\/code> ve <code>Apache Secure<\/code> profilleri bulunur.<br \/>\n*   <code>Apache<\/code>: Sadece 80 portuna (HTTP) izin verir.<br \/>\n*   <code>Apache Full<\/code>: Hem 80 (HTTP) hem de 443 (HTTPS) portlar\u0131na izin verir.<br \/>\n*   <code>Apache Secure<\/code>: Sadece 443 portuna (HTTPS) izin verir.<\/p>\n<p>Bizim durumumuzda, \u015fimdilik sadece HTTP eri\u015fimi i\u00e7in <code>Apache<\/code> profilini kullanabiliriz, ancak ileride HTTPS kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcyorsan\u0131z <code>Apache Full<\/code> daha iyidir:<\/p>\n<pre><code class=\"language-bash\">sudo ufw allow 'Apache Full'\nsudo ufw enable # E\u011fer UFW etkin de\u011filse etkinle\u015ftirin\nsudo ufw status # Kurallar\u0131n uyguland\u0131\u011f\u0131n\u0131 kontrol edin<\/code><\/pre>\n<p><strong>Apache Testi:<\/strong><br \/>\nTaray\u0131c\u0131n\u0131zda sunucunuzun IP adresini (\u00f6rne\u011fin <code>http:\/\/your_server_ip<\/code>) ziyaret ederek Apache&#8217;nin varsay\u0131lan &#8220;It works!&#8221; sayfas\u0131n\u0131 g\u00f6rmelisiniz. Bu, Apache&#8217;nin ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6sterir.<\/p>\n<p>Apache&#8217;nin varsay\u0131lan k\u00f6k dizini <code>\/var\/www\/html<\/code>&#8216;dir. T\u00fcm web i\u00e7eri\u011finiz bu dizin alt\u0131nda yer alacakt\u0131r. Ana yap\u0131land\u0131rma dosyas\u0131 <code>\/etc\/apache2\/apache2.conf<\/code> ve sanal host tan\u0131mlar\u0131 <code>\/etc\/apache2\/sites-available\/<\/code> dizinindedir. Varsay\u0131lan site <code>\/etc\/apache2\/sites-available\/000-default.conf<\/code> olarak tan\u0131ml\u0131d\u0131r.<\/p>\n<h3>3. MySQL Veritaban\u0131 Sunucusu Kurulumu<\/h3>\n<p>MySQL, a\u00e7\u0131k kaynakl\u0131 ve d\u00fcnyan\u0131n en pop\u00fcler ili\u015fkisel veritaban\u0131 y\u00f6netim sistemlerinden biridir. Veri depolama ve y\u00f6netimi i\u00e7in kullan\u0131lacakt\u0131r.<\/p>\n<p>MySQL sunucusunu ve Python ile ba\u011flant\u0131 kurmak i\u00e7in gerekli olan <code>python-mysqldb<\/code> mod\u00fcl\u00fcn\u00fc kurmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo apt-get install mysql-server python-mysqldb -y<\/code><\/pre>\n<p>Kurulum s\u0131ras\u0131nda MySQL <code>root<\/code> kullan\u0131c\u0131s\u0131 i\u00e7in bir parola belirlemeniz istenecektir. Bu parolay\u0131 g\u00fcvenli bir yerde saklay\u0131n.<\/p>\n<p><strong>MySQL G\u00fcvenlik Ayarlar\u0131:<\/strong><br \/>\nMySQL kurulumunu daha g\u00fcvenli hale getirmek i\u00e7in a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo mysql_secure_installation<\/code><\/pre>\n<p>Bu komut sizi bir dizi soruyla y\u00f6nlendirecektir:<br \/>\n1.  <strong>Enter current password for root (enter for none):<\/strong> MySQL <code>root<\/code> kullan\u0131c\u0131s\u0131 i\u00e7in belirledi\u011finiz parolay\u0131 girin.<br \/>\n2.  <strong>Change the root password? [Y\/n]:<\/strong> Genellikle <code>n<\/code> (hay\u0131r) se\u00e7ene\u011fini se\u00e7ebilirsiniz, \u00e7\u00fcnk\u00fc kurulum s\u0131ras\u0131nda zaten bir parola belirledik.<br \/>\n3.  <strong>Remove anonymous users? [Y\/n]:<\/strong> <code>Y<\/code> (evet) se\u00e7ene\u011fini se\u00e7in. Anonim kullan\u0131c\u0131lar g\u00fcvenlik a\u00e7\u0131\u011f\u0131 olu\u015fturabilir.<br \/>\n4.  <strong>Disallow root login remotely? [Y\/n]:<\/strong> <code>Y<\/code> (evet) se\u00e7ene\u011fini se\u00e7in. <code>root<\/code> kullan\u0131c\u0131s\u0131n\u0131n sadece yerel olarak ba\u011flanabilmesi daha g\u00fcvenlidir.<br \/>\n5.  <strong>Remove test database and access to it? [Y\/n]:<\/strong> <code>Y<\/code> (evet) se\u00e7ene\u011fini se\u00e7in. Test veritaban\u0131 gereksizdir ve kald\u0131r\u0131lmal\u0131d\u0131r.<br \/>\n6.  <strong>Reload privilege tables now? [Y\/n]:<\/strong> <code>Y<\/code> (evet) se\u00e7ene\u011fini se\u00e7in. Bu, yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fikliklerin hemen etkili olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>MySQL Testi:<\/strong><br \/>\nMySQL sunucusuna <code>root<\/code> kullan\u0131c\u0131s\u0131 ile ba\u011flanarak kurulumu test edebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">mysql -u root -p<\/code><\/pre>\n<p>Parolan\u0131z\u0131 girdikten sonra MySQL komut istemine (<code>mysql><\/code>) d\u00fc\u015fmelisiniz. \u00c7\u0131kmak i\u00e7in <code>exit<\/code> yaz\u0131n.<\/p>\n<p><strong>Veritaban\u0131 ve Kullan\u0131c\u0131 Olu\u015fturma (Python i\u00e7in):<\/strong><br \/>\nUygulamalar\u0131n\u0131z i\u00e7in <code>root<\/code> kullan\u0131c\u0131s\u0131n\u0131 kullanmak yerine, \u00f6zel bir veritaban\u0131 ve o veritaban\u0131na eri\u015fimi olan \u00f6zel bir kullan\u0131c\u0131 olu\u015fturmak en iyi g\u00fcvenlik uygulamas\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">mysql -u root -p<\/code><\/pre>\n<p>Parolan\u0131z\u0131 girin ve a\u015fa\u011f\u0131daki SQL komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-sql\">CREATE DATABASE python_db DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;\nCREATE USER 'python_user'@'localhost' IDENTIFIED BY 'your_secure_password';\nGRANT ALL PRIVILEGES ON python_db.* TO 'python_user'@'localhost';\nFLUSH PRIVILEGES;\nEXIT;<\/code><\/pre>\n<p>*   <code>CREATE DATABASE python_db<\/code>: <code>python_db<\/code> ad\u0131nda yeni bir veritaban\u0131 olu\u015fturur.<br \/>\n*   <code>CREATE USER 'python_user'@'localhost' ...<\/code>: <code>localhost<\/code> \u00fczerinden ba\u011flanabilecek <code>python_user<\/code> ad\u0131nda yeni bir kullan\u0131c\u0131 olu\u015fturur ve ona <code>your_secure_password<\/code> parolas\u0131n\u0131 atar.<br \/>\n<em>   <code>GRANT ALL PRIVILEGES ON python_db.<\/em> TO 'python_user'@'localhost'<\/code>: <code>python_user<\/code>&#8216;a <code>python_db<\/code> veritaban\u0131ndaki t\u00fcm tablolara tam eri\u015fim yetkisi verir.<br \/>\n*   <code>FLUSH PRIVILEGES<\/code>: Yetki tablolar\u0131n\u0131 yeniden y\u00fckleyerek de\u011fi\u015fikliklerin hemen etkili olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>4. Python Kurulumu ve Gerekli Mod\u00fcller<\/h3>\n<p>Ubuntu 14.04, varsay\u0131lan olarak Python 2.7 ile gelir. Bu makalede, Apache ile entegrasyon i\u00e7in Python 2.7&#8217;yi kullanaca\u011f\u0131z.<\/p>\n<p>Python geli\u015ftirme ara\u00e7lar\u0131n\u0131 ve <code>pip<\/code> (Python paket y\u00f6neticisi) kurmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo apt-get install python python-dev python-pip -y<\/code><\/pre>\n<p>*   <code>python<\/code>: Python 2.7 yorumlay\u0131c\u0131s\u0131.<br \/>\n*   <code>python-dev<\/code>: Python ba\u015fl\u0131k dosyalar\u0131n\u0131 ve statik k\u00fct\u00fcphaneleri i\u00e7erir, bu da baz\u0131 Python mod\u00fcllerini derlemek i\u00e7in gereklidir.<br \/>\n*   <code>python-pip<\/code>: Python paketlerini kolayca kurman\u0131z\u0131 sa\u011flayan <code>pip<\/code> arac\u0131n\u0131 kurar.<\/p>\n<p><code>python-mysqldb<\/code> paketi daha \u00f6nce <code>mysql-server<\/code> ile birlikte kuruldu, ancak <code>pip<\/code> ile de kurulabilir (genellikle sistem paket y\u00f6neticisi tercih edilir).<\/p>\n<h3>5. Apache&#8217;yi Python ile Yap\u0131land\u0131rma<\/h3>\n<p>Apache&#8217;nin Python uygulamalar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmas\u0131 i\u00e7in iki ana y\u00f6ntem vard\u0131r: CGI (Common Gateway Interface) ve WSGI (Web Server Gateway Interface). CGI daha basittir ancak her istekte yeni bir Python yorumlay\u0131c\u0131s\u0131 ba\u015flatt\u0131\u011f\u0131 i\u00e7in daha az performansl\u0131d\u0131r. WSGI ise daha modern, performansl\u0131 ve framework&#8217;ler taraf\u0131ndan yayg\u0131n olarak kullan\u0131lan bir aray\u00fczd\u00fcr.<\/p>\n<h4>5.1. CGI (Common Gateway Interface) ile Python<\/h4>\n<p>CGI, web sunucusunun harici bir program\u0131 (bu durumda bir Python beti\u011fi) \u00e7al\u0131\u015ft\u0131rmas\u0131 ve \u00e7\u0131kt\u0131s\u0131n\u0131 istemciye geri g\u00f6ndermesi i\u00e7in standart bir protokold\u00fcr.<\/p>\n<p><strong>mod_cgi&#8217;yi Etkinle\u015ftirme:<\/strong><br \/>\nApache&#8217;nin CGI betiklerini \u00e7al\u0131\u015ft\u0131rma yetene\u011fine sahip olmas\u0131 i\u00e7in <code>mod_cgi<\/code> mod\u00fcl\u00fcn\u00fc etkinle\u015ftirmemiz gerekir:<\/p>\n<pre><code class=\"language-bash\">sudo a2enmod cgi<\/code><\/pre>\n<p>Ard\u0131ndan Apache&#8217;yi yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo service apache2 restart<\/code><\/pre>\n<p><strong>Apache Yap\u0131land\u0131rmas\u0131:<\/strong><br \/>\n\u015eimdi, Apache&#8217;ye Python betiklerini nerede bulaca\u011f\u0131n\u0131 ve nas\u0131l \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131 s\u00f6ylememiz gerekiyor. Varsay\u0131lan sanal host dosyas\u0131n\u0131 d\u00fczenleyelim (<code>\/etc\/apache2\/sites-available\/000-default.conf<\/code>):<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/apache2\/sites-available\/000-default.conf<\/code><\/pre>\n<p><code><VirtualHost *:80><\/code> blo\u011funun i\u00e7ine a\u015fa\u011f\u0131daki sat\u0131rlar\u0131 ekleyin (genellikle <code>DocumentRoot<\/code> sat\u0131r\u0131ndan sonra):<\/p>\n<pre><code class=\"language-apache\">ScriptAlias \/cgi-bin\/ \/var\/www\/html\/cgi-bin\/\n    <Directory \"\/var\/www\/html\/cgi-bin\">\n        Options +ExecCGI\n        AddHandler cgi-script .py\n        Order allow,deny\n        Allow from all\n    <\/Directory><\/code><\/pre>\n<p>*   <code>ScriptAlias \/cgi-bin\/ \/var\/www\/html\/cgi-bin\/<\/code>: Apache&#8217;ye <code>\/cgi-bin\/<\/code> URL&#8217;sine gelen isteklerin <code>\/var\/www\/html\/cgi-bin\/<\/code> dizinindeki betiklere y\u00f6nlendirilmesi gerekti\u011fini s\u00f6yler.<br \/>\n*   <code><Directory ...><\/code>: Belirtilen dizin i\u00e7in \u00f6zel yap\u0131land\u0131rma ayarlar\u0131n\u0131 tan\u0131mlar.<br \/>\n*   <code>Options +ExecCGI<\/code>: Bu dizindeki betiklerin y\u00fcr\u00fct\u00fclmesine izin verir.<br \/>\n*   <code>AddHandler cgi-script .py<\/code>: <code>.py<\/code> uzant\u0131l\u0131 dosyalar\u0131n CGI betikleri olarak i\u015flenmesi gerekti\u011fini belirtir.<\/p>\n<p>Kaydedin ve \u00e7\u0131k\u0131n (Ctrl+O, Enter, Ctrl+X).<\/p>\n<p><strong>\u00d6rnek Bir Python CGI Beti\u011fi Olu\u015fturma:<\/strong><br \/>\n\u015eimdi <code>\/var\/www\/html\/cgi-bin\/<\/code> dizinini olu\u015ftural\u0131m ve i\u00e7ine basit bir Python CGI beti\u011fi ekleyelim:<\/p>\n<pre><code class=\"language-bash\">sudo mkdir \/var\/www\/html\/cgi-bin\nsudo nano \/var\/www\/html\/cgi-bin\/test.py<\/code><\/pre>\n<p>A\u015fa\u011f\u0131daki i\u00e7eri\u011fi dosyaya yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-python\">#!\/usr\/bin\/python\nprint \"Content-type: text\/html\\n\"\nprint \"<html><body>\"\nprint \"\"\nprint \"<p>Bu bir Python CGI beti\u011fidir.<\/p>\"\nprint \"<p>Sunucu zaman\u0131: %s<\/p>\" % __import__('datetime').datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\nprint \"<\/body><\/html>\"<\/code><\/pre>\n<p>*   <code>#!\/usr\/bin\/python<\/code>: Bu sat\u0131r (shebang), beti\u011fin hangi yorumlay\u0131c\u0131 ile \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gerekti\u011fini belirtir. Ubuntu 14.04&#8217;te <code>python<\/code> genellikle <code>\/usr\/bin\/python<\/code>&#8216;a i\u015faret eder.<br \/>\n*   <code>print \"Content-type: text\/html\\n\"<\/code>: CGI betiklerinin HTTP ba\u015fl\u0131klar\u0131n\u0131 bu \u015fekilde \u00e7\u0131kt\u0131da vermesi gerekir. \u0130ki yeni sat\u0131r (<code>\\n<\/code>) ba\u015fl\u0131klar\u0131 g\u00f6vdeden ay\u0131r\u0131r.<\/p>\n<p>Beti\u011fe \u00e7al\u0131\u015ft\u0131rma izni verin:<\/p>\n<pre><code class=\"language-bash\">sudo chmod +x \/var\/www\/html\/cgi-bin\/test.py<\/code><\/pre>\n<p>Apache&#8217;yi yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo service apache2 restart<\/code><\/pre>\n<p><strong>Test Etme:<\/strong><br \/>\nTaray\u0131c\u0131n\u0131zda <code>http:\/\/your_server_ip\/cgi-bin\/test.py<\/code> adresini ziyaret edin. &#8220;Merhaba, Python CGI!&#8221; ba\u015fl\u0131\u011f\u0131n\u0131 ve sunucu zaman\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h4>5.2. WSGI (Web Server Gateway Interface) ile Python<\/h4>\n<p>WSGI, Python web uygulamalar\u0131 ile web sunucular\u0131 aras\u0131nda standart bir aray\u00fczd\u00fcr. CGI&#8217;dan daha verimlidir \u00e7\u00fcnk\u00fc Python yorumlay\u0131c\u0131s\u0131n\u0131 her istekte yeniden ba\u015flatmak yerine, uygulamay\u0131 sunucu s\u00fcrecinde tutar. <code>mod_wsgi<\/code> Apache i\u00e7in en yayg\u0131n WSGI mod\u00fcl\u00fcd\u00fcr.<\/p>\n<p><strong>mod_wsgi&#8217;yi Kurma ve Etkinle\u015ftirme:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt-get install libapache2-mod-wsgi -y<\/code><\/pre>\n<p>Kurulum genellikle <code>mod_wsgi<\/code>&#8216;yi otomatik olarak etkinle\u015ftirir. Kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo a2enmod wsgi<\/code><\/pre>\n<p>Zaten etkinse, &#8220;Module wsgi already enabled&#8221; mesaj\u0131n\u0131 g\u00f6r\u00fcrs\u00fcn\u00fcz.<br \/>\nApache&#8217;yi yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo service apache2 restart<\/code><\/pre>\n<p><strong>Apache Yap\u0131land\u0131rmas\u0131:<\/strong><br \/>\nYine, varsay\u0131lan sanal host dosyas\u0131n\u0131 d\u00fczenleyelim (<code>\/etc\/apache2\/sites-available\/000-default.conf<\/code>):<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/apache2\/sites-available\/000-default.conf<\/code><\/pre>\n<p><code><VirtualHost *:80><\/code> blo\u011funun i\u00e7ine a\u015fa\u011f\u0131daki sat\u0131rlar\u0131 ekleyin (CGI yap\u0131land\u0131rmas\u0131ndan sonra veya ayr\u0131 bir sanal host olarak):<\/p>\n<pre><code class=\"language-apache\"># WSGI uygulamas\u0131 i\u00e7in\n    WSGIScriptAlias \/myapp \/var\/www\/html\/myapp\/myapp.wsgi\n    WSGIDaemonProcess myapp user=www-data group=www-data processes=2 threads=15 display-name=%{GROUP}\n    WSGIProcessGroup myapp\n\n    <Directory \/var\/www\/html\/myapp>\n        Order deny,allow\n        Allow from all\n    <\/Directory><\/code><\/pre>\n<p>*   <code>WSGIScriptAlias \/myapp \/var\/www\/html\/myapp\/myapp.wsgi<\/code>: <code>\/myapp<\/code> URL&#8217;sine gelen istekleri <code>\/var\/www\/html\/myapp\/myapp.wsgi<\/code> dosyas\u0131ndaki WSGI uygulamas\u0131na y\u00f6nlendirir.<br \/>\n*   <code>WSGIDaemonProcess myapp ...<\/code>: <code>myapp<\/code> ad\u0131nda bir WSGI daemon s\u00fcreci tan\u0131mlar. Bu s\u00fcre\u00e7, Python uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r ve Apache&#8217;den gelen istekleri i\u015fler. <code>user=www-data<\/code> ve <code>group=www-data<\/code>, uygulaman\u0131n Apache&#8217;nin \u00e7al\u0131\u015ft\u0131\u011f\u0131 kullan\u0131c\u0131 ve grup alt\u0131nda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>WSGIProcessGroup myapp<\/code>: Bu <code>WSGIScriptAlias<\/code> i\u00e7in kullan\u0131lacak daemon s\u00fcrecini belirtir.<br \/>\n*   <code><Directory ...><\/code>: WSGI uygulamas\u0131n\u0131n bulundu\u011fu dizine eri\u015fim izinlerini ayarlar.<\/p>\n<p>Kaydedin ve \u00e7\u0131k\u0131n.<\/p>\n<p><strong>\u00d6rnek Bir Python WSGI Uygulamas\u0131 Olu\u015fturma:<\/strong><br \/>\nUygulama dizinini olu\u015ftural\u0131m ve i\u00e7ine <code>myapp.wsgi<\/code> dosyas\u0131n\u0131 ekleyelim:<\/p>\n<pre><code class=\"language-bash\">sudo mkdir \/var\/www\/html\/myapp\nsudo nano \/var\/www\/html\/myapp\/myapp.wsgi<\/code><\/pre>\n<p>A\u015fa\u011f\u0131daki i\u00e7eri\u011fi dosyaya yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-python\">import sys\nimport datetime\n\n<h2>Uygulama kodunun oldu\u011fu dizini sys.path'e ekleyin, b\u00f6ylece di\u011fer mod\u00fcller import edilebilir.<\/h2>\nsys.path.insert(0, '\/var\/www\/html\/myapp')\n\ndef application(environ, start_response):\n    status = '200 OK'\n    headers = [('Content-type', 'text\/html')]\n    start_response(status, headers)\n\n    html_content = \"\"\"\n    <html><body>\n    \n    <p>Bu bir Python WSGI uygulamas\u0131d\u0131r.<\/p>\n    <p>Sunucu zaman\u0131: %s<\/p>\n    <\/body><\/html>\n    \"\"\" % datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n\n    return [html_content]<\/code><\/pre>\n<p>WSGI uygulamas\u0131, <code>application<\/code> ad\u0131nda \u00e7a\u011fr\u0131labilir (callable) bir nesne olmal\u0131d\u0131r. Bu nesne, <code>environ<\/code> ve <code>start_response<\/code> ad\u0131nda iki arg\u00fcman al\u0131r. <code>environ<\/code> HTTP iste\u011fi hakk\u0131nda bilgileri (CGI de\u011fi\u015fkenleri gibi) i\u00e7erirken, <code>start_response<\/code> HTTP durum kodunu ve ba\u015fl\u0131klar\u0131 ayarlamak i\u00e7in kullan\u0131lan bir fonksiyondur.<\/p>\n<p>Dosyaya okuma izni verin (\u00e7al\u0131\u015ft\u0131rma izni gerekmez, \u00e7\u00fcnk\u00fc Python yorumlay\u0131c\u0131s\u0131 taraf\u0131ndan \u00e7a\u011fr\u0131l\u0131r):<\/p>\n<pre><code class=\"language-bash\">sudo chmod 644 \/var\/www\/html\/myapp\/myapp.wsgi<\/code><\/pre>\n<p>Apache&#8217;yi yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo service apache2 restart<\/code><\/pre>\n<p><strong>Test Etme:<\/strong><br \/>\nTaray\u0131c\u0131n\u0131zda <code>http:\/\/your_server_ip\/myapp<\/code> adresini ziyaret edin. &#8220;Merhaba, Python WSGI!&#8221; ba\u015fl\u0131\u011f\u0131n\u0131 ve sunucu zaman\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h3>6. Python ve MySQL Entegrasyonu<\/h3>\n<p>\u015eimdi Python betiklerimizin MySQL veritaban\u0131m\u0131zla nas\u0131l etkile\u015fime girece\u011fini g\u00f6sterelim. Daha \u00f6nce <code>python-mysqldb<\/code> mod\u00fcl\u00fcn\u00fc kurmu\u015ftuk.<\/p>\n<p>A\u015fa\u011f\u0131daki \u00f6rnek kodu, hem CGI hem de WSGI ortam\u0131nda \u00e7al\u0131\u015ft\u0131rabilece\u011finiz bir Python beti\u011fi olarak d\u00fc\u015f\u00fcnebilirsiniz. Bu betik, MySQL veritaban\u0131na ba\u011flan\u0131r, bir tablo olu\u015fturur, veri ekler ve eklenen verileri okuyarak HTML \u00e7\u0131kt\u0131s\u0131 olarak g\u00f6sterir.<\/p>\n<pre><code class=\"language-bash\">sudo nano \/var\/www\/html\/cgi-bin\/mysql_test.py # CGI i\u00e7in\n<h2>Veya<\/h2>\nsudo nano \/var\/www\/html\/myapp\/mysql_test_wsgi.py # WSGI i\u00e7in<\/code><\/pre>\n<p>(WSGI i\u00e7in bu dosyay\u0131 <code>myapp.wsgi<\/code> i\u00e7inde import edip kullanabilirsiniz.)<\/p>\n<pre><code class=\"language-python\">#!\/usr\/bin\/python\n<h2>-<em>- coding: utf-8 -<\/em>-<\/h2>\n\nimport MySQLdb\nimport sys\nimport datetime\n\n<h2>MySQL ba\u011flant\u0131 bilgileri<\/h2>\nDB_HOST = 'localhost'\nDB_USER = 'python_user' # Daha \u00f6nce olu\u015fturdu\u011fumuz kullan\u0131c\u0131\nDB_PASSWORD = 'your_secure_password' # Kullan\u0131c\u0131n\u0131n parolas\u0131\nDB_NAME = 'python_db' # Daha \u00f6nce olu\u015fturdu\u011fumuz veritaban\u0131\n\ndef get_html_response(content):\n    \"\"\"HTML i\u00e7eri\u011fini ba\u015fl\u0131klarla birlikte d\u00f6nd\u00fcr\u00fcr.\"\"\"\n    return \"Content-type: text\/html; charset=utf-8\\n\\n\" + \\\n           \"<html><head><meta charset='utf-8'><\/head><body>\" + \\\n           content + \\\n           \"<\/body><\/html>\"\n\ndef application(environ=None, start_response=None): # WSGI uyumlulu\u011fu i\u00e7in\n    html_output = \"\"\n    db = None\n    try:\n        # Veritaban\u0131na ba\u011flanma\n        db = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASSWORD, db=DB_NAME, charset='utf8')\n        cursor = db.cursor()\n\n        # Tablo olu\u015fturma (varsa silip yeniden olu\u015ftur)\n        cursor.execute(\"DROP TABLE IF EXISTS users\")\n        sql_create_table = \"\"\"CREATE TABLE users (\n            id INT AUTO_INCREMENT PRIMARY KEY,\n            name VARCHAR(255),\n            email VARCHAR(255),\n            created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n        ) CHARACTER SET utf8 COLLATE utf8_unicode_ci;\"\"\"\n        cursor.execute(sql_create_table)\n        html_output += \"<h2>Tablo Olu\u015fturuldu: users<\/h2>\"\n\n        # Veri ekleme\n        sql_insert = \"INSERT INTO users (name, email) VALUES (%s, %s)\"\n        cursor.execute(sql_insert, ('Alice Smith', 'alice@example.com'))\n        cursor.execute(sql_insert, ('Bob Johnson', 'bob@example.com'))\n        db.commit() # De\u011fi\u015fiklikleri kaydet\n        html_output += \"<h2>Veriler Eklendi<\/h2>\"\n\n        # Veri okuma\n        sql_select = \"SELECT id, name, email, created_at FROM users\"\n        cursor.execute(sql_select)\n        results = cursor.fetchall()\n\n        html_output += \"<h2>Kullan\u0131c\u0131lar Listesi<\/h2><ul>\"\n        if results:\n            for row in results:\n                html_output += \"<li>ID: %d, \u0130sim: %s, Email: %s, Olu\u015fturulma Tarihi: %s<\/li>\" % \\\n                               (row[0], row[1], row[2], row[3].strftime(\"%Y-%m-%d %H:%M:%S\"))\n        else:\n            html_output += \"<li>Hen\u00fcz kullan\u0131c\u0131 bulunmuyor.<\/li>\"\n        html_output += \"<\/ul>\"\n\n    except MySQLdb.Error as e:\n        error_message = \"Veritaban\u0131 Hatas\u0131: %s\" % e\n        html_output += \"<p>%s<\/p>\" % error_message\n        sys.stderr.write(error_message + \"\\n\") # Hata loglar\u0131n\u0131 Apache error loguna yaz\n\n    finally:\n        if db:\n            db.close()\n\n    if environ and start_response: # WSGI modunda \u00e7al\u0131\u015f\u0131yorsa\n        status = '200 OK'\n        headers = [('Content-type', 'text\/html; charset=utf-8')]\n        start_response(status, headers)\n        return [html_output.encode('utf-8')] # Byte dizisi olarak d\u00f6nd\u00fcr\n    else: # CGI modunda \u00e7al\u0131\u015f\u0131yorsa\n        print get_html_response(html_output).encode('utf-8')\n\nif __name__ == '__main__':\n    # Bu blok, betik do\u011frudan \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda (CGI gibi) \u00e7al\u0131\u015f\u0131r.\n    # WSGI modunda \u00e7al\u0131\u015f\u0131rken, 'application' fonksiyonu do\u011frudan \u00e7a\u011fr\u0131l\u0131r.\n    application()<\/code><\/pre>\n<p>*   <strong><code>charset='utf8'<\/code>:<\/strong> MySQL ba\u011flant\u0131s\u0131nda T\u00fcrk\u00e7e karakter sorunlar\u0131n\u0131 \u00f6nlemek i\u00e7in bu parametreyi ekledik.<br \/>\n*   <strong><code>encode('utf-8')<\/code>:<\/strong> Python 2&#8217;de <code>print<\/code> ile stringleri do\u011frudan basarken veya WSGI&#8217;den d\u00f6nd\u00fcr\u00fcrken karakter kodlama sorunlar\u0131n\u0131 \u00f6nlemek i\u00e7in UTF-8&#8217;e d\u00f6n\u00fc\u015ft\u00fcrmek \u00f6nemlidir.<br \/>\n*   <strong><code>sys.stderr.write()<\/code>:<\/strong> Hatalar\u0131 Apache&#8217;nin hata loglar\u0131na yazmak i\u00e7in kullan\u0131l\u0131r, bu da sorun gidermede yard\u0131mc\u0131 olur.<\/p>\n<p><strong>CGI Olarak \u00c7al\u0131\u015ft\u0131rma:<\/strong><br \/>\nE\u011fer bu kodu <code>\/var\/www\/html\/cgi-bin\/mysql_test.py<\/code> olarak kaydettiyseniz, \u00e7al\u0131\u015ft\u0131rma izni verin:<\/p>\n<pre><code class=\"language-bash\">sudo chmod +x \/var\/www\/html\/cgi-bin\/mysql_test.py\nsudo service apache2 restart<\/code><\/pre>\n<p>Taray\u0131c\u0131n\u0131zda <code>http:\/\/your_server_ip\/cgi-bin\/mysql_test.py<\/code> adresini ziyaret ederek test edin.<\/p>\n<p><strong>WSGI Olarak \u00c7al\u0131\u015ft\u0131rma:<\/strong><br \/>\nE\u011fer bu kodu <code>\/var\/www\/html\/myapp\/mysql_test_wsgi.py<\/code> olarak kaydettiyseniz, <code>myapp.wsgi<\/code> dosyan\u0131z\u0131 a\u015fa\u011f\u0131daki gibi d\u00fczenleyerek bu uygulamay\u0131 \u00e7a\u011f\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-python\">import sys\nimport datetime\n<h2>Yeni olu\u015fturdu\u011fumuz MySQL test uygulamas\u0131n\u0131 import edin<\/h2>\nfrom mysql_test_wsgi import application as mysql_app # application fonksiyonunu mysql_app olarak import ediyoruz\n\nsys.path.insert(0, '\/var\/www\/html\/myapp')\n\ndef application(environ, start_response):\n    # Basit bir y\u00f6nlendirme yapabiliriz veya do\u011frudan mysql_app'i \u00e7a\u011f\u0131rabiliriz\n    if environ['PATH_INFO'] == '\/mysql_test':\n        return mysql_app(environ, start_response)\n    else:\n        status = '200 OK'\n        headers = [('Content-type', 'text\/html; charset=utf-8')]\n        start_response(status, headers)\n        html_content = \"\"\"\n        <html><body>\n        \n        <p>Ana sayfa. <a href=\"\/myapp\/mysql_test\">MySQL Testi<\/a><\/p>\n        <p>Sunucu zaman\u0131: %s<\/p>\n        <\/body><\/html>\n        \"\"\" % datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n        return [html_content.encode('utf-8')]<\/code><\/pre>\n<p><code>mysql_test_wsgi.py<\/code> dosyas\u0131n\u0131 <code>myapp.wsgi<\/code> ile ayn\u0131 dizine koydu\u011funuzdan emin olun.<br \/>\nDosyaya okuma izni verin:<\/p>\n<pre><code class=\"language-bash\">sudo chmod 644 \/var\/www\/html\/myapp\/mysql_test_wsgi.py\nsudo service apache2 restart<\/code><\/pre>\n<p>Taray\u0131c\u0131n\u0131zda <code>http:\/\/your_server_ip\/myapp\/mysql_test<\/code> adresini ziyaret ederek test edin.<\/p>\n<h3>7. G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h3>\n<p>Bir sunucu kurarken g\u00fcvenlik her zaman \u00f6ncelikli olmal\u0131d\u0131r. \u0130\u015fte dikkat etmeniz gereken baz\u0131 temel g\u00fcvenlik ipu\u00e7lar\u0131:<br \/>\n*   <strong>MySQL Root Parolas\u0131 ve Kullan\u0131c\u0131 Yetkileri:<\/strong> MySQL <code>root<\/code> kullan\u0131c\u0131s\u0131n\u0131n parolas\u0131n\u0131 asla bo\u015f b\u0131rakmay\u0131n ve uzaktan eri\u015fimi devre d\u0131\u015f\u0131 b\u0131rak\u0131n. Uygulamalar\u0131n\u0131z i\u00e7in <code>root<\/code> kullan\u0131c\u0131s\u0131 yerine, sadece ihtiya\u00e7 duyduklar\u0131 veritabanlar\u0131na eri\u015fimi olan s\u0131n\u0131rl\u0131 yetkili kullan\u0131c\u0131lar olu\u015fturun.<br \/>\n*   <strong>Apache Dizin \u0130zinleri:<\/strong> <code>\/var\/www\/html<\/code> ve alt\u0131ndaki dizinlerin dosya ve dizin izinlerini do\u011fru ayarlay\u0131n. Genellikle web sunucusu kullan\u0131c\u0131s\u0131n\u0131n (<code>www-data<\/code>) yazma iznine ihtiyac\u0131 yoktur, sadece okuma izni yeterlidir. Betik dosyalar\u0131na \u00e7al\u0131\u015ft\u0131rma izni (<code>chmod +x<\/code>) sadece CGI i\u00e7in gereklidir, WSGI i\u00e7in genellikle 644 izinleri yeterlidir.<br \/>\n*   <strong>G\u00fcvenlik Duvar\u0131 (UFW):<\/strong> Sadece gerekli portlara (HTTP i\u00e7in 80, HTTPS i\u00e7in 443, SSH i\u00e7in 22) izin verin. Di\u011fer t\u00fcm portlar\u0131 kapat\u0131n.<br \/>\n*   <strong>SSL\/TLS (HTTPS):<\/strong> Web sitenizi ve uygulamalar\u0131n\u0131z\u0131 \u015fifrelemek i\u00e7in mutlaka HTTPS kullan\u0131n. Let&#8217;s Encrypt gibi hizmetlerle \u00fccretsiz SSL sertifikalar\u0131 alabilirsiniz. Ubuntu 14.04 \u00fczerinde Let&#8217;s Encrypt kurulumu biraz daha zahmetli olabilir (\u00f6rne\u011fin <code>certbot<\/code> i\u00e7in daha yeni Python s\u00fcr\u00fcmleri gerekebilir), ancak m\u00fcmk\u00fcnd\u00fcr.<br \/>\n*   <strong>Gereksiz Mod\u00fclleri Kapatma:<\/strong> Apache&#8217;de kullanmad\u0131\u011f\u0131n\u0131z mod\u00fclleri (<code>a2dismod<\/code>) devre d\u0131\u015f\u0131 b\u0131rak\u0131n. Bu, potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 azalt\u0131r.<br \/>\n*   <strong>Sistemi G\u00fcncel Tutma:<\/strong> \u0130\u015fletim sisteminizi ve t\u00fcm y\u00fckl\u00fc paketleri d\u00fczenli olarak <code>sudo apt-get update && sudo apt-get upgrade<\/code> komutlar\u0131yla g\u00fcncel tutun. Bu, bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 yamalar\u0131 alman\u0131z\u0131 sa\u011flar.<br \/>\n*   <strong>Hata Mesajlar\u0131n\u0131 K\u0131s\u0131tlama:<\/strong> \u00dcretim ortam\u0131nda detayl\u0131 hata mesajlar\u0131n\u0131 kullan\u0131c\u0131ya g\u00f6stermeyin. Bu, sald\u0131rganlara sisteminiz hakk\u0131nda de\u011ferli bilgiler verebilir. Apache ve Python uygulamalar\u0131n\u0131z\u0131n hata loglar\u0131n\u0131 (<code>\/var\/log\/apache2\/error.log<\/code> gibi) kontrol edin.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Ubuntu 14.04 i\u015fletim sistemi \u00fczerinde Apache, MySQL ve Python&#8217;dan olu\u015fan bir web sunucusu y\u0131\u011f\u0131n\u0131n\u0131 herhangi bir web framework&#8217;\u00fc kullanmadan nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceledik. Sistemi g\u00fcncellemekten ba\u015flayarak Apache ve MySQL sunucular\u0131n\u0131 kurduk, Python ortam\u0131n\u0131 haz\u0131rlad\u0131k ve son olarak Apache&#8217;yi hem CGI hem de WSGI modlar\u0131nda Python uygulamalar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131racak \u015fekilde yap\u0131land\u0131rd\u0131k. Ayr\u0131ca, Python ile MySQL veritaban\u0131 entegrasyonunu g\u00f6steren bir \u00f6rnek uygulama geli\u015ftirdik.<\/p>\n<p>Bu &#8220;\u00e7er\u00e7evesiz&#8221; yakla\u015f\u0131m, web sunucusu ve uygulama aras\u0131ndaki temel etkile\u015fim mekanizmalar\u0131n\u0131 anlamak i\u00e7in de\u011ferli bir deneyim sunar. CGI ve WSGI&#8217;nin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kavramak, daha sonra Django veya Flask gibi framework&#8217;leri kullan\u0131rken size sa\u011flam bir temel sa\u011flayacakt\u0131r.<\/p>\n<p>Art\u0131k temel bir LAMP (Python) sunucusuna sahipsiniz. Bir sonraki ad\u0131mlar\u0131n\u0131z, uygulaman\u0131z\u0131 daha karma\u015f\u0131k hale getirmek, performans optimizasyonlar\u0131 yapmak, HTTPS kurmak veya bir Python web framework&#8217;\u00fcne ge\u00e7i\u015f yapmak olabilir. Unutmay\u0131n, bu makale Ubuntu 14.04&#8217;e \u00f6zeldir ve daha yeni Ubuntu s\u00fcr\u00fcmlerinde baz\u0131 paket adlar\u0131 veya kurulum ad\u0131mlar\u0131 farkl\u0131l\u0131k g\u00f6sterebilir. Ancak temel mant\u0131k ve kavramlar benzer kalacakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m\nGiri\u015f\nWeb uygulamalar\u0131n\u0131n temelini olu\u015fturan sun","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-34320","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m\" \/>\n<meta property=\"og:description\" content=\"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m Giri\u015f Web uygulamalar\u0131n\u0131n temelini olu\u015fturan sun\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-15T01:40:50+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m\",\"datePublished\":\"2025-11-15T01:40:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/\"},\"wordCount\":2526,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/\",\"name\":\"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-15T01:40:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/","og_locale":"tr_TR","og_type":"article","og_title":"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m","og_description":"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m Giri\u015f Web uygulamalar\u0131n\u0131n temelini olu\u015fturan sun","og_url":"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-15T01:40:50+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m","datePublished":"2025-11-15T01:40:50+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/"},"wordCount":2526,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/","url":"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/","name":"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-15T01:40:50+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/apache-mysql-ve-python-lamp-sunucusu-kurulumu-ubuntu-14-04-uzerinde-cercevesiz-yaklasim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Apache, MySQL ve Python (LAMP) Sunucusu Kurulumu: Ubuntu 14.04 \u00dczerinde \u00c7er\u00e7evesiz Yakla\u015f\u0131m"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34320","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34320"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34320\/revisions"}],"predecessor-version":[{"id":34321,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34320\/revisions\/34321"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34320"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34320"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34320"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}