{"id":39233,"date":"2026-02-17T07:40:47","date_gmt":"2026-02-17T04:40:47","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39233"},"modified":"2026-02-17T07:40:47","modified_gmt":"2026-02-17T04:40:47","slug":"flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/","title":{"rendered":"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Modern web uygulamalar\u0131 geli\u015ftirirken, geli\u015ftirme s\u00fcrecinin yan\u0131 s\u0131ra uygulaman\u0131n g\u00fcvenli, verimli ve \u00f6l\u00e7eklenebilir bir \u015fekilde sunulmas\u0131 da b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Python tabanl\u0131 mikro web \u00e7er\u00e7evesi Flask, esnekli\u011fi ve hafif yap\u0131s\u0131yla pop\u00fclerli\u011fini korurken, \u00fcretim ortam\u0131nda do\u011frudan kullan\u0131ma uygun de\u011fildir. Flask gibi WSGI (Web Server Gateway Interface) uygulamalar\u0131n\u0131 \u00fcretimde \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir WSGI sunucusuna (\u00f6rne\u011fin Gunicorn) ve kullan\u0131c\u0131 isteklerini y\u00f6nlendiren, statik dosyalar\u0131 sunan ve y\u00fck dengeleme gibi g\u00f6revleri \u00fcstlenen bir ters proxy sunucusuna (\u00f6rne\u011fin Nginx) ihtiya\u00e7 duyar\u0131z. Bu rehberde, Flask uygulaman\u0131z\u0131 Ubuntu 16.04 i\u015fletim sistemi \u00fczerinde Gunicorn ve Nginx kullanarak nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m detayl\u0131 bir \u015fekilde a\u00e7\u0131klayaca\u011f\u0131z.<\/p>\n<p>Ubuntu 16.04, uzun s\u00fcreli destek (LTS) sa\u011flayan ve bir\u00e7ok kurumsal ortamda hala kullan\u0131lan stabil bir i\u015fletim sistemi s\u00fcr\u00fcm\u00fcd\u00fcr. Bu rehber, eski sistemlerde veya belirli bir LTS s\u00fcr\u00fcm\u00fcne ba\u011fl\u0131 kalmak zorunda olan projelerde Flask uygulamalar\u0131n\u0131 ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131rmak isteyen geli\u015ftiriciler ve sistem y\u00f6neticileri i\u00e7in kapsaml\u0131 bir kaynak olmay\u0131 hedeflemektedir.<\/p>\n<p>Bu kurulum, uygulaman\u0131z\u0131n a\u015fa\u011f\u0131daki avantajlara sahip olmas\u0131n\u0131 sa\u011flayacakt\u0131r:<br \/>\n*   <strong>Performans:<\/strong> Nginx, statik dosyalar\u0131 h\u0131zl\u0131 bir \u015fekilde sunar ve Gunicorn, Python uygulaman\u0131z\u0131n birden fazla s\u00fcrecini y\u00f6neterek e\u015fzamanl\u0131 istekleri daha verimli i\u015fler.<br \/>\n*   <strong>G\u00fcvenlik:<\/strong> Nginx, do\u011frudan uygulama sunucusu yerine bir arac\u0131 g\u00f6revi g\u00f6rerek uygulaman\u0131z\u0131 d\u0131\u015f d\u00fcnyaya kar\u015f\u0131 korur.<br \/>\n*   <strong>G\u00fcvenilirlik:<\/strong> Systemd, Gunicorn s\u00fcrecini y\u00f6neterek uygulaman\u0131z\u0131n otomatik olarak ba\u015flat\u0131lmas\u0131n\u0131 ve \u00e7\u00f6kt\u00fc\u011f\u00fcnde yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Bu mimari, gelecekte uygulaman\u0131z\u0131n y\u00fck\u00fcn\u00fc dengelemek veya daha fazla sunucu eklemek i\u00e7in temel olu\u015fturur.<\/p>\n<h2>\u00d6n Ko\u015fullar<\/h2>\n<p>Bu rehbere ba\u015flamadan \u00f6nce a\u015fa\u011f\u0131daki maddelerin haz\u0131r oldu\u011fundan emin olmal\u0131s\u0131n\u0131z:<br \/>\n*   <strong>Ubuntu 16.04 Kurulu Bir Sunucu:<\/strong> SSH eri\u015fimine sahip, g\u00fcncel ve \u00e7al\u0131\u015fan bir Ubuntu 16.04 sunucusu gereklidir. DigitalOcean, AWS, Google Cloud veya herhangi bir sanal \u00f6zel sunucu (VPS) sa\u011flay\u0131c\u0131s\u0131ndan temin edebilirsiniz.<br \/>\n*   <strong>Sudo Yetkilerine Sahip Bir Kullan\u0131c\u0131:<\/strong> Sunucuda <code>sudo<\/code> komutunu kullanabilen, root olmayan bir kullan\u0131c\u0131 hesab\u0131na sahip olmal\u0131s\u0131n\u0131z. G\u00fcvenlik nedenleriyle root kullan\u0131c\u0131s\u0131 olarak do\u011frudan \u00e7al\u0131\u015fmaktan ka\u00e7\u0131n\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong>Temel Linux Komut Bilgisi:<\/strong> <code>cd<\/code>, <code>ls<\/code>, <code>mkdir<\/code>, <code>nano<\/code> gibi temel Linux komutlar\u0131na a\u015fina olman\u0131z, kurulum s\u00fcrecini kolayla\u015ft\u0131racakt\u0131r.<br \/>\n*   <strong>Alan Ad\u0131 (\u0130ste\u011fe Ba\u011fl\u0131 ama \u00d6nerilir):<\/strong> Uygulaman\u0131za bir alan ad\u0131 (\u00f6rne\u011fin <code>example.com<\/code>) \u00fczerinden eri\u015fmek istiyorsan\u0131z, alan ad\u0131n\u0131z\u0131n sunucunuzun IP adresine y\u00f6nlendirilmi\u015f olmas\u0131 gerekir. Aksi takdirde, sunucunuzun IP adresi \u00fczerinden eri\u015fim sa\u011flayabilirsiniz.<\/p>\n<h2>Ad\u0131m 1: Sistem G\u00fcncelleme ve Temel Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kurma<\/h2>\n<p>Herhangi bir yeni kuruluma ba\u015flamadan \u00f6nce, sunucunuzdaki paket listesini g\u00fcncellemek ve mevcut paketleri en son s\u00fcr\u00fcmlerine y\u00fckseltmek iyi bir uygulamad\u0131r. Bu, olas\u0131 g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 kapat\u0131r ve en g\u00fcncel yaz\u0131l\u0131m s\u00fcr\u00fcmlerini kullanman\u0131z\u0131 sa\u011flar.<\/p>\n<p>SSH \u00fczerinden sunucunuza ba\u011fland\u0131ktan sonra a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt upgrade -y<\/code><\/pre>\n<p>Ard\u0131ndan, Flask uygulamam\u0131z\u0131n ve Gunicorn&#8217;\u0131n d\u00fczg\u00fcn \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olabilecek baz\u0131 temel geli\u015ftirme ara\u00e7lar\u0131n\u0131 ve Python ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurmal\u0131y\u0131z. Ayr\u0131ca Nginx&#8217;i de bu ad\u0131mda kurabiliriz.<\/p>\n<pre><code class=\"language-bash\">sudo apt install -y build-essential python-dev python-pip nginx<\/code><\/pre>\n<p>*   <code>build-essential<\/code>: Derleme ara\u00e7lar\u0131, baz\u0131 Python paketleri i\u00e7in gereklidir.<br \/>\n*   <code>python-dev<\/code>: Python ba\u015fl\u0131k dosyalar\u0131, C uzant\u0131lar\u0131 derlenirken ihtiya\u00e7 duyulur.<br \/>\n*   <code>python-pip<\/code>: Python paket y\u00f6neticisi. Ubuntu 16.04&#8217;te genellikle Python 2&#8217;nin <code>pip<\/code>&#8216;ini kurar\u0131z, ancak daha sonra Python 3 i\u00e7in de <code>pip3<\/code>&#8216;\u00fc kuraca\u011f\u0131z.<br \/>\n*   <code>nginx<\/code>: Ters proxy sunucumuz.<\/p>\n<h2>Ad\u0131m 2: Python Ortam\u0131n\u0131 Haz\u0131rlama<\/h2>\n<p>Ubuntu 16.04 varsay\u0131lan olarak Python 2 ile gelir ve sistemin baz\u0131 bile\u015fenleri bu s\u00fcr\u00fcme ba\u011f\u0131ml\u0131d\u0131r. Bu nedenle, Flask uygulamam\u0131z\u0131 Python 3 \u00fczerinde \u00e7al\u0131\u015ft\u0131rmak ve sistem Python&#8217;unu etkilememek i\u00e7in sanal ortam (virtual environment) kullanmak en iyi yakla\u015f\u0131md\u0131r.<\/p>\n<h3>Python 3 Kurulumu<\/h3>\n<p>E\u011fer sunucunuzda Python 3 y\u00fckl\u00fc de\u011filse, a\u015fa\u011f\u0131daki komutla kurabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo apt install -y python3 python3-pip<\/code><\/pre>\n<p>Bu komut, Python 3 yorumlay\u0131c\u0131s\u0131n\u0131 ve Python 3 i\u00e7in <code>pip<\/code> paket y\u00f6neticisini kuracakt\u0131r.<\/p>\n<h3>Sanal Ortam Olu\u015fturma<\/h3>\n<p>Uygulamam\u0131z i\u00e7in \u00f6zel bir dizin olu\u015ftural\u0131m ve bu dizin i\u00e7inde bir sanal ortam kural\u0131m. Bu, uygulaman\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 sistem genelindeki Python paketlerinden izole etmenizi sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/var\/www\/myflaskapp\nsudo chown -R $USER:$USER \/var\/www\/myflaskapp\ncd \/var\/www\/myflaskapp<\/code><\/pre>\n<p>*   <code>sudo mkdir -p \/var\/www\/myflaskapp<\/code>: Flask uygulamam\u0131z i\u00e7in <code>\/var\/www<\/code> dizini alt\u0131nda <code>myflaskapp<\/code> ad\u0131nda bir dizin olu\u015fturur. <code>-p<\/code> parametresi, \u00fcst dizinler mevcut de\u011filse onlar\u0131 da olu\u015fturur.<br \/>\n*   <code>sudo chown -R $USER:$USER \/var\/www\/myflaskapp<\/code>: Bu komut, olu\u015fturdu\u011fumuz <code>myflaskapp<\/code> dizininin sahipli\u011fini mevcut kullan\u0131c\u0131m\u0131za verir. Bu sayede, <code>sudo<\/code> kullanmadan bu dizin i\u00e7inde dosya olu\u015fturabilir ve de\u011fi\u015ftirebiliriz. <code>$USER<\/code> ortam de\u011fi\u015fkeni, mevcut kullan\u0131c\u0131 ad\u0131n\u0131z\u0131 temsil eder.<br \/>\n*   <code>cd \/var\/www\/myflaskapp<\/code>: \u00c7al\u0131\u015fma dizinimizi Flask uygulamam\u0131z\u0131n k\u00f6k dizinine de\u011fi\u015ftiririz.<\/p>\n<p>\u015eimdi bu dizin i\u00e7inde bir sanal ortam olu\u015ftural\u0131m ve etkinle\u015ftirelim:<\/p>\n<pre><code class=\"language-bash\">python3 -m venv venv\nsource venv\/bin\/activate<\/code><\/pre>\n<p>*   <code>python3 -m venv venv<\/code>: <code>venv<\/code> mod\u00fcl\u00fcn\u00fc kullanarak <code>venv<\/code> ad\u0131nda bir sanal ortam olu\u015fturur.<br \/>\n*   <code>source venv\/bin\/activate<\/code>: Sanal ortam\u0131 etkinle\u015ftirir. Komut sat\u0131r\u0131n\u0131z\u0131n ba\u015f\u0131nda <code>(venv)<\/code> ifadesini g\u00f6rmelisiniz. Bu, art\u0131k sanal ortam\u0131n aktif oldu\u011funu ve <code>pip<\/code> ile kuraca\u011f\u0131n\u0131z paketlerin bu ortama y\u00fcklenece\u011fini g\u00f6sterir.<\/p>\n<h2>Ad\u0131m 3: Flask Uygulamas\u0131n\u0131 Olu\u015fturma<\/h2>\n<p>Basit bir Flask uygulamas\u0131 olu\u015ftural\u0131m. Bu uygulama, web taray\u0131c\u0131s\u0131ndan eri\u015fildi\u011finde basit bir &#8220;Merhaba D\u00fcnya!&#8221; mesaj\u0131 d\u00f6nd\u00fcrecektir.<\/p>\n<p>\u00d6ncelikle, Flask&#8217;\u0131 sanal ortam\u0131m\u0131za kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">pip install Flask<\/code><\/pre>\n<p>\u015eimdi Flask uygulamam\u0131z\u0131n kodunu i\u00e7eren bir dosya (<code>app.py<\/code>) olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">nano app.py<\/code><\/pre>\n<p>A\u015fa\u011f\u0131daki i\u00e7eri\u011fi <code>app.py<\/code> dosyas\u0131na yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-python\">from flask import Flask, send_from_directory\nimport os\n\napp = Flask(__name__)\n\n<h2>Statik dosyalar i\u00e7in bir \u00f6rnek dizin olu\u015ftural\u0131m<\/h2>\n<h2>Bu dizin Nginx taraf\u0131ndan sunulacak<\/h2>\n@app.route('\/static\/<path:filename>')\ndef static_files(filename):\n    return send_from_directory('static', filename)\n\n@app.route('\/')\ndef hello_world():\n    return 'Merhaba D\u00fcnya! Flask Uygulamam Gunicorn ve Nginx ile \u00c7al\u0131\u015f\u0131yor!'\n\nif __name__ == '__main__':\n    app.run(debug=True)<\/code><\/pre>\n<p>*   <code>from flask import Flask, send_from_directory<\/code>: Flask s\u0131n\u0131f\u0131n\u0131 ve statik dosyalar\u0131 sunmak i\u00e7in <code>send_from_directory<\/code> fonksiyonunu i\u00e7e aktar\u0131r\u0131z.<br \/>\n*   <code>app = Flask(__name__)<\/code>: Bir Flask uygulamas\u0131 \u00f6rne\u011fi olu\u015ftururuz.<br \/>\n*   <code>@app.route('\/')<\/code>: K\u00f6k URL&#8217;ye (\/) gelen istekleri <code>hello_world<\/code> fonksiyonuna y\u00f6nlendirir.<br \/>\n*   <code>hello_world()<\/code>: Basit bir metin d\u00f6nd\u00fcren fonksiyon.<br \/>\n*   <code>@app.route('\/static\/<path:filename>')<\/code>: <code>\/static\/<\/code> ile ba\u015flayan URL&#8217;ler i\u00e7in bir rota tan\u0131mlar. Bu rota, Nginx&#8217;in statik dosyalar\u0131 sunmas\u0131n\u0131 sa\u011flayacak \u015fekilde ayarlanacak olsa da, geli\u015ftirme s\u0131ras\u0131nda veya Nginx yap\u0131land\u0131rmas\u0131nda bir sorun olmas\u0131 durumunda Flask&#8217;\u0131n da statik dosyalar\u0131 sunabilmesi i\u00e7in bir yedek mekanizma olarak eklendi.<br \/>\n*   <code>if __name__ == '__main__': app.run(debug=True)<\/code>: Bu k\u0131s\u0131m, uygulamay\u0131 do\u011frudan Python ile \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda (\u00f6rne\u011fin <code>python app.py<\/code>) geli\u015ftirme sunucusunu ba\u015flat\u0131r. \u00dcretim ortam\u0131nda Gunicorn kullanaca\u011f\u0131m\u0131z i\u00e7in bu k\u0131s\u0131m \u00e7al\u0131\u015fmayacakt\u0131r.<\/p>\n<p>Statik dosyalar i\u00e7in bir dizin olu\u015ftural\u0131m ve i\u00e7ine \u00f6rnek bir dosya koyal\u0131m. Bu, Nginx&#8217;in statik dosyalar\u0131 do\u011fru bir \u015fekilde sunup sunmad\u0131\u011f\u0131n\u0131 test etmemize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<pre><code class=\"language-bash\">mkdir static\necho \"Bu bir statik dosya testidir.\" > static\/test.txt<\/code><\/pre>\n<p>Flask uygulamam\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 <code>requirements.txt<\/code> dosyas\u0131na kaydedelim. Bu, gelecekte uygulamay\u0131 ba\u015fka bir ortamda kurarken veya da\u011f\u0131t\u0131rken kolayl\u0131k sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">pip freeze > requirements.txt<\/code><\/pre>\n<p>\u015eimdi sanal ortamdan \u00e7\u0131kabiliriz:<\/p>\n<pre><code class=\"language-bash\">deactivate<\/code><\/pre>\n<h2>Ad\u0131m 4: Gunicorn&#8217;\u0131 Kurma ve Yap\u0131land\u0131rma<\/h2>\n<p>Gunicorn (Green Unicorn), bir WSGI HTTP sunucusudur ve Flask uygulaman\u0131z ile Nginx aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Gunicorn, birden fazla Python s\u00fcrecini y\u00f6neterek uygulaman\u0131z\u0131n ayn\u0131 anda birden fazla iste\u011fi i\u015flemesini sa\u011flar.<\/p>\n<h3>Gunicorn Kurulumu<\/h3>\n<p>\u00d6ncelikle tekrar sanal ortam\u0131m\u0131z\u0131 etkinle\u015ftirelim ve Gunicorn&#8217;\u0131 kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">cd \/var\/www\/myflaskapp\nsource venv\/bin\/activate\npip install gunicorn<\/code><\/pre>\n<h3>Uygulamay\u0131 Gunicorn ile Test Etme<\/h3>\n<p>Gunicorn&#8217;\u0131n Flask uygulaman\u0131z\u0131 do\u011fru bir \u015fekilde ba\u015flat\u0131p ba\u015flatmad\u0131\u011f\u0131n\u0131 test edelim:<\/p>\n<pre><code class=\"language-bash\">gunicorn --bind 0.0.0.0:5000 app:app<\/code><\/pre>\n<p>*   <code>--bind 0.0.0.0:5000<\/code>: Gunicorn&#8217;\u0131n t\u00fcm a\u011f aray\u00fczlerinde (0.0.0.0) 5000 numaral\u0131 porttan gelen ba\u011flant\u0131lar\u0131 dinlemesini s\u00f6yler.<br \/>\n*   <code>app:app<\/code>: \u0130lk <code>app<\/code>, Flask uygulaman\u0131z\u0131n kodunu i\u00e7eren Python mod\u00fcl\u00fcn\u00fcn ad\u0131d\u0131r (<code>app.py<\/code>). \u0130kinci <code>app<\/code> ise bu mod\u00fcl i\u00e7indeki Flask uygulama nesnesinin ad\u0131d\u0131r (yani <code>app = Flask(__name__)<\/code> ile olu\u015fturdu\u011fumuz <code>app<\/code> de\u011fi\u015fkeni).<\/p>\n<p>Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, web taray\u0131c\u0131n\u0131zdan sunucunuzun IP adresini ve 5000 portunu (\u00f6rne\u011fin <code>http:\/\/your_server_ip:5000<\/code>) ziyaret ederek uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulayabilirsiniz. Testi tamamlad\u0131\u011f\u0131n\u0131zda <code>CTRL+C<\/code> tu\u015f kombinasyonu ile Gunicorn&#8217;\u0131 durdurun.<\/p>\n<h3>Gunicorn i\u00e7in Systemd Servisi Olu\u015fturma<\/h3>\n<p>Uygulamam\u0131z\u0131n sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda otomatik olarak ba\u015flamas\u0131 ve bir hata durumunda yeniden ba\u015flat\u0131lmas\u0131 i\u00e7in Gunicorn&#8217;\u0131 bir <code>systemd<\/code> servisi olarak yap\u0131land\u0131rmam\u0131z gerekir. <code>systemd<\/code>, modern Linux da\u011f\u0131t\u0131mlar\u0131nda sistem ve servis y\u00f6neticisidir.<\/p>\n<p>Gunicorn&#8217;\u0131 bir socket dosyas\u0131 \u00fczerinden Nginx&#8217;e ba\u011flayaca\u011f\u0131z. Bu, a\u011f portu kullanmaktan daha g\u00fcvenli ve performansl\u0131 bir y\u00f6ntemdir.<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/systemd\/system\/myflaskapp.service<\/code><\/pre>\n<p>A\u015fa\u011f\u0131daki i\u00e7eri\u011fi <code>myflaskapp.service<\/code> dosyas\u0131na yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-ini\">[Unit]\nDescription=Gunicorn instance to serve myflaskapp\nAfter=network.target\n\n[Service]\nUser=www-data\nGroup=www-data\nWorkingDirectory=\/var\/www\/myflaskapp\nEnvironment=\"PATH=\/var\/www\/myflaskapp\/venv\/bin\"\nExecStart=\/var\/www\/myflaskapp\/venv\/bin\/gunicorn --workers 3 --bind unix:\/var\/www\/myflaskapp\/myflaskapp.sock -m 007 app:app\nRestart=always\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>*   <strong>[Unit] B\u00f6l\u00fcm\u00fc:<\/strong><br \/>\n    *   <code>Description<\/code>: Servisin k\u0131sa bir a\u00e7\u0131klamas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <code>After=network.target<\/code>: Servisin a\u011f servisi ba\u015flat\u0131ld\u0131ktan sonra ba\u015flamas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>[Service] B\u00f6l\u00fcm\u00fc:<\/strong><br \/>\n    *   <code>User=www-data<\/code>: Gunicorn s\u00fcrecinin hangi kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir. <code>www-data<\/code> genellikle web sunucusu s\u00fcre\u00e7leri i\u00e7in kullan\u0131lan standart bir kullan\u0131c\u0131d\u0131r.<br \/>\n    *   <code>Group=www-data<\/code>: Gunicorn s\u00fcrecinin hangi grup alt\u0131nda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir.<br \/>\n    *   <code>WorkingDirectory<\/code>: Uygulaman\u0131z\u0131n k\u00f6k dizinini belirtir. Gunicorn bu dizinde \u00e7al\u0131\u015facakt\u0131r.<br \/>\n    *   <code>Environment=\"PATH=\/var\/www\/myflaskapp\/venv\/bin\"<\/code>: Gunicorn&#8217;\u0131n sanal ortamdaki Python ve Gunicorn ikilisine eri\u015febilmesi i\u00e7in PATH de\u011fi\u015fkenini ayarlar.<br \/>\n    *   <code>ExecStart<\/code>: Servis ba\u015flat\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lacak komutu belirtir.<br \/>\n        *   <code>\/var\/www\/myflaskapp\/venv\/bin\/gunicorn<\/code>: Sanal ortamdaki Gunicorn y\u00fcr\u00fct\u00fclebilir dosyas\u0131n\u0131n tam yolu.<br \/>\n        <em>   <code>--workers 3<\/code>: Gunicorn&#8217;\u0131n 3 adet worker (\u00e7al\u0131\u015fan) s\u00fcreci ba\u015flatmas\u0131n\u0131 s\u00f6yler. Bu say\u0131 genellikle <code>(2 <\/em> CPU \u00c7ekirdek Say\u0131s\u0131) + 1<\/code> form\u00fcl\u00fcyle belirlenir, ancak sunucunuzun kaynaklar\u0131na g\u00f6re ayarlaman\u0131z gerekebilir.<br \/>\n        *   <code>--bind unix:\/var\/www\/myflaskapp\/myflaskapp.sock<\/code>: Gunicorn&#8217;\u0131n bir TCP portu yerine bir Unix soket dosyas\u0131 \u00fczerinden dinlemesini sa\u011flar. Bu dosya, Nginx ile ileti\u015fim kurmak i\u00e7in kullan\u0131lacakt\u0131r.<br \/>\n        *   <code>-m 007<\/code>: Olu\u015fturulan soket dosyas\u0131n\u0131n izinlerini ayarlar. <code>007<\/code> izni, soket dosyas\u0131n\u0131n sahibi (root) ve grup (www-data) taraf\u0131ndan tam eri\u015fime sahip olmas\u0131n\u0131, di\u011ferlerinin ise yaln\u0131zca y\u00fcr\u00fctme iznine sahip olmas\u0131n\u0131 sa\u011flar. Bu, Nginx&#8217;in soket dosyas\u0131na eri\u015febilmesi i\u00e7in \u00f6nemlidir.<br \/>\n        *   <code>app:app<\/code>: Flask uygulaman\u0131z\u0131n mod\u00fcl ve uygulama nesnesi.<br \/>\n    *   <code>Restart=always<\/code>: Gunicorn s\u00fcreci herhangi bir nedenle \u00e7\u00f6kerse veya durursa, <code>systemd<\/code>&#8216;nin onu otomatik olarak yeniden ba\u015flatmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>[Install] B\u00f6l\u00fcm\u00fc:<\/strong><br \/>\n    *   <code>WantedBy=multi-user.target<\/code>: Servisin sistem \u00e7ok kullan\u0131c\u0131l\u0131 moda ge\u00e7ti\u011finde etkinle\u015ftirilmesini sa\u011flar (yani normal \u00f6ny\u00fckleme s\u0131ras\u0131nda).<\/p>\n<p>Dosyay\u0131 kaydedip kapat\u0131n (<code>CTRL+X<\/code>, <code>Y<\/code>, <code>Enter<\/code>).<\/p>\n<p>\u015eimdi <code>systemd<\/code>&#8216;ye yeni servisimizi tan\u0131tmak i\u00e7in yap\u0131land\u0131rmay\u0131 yeniden y\u00fckleyelim, servisi ba\u015flatal\u0131m ve sunucu a\u00e7\u0131l\u0131\u015f\u0131nda otomatik ba\u015flamas\u0131 i\u00e7in etkinle\u015ftirelim:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl daemon-reload\nsudo systemctl start myflaskapp\nsudo systemctl enable myflaskapp<\/code><\/pre>\n<p>Servisin durumunu kontrol ederek do\u011fru bir \u015fekilde \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 do\u011frulayabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl status myflaskapp<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131da <code>Active: active (running)<\/code> mesaj\u0131n\u0131 g\u00f6rmelisiniz. Ayr\u0131ca, Gunicorn&#8217;\u0131n soket dosyas\u0131n\u0131 olu\u015fturup olu\u015fturmad\u0131\u011f\u0131n\u0131 kontrol edelim:<\/p>\n<pre><code class=\"language-bash\">ls -l \/var\/www\/myflaskapp\/myflaskapp.sock<\/code><\/pre>\n<p>Bu komut, <code>myflaskapp.sock<\/code> dosyas\u0131n\u0131n varl\u0131\u011f\u0131n\u0131 ve izinlerini g\u00f6stermelidir.<\/p>\n<p>Sanal ortamdan \u00e7\u0131kmay\u0131 unutmay\u0131n:<\/p>\n<pre><code class=\"language-bash\">deactivate<\/code><\/pre>\n<h2>Ad\u0131m 5: Nginx&#8217;i Yap\u0131land\u0131rma<\/h2>\n<p>Nginx, kullan\u0131c\u0131 isteklerini dinleyecek, statik dosyalar\u0131 sunacak ve gelen istekleri Gunicorn taraf\u0131ndan y\u00f6netilen Flask uygulaman\u0131za ters proxy olarak y\u00f6nlendirecektir.<\/p>\n<h3>Nginx Sanal Host Dosyas\u0131 Olu\u015fturma<\/h3>\n<p>Nginx, sitelerin yap\u0131land\u0131rmalar\u0131n\u0131 <code>\/etc\/nginx\/sites-available\/<\/code> dizininde tutar. Bu dizinde yeni bir yap\u0131land\u0131rma dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/nginx\/sites-available\/myflaskapp<\/code><\/pre>\n<p>A\u015fa\u011f\u0131daki i\u00e7eri\u011fi <code>myflaskapp<\/code> dosyas\u0131na yap\u0131\u015ft\u0131r\u0131n. <code>your_domain.com<\/code> ve <code>www.your_domain.com<\/code> k\u0131s\u0131mlar\u0131n\u0131 kendi alan ad\u0131n\u0131zla veya sunucunuzun IP adresiyle de\u011fi\u015ftirmeniz gerekti\u011fini unutmay\u0131n. E\u011fer bir alan ad\u0131n\u0131z yoksa, sadece IP adresinizi kullanabilirsiniz.<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name your_domain.com www.your_domain.com; # Kendi alan ad\u0131n\u0131z\u0131 veya IP adresinizi buraya yaz\u0131n\n\n    location \/ {\n        include proxy_params;\n        proxy_pass http:\/\/unix:\/var\/www\/myflaskapp\/myflaskapp.sock;\n    }\n\n    location \/static {\n        alias \/var\/www\/myflaskapp\/static; # Flask uygulaman\u0131z\u0131n statik dosyalar\u0131n\u0131n oldu\u011fu dizin\n    }\n}<\/code><\/pre>\n<p>*   <code>listen 80;<\/code>: Nginx&#8217;in HTTP istekleri i\u00e7in 80 numaral\u0131 portu dinlemesini sa\u011flar.<br \/>\n*   <code>server_name your_domain.com www.your_domain.com;<\/code>: Bu sunucu blo\u011funun hangi alan adlar\u0131 i\u00e7in ge\u00e7erli oldu\u011funu belirtir. \u0130steklerin geldi\u011fi <code>Host<\/code> ba\u015fl\u0131\u011f\u0131 bu de\u011ferlerle e\u015fle\u015fmelidir.<br \/>\n*   <code>location \/ { ... }<\/code>: K\u00f6k URL&#8217;ye (veya e\u015fle\u015fen herhangi bir URL&#8217;ye) gelen istekler i\u00e7in yap\u0131land\u0131rma blo\u011fu.<br \/>\n    *   <code>include proxy_params;<\/code>: Nginx&#8217;in ters proxy olarak \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan standart proxy ba\u015fl\u0131klar\u0131n\u0131 i\u00e7erir (\u00f6rne\u011fin <code>X-Forwarded-For<\/code>, <code>X-Real-IP<\/code>). Bu dosya genellikle <code>\/etc\/nginx\/proxy_params<\/code> yolunda bulunur.<br \/>\n    *   <code>proxy_pass http:\/\/unix:\/var\/www\/myflaskapp\/myflaskapp.sock;<\/code>: Gelen istekleri Gunicorn&#8217;\u0131n dinledi\u011fi Unix soket dosyas\u0131na y\u00f6nlendirir. <code>http:\/\/unix:<\/code> \u00f6neki, Nginx&#8217;e bir Unix soketi \u00fczerinden ileti\u015fim kurulaca\u011f\u0131n\u0131 belirtir.<br \/>\n*   <code>location \/static { ... }<\/code>: <code>\/static\/<\/code> ile ba\u015flayan URL&#8217;lere gelen istekler i\u00e7in \u00f6zel bir yap\u0131land\u0131rma blo\u011fu.<br \/>\n    *   <code>alias \/var\/www\/myflaskapp\/static;<\/code>: Nginx&#8217;in <code>\/static\/<\/code> URL&#8217;sine gelen istekleri do\u011frudan <code>\/var\/www\/myflaskapp\/static<\/code> dizinindeki dosyalara y\u00f6nlendirmesini sa\u011flar. Bu, Nginx&#8217;in statik dosyalar\u0131 do\u011frudan sunarak Flask uygulaman\u0131z\u0131n y\u00fck\u00fcn\u00fc hafifletmesini ve daha h\u0131zl\u0131 yan\u0131t vermesini sa\u011flar.<\/p>\n<p>Dosyay\u0131 kaydedip kapat\u0131n.<\/p>\n<h3>Yap\u0131land\u0131rmay\u0131 Etkinle\u015ftirme<\/h3>\n<p>Yeni Nginx yap\u0131land\u0131rma dosyam\u0131z\u0131 etkinle\u015ftirmek i\u00e7in, <code>sites-available<\/code> dizininden <code>sites-enabled<\/code> dizinine bir sembolik ba\u011flant\u0131 (symlink) olu\u015fturmal\u0131y\u0131z:<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/myflaskapp \/etc\/nginx\/sites-enabled<\/code><\/pre>\n<p>Ayr\u0131ca, Nginx&#8217;in varsay\u0131lan yap\u0131land\u0131rma dosyas\u0131n\u0131 devre d\u0131\u015f\u0131 b\u0131rakmak iyi bir uygulamad\u0131r, aksi takdirde \u00e7ak\u0131\u015fmalar ya\u015fanabilir:<\/p>\n<pre><code class=\"language-bash\">sudo rm \/etc\/nginx\/sites-enabled\/default<\/code><\/pre>\n<h3>Nginx Yap\u0131land\u0131rma Testi ve Yeniden Ba\u015flatma<\/h3>\n<p>De\u011fi\u015fiklikleri uygulamadan \u00f6nce Nginx yap\u0131land\u0131rman\u0131z\u0131n s\u00f6zdizimsel olarak do\u011fru olup olmad\u0131\u011f\u0131n\u0131 test etmek \u00e7ok \u00f6nemlidir:<\/p>\n<pre><code class=\"language-bash\">sudo nginx -t<\/code><\/pre>\n<p>E\u011fer her \u015fey yolundaysa, <code>test is successful<\/code> veya <code>syntax is ok<\/code> gibi bir mesaj g\u00f6rmelisiniz. Herhangi bir hata varsa, <code>nano \/etc\/nginx\/sites-available\/myflaskapp<\/code> komutuyla dosyan\u0131z\u0131 tekrar a\u00e7\u0131p d\u00fczeltmeniz gerekir.<\/p>\n<p>Yap\u0131land\u0131rma testi ba\u015far\u0131l\u0131 olduktan sonra, Nginx servisini yeniden ba\u015flat\u0131n ki yeni yap\u0131land\u0131rmay\u0131 y\u00fcklesin:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl restart nginx<\/code><\/pre>\n<p>Nginx servisinin durumunu kontrol ederek do\u011fru bir \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl status nginx<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131da <code>Active: active (running)<\/code> mesaj\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h2>Ad\u0131m 6: G\u00fcvenlik Duvar\u0131 Ayarlar\u0131<\/h2>\n<p>Ubuntu 16.04&#8217;te varsay\u0131lan g\u00fcvenlik duvar\u0131 olan UFW (Uncomplicated Firewall) genellikle etkindir. Nginx&#8217;in web isteklerini alabilmesi i\u00e7in HTTP (port 80) trafi\u011fine izin vermemiz gerekir.<\/p>\n<p>\u00d6ncelikle UFW&#8217;nin durumunu kontrol edelim:<\/p>\n<pre><code class=\"language-bash\">sudo ufw status<\/code><\/pre>\n<p>E\u011fer UFW etkinse, Nginx i\u00e7in HTTP profiline izin verin:<\/p>\n<pre><code class=\"language-bash\">sudo ufw allow 'Nginx HTTP'<\/code><\/pre>\n<p>E\u011fer UFW etkin de\u011filse ve etkinle\u015ftirmek istiyorsan\u0131z (\u015fiddetle tavsiye edilir):<\/p>\n<pre><code class=\"language-bash\">sudo ufw enable<\/code><\/pre>\n<p><code>y<\/code> yaz\u0131p <code>Enter<\/code> tu\u015funa basarak onaylay\u0131n.<\/p>\n<p>Tekrar <code>sudo ufw status<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak kurallar\u0131n uyguland\u0131\u011f\u0131n\u0131 do\u011frulayabilirsiniz. \u00c7\u0131kt\u0131da <code>Nginx HTTP<\/code> kural\u0131n\u0131n <code>ALLOW<\/code> olarak listelendi\u011fini g\u00f6rmelisiniz.<\/p>\n<h2>Ad\u0131m 7: Uygulamay\u0131 Test Etme<\/h2>\n<p>Art\u0131k t\u00fcm bile\u015fenler kuruldu ve yap\u0131land\u0131r\u0131ld\u0131. Web taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131n ve sunucunuzun alan ad\u0131n\u0131 (\u00f6rne\u011fin <code>http:\/\/your_domain.com<\/code>) veya IP adresini (\u00f6rne\u011fin <code>http:\/\/your_server_ip<\/code>) ziyaret edin.<\/p>\n<p>E\u011fer her \u015fey do\u011fru yap\u0131land\u0131r\u0131ld\u0131ysa, Flask uygulaman\u0131zdan gelen &#8220;Merhaba D\u00fcnya! Flask Uygulamam Gunicorn ve Nginx ile \u00c7al\u0131\u015f\u0131yor!&#8221; mesaj\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<p>Ayr\u0131ca statik dosyam\u0131z\u0131 da test edelim: <code>http:\/\/your_domain.com\/static\/test.txt<\/code> adresine giderek &#8220;Bu bir statik dosya testidir.&#8221; mesaj\u0131n\u0131 g\u00f6rmelisiniz. Bu, Nginx&#8217;in statik dosyalar\u0131 do\u011fru bir \u015fekilde sundu\u011funu g\u00f6sterir.<\/p>\n<h2>Ek Hususlar ve \u0130yile\u015ftirmeler<\/h2>\n<p>Uygulaman\u0131z\u0131 ba\u015far\u0131yla da\u011f\u0131tm\u0131\u015f olsan\u0131z da, \u00fcretim ortam\u0131nda dikkate alman\u0131z gereken baz\u0131 ek noktalar ve iyile\u015ftirmeler bulunmaktad\u0131r:<\/p>\n<h3>HTTPS (SSL\/TLS) Kurulumu<\/h3>\n<p>Web sitenizin g\u00fcvenli\u011fini sa\u011flamak i\u00e7in HTTPS kullanmak kritik \u00f6neme sahiptir. Let&#8217;s Encrypt, \u00fccretsiz SSL\/TLS sertifikalar\u0131 sa\u011flayan pop\u00fcler bir servistir. Certbot arac\u0131 ile Nginx \u00fczerinde Let&#8217;s Encrypt sertifikalar\u0131n\u0131 kolayca kurabilirsiniz.<\/p>\n<pre><code class=\"language-bash\">sudo apt install certbot python-certbot-nginx\nsudo certbot --nginx -d your_domain.com -d www.your_domain.com<\/code><\/pre>\n<p>Bu komutlar, Certbot&#8217;u kuracak ve Nginx yap\u0131land\u0131rman\u0131z\u0131 otomatik olarak HTTPS&#8217;ye ge\u00e7irecektir. Sertifikalar\u0131n\u0131z\u0131n otomatik olarak yenilenmesi i\u00e7in de gerekli cron job&#8217;lar\u0131 ayarlayacakt\u0131r.<\/p>\n<h3>Statik Dosyalar ve Medya Dosyalar\u0131<\/h3>\n<p>Uygulaman\u0131z\u0131n daha fazla statik dosyas\u0131 (CSS, JS, resimler) veya kullan\u0131c\u0131 taraf\u0131ndan y\u00fcklenen medya dosyalar\u0131 varsa, Nginx&#8217;in bunlar\u0131 do\u011frudan sunmas\u0131n\u0131 sa\u011flamak en verimli yoldur. <code>location \/static<\/code> blo\u011funa benzer \u015fekilde, farkl\u0131 dizinler i\u00e7in de <code>location<\/code> bloklar\u0131 tan\u0131mlayabilirsiniz. \u00d6rne\u011fin, kullan\u0131c\u0131 taraf\u0131ndan y\u00fcklenen resimler i\u00e7in <code>\/var\/www\/myflaskapp\/media<\/code> dizinine i\u015faret eden bir <code>\/media<\/code> konumu ekleyebilirsiniz.<\/p>\n<h3>Hata Ay\u0131klama ve Loglama<\/h3>\n<p>Uygulaman\u0131z\u0131n veya sunucunuzun sorunlar\u0131n\u0131 gidermek i\u00e7in log dosyalar\u0131n\u0131 kontrol etmek \u00f6nemlidir:<br \/>\n*   <strong>Gunicorn Loglar\u0131:<\/strong> Gunicorn loglar\u0131 genellikle <code>journalctl -u myflaskapp<\/code> komutuyla veya <code>systemd<\/code> servisi yap\u0131land\u0131rman\u0131za g\u00f6re <code>\/var\/log\/myflaskapp.log<\/code> gibi bir dosyaya yaz\u0131labilir.<br \/>\n*   <strong>Nginx Loglar\u0131:<\/strong> Nginx eri\u015fim loglar\u0131 <code>\/var\/log\/nginx\/access.log<\/code> ve hata loglar\u0131 <code>\/var\/log\/nginx\/error.log<\/code> dizininde bulunur. Bu loglar, gelen istekler, HTTP durum kodlar\u0131 ve olas\u0131 Nginx yap\u0131land\u0131rma sorunlar\u0131 hakk\u0131nda bilgi sa\u011flar.<\/p>\n<h3>\u00c7al\u0131\u015fan Say\u0131s\u0131 (Workers) Ayar\u0131<\/h3>\n<p>Gunicorn&#8217;\u0131n <code>ExecStart<\/code> komutundaki <code>--workers<\/code> parametresi, uygulaman\u0131z\u0131n ka\u00e7 e\u015fzamanl\u0131 iste\u011fi i\u015fleyebilece\u011fini belirler. Bu de\u011feri sunucunuzun CPU \u00e7ekirdek say\u0131s\u0131na ve uygulaman\u0131z\u0131n bellek kullan\u0131m\u0131na g\u00f6re optimize etmelisiniz. Genellikle <code>(2 * CPU \u00c7ekirdek Say\u0131s\u0131) + 1<\/code> form\u00fcl\u00fc ba\u015flang\u0131\u00e7 noktas\u0131 olarak kullan\u0131l\u0131r.<\/p>\n<h3>Domain ve DNS Ayarlar\u0131<\/h3>\n<p>E\u011fer bir alan ad\u0131 kullan\u0131yorsan\u0131z, alan ad\u0131n\u0131z\u0131n DNS kay\u0131tlar\u0131n\u0131n (A kayd\u0131) sunucunuzun IP adresini i\u015faret etti\u011finden emin olun. Bu ayarlar genellikle alan ad\u0131 sa\u011flay\u0131c\u0131n\u0131z\u0131n kontrol panelinden yap\u0131l\u0131r.<\/p>\n<h3>S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD)<\/h3>\n<p>Uygulaman\u0131z\u0131 d\u00fczenli olarak g\u00fcncelliyorsan\u0131z, da\u011f\u0131t\u0131m s\u00fcrecini otomatikle\u015ftirmek i\u00e7in CI\/CD ara\u00e7lar\u0131 (\u00f6rne\u011fin Jenkins, GitLab CI\/CD, GitHub Actions) kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bu, manuel hatalar\u0131 azalt\u0131r ve da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu rehberde, Flask uygulaman\u0131z\u0131 Ubuntu 16.04 \u00fczerinde Gunicorn ve Nginx kullanarak nas\u0131l g\u00fcvenli, verimli ve \u00f6l\u00e7eklenebilir bir \u015fekilde da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frendiniz. Flask&#8217;\u0131n hafif yap\u0131s\u0131, Gunicorn&#8217;\u0131n g\u00fc\u00e7l\u00fc WSGI sunucusu yetenekleri ve Nginx&#8217;in ters proxy ve statik dosya sunma kabiliyetleri bir araya geldi\u011finde, Python tabanl\u0131 web uygulamalar\u0131 i\u00e7in sa\u011flam bir da\u011f\u0131t\u0131m \u00e7\u00f6z\u00fcm\u00fc sunar.<\/p>\n<p>Kurulum s\u00fcrecinde sistem g\u00fcncellemelerinden ba\u015flayarak, Python sanal ortam\u0131 olu\u015fturmaya, basit bir Flask uygulamas\u0131 yazmaya, Gunicorn&#8217;\u0131 <code>systemd<\/code> servisi olarak yap\u0131land\u0131rmaya ve son olarak Nginx&#8217;i ters proxy olarak ayarlamaya kadar her ad\u0131m\u0131 detayl\u0131ca inceledik. Ayr\u0131ca, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131nda daha da g\u00fc\u00e7lendirilmesi i\u00e7in g\u00fcvenlik duvar\u0131 ayarlar\u0131, HTTPS kurulumu, loglama ve performans optimizasyonlar\u0131 gibi ek hususlara da de\u011findik.<\/p>\n<p>Bu mimari, uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131r\u0131rken, ayn\u0131 zamanda bak\u0131m\u0131 kolay ve gelecekteki b\u00fcy\u00fcmelere a\u00e7\u0131k bir temel sa\u011flar. Art\u0131k Flask uygulamalar\u0131n\u0131z\u0131 g\u00fcvenle yay\u0131nlayabilir ve kullan\u0131c\u0131lar\u0131n\u0131za sunabilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi\nGiri\u015f\nModern web uygulamalar\u0131 geli\u015ftirirken, geli\u015ftirme s\u00fc","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-39233","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>Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi - 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\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi Giri\u015f Modern web uygulamalar\u0131 geli\u015ftirirken, geli\u015ftirme s\u00fc\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-17T04:40:47+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\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi\",\"datePublished\":\"2026-02-17T04:40:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/\"},\"wordCount\":2987,\"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\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/\",\"name\":\"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-17T04:40:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi\"}]},{\"@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":"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi - 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\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi","og_description":"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi Giri\u015f Modern web uygulamalar\u0131 geli\u015ftirirken, geli\u015ftirme s\u00fc","og_url":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-17T04:40:47+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\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi","datePublished":"2026-02-17T04:40:47+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/"},"wordCount":2987,"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\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/","name":"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-17T04:40:47+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamalarini-gunicorn-ve-nginx-ile-ubuntu-16-04-uzerinde-dagitma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Flask Uygulamalar\u0131n\u0131 Gunicorn ve Nginx ile Ubuntu 16.04 \u00dczerinde Da\u011f\u0131tma Rehberi"}]},{"@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\/39233","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=39233"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39233\/revisions"}],"predecessor-version":[{"id":39234,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39233\/revisions\/39234"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39233"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39233"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39233"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}