{"id":3502,"date":"2025-12-27T18:08:02","date_gmt":"2025-12-27T15:08:02","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/vps-uzerinde-arka-plan-isleri-ve-kuyruk-yonetimi-laravel-queue-supervisor-systemd-ve-pm2\/"},"modified":"2025-12-27T18:08:02","modified_gmt":"2025-12-27T15:08:02","slug":"vps-uzerinde-arka-plan-isleri-ve-kuyruk-yonetimi-laravel-queue-supervisor-systemd-ve-pm2","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/vps-uzerinde-arka-plan-isleri-ve-kuyruk-yonetimi-laravel-queue-supervisor-systemd-ve-pm2\/","title":{"rendered":"VPS \u00dczerinde Arka Plan \u0130\u015fleri ve Kuyruk Y\u00f6netimi: Laravel Queue, Supervisor, systemd ve PM2"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><p>Laravel ile \u00e7al\u0131\u015fan bir projede, arka planda y\u00fcr\u00fcyen i\u015fler do\u011fru y\u00f6netilmedi\u011finde ilk darbe genellikle kullan\u0131c\u0131 deneyimine vurur: sipari\u015f sonras\u0131 e-posta ge\u00e7 gider, raporlar saatlerce s\u00fcrer, yo\u011fun trafikte sayfalar beklenenden daha yava\u015f yan\u0131t verir. T\u00fcm bu problemler \u00e7o\u011fu zaman veritaban\u0131ndan ya da PHP kodundan de\u011fil, arka plan i\u015flerinin ve kuyruk t\u00fcketicilerinin yanl\u0131\u015f y\u00f6netilmesinden kaynaklan\u0131r. \u00d6zellikle <a href=\"https:\/\/www.dchost.com\/tr\/vps\">VPS<\/a> \u00fczerinde kendi altyap\u0131n\u0131z\u0131 y\u00f6netti\u011finizde, Laravel queue, Supervisor, systemd ve PM2 gibi ara\u00e7lar\u0131n nas\u0131l konumlanaca\u011f\u0131n\u0131 bilmek kritik hale gelir.<\/p>\n<p>Bu yaz\u0131da, DCHost altyap\u0131s\u0131nda s\u0131k\u00e7a kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z ger\u00e7ek senaryolardan yola \u00e7\u0131karak, VPS \u00fczerinde arka plan i\u015fleri ve kuyruk y\u00f6netimini u\u00e7tan uca ele alaca\u011f\u0131z. Laravel Queue mimarisini sade bir dille \u00f6zetleyecek, Supervisor ve systemd ile PHP queue worker s\u00fcre\u00e7lerini nas\u0131l y\u00f6netebilece\u011finizi g\u00f6sterecek, Node.js taraf\u0131nda PM2 ile \u00e7al\u0131\u015fan t\u00fcketici s\u00fcre\u00e7lerini bu mimariye nas\u0131l entegre edece\u011finizi konu\u015faca\u011f\u0131z. Ayr\u0131ca loglama, izleme, yeniden ba\u015flatma stratejileri ve \u00f6l\u00e7eklendirme gibi operasyonel detaylara da girece\u011fiz. Okudu\u011funuzda, Laravel tabanl\u0131 bir uygulamay\u0131 DCHost VPS \u00fczerinde \u00fcretim ortam\u0131na ta\u015f\u0131rken arka plan i\u015fleri konusunda net bir yol haritan\u0131z olacak.<\/p>\n<div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#Arka_Plan_Isleri_ve_Kuyruklar_Neden_Bu_Kadar_Onemli\"><span class=\"toc_number toc_depth_1\">1<\/span> Arka Plan \u0130\u015fleri ve Kuyruklar Neden Bu Kadar \u00d6nemli?<\/a><\/li><li><a href=\"#VPS_Uzerinde_Kuyruk_Mimarisi_Temel_Bilesenler\"><span class=\"toc_number toc_depth_1\">2<\/span> VPS \u00dczerinde Kuyruk Mimarisi: Temel Bile\u015fenler<\/a><\/li><li><a href=\"#Laravel_Queue_Temelleri_Job_Tasarimi_ve_Suruculer\"><span class=\"toc_number toc_depth_1\">3<\/span> Laravel Queue Temelleri: Job Tasar\u0131m\u0131 ve S\u00fcr\u00fcc\u00fcler<\/a><ul><li><a href=\"#Job_Siniflarini_Dogru_Tasarlamak\"><span class=\"toc_number toc_depth_2\">3.1<\/span> Job S\u0131n\u0131flar\u0131n\u0131 Do\u011fru Tasarlamak<\/a><\/li><li><a href=\"#Surucu_Secimi_Database_mi_Redis_mi\"><span class=\"toc_number toc_depth_2\">3.2<\/span> S\u00fcr\u00fcc\u00fc Se\u00e7imi: Database mi, Redis mi?<\/a><\/li><li><a href=\"#Retry_Timeout_ve_Failed_Jobs\"><span class=\"toc_number toc_depth_2\">3.3<\/span> Retry, Timeout ve Failed Jobs<\/a><\/li><\/ul><\/li><li><a href=\"#VPS_Uzerinde_Queue_Worker_Calistirma_Stratejisi\"><span class=\"toc_number toc_depth_1\">4<\/span> VPS \u00dczerinde Queue Worker \u00c7al\u0131\u015ft\u0131rma Stratejisi<\/a><\/li><li><a href=\"#Supervisor_ile_Laravel_Queue_Worker_Yonetimi\"><span class=\"toc_number toc_depth_1\">5<\/span> Supervisor ile Laravel Queue Worker Y\u00f6netimi<\/a><ul><li><a href=\"#Supervisor_Kurulumu\"><span class=\"toc_number toc_depth_2\">5.1<\/span> Supervisor Kurulumu<\/a><\/li><li><a href=\"#Laravel_Queue_Icin_Ornek_Supervisor_Konfigurasyonu\"><span class=\"toc_number toc_depth_2\">5.2<\/span> Laravel Queue \u0130\u00e7in \u00d6rnek Supervisor Konfig\u00fcrasyonu<\/a><\/li><li><a href=\"#Supervisorin_Artilari_ve_Eksileri\"><span class=\"toc_number toc_depth_2\">5.3<\/span> Supervisor\u2019\u0131n Art\u0131lar\u0131 ve Eksileri<\/a><\/li><\/ul><\/li><li><a href=\"#systemd_ile_Laravel_Queue_Worker_Calistirmak\"><span class=\"toc_number toc_depth_1\">6<\/span> systemd ile Laravel Queue Worker \u00c7al\u0131\u015ft\u0131rmak<\/a><ul><li><a href=\"#Basit_Bir_systemd_Service_Tanimi\"><span class=\"toc_number toc_depth_2\">6.1<\/span> Basit Bir systemd Service Tan\u0131m\u0131<\/a><\/li><li><a href=\"#systemd_Kullanirken_Dikkat_Edilecek_Noktalar\"><span class=\"toc_number toc_depth_2\">6.2<\/span> systemd Kullan\u0131rken Dikkat Edilecek Noktalar<\/a><\/li><li><a href=\"#Supervisor_mi_systemd_mi\"><span class=\"toc_number toc_depth_2\">6.3<\/span> Supervisor m\u0131 systemd mi?<\/a><\/li><\/ul><\/li><li><a href=\"#Nodejs_Tuketiciler_Icin_PM2_Laravel_ile_Yan_Yana\"><span class=\"toc_number toc_depth_1\">7<\/span> Node.js T\u00fcketiciler \u0130\u00e7in PM2: Laravel ile Yan Yana<\/a><ul><li><a href=\"#PM2_ile_Basit_Worker_Sureci\"><span class=\"toc_number toc_depth_2\">7.1<\/span> PM2 ile Basit Worker S\u00fcreci<\/a><\/li><li><a href=\"#Laravel_ve_PM2yi_Ayni_Kuyruga_Baglamak\"><span class=\"toc_number toc_depth_2\">7.2<\/span> Laravel ve PM2\u2019yi Ayn\u0131 Kuyru\u011fa Ba\u011flamak<\/a><\/li><\/ul><\/li><li><a href=\"#Hangi_Araci_Ne_Zaman_Secmeli_Supervisor_systemd_ve_PM2_Karsilastirmasi\"><span class=\"toc_number toc_depth_1\">8<\/span> Hangi Arac\u0131 Ne Zaman Se\u00e7meli? Supervisor, systemd ve PM2 Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/a><\/li><li><a href=\"#Loglama_Izleme_ve_Alarm_Kuyruklarin_Sagligini_Olcmek\"><span class=\"toc_number toc_depth_1\">9<\/span> Loglama, \u0130zleme ve Alarm: Kuyruklar\u0131n Sa\u011fl\u0131\u011f\u0131n\u0131 \u00d6l\u00e7mek<\/a><ul><li><a href=\"#Log_Yonetimi\"><span class=\"toc_number toc_depth_2\">9.1<\/span> Log Y\u00f6netimi<\/a><\/li><li><a href=\"#Metrik_ve_Alarm\"><span class=\"toc_number toc_depth_2\">9.2<\/span> Metrik ve Alarm<\/a><\/li><\/ul><\/li><li><a href=\"#Guvenlik_ve_Kaynak_Yonetimi_Perspektifinden_Kuyruklar\"><span class=\"toc_number toc_depth_1\">10<\/span> G\u00fcvenlik ve Kaynak Y\u00f6netimi Perspektifinden Kuyruklar<\/a><ul><li><a href=\"#Kullanici_Izinler_ve_Izolasyon\"><span class=\"toc_number toc_depth_2\">10.1<\/span> Kullan\u0131c\u0131, \u0130zinler ve \u0130zolasyon<\/a><\/li><li><a href=\"#CPU_RAM_ve_IO_Kullanimi\"><span class=\"toc_number toc_depth_2\">10.2<\/span> CPU, RAM ve IO Kullan\u0131m\u0131<\/a><\/li><\/ul><\/li><li><a href=\"#DCHost_VPS_Uzerinde_Ornek_Bir_Kuyruk_Mimarisi\"><span class=\"toc_number toc_depth_1\">11<\/span> DCHost VPS \u00dczerinde \u00d6rnek Bir Kuyruk Mimarisi<\/a><ul><li><a href=\"#Onerilen_Queue_Yapilari\"><span class=\"toc_number toc_depth_2\">11.1<\/span> \u00d6nerilen Queue Yap\u0131lar\u0131<\/a><\/li><\/ul><\/li><li><a href=\"#Ozet_ve_Yol_Haritasi_Arka_Plan_Islerini_Rayina_Oturtmak\"><span class=\"toc_number toc_depth_1\">12<\/span> \u00d6zet ve Yol Haritas\u0131: Arka Plan \u0130\u015flerini Ray\u0131na Oturtmak<\/a><\/li><\/ul><\/div>\n<h2><span id=\"Arka_Plan_Isleri_ve_Kuyruklar_Neden_Bu_Kadar_Onemli\">Arka Plan \u0130\u015fleri ve Kuyruklar Neden Bu Kadar \u00d6nemli?<\/span><\/h2>\n<p>Modern web uygulamalar\u0131nda kullan\u0131c\u0131 iste\u011fine an\u0131nda cevap vermek ile a\u011f\u0131r i\u015fleri arka plana atmak aras\u0131ndaki denge, performans\u0131n kalbinde yer al\u0131r. \u00d6zellikle PHP-FPM veya klasik PHP \u00e7al\u0131\u015ft\u0131rma modellerinde, her HTTP iste\u011fi belirli bir maksimum s\u00fcre i\u00e7inde tamamlanmak zorundad\u0131r. A\u011f\u0131r i\u015fleri senkron \u00e7al\u0131\u015ft\u0131r\u0131rsan\u0131z sadece kullan\u0131c\u0131y\u0131 bekletmekle kalmaz, ayn\u0131 zamanda sunucu kaynaklar\u0131n\u0131 da gereksiz yere t\u00fcketirsiniz.<\/p>\n<p>Tipik olarak arka planda \u00e7al\u0131\u015fmas\u0131 gereken i\u015fler \u015funlard\u0131r:<\/p>\n<ul>\n<li>E-posta, SMS, push bildirim g\u00f6nderimi<\/li>\n<li>Fatura PDF \u00fcretimi, rapor olu\u015fturma, Excel d\u0131\u015fa aktarma<\/li>\n<li>G\u00f6rsel i\u015flemeleri, thumbnail \u00fcretimi, video transkodlama<\/li>\n<li>D\u0131\u015f API\u2019lere (\u00f6deme, kargo, entegrasyonlar) toplu istekler<\/li>\n<li>\u00d6nbellek \u0131s\u0131tma, arama indekslerini g\u00fcncelleme, veri migrasyonlar\u0131<\/li>\n<\/ul>\n<p>Bu t\u00fcr i\u015fler i\u00e7in d\u00fczg\u00fcn bir kuyruk ve worker mimarisi kurmazsan\u0131z, uygulaman\u0131z\u0131n \u00f6n y\u00fcz\u00fc ile arka plandaki a\u011f\u0131r i\u015fler birbirine kar\u0131\u015f\u0131r; hem tepki s\u00fcreleri artar hem de hata y\u00f6netimi zorla\u015f\u0131r. DCHost olarak y\u00fcksek trafikli WooCommerce, Laravel ve SaaS projelerinde g\u00f6rd\u00fc\u011f\u00fcm\u00fcz en yayg\u0131n performans sorunlar\u0131ndan baz\u0131lar\u0131, asl\u0131nda yanl\u0131\u015f konumland\u0131r\u0131lm\u0131\u015f cron job\u2019lar ve da\u011f\u0131n\u0131k queue worker s\u00fcre\u00e7lerinden kaynaklan\u0131yor. Bu y\u00fczden \u00f6nce mimariyi netle\u015ftirmek gerekiyor.<\/p>\n<h2><span id=\"VPS_Uzerinde_Kuyruk_Mimarisi_Temel_Bilesenler\">VPS \u00dczerinde Kuyruk Mimarisi: Temel Bile\u015fenler<\/span><\/h2>\n<p>VPS \u00fczerinde kendi Laravel altyap\u0131n\u0131z\u0131 y\u00f6netti\u011finizde, kuyruk mimariniz genellikle \u015fu bile\u015fenlerden olu\u015fur:<\/p>\n<ul>\n<li><strong>Uygulama (Laravel)<\/strong>: Job s\u0131n\u0131flar\u0131, dispatch edilen i\u015fler, queue s\u00fcr\u00fcc\u00fcleri.<\/li>\n<li><strong>Kuyruk Arka Ucu<\/strong>: Veritaban\u0131, Redis veya ba\u015fka bir mesaj kuyru\u011fu sistemi.<\/li>\n<li><strong>Worker S\u00fcre\u00e7leri<\/strong>: Kuyruktan i\u015fi \u00e7ekip \u00e7al\u0131\u015ft\u0131ran PHP (veya Node.js) s\u00fcre\u00e7leri.<\/li>\n<li><strong>S\u00fcre\u00e7 Y\u00f6neticisi<\/strong>: Supervisor, systemd veya PM2 gibi worker\u2019lar\u0131 ayakta tutan ara\u00e7lar.<\/li>\n<li><strong>\u0130zleme ve Loglama<\/strong>: Log dosyalar\u0131, metrikler, alarmlar.<\/li>\n<\/ul>\n<p>Bu bile\u015fenlerin hepsini do\u011fru konumland\u0131rmadan performans optimizasyonu yapmak \u00e7o\u011fu zaman bo\u015fa efor oluyor. \u00d6rne\u011fin sadece PHP-FPM ayarlar\u0131 ile oynamak genellikle yeterli olmaz; Laravel prod ortam\u0131ndaki b\u00fct\u00fcn bile\u015fenleri birlikte ele almak gerekir. Bu konuda daha geni\u015f bir resim g\u00f6rmek isterseniz, <a href='https:\/\/www.dchost.com\/blog\/laravel-prod-ortam-optimizasyonu-nasil-yapilir-php%e2%80%91fpm-opcache-octane-queue-horizon-ve-redisi-el-ele-calistirmak\/'>Laravel prod ortam optimizasyonu rehberimizde PHP-FPM, OPcache, Octane ve queue yap\u0131lar\u0131n\u0131 birlikte ele ald\u0131\u011f\u0131m\u0131z yaz\u0131ya<\/a> g\u00f6z atabilirsiniz.<\/p>\n<h2><span id=\"Laravel_Queue_Temelleri_Job_Tasarimi_ve_Suruculer\">Laravel Queue Temelleri: Job Tasar\u0131m\u0131 ve S\u00fcr\u00fcc\u00fcler<\/span><\/h2>\n<p>Laravel Queue, senkron i\u015f y\u00fck\u00fcn\u00fc arka plana ta\u015f\u0131man\u0131z\u0131 sa\u011flar. Basit\u00e7e:<\/p>\n<ul>\n<li>Yap\u0131lacak i\u015fi bir <code>Job<\/code> s\u0131n\u0131f\u0131nda tan\u0131mlars\u0131n\u0131z.<\/li>\n<li>Bu job\u2019\u0131 <code>dispatch()<\/code> ile kuyru\u011fa atars\u0131n\u0131z.<\/li>\n<li>Arka planda \u00e7al\u0131\u015fan worker s\u00fcre\u00e7leri bu job\u2019\u0131 kuyruqdan \u00e7ekip \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<h3><span id=\"Job_Siniflarini_Dogru_Tasarlamak\">Job S\u0131n\u0131flar\u0131n\u0131 Do\u011fru Tasarlamak<\/span><\/h3>\n<p>Job s\u0131n\u0131flar\u0131, kuyruk mimarisinin \u00e7ekirde\u011fidir. Temel pratikler:<\/p>\n<ul>\n<li>Job i\u00e7ine <strong>fazla mant\u0131k koymay\u0131n<\/strong>; as\u0131l i\u015fi servis katman\u0131na devredin.<\/li>\n<li>Job i\u00e7inde sadece <strong>ta\u015f\u0131nabilir veri<\/strong> tutun (ID, k\u00fc\u00e7\u00fck array\u2019ler). B\u00fcy\u00fck model nesnelerini serile\u015ftirmekten ka\u00e7\u0131n\u0131n.<\/li>\n<li><strong>Idempotent<\/strong> (tekrar \u00e7al\u0131\u015ft\u0131r\u0131l\u0131nca zarar vermeyen) olacak \u015fekilde tasarlamaya \u00e7al\u0131\u015f\u0131n. \u00c7\u00fcnk\u00fc ba\u015far\u0131s\u0131z olan job\u2019lar yeniden denenebilir.<\/li>\n<\/ul>\n<p>Basit bir \u00f6rnek job s\u0131n\u0131f\u0131:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">php artisan make:job SendOrderEmail<\/code><\/pre>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">class SendOrderEmail implements ShouldQueue {&lt;br&gt;    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;&lt;br&gt;&lt;br&gt;    public function __construct(public int $orderId) {}&lt;br&gt;&lt;br&gt;    public function handle(): void {&lt;br&gt;        $order = Order::find($this-&gt;orderId);&lt;br&gt;        if (! $order) {&lt;br&gt;            return;&lt;br&gt;        }&lt;br&gt;        Mail::to($order-&gt;customer_email)-&gt;send(new OrderCreatedMail($order));&lt;br&gt;    }&lt;br&gt;}<\/code><\/pre>\n<h3><span id=\"Surucu_Secimi_Database_mi_Redis_mi\">S\u00fcr\u00fcc\u00fc Se\u00e7imi: Database mi, Redis mi?<\/span><\/h3>\n<p>Laravel Queue i\u00e7in birka\u00e7 s\u00fcr\u00fcc\u00fc se\u00e7ene\u011fi var. VPS ortam\u0131nda en s\u0131k g\u00f6rd\u00fcklerimiz:<\/p>\n<ul>\n<li><strong>sync<\/strong>: Geli\u015ftirme ortam\u0131 i\u00e7in, i\u015fi an\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131r (kuyruk yokmu\u015f gibi). \u00dcretim i\u00e7in uygun de\u011fildir.<\/li>\n<li><strong>database<\/strong>: Job\u2019lar\u0131 veritaban\u0131ndaki bir tabloda saklar. Kurulumu basit ama yo\u011fun trafikte veritaban\u0131n\u0131 yorar.<\/li>\n<li><strong>redis<\/strong>: Y\u00fcksek performansl\u0131, bellek tabanl\u0131 kuyruk. Ger\u00e7ek zamanl\u0131 i\u015fler ve y\u00fcksek trafik i\u00e7in ideal.<\/li>\n<\/ul>\n<p>K\u00fc\u00e7\u00fck \u00f6l\u00e7ekli bir SaaS veya kurumsal panel i\u00e7in <strong>database s\u00fcr\u00fcc\u00fcs\u00fc<\/strong> ba\u015flang\u0131\u00e7ta gayet yeterli olabilir. Ancak arka plan i\u015flerinin hacmi artt\u0131k\u00e7a, veritaban\u0131n\u0131 i\u015f kuyru\u011fu ile doldurmak, hem sorgu performans\u0131n\u0131 hem de yedekleme\/restore operasyonlar\u0131n\u0131 zorla\u015ft\u0131r\u0131r. Bu noktada Redis\u2019e ge\u00e7mek genellikle mant\u0131kl\u0131 olur.<\/p>\n<p>Queue s\u00fcr\u00fcc\u00fc se\u00e7imi yaparken, veritaban\u0131 taraf\u0131ndaki y\u00fck\u00fcn sitenizi ne kadar etkileyebilece\u011fini anlamak i\u00e7in <a href='https:\/\/www.dchost.com\/blog\/woocommerce-ve-buyuk-katalog-siteleri-icin-mysql-indeksleme-ve-sorgu-optimizasyonu-rehberi\/'>veritaban\u0131 indeksleme ve sorgu optimizasyonu rehberimizde anlatt\u0131\u011f\u0131m\u0131z sorgu y\u00fck\u00fc analiz y\u00f6ntemlerini<\/a> kuyruk tablolar\u0131n\u0131z i\u00e7in de uygulayabilirsiniz.<\/p>\n<h3><span id=\"Retry_Timeout_ve_Failed_Jobs\">Retry, Timeout ve Failed Jobs<\/span><\/h3>\n<p>\u00dcretim ortam\u0131nda en \u00e7ok ihmal edilen konulardan biri de job hata y\u00f6netimidir. Laravel taraf\u0131nda \u015fu ayarlar\u0131 mutlaka d\u00fc\u015f\u00fcnmelisiniz:<\/p>\n<ul>\n<li><strong>timeout<\/strong>: Bir job\u2019\u0131n en fazla ka\u00e7 saniye \u00e7al\u0131\u015fabilece\u011fi.<\/li>\n<li><strong>tries<\/strong> veya <strong>maxAttempts<\/strong>: Job\u2019\u0131n ba\u015far\u0131s\u0131z oldu\u011funda ka\u00e7 kez yeniden denenece\u011fi.<\/li>\n<li><strong>failed_jobs<\/strong> tablosu: Kal\u0131c\u0131 olarak ba\u015far\u0131s\u0131z olan i\u015flerin kay\u0131tlar\u0131.<\/li>\n<\/ul>\n<p>\u00d6rne\u011fin \u00e7al\u0131\u015fan bir entegrasyon API\u2019si zaman zaman ge\u00e7 cevap veriyorsa, timeout\u2019u biraz y\u00fcksek tutabilir; ancak idempotent olmayan i\u015flerde <strong>tries<\/strong> de\u011ferini s\u0131n\u0131rl\u0131 tutup, ba\u015far\u0131s\u0131z job\u2019lar\u0131 manuel incelemeye alabilirsiniz.<\/p>\n<h2><span id=\"VPS_Uzerinde_Queue_Worker_Calistirma_Stratejisi\">VPS \u00dczerinde Queue Worker \u00c7al\u0131\u015ft\u0131rma Stratejisi<\/span><\/h2>\n<p>Art\u0131k kod taraf\u0131 haz\u0131r; s\u0131ra VPS \u00fczerinde worker s\u00fcre\u00e7lerini nas\u0131l y\u00f6netece\u011finize geliyor. Bir DCHost VPS \u00fczerinde Laravel uygulamas\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, genellikle \u015fu yap\u0131 ile kar\u015f\u0131la\u015f\u0131yoruz:<\/p>\n<ul>\n<li>Nginx veya Apache + PHP-FPM ile HTTP trafi\u011fini kar\u015f\u0131layan web katman\u0131<\/li>\n<li>Laravel artisan komutlar\u0131 ile \u00e7al\u0131\u015fan queue worker s\u00fcre\u00e7leri<\/li>\n<li>Bu s\u00fcre\u00e7leri y\u00f6neten Supervisor veya systemd unit dosyalar\u0131<\/li>\n<\/ul>\n<p>En temel komut \u015fu:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">php artisan queue:work --queue=default --sleep=1 --max-time=3600 --tries=3<\/code><\/pre>\n<p>Bunu do\u011frudan SSH oturumundan \u00e7al\u0131\u015ft\u0131rmak yerine, arka planda, \u00e7\u00f6k\u00fcnce yeniden ba\u015flayacak, log\u2019lar\u0131 merkezi bir yerde toplanacak \u015fekilde y\u00f6netmek i\u00e7in bir s\u00fcre\u00e7 y\u00f6neticisine ihtiya\u00e7 var. Burada iki klasik oyuncu devreye giriyor: <strong>Supervisor<\/strong> ve <strong>systemd<\/strong>. Node.js tabanl\u0131 worker\u2019lar\u0131n\u0131z varsa, \u00fc\u00e7\u00fcnc\u00fc oyuncu olarak PM2 de sahneye \u00e7\u0131k\u0131yor.<\/p>\n<h2><span id=\"Supervisor_ile_Laravel_Queue_Worker_Yonetimi\">Supervisor ile Laravel Queue Worker Y\u00f6netimi<\/span><\/h2>\n<p>Supervisor, \u00f6zellikle Laravel toplulu\u011funda y\u0131llard\u0131r kullan\u0131lan, basit ini tarz\u0131 yap\u0131land\u0131rma dosyalar\u0131yla \u00e7al\u0131\u015fan bir s\u00fcre\u00e7 y\u00f6neticisidir. Debian\/Ubuntu tabanl\u0131 bir DCHost VPS \u00fczerinde kurulumu olduk\u00e7a kolayd\u0131r.<\/p>\n<h3><span id=\"Supervisor_Kurulumu\">Supervisor Kurulumu<\/span><\/h3>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sudo apt update&lt;br&gt;sudo apt install supervisor -y<\/code><\/pre>\n<p>Supervisor genellikle <code>\/etc\/supervisor\/conf.d\/<\/code> alt\u0131nda konfig\u00fcrasyon dosyalar\u0131 bekler. Her uygulama i\u00e7in ayr\u0131 bir dosya olu\u015fturabilirsiniz.<\/p>\n<h3><span id=\"Laravel_Queue_Icin_Ornek_Supervisor_Konfigurasyonu\">Laravel Queue \u0130\u00e7in \u00d6rnek Supervisor Konfig\u00fcrasyonu<\/span><\/h3>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">[program:myapp-queue-default]&lt;br&gt;command=\/usr\/bin\/php \/var\/www\/myapp\/artisan queue:work redis --queue=default --sleep=1 --max-time=3600 --tries=3&lt;br&gt;directory=\/var\/www\/myapp&lt;br&gt;user=www-data&lt;br&gt;autostart=true&lt;br&gt;autorestart=true&lt;br&gt;numprocs=3&lt;br&gt;redirect_stderr=true&lt;br&gt;stdout_logfile=\/var\/log\/supervisor\/myapp-queue-default.log&lt;br&gt;stopwaitsecs=600<\/code><\/pre>\n<p>Burada kritik birka\u00e7 nokta var:<\/p>\n<ul>\n<li><strong>command<\/strong>: Mutlaka tam yollar\u0131 kullanmaya \u00e7al\u0131\u015f\u0131n. PHP\u2019nin ve projenizin yolu net olsun.<\/li>\n<li><strong>user<\/strong>: Web sunucusunun \u00e7al\u0131\u015ft\u0131\u011f\u0131 kullan\u0131c\u0131 ile uyumlu olmas\u0131na dikkat edin (genelde www-data veya nginx).<\/li>\n<li><strong>numprocs<\/strong>: Ayn\u0131 konfig\u00fcrasyondan ka\u00e7 worker s\u00fcreci a\u00e7\u0131laca\u011f\u0131n\u0131 belirler. CPU \u00e7ekirdek say\u0131s\u0131na ve i\u015f y\u00fck\u00fcne g\u00f6re ayarlay\u0131n.<\/li>\n<li><strong>stopwaitsecs<\/strong>: Graceful shutdown i\u00e7in \u00f6nemli. Uzun s\u00fcren job\u2019lar\u0131n\u0131z varsa y\u00fcksek tutun ki ani kesilmelerde veri tutars\u0131zl\u0131\u011f\u0131 olmas\u0131n.<\/li>\n<\/ul>\n<p>Konfig\u00fcrasyonu kaydettikten sonra Supervisor\u2019a tan\u0131tal\u0131m:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sudo supervisorctl reread&lt;br&gt;sudo supervisorctl update&lt;br&gt;sudo supervisorctl status<\/code><\/pre>\n<p><code>status<\/code> \u00e7\u0131kt\u0131s\u0131nda worker\u2019lar\u0131n\u0131z\u0131 RUNNING olarak g\u00f6r\u00fcyorsan\u0131z, temel yap\u0131 haz\u0131r demektir.<\/p>\n<h3><span id=\"Supervisorin_Artilari_ve_Eksileri\">Supervisor\u2019\u0131n Art\u0131lar\u0131 ve Eksileri<\/span><\/h3>\n<p><strong>Art\u0131lar\u0131:<\/strong><\/p>\n<ul>\n<li>Laravel dok\u00fcmantasyonu ve ekosistemi ile \u00e7ok uyumlu.<\/li>\n<li>\u0130ni format\u0131 sayesinde yap\u0131land\u0131rmas\u0131 basit ve okunakl\u0131.<\/li>\n<li>Ayn\u0131 dosya i\u00e7inde birden \u00e7ok kuyruk ve worker tan\u0131mlayabilirsiniz.<\/li>\n<\/ul>\n<p><strong>Eksi Yanlar\u0131:<\/strong><\/p>\n<ul>\n<li>systemd kadar derin servis entegrasyonu yok (\u00f6rne\u011fin cgroups, resource limitler vb.).<\/li>\n<li>Log y\u00f6netimi i\u00e7in ek ayarlara ve zaman zaman <code>logrotate<\/code> entegrasyonuna ihtiya\u00e7 duyar.<\/li>\n<li>\u0130\u015fletim sisteminin varsay\u0131lan init sistemi olmad\u0131\u011f\u0131 i\u00e7in ek bir katman olarak d\u00fc\u015f\u00fcn\u00fclmeli.<\/li>\n<\/ul>\n<p>Yine de pek \u00e7ok proje i\u00e7in Supervisor h\u00e2l\u00e2 son derece pratik ve g\u00fcvenilir bir \u00e7\u00f6z\u00fcm. \u00d6zellikle tek bir VPS \u00fczerinde birka\u00e7 Laravel uygulamas\u0131 ko\u015fturdu\u011funuz senaryolarda, her proje i\u00e7in ayr\u0131 Supervisor programlar\u0131 tan\u0131mlamak temizlik ve y\u00f6netilebilirlik getirir.<\/p>\n<h2><span id=\"systemd_ile_Laravel_Queue_Worker_Calistirmak\">systemd ile Laravel Queue Worker \u00c7al\u0131\u015ft\u0131rmak<\/span><\/h2>\n<p>Modern Linux da\u011f\u0131t\u0131mlar\u0131nda systemd zaten varsay\u0131lan init sistemi olarak \u00e7al\u0131\u015f\u0131yor. Yani makineniz a\u00e7\u0131ld\u0131\u011f\u0131nda hangi servislerin aya\u011fa kalkaca\u011f\u0131, nas\u0131l izlenece\u011fi, log\u2019lar\u0131n nereye akaca\u011f\u0131 gibi konular\u0131n \u00e7o\u011fu systemd \u00fczerinden y\u00f6netiliyor. Bu y\u00fczden pek \u00e7ok ekip ek bir katmana ihtiya\u00e7 duymadan, do\u011frudan systemd unit dosyalar\u0131 ile queue worker s\u00fcre\u00e7lerini y\u00f6netmeyi tercih ediyor.<\/p>\n<h3><span id=\"Basit_Bir_systemd_Service_Tanimi\">Basit Bir systemd Service Tan\u0131m\u0131<\/span><\/h3>\n<p>\u00d6rnek bir Laravel queue worker service dosyas\u0131na bakal\u0131m. <code>\/etc\/systemd\/system\/laravel-queue-default.service<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">[Unit]&lt;br&gt;Description=Laravel Queue Worker (default queue)&lt;br&gt;After=network.target&lt;br&gt;&lt;br&gt;[Service]&lt;br&gt;Type=simple&lt;br&gt;User=www-data&lt;br&gt;WorkingDirectory=\/var\/www\/myapp&lt;br&gt;ExecStart=\/usr\/bin\/php artisan queue:work redis --queue=default --sleep=1 --max-time=3600 --tries=3&lt;br&gt;Restart=always&lt;br&gt;RestartSec=5&lt;br&gt;StandardOutput=append:\/var\/log\/laravel-queue-default.log&lt;br&gt;StandardError=append:\/var\/log\/laravel-queue-default-error.log&lt;br&gt;&lt;br&gt;[Install]&lt;br&gt;WantedBy=multi-user.target<\/code><\/pre>\n<p>Servisi etkinle\u015ftirelim:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sudo systemctl daemon-reload&lt;br&gt;sudo systemctl enable laravel-queue-default&lt;br&gt;sudo systemctl start laravel-queue-default&lt;br&gt;sudo systemctl status laravel-queue-default<\/code><\/pre>\n<p>Bu yap\u0131 ile makine her a\u00e7\u0131ld\u0131\u011f\u0131nda queue worker otomatik devreye girer, \u00e7\u00f6kt\u00fc\u011f\u00fcnde yeniden ba\u015flar ve log\u2019lar systemd taraf\u0131ndan y\u00f6netilir.<\/p>\n<h3><span id=\"systemd_Kullanirken_Dikkat_Edilecek_Noktalar\">systemd Kullan\u0131rken Dikkat Edilecek Noktalar<\/span><\/h3>\n<ul>\n<li><strong>PHP s\u00fcr\u00fcm\u00fc ve yol<\/strong>: Birden fazla PHP s\u00fcr\u00fcm\u00fc y\u00fckl\u00fc ise, do\u011fru binary yolunu kullanmay\u0131 unutmay\u0131n.<\/li>\n<li><strong>Environment de\u011fi\u015fkenleri<\/strong>: .env i\u00e7eri\u011fi genelde yeterlidir ama \u00f6zel ortam de\u011fi\u015fkenlerine ihtiya\u00e7 varsa, <code>Environment=KEY=value<\/code> sat\u0131rlar\u0131 ekleyebilir veya ayr\u0131 bir environment dosyas\u0131 kullanabilirsiniz.<\/li>\n<li><strong>Kaynak limitleri<\/strong>: systemd ile <code>MemoryMax<\/code>, <code>CPUQuota<\/code> gibi ayarlarla queue worker s\u00fcre\u00e7lerinin kaynak kullan\u0131m\u0131n\u0131 s\u0131n\u0131rland\u0131rabilirsiniz.<\/li>\n<\/ul>\n<p>Cron i\u015flerini de systemd timer ile y\u00f6netmek isterseniz, <a href='https:\/\/www.dchost.com\/blog\/cron-mu-systemd-timer-mi-neden-nasil-ve-ne-zaman-hangisini-secmeli\/'>cron mu systemd timer m\u0131 rehberimizde<\/a> detayl\u0131 anlatt\u0131\u011f\u0131m\u0131z gibi, schedule edilmi\u015f g\u00f6revleri de tek \u00e7at\u0131 alt\u0131nda toplaman\u0131z m\u00fcmk\u00fcn.<\/p>\n<h3><span id=\"Supervisor_mi_systemd_mi\">Supervisor m\u0131 systemd mi?<\/span><\/h3>\n<p>\u0130ki yakla\u015f\u0131m\u0131n da g\u00fc\u00e7l\u00fc taraflar\u0131 var. \u00d6zet bir kar\u015f\u0131la\u015ft\u0131rma yapal\u0131m:<\/p>\n<ul>\n<li><strong>Supervisor daha uygun<\/strong> olabilir:\n<ul>\n<li>Birden \u00e7ok proje i\u00e7in h\u0131zl\u0131ca worker tan\u0131mlamak istiyorsan\u0131z.<\/li>\n<li>Laravel d\u00f6k\u00fcmantasyonundaki \u00f6rneklerle birebir ilerlemek istiyorsan\u0131z.<\/li>\n<li>Sunucu y\u00f6netimi ekibiniz Supervisor\u2019a al\u0131\u015fk\u0131nsa.<\/li>\n<\/ul>\n<\/li>\n<li><strong>systemd daha uygun<\/strong> olabilir:\n<ul>\n<li>Ekstra ba\u011f\u0131ml\u0131l\u0131k istemiyor ve sadece Linux\u2019un sunduklar\u0131yla yetinmek istiyorsan\u0131z.<\/li>\n<li>Kaynak limitlerini, restart politikalar\u0131n\u0131, log\u2019lar\u0131 tek merkezden y\u00f6netmek istiyorsan\u0131z.<\/li>\n<li>DevOps taraf\u0131nda zaten systemd ile standardize bir pratik benimsediyseniz.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>DCHost taraf\u0131nda y\u00f6netilen VPS ve <a href=\"https:\/\/www.dchost.com\/tr\/fiziksel-sunucu\">dedicated sunucu<\/a>larda, m\u00fc\u015fterinin operasyon k\u00fclt\u00fcr\u00fcne g\u00f6re iki yakla\u015f\u0131m\u0131 da g\u00f6r\u00fcyoruz. K\u00fc\u00e7\u00fck\/orta Laravel projelerinde Supervisor, daha b\u00fcy\u00fck ve karma\u015f\u0131k yap\u0131larda ise systemd a\u011f\u0131rl\u0131\u011f\u0131n\u0131 hissettiriyor.<\/p>\n<h2><span id=\"Nodejs_Tuketiciler_Icin_PM2_Laravel_ile_Yan_Yana\">Node.js T\u00fcketiciler \u0130\u00e7in PM2: Laravel ile Yan Yana<\/span><\/h2>\n<p>Pek \u00e7ok ekip Laravel\u2019i ana API ve panel katman\u0131 olarak kullan\u0131rken, arka plandaki baz\u0131 i\u015flerde Node.js tabanl\u0131 t\u00fcketicilere de yer veriyor. \u00d6rne\u011fin Redis tabanl\u0131 bir kuyru\u011fu hem Laravel hem de Node.js worker\u2019lar\u0131n t\u00fcketti\u011fi hibrit bir mimari d\u00fc\u015f\u00fcnebilirsiniz. Bu noktada Node.js s\u00fcre\u00e7lerini y\u00f6netmek i\u00e7in <strong>PM2<\/strong> devreye giriyor.<\/p>\n<h3><span id=\"PM2_ile_Basit_Worker_Sureci\">PM2 ile Basit Worker S\u00fcreci<\/span><\/h3>\n<p>\u00d6rne\u011fin Redis tabanl\u0131 bir kuyru\u011fu dinleyen Node.js script\u2019iniz olsun: <code>worker.js<\/code>.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">npm install -g pm2&lt;br&gt;pm2 start worker.js --name myapp-node-worker&lt;br&gt;pm2 save&lt;br&gt;pm2 startup<\/code><\/pre>\n<p>Bu komutlar ile:<\/p>\n<ul>\n<li>worker.js arka planda bir servis gibi \u00e7al\u0131\u015f\u0131r,<\/li>\n<li>PM2 \u00e7\u00f6k\u00fcnce yeniden ba\u015flat\u0131r,<\/li>\n<li>Sunucu yeniden a\u00e7\u0131ld\u0131\u011f\u0131nda process otomatik aya\u011fa kalkar.<\/li>\n<\/ul>\n<p>Node.js uygulamalar\u0131n\u0131 \u00fcretim ortam\u0131na ta\u015f\u0131rken PM2 ve systemd entegrasyonunu ad\u0131m ad\u0131m g\u00f6rmek isterseniz, <a href='https:\/\/www.dchost.com\/blog\/node-jsi-canliya-alirken-panik-yapma-pm2-systemd-nginx-ssl-ve-sifir-kesinti-deploy-nasil-kurulur\/'>Node.js\u2019i canl\u0131ya al\u0131rken PM2 ve systemd kullan\u0131m\u0131 rehberimiz<\/a> iyi bir referans olacakt\u0131r.<\/p>\n<h3><span id=\"Laravel_ve_PM2yi_Ayni_Kuyruga_Baglamak\">Laravel ve PM2\u2019yi Ayn\u0131 Kuyru\u011fa Ba\u011flamak<\/span><\/h3>\n<p>Redis tabanl\u0131 bir kuyruk kullan\u0131yorsan\u0131z, Laravel taraf\u0131nda Redis queue s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc, Node.js taraf\u0131nda ise \u00f6rne\u011fin Bull, BullMQ gibi k\u00fct\u00fcphaneleri ayn\u0131 Redis instance\u2019\u0131na ba\u011flayarak hibrit t\u00fcketiciler olu\u015fturabilirsiniz. Burada \u00f6nemli olan:<\/p>\n<ul>\n<li>Her i\u015f tipine ayr\u0131 queue (\u00f6rne\u011fin mail, sms, report) tahsis etmek,<\/li>\n<li>\u0130\u015flerin hangi dilde (PHP\/Node) \u00e7al\u0131\u015faca\u011f\u0131n\u0131 net belirlemek,<\/li>\n<li>Retry politikas\u0131n\u0131 ve idempotent davran\u0131\u015f\u0131 her iki tarafta da tutarl\u0131 k\u0131lmak.<\/li>\n<\/ul>\n<p>Bu sayede CPU ve IO yo\u011funlu\u011fu y\u00fcksek i\u015fleri Node.js tabanl\u0131 s\u00fcre\u00e7lere kayd\u0131r\u0131rken, Laravel\u2019in g\u00fc\u00e7l\u00fc oldu\u011fu alanlarda PHP worker\u2019lar\u0131 kullanmaya devam edebilirsiniz.<\/p>\n<h2><span id=\"Hangi_Araci_Ne_Zaman_Secmeli_Supervisor_systemd_ve_PM2_Karsilastirmasi\">Hangi Arac\u0131 Ne Zaman Se\u00e7meli? Supervisor, systemd ve PM2 Kar\u015f\u0131la\u015ft\u0131rmas\u0131<\/span><\/h2>\n<p>K\u0131sa bir karar matrisi \u00fczerinden gidelim:<\/p>\n<ul>\n<li><strong>Sadece Laravel, sadece PHP worker\u2019lar<\/strong>:\n<ul>\n<li>K\u00fc\u00e7\u00fck\/orta \u00f6l\u00e7ek: Supervisor \u00e7ok pratik.<\/li>\n<li>Orta\/b\u00fcy\u00fck \u00f6l\u00e7ek, kurumsal operasyon: systemd daha b\u00fct\u00fcnc\u00fcl.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Laravel + Node.js kar\u0131\u015f\u0131k mimari<\/strong>:\n<ul>\n<li>PHP worker\u2019lar i\u00e7in Supervisor veya systemd,<\/li>\n<li>Node.js worker\u2019lar i\u00e7in PM2,<\/li>\n<li>Hepsinin \u00fczerinde iyi kurgulanm\u0131\u015f log ve izleme katman\u0131.<\/li>\n<\/ul>\n<\/li>\n<li><strong>CI\/CD ile entegre geli\u015fmi\u015f da\u011f\u0131t\u0131mlar<\/strong>:\n<ul>\n<li>systemd servisleriyle <code>ExecReload<\/code>, <code>Deploy<\/code> script\u2019leri tan\u0131mlamak,<\/li>\n<li>PM2 ile zero-downtime deploy senaryolar\u0131.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>VPS taraf\u0131nda s\u0131f\u0131r kesinti da\u011f\u0131t\u0131m, rollback ve benzeri konulara girmek istiyorsan\u0131z, <a href='https:\/\/www.dchost.com\/blog\/vpse-sifir-kesinti-ci-cd-nasil-kurulur-rsync-sembolik-surumler-ve-systemd-ile-sicacik-bir-yolculuk\/'>VPS\u2019e s\u0131f\u0131r kesinti CI\/CD nas\u0131l kurulur rehberimizde<\/a> anlatt\u0131\u011f\u0131m\u0131z systemd tabanl\u0131 da\u011f\u0131t\u0131m teknikleri bu mimariyle \u00e7ok iyi \u00f6rt\u00fc\u015f\u00fcyor.<\/p>\n<h2><span id=\"Loglama_Izleme_ve_Alarm_Kuyruklarin_Sagligini_Olcmek\">Loglama, \u0130zleme ve Alarm: Kuyruklar\u0131n Sa\u011fl\u0131\u011f\u0131n\u0131 \u00d6l\u00e7mek<\/span><\/h2>\n<p>Arka plan i\u015fleri ile ilgili en b\u00fcy\u00fck tehlike, sessizce bozulmalar\u0131d\u0131r. HTTP istekleri genelde log\u2019lara ve error monitoring ara\u00e7lar\u0131na daha h\u0131zl\u0131 yans\u0131r; ancak queue worker\u2019lar arka planda sessizce durabilir, tak\u0131labilir ya da hata verip kapat\u0131labilir. DCHost taraf\u0131nda s\u0131k g\u00f6rd\u00fc\u011f\u00fcm\u00fcz sorunlardan biri, kimsenin fark etmedi\u011fi bir worker \u00e7\u00f6kmesi sonras\u0131 biriken on binlerce job ve ani gecikmelerdir.<\/p>\n<h3><span id=\"Log_Yonetimi\">Log Y\u00f6netimi<\/span><\/h3>\n<p>Supervisor veya systemd kullan\u0131yor olsan\u0131z da, \u015fu prensiplere dikkat edin:<\/p>\n<ul>\n<li>Her queue grubuna ayr\u0131 log dosyas\u0131 verin (\u00f6rne\u011fin <code>queue-mail.log<\/code>, <code>queue-report.log<\/code>).<\/li>\n<li>Log\u2019lar\u0131 <code>logrotate<\/code> ile d\u00fczenli d\u00f6nd\u00fcr\u00fcn; disk dolma problemlerini \u00f6nlemek i\u00e7in <a href='https:\/\/www.dchost.com\/blog\/vps-disk-kullanimi-ve-logrotate-ayarlariyla-no-space-left-on-device-hatasini-onlemek\/'>VPS disk kullan\u0131m\u0131 ve logrotate rehberimizde<\/a> anlatt\u0131\u011f\u0131m\u0131z pratikleri uygulay\u0131n.<\/li>\n<li>Laravel i\u00e7 loglar\u0131 ile sistem loglar\u0131n\u0131 korele edebilmek i\u00e7in zaman damgalar\u0131n\u0131 ve korelasyon ID\u2019lerini tutarl\u0131 kullan\u0131n.<\/li>\n<\/ul>\n<h3><span id=\"Metrik_ve_Alarm\">Metrik ve Alarm<\/span><\/h3>\n<p>Kuyruk sa\u011fl\u0131\u011f\u0131n\u0131 izlemek i\u00e7in \u015funlara bakmak iyi bir ba\u015flang\u0131\u00e7t\u0131r:<\/p>\n<ul>\n<li>Her queue i\u00e7in bekleyen job say\u0131s\u0131<\/li>\n<li>Job\u2019lar\u0131n ortalama ve maksimum bekleme s\u00fcresi<\/li>\n<li>Failed jobs metrikleri (saatlik\/g\u00fcnl\u00fck art\u0131\u015f)<\/li>\n<li>Worker say\u0131s\u0131 ve CPU\/RAM kullan\u0131m\u0131<\/li>\n<\/ul>\n<p>Basitten ba\u015flay\u0131p zaman i\u00e7inde olgunla\u015ft\u0131rmak i\u00e7in, \u00f6nce <a href='https:\/\/www.dchost.com\/blog\/vps-izleme-ve-alarm-kurulumu-prometheus-grafana-ve-uptime-kuma-ile-baslangic\/'>Prometheus ve Grafana ile VPS izleme rehberimizde<\/a> anlatt\u0131\u011f\u0131m\u0131z temel node exporter metriklerini kurabilir; ard\u0131ndan Laravel taraf\u0131nda job metriklerini Prometheus\u2019a i\u015fleyerek daha ayr\u0131nt\u0131l\u0131 grafikler elde edebilirsiniz.<\/p>\n<h2><span id=\"Guvenlik_ve_Kaynak_Yonetimi_Perspektifinden_Kuyruklar\">G\u00fcvenlik ve Kaynak Y\u00f6netimi Perspektifinden Kuyruklar<\/span><\/h2>\n<p>Arka plan i\u015fleriniz de sonu\u00e7ta sunucuda \u00e7al\u0131\u015fan s\u00fcre\u00e7lerdir; dolay\u0131s\u0131yla g\u00fcvenlik ve kaynak y\u00f6netimi a\u00e7\u0131s\u0131ndan web katman\u0131 kadar \u00f6nemlidir.<\/p>\n<h3><span id=\"Kullanici_Izinler_ve_Izolasyon\">Kullan\u0131c\u0131, \u0130zinler ve \u0130zolasyon<\/span><\/h3>\n<ul>\n<li>Queue worker s\u00fcre\u00e7lerini <strong>root<\/strong> kullan\u0131c\u0131 ile kesinlikle \u00e7al\u0131\u015ft\u0131rmay\u0131n.<\/li>\n<li>Web sunucusunun kulland\u0131\u011f\u0131 kullan\u0131c\u0131 (www-data, nginx vs.) veya projeye \u00f6zel a\u00e7t\u0131\u011f\u0131n\u0131z k\u0131s\u0131tl\u0131 bir kullan\u0131c\u0131 ile \u00e7al\u0131\u015ft\u0131r\u0131n.<\/li>\n<li>Dosya izinlerini ve sahiplikleri do\u011fru kurgulamak i\u00e7in <a href='https:\/\/www.dchost.com\/blog\/linux-dosya-izinleri-644-755-777-paylasimli-hosting-ve-vps-icin-guvenli-ayarlar\/'>Linux dosya izinleri rehberimizde<\/a> anlatt\u0131\u011f\u0131m\u0131z prensipleri uygulay\u0131n.<\/li>\n<\/ul>\n<h3><span id=\"CPU_RAM_ve_IO_Kullanimi\">CPU, RAM ve IO Kullan\u0131m\u0131<\/span><\/h3>\n<p>\u00d6zellikle g\u00f6rsel i\u015fleme, PDF \u00fcretimi, rapor olu\u015fturma gibi CPU ve disk a\u011f\u0131rl\u0131kl\u0131 i\u015fler, yanl\u0131\u015f yap\u0131land\u0131r\u0131lm\u0131\u015f worker say\u0131lar\u0131yla birle\u015fti\u011finde t\u00fcm VPS\u2019inizi kilitleyebilir. \u015eu pratikleri \u00f6neriyoruz:<\/p>\n<ul>\n<li>CPU \u00e7ekirdek say\u0131n\u0131z kadar veya biraz alt\u0131nda worker say\u0131s\u0131 belirleyin.<\/li>\n<li>A\u011f\u0131r i\u015fler i\u00e7in ayr\u0131 kuyruk tan\u0131mlay\u0131n (\u00f6rne\u011fin <code>heavy<\/code>) ve bu kuyru\u011fu s\u0131n\u0131rl\u0131 say\u0131da worker ile t\u00fcketin.<\/li>\n<li>systemd kullan\u0131yorsan\u0131z, <code>CPUQuota<\/code> ile worker servisinin maksimum CPU y\u00fczdesini s\u0131n\u0131rlamay\u0131 d\u00fc\u015f\u00fcn\u00fcn.<\/li>\n<li>Disk IO kullan\u0131m\u0131n\u0131 izlemek i\u00e7in <a href='https:\/\/www.dchost.com\/blog\/vps-kaynak-kullanimi-izleme-rehberi-htop-iotop-netdata-ve-prometheus\/'>VPS kaynak kullan\u0131m\u0131 izleme rehberimizde<\/a> anlatt\u0131\u011f\u0131m\u0131z iotop ve benzeri ara\u00e7larla periyodik kontroller yap\u0131n.<\/li>\n<\/ul>\n<h2><span id=\"DCHost_VPS_Uzerinde_Ornek_Bir_Kuyruk_Mimarisi\">DCHost VPS \u00dczerinde \u00d6rnek Bir Kuyruk Mimarisi<\/span><\/h2>\n<p>T\u00fcm bu anlatt\u0131klar\u0131m\u0131z\u0131, orta \u00f6l\u00e7ekli bir Laravel e-ticaret projesi i\u00e7in \u00f6rnek bir DCHost VPS mimarisi \u00fczerinden toparlayal\u0131m:<\/p>\n<ul>\n<li><strong>Sunucu<\/strong>: 4 vCPU, 8 GB RAM, NVMe diskli bir DCHost VPS<\/li>\n<li><strong>Uygulama<\/strong>: Laravel 10, Nginx + PHP-FPM<\/li>\n<li><strong>Kuyruk Arka Ucu<\/strong>: Redis<\/li>\n<li><strong>Worker Y\u00f6netimi<\/strong>: systemd (PHP) + PM2 (Node.js varsa)<\/li>\n<\/ul>\n<h3><span id=\"Onerilen_Queue_Yapilari\">\u00d6nerilen Queue Yap\u0131lar\u0131<\/span><\/h3>\n<ul>\n<li><code>queue=mail<\/code>: Sipari\u015f e-postalar\u0131, bildirimler. 2 worker.<\/li>\n<li><code>queue=report<\/code>: Raporlama ve PDF i\u015fleri. 1 a\u011f\u0131r worker.<\/li>\n<li><code>queue=realtime<\/code>: Anl\u0131k stok g\u00fcncelleme, entegrasyon callback\u2019leri. 2 h\u0131zl\u0131 worker.<\/li>\n<\/ul>\n<p>Her biri i\u00e7in ayr\u0131 systemd service dosyas\u0131 olu\u015fturup, her servise \u00f6zel log dosyas\u0131, restart politikas\u0131 ve gerekiyorsa CPU\/RAM limitleri tan\u0131mlanabilir. B\u00f6ylece mail kuyru\u011funda sorun ya\u015fansa bile realtime i\u015fleri etkileyen worker\u2019lar ayr\u0131 kal\u0131r.<\/p>\n<p>Laravel uygulaman\u0131z\u0131 bu yap\u0131yla birlikte DCHost VPS \u00fczerinde aya\u011fa kald\u0131rma s\u00fcrecinde, <a href='https:\/\/www.dchost.com\/blog\/laravel-uygulamalarini-vpste-nasil-yayinlarim-nginx-php%e2%80%91fpm-horizon-ve-sifir-kesinti-dagitimin-sicacik-yol-haritasi\/'>Laravel uygulamalar\u0131n\u0131 VPS\u2019te yay\u0131nlama rehberimizde<\/a> anlatt\u0131\u011f\u0131m\u0131z Nginx, PHP-FPM ve da\u011f\u0131t\u0131m ad\u0131mlar\u0131n\u0131 takip edebilir, oradaki Horizon ve queue yap\u0131lar\u0131n\u0131 bu yaz\u0131daki s\u00fcre\u00e7 y\u00f6netimi pratikleri ile birle\u015ftirebilirsiniz.<\/p>\n<h2><span id=\"Ozet_ve_Yol_Haritasi_Arka_Plan_Islerini_Rayina_Oturtmak\">\u00d6zet ve Yol Haritas\u0131: Arka Plan \u0130\u015flerini Ray\u0131na Oturtmak<\/span><\/h2>\n<p>VPS \u00fczerinde \u00e7al\u0131\u015fan bir Laravel uygulamas\u0131nda, arka plan i\u015fleri ve kuyruk y\u00f6netimi \u00e7o\u011fu zaman ertelenen, ama sorun \u00e7\u0131kt\u0131\u011f\u0131nda en \u00e7ok can yakan ba\u015fl\u0131klardan biri oluyor. Job\u2019lar\u0131 do\u011fru tasarlamak, uygun kuyruk s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc se\u00e7mek, Supervisor veya systemd ile worker s\u00fcre\u00e7lerini sa\u011flam \u015fekilde ko\u015fturmak, Node.js taraf\u0131nda PM2 ile hibrit bir yap\u0131 kurmak ve t\u00fcm bunlar\u0131 loglama ile izleme katman\u0131na ba\u011flamak; projenizin olgunluk seviyesini do\u011frudan etkiliyor.<\/p>\n<p>Pratik bir yol haritas\u0131 \u00e7izelim:<\/p>\n<ol>\n<li>\u00d6nce uygulaman\u0131zdaki a\u011f\u0131r i\u015fleri tespit edin, hepsini Laravel Queue job\u2019lar\u0131na ta\u015f\u0131y\u0131n.<\/li>\n<li>K\u00fc\u00e7\u00fck \u00f6l\u00e7ekli projelerde database, b\u00fcy\u00fcyen projelerde Redis tabanl\u0131 queue yap\u0131s\u0131na ge\u00e7meyi planlay\u0131n.<\/li>\n<li>VPS \u00fczerinde Supervisor veya systemd tercihine karar verin; tek bir yakla\u015f\u0131mda standardize olun.<\/li>\n<li>Her queue t\u00fcr\u00fc i\u00e7in ayr\u0131 worker gruplar\u0131 ve log dosyalar\u0131 tan\u0131mlay\u0131n, <code>logrotate<\/code> ile disk kullan\u0131m\u0131n\u0131 kontrol alt\u0131na al\u0131n.<\/li>\n<li>Prometheus\/Grafana veya benzeri bir sistemle kuyruk metriklerini izlemeye ba\u015flay\u0131n; basit ama anlaml\u0131 alarmlar kurun.<\/li>\n<\/ol>\n<p>DCHost olarak sa\u011flad\u0131\u011f\u0131m\u0131z VPS, dedicated ve colocation altyap\u0131lar\u0131nda, benzer kuyruk mimarilerini her \u00f6l\u00e7ekte projede uyguluyoruz. Uygulaman\u0131z Laravel veya Node.js tabanl\u0131 olsun, arka plan i\u015flerini g\u00fcvenilir ve \u00f6l\u00e7eklenebilir \u015fekilde y\u00f6netmek i\u00e7in bu yaz\u0131daki ad\u0131mlar\u0131 temel \u00e7er\u00e7eve olarak alabilirsiniz. \u0130htiyac\u0131n\u0131z oldu\u011funda, do\u011fru kaynak planlamas\u0131 (CPU, RAM, NVMe disk ve a\u011f) i\u00e7in <a href='https:\/\/www.dchost.com\/blog\/woocommerce-laravel-ve-node-jsde-dogru-vps-kaynaklarini-nasil-secersin-cpu-ram-nvme-ve-bant-genisligi-rehberi\/'>VPS kaynak planlama rehberimizde<\/a> payla\u015ft\u0131\u011f\u0131m\u0131z hesaplama y\u00f6ntemlerini de bu kuyruk mimarisiyle birlikte d\u00fc\u015f\u00fcnmenizi \u00f6neririz. B\u00f6ylece hem \u00f6n y\u00fcz, hem arka plan i\u015fler, hem de altyap\u0131 taraf\u0131 ayn\u0131 anda dengede kal\u0131r.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Laravel ile \u00e7al\u0131\u015fan bir projede, arka planda y\u00fcr\u00fcyen i\u015fler do\u011fru y\u00f6netilmedi\u011finde ilk darbe genellikle kullan\u0131c\u0131 deneyimine vurur: sipari\u015f sonras\u0131 e-posta ge\u00e7 gider, raporlar saatlerce s\u00fcrer, yo\u011fun trafikte sayfalar beklenenden daha yava\u015f yan\u0131t verir. T\u00fcm bu problemler \u00e7o\u011fu zaman veritaban\u0131ndan ya da PHP kodundan de\u011fil, arka plan i\u015flerinin ve kuyruk t\u00fcketicilerinin yanl\u0131\u015f y\u00f6netilmesinden kaynaklan\u0131r. \u00d6zellikle VPS [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3503,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-3502","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/3502","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=3502"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/3502\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/3503"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=3502"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=3502"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=3502"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}