Anlık 2500 kişi yüklenince site çökmesi hk.
[Wed Oct 21 20:34:41.839078 2020] [proxy_fcgi:error] [pid 14837:tid 140694127634176] [client 178.244.196.20:39068] AH01068: Got bogus version 68, referer: https://www.siteadi.com/yonetim/yurt
[Wed Oct 21 20:34:41.839158 2020] [proxy_fcgi:error] [pid 14837:tid 140694127634176] (22)Invalid argument: [client 178.244.196.20:39068] AH01075: Error dispatching request to :, referer: https://www.siteadi.com/yonetim/yurt
[Wed Oct 21 20:34:56.145506 2020] [proxy_fcgi:error] [pid 19081:tid 140694068885248] [client 78.181.144.101:41472] AH01068: Got bogus version 32, referer: https://www.siteadi.com/yonetim/anasayfa
[Wed Oct 21 20:34:56.145556 2020] [proxy_fcgi:error] [pid 19081:tid 140694068885248] (22)Invalid argument: [client 78.181.144.101:41472] AH01075: Error dispatching request to :, referer: https://www.siteadi.com/yonetim/anasayfa
[Wed Oct 21 20:35:00.737750 2020] [proxy_fcgi:error] [pid 14837:tid 140694136026880] [client 78.181.144.101:42416] AH01068: Got bogus version 32, referer: https://www.siteadi.com/yonetim/anasayfa
[Wed Oct 21 20:35:00.737795 2020] [proxy_fcgi:error] [pid 14837:tid 140694136026880] (22)Invalid argument: [client 78.181.144.101:42416] AH01075: Error dispatching request to :, referer: https://www.siteadi.com/yonetim/anasayfa
[Wed Oct 21 20:40:20.947447 2020] [proxy_fcgi:error] [pid 19536:tid 140694001743616] [client 95.5.186.213:58176] AH01068: Got bogus version 32, referer: https://siteadi.com/yonetim/yurt
[Wed Oct 21 20:40:20.947511 2020] [proxy_fcgi:error] [pid 19536:tid 140694001743616] (22)Invalid argument: [client 95.5.186.213:58176] AH01075: Error dispatching request to :, referer: https://siteadi.com/yonetim/yurt
[Wed Oct 21 20:40:21.709417 2020] [proxy_fcgi:error] [pid 14837:tid 140694018529024] [client 95.5.186.213:58210] AH01068: Got bogus version 32, referer: https://siteadi.com/yonetim/yurt
[Wed Oct 21 20:40:21.709511 2020] [proxy_fcgi:error] [pid 14837:tid 140694018529024] (22)Invalid argument: [client 95.5.186.213:58210] AH01075: Error dispatching request to :, referer: https://siteadi.com/yonetim/yurt
[Wed Oct 21 21:59:28.983955 2020] [proxy_fcgi:error] [pid 14834:tid 140694043707136] [client 95.5.186.213:41160] AH01068: Got bogus version 32, referer: https://siteadi.com/yonetim/anasayfa
[Wed Oct 21 21:59:28.984109 2020] [proxy_fcgi:error] [pid 14834:tid 140694043707136] (22)Invalid argument: [client 95.5.186.213:41160] AH01075: Error dispatching request to :, referer: https://siteadi.com/yonetim/anasayfa
[Wed Oct 21 22:06:43.437656 2020] [proxy_fcgi:error] [pid 19536:tid 140694010136320] [client 81.213.249.235:42808] AH01068: Got bogus version 32, referer: https://www.siteadi.com/yonetim/anasayfa
[Wed Oct 21 22:06:43.437796 2020] [proxy_fcgi:error] [pid 19536:tid 140694010136320] (22)Invalid argument: [client 81.213.249.235:42808] AH01075: Error dispatching request to :, referer: https://www.siteadi.com/yonetim/anasayfa
[Wed Oct 21 22:06:44.887894 2020] [proxy_fcgi:error] [pid 19536:tid 140693993350912] [client 81.213.249.235:42820] AH01068: Got bogus version 32, referer: https://www.siteadi.com/yonetim/anasayfa
[Wed Oct 21 22:06:44.888002 2020] [proxy_fcgi:error] [pid 19536:tid 140693993350912] (22)Invalid argument: [client 81.213.249.235:42820] AH01075: Error dispatching request to :, referer: https://www.siteadi.com/yonetim/anasayfa
Hocam o saat aralığına ait loglar bu şekilde. Nasıl yorumlandığını bilemiyorum tabi.
Controller'da IP için aşağıdaki fonksiyon vardı ama yazmışım öyle kalmış. Herhangi bir yerde kullanmıyordum. O kodu silince gayet stabil gördüm sistemi. Bu tür kodlar, kullanılmadığı halde sistemi yorar mı?
public function GetIP()
{
if(getenv("HTTP_CLIENT_IP")) {
$ip = getenv("HTTP_CLIENT_IP");
} elseif(getenv("HTTP_X_FORWARDED_FOR")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
if (strstr($ip, ',')) {
$tmp = explode (',', $ip);
$ip = trim($tmp[0]);
}
} else {
$ip = getenv("REMOTE_ADDR");
}
return $ip;
}
alaca33 getenv PHP içindeki sabitlerden 5 kat daha yavaştır. Tek bir istekte birden fazla çağrıldığında ve çok sayıda değişken olduğunda performans sorunu oluşturabilir fakat bir yerde kullanmadım demişsiniz, o yüzden bilmiyorum. Ayrıca IP adresini $request->ip() şeklinde alabilirsiniz.
Laravellik bir sıkıntı değildir bu.Ha laravelin requesti kendi icinde framework olmasından dolayı zaten pure php gibi değildir tabi,ama sorun laravel kaynaklı değildir.Querylerinizi takibe alın.Mutlaka optimize etmeniz gereken yerler olabilir.Birde böyle fonksiyonlar niye kullanıyorsunuz.Framework zaten yapmıs size bunları.request->ip gibi kullanabilirsiniz @mgsmus un yazdıgı gibi..
- Düzenlendi
Henüz CPU problemini aşamadık. Basit bir post ve login işleminde, %60 CPU buluyor sistem.
Sistemimiz istek gönderilen site.com/{subdomain} şeklinde {subdomain} üzerinden çalışıyor. {subdomain} eğer veritabanında var ise veritabanına bağlanıp ilgili {subdomain} e ait veriler çekilerek oturum açma ve yayın bilgilerinin çekilmesi işlemleri yapılıyor.
Route içeriği:
Route::get('{subdomain}/giris', 'Auth\DinleyiciLoginController@index')->name('dinleyici.login');
Route::post('giris', 'Auth\DinleyiciLoginController@login')->name('dinleyici.login.post');
Route::get('{subdomain}/cikis', 'Auth\DinleyiciLoginController@logout')->name('dinleyici.logout');
Route::middleware('isDinleyici')->group(function () {
Route::get('{subdomain}', 'Auth\DinleyiciController@index')->name('dinleyici.anasayfa');
Route::post('yayinYenile', 'Auth\DinleyiciController@yenile')->name('dinleyici.yayinYenile');
});
DinleyiciLoginController sayfası içeriği
public function index($subdomain)
{
$yayinVarMi = Yayinlar::where('subdomain' , $subdomain)->count();
if($subdomain == '') {
$yonlendirme = false;
} elseif($yayinVarMi>0) {
$yayinBilgisi = Yayinlar::where('subdomain', $subdomain)->first();
$yonlendirme = true;
} else {
$yonlendirme = false;
}
if($yonlendirme) {
$data['subdomain'] = $subdomain;
return view('front.auth.login', $data);
} else {
return abort(404);
}
}
DinleyiciController sayfası içeriği
public function index($subdomain)
{
$domain = $subdomain;
$sorgu = Yayin::where('subdomain' , $subdomain);
$yayinVarMi = $sorgu->count();
if($domain == '') {
return '';
} elseif($yayinVarMi>0) {
$yayinBilgisi = $sorgu->first();
if((session('yayin_id') == $yayinBilgisi->id)) {
if($yayinBilgisi->sunucu_linki2 == '') {
$data['yayinLinki'] = $yayinBilgisi->sunucu_linki1;
} else {
$data['yayinLinki'] = $yayinBilgisi->sunucu_linki2;
}
$data['yayinBilgisi'] = $yayinBilgisi;
$data['subdomain'] = $domain;
return view('front.anasayfa.index4', $data);
} else {
session()->flush();
return redirect()->route('dinleyici.login', $subdomain);
}
} else {
return '';
}
}
isDinleyici Middleware içeriği:
public function handle($request, Closure $next)
{
$domain = ltrim($request->getRequestUri(), '/');
$yayinVarMi = Yayin::where('subdomain' , $domain)->count();
if($domain == '') {
$yayinBilgisi = '';
$yonlendirme = false;
} elseif($yayinVarMi > 0) {
$yayinBilgisi = Yayin::where('subdomain', $domain)->first();
$yonlendirme = true;
} else {
$yayinBilgisi = '';
$yonlendirme = false;
}
if(session('dinleyiciOturum')) {
return $next($request);
} else {
if($yonlendirme AND (session('yayin_id') == $yayinBilgisi->id)) {
return redirect()->route('dinleyici.login', ['subdomain' => $domain]);//abort(403);
} else {
return redirect()->route('dinleyici.login', ['subdomain' => $domain]);//abort(403);
}
}
}
alaca33 db sorgularınızı cache'e alabilirsiniz. Yeni güncelleme olduğunda cache temizlersiniz.
Debugbar kurarak kontrol ederek ilerlerseniz daha kolay olabilir.
Dostum, Laravelde yeniyim fakat php ve network bilgim mevcut. Laravel kodlarına baktığımda herhangi bi bir şekilde request işlemini çok fazla döndürüp bir cpu işleyecek ilem göremedim. Eğer host satın almadıysanız
Dedicatedinize girin ve sistemin network ve cpu işlemci bazlı doğru çalıştığından emin olun.
eğer oda değilse bir cloudflare üzerinden cdn hizmeti alarak 2500 kişinin aynanda giriş sağlamasını beli aralıklarla (cloudflare kendisi otomatik yapıcağı işlemdir.) girmesini sağlar ve böylece yoğun yük ortamı biraz daha azalmış olabilir tabikide üstadlar benden daha iyi olabilir yazılım konusunda belki bi yerde cpu şişiricek bir işlem yapmaya devam ediyordur.
2 Olarak aldığınız bana göre önerim, server timeout sürelerinin az olmasından kaynaklanmaktadır.
şu aşamaları takip edin:
- web serverinizin çalışma durumunu sağlayan ne ise onun .conf dosyasına
- timeout 500
- proxytimeout 500
Yazarak sonrasında ise web servis sağlayıcınızı yenileyerek bu sorunu çözebilirsiniz gibime geliyor. Denemenizde fayda var.
- Düzenlendi
Anlık birkaç bin kişi giriyor ama girişta yaptığımız sorgulama çok basit ve başka sitede hiçbir işlem yapmıyor ziyaretçiler.
Tavsiye edildiği üzere cache işlemini araştırdım ve aşağıdaki gibi yaptım. Buna rağmen CPU kullanımı %60'a değmek üzere. Kontrol edip, hata yaptığım yer olup olmadığına bakabilir misiniz?
App/Cache/Yayinlar.php diye dosya oluşturdum ve içine şunları yazdım:
<?php
namespace App\Cache;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class Yayinlar
{
public static function bul($subdomain)
{
$key = "get.{$subdomain}";
$cacheKey = "YAYINLAR.".$key;
$value = Cache::remember($cacheKey, 300, function () use ($subdomain) {
return DB::table('yayinlarss')->where('subdomain', '=', $subdomain)->first();
});
return $value;
}
}
Bunu da LoginController içerisinde şöyle kullandım:
public function index($subdomain)
{
$sorgu = Yayinlar::bul($subdomain);
if(!empty($sorgu)) {
$yayinVarMi = 1;
} else {
$yayinVarMi = 0;
}
if($subdomain == '') {
$yonlendirme = false;
} elseif($yayinVarMi>0) {
$yayinBilgisi = $sorgu;
$yonlendirme = true;
} else {
$yonlendirme = false;
}
if($yonlendirme) {
$data['yayin_adi'] = $yayinBilgisi->yayin_adi;
$data['subdomain'] = $subdomain;
return view('front.auth.login', $data);
} else {
return abort(404);
}
}
@alaca33 Hata kayıtlarınıza bakın. /var/log/messages ayrıca sitenin hata kayıtlarını inceleyin. Bu kısımda bir sorun yok ise bir kaç kod ve fonksiyondan oluşan bir php dosyası oluşturun ve stres teste sokun. Disk arızası ve ram arızası işletim sistemi sorunu veya php derleyici sorunu olabilir bir çok şey olabilir. Test etmeniz lazım.