infolightbulb_outlinenew_releasesreportwarning

Apache Web Sunucusu

Doruk Fişek

Web Mimarisi

web mimarisi

HTTP

En Yoğun Bir Milyon Sitenin Sunucu Payları - 1

netcraft ekim2014

En Yoğun Bir Milyon Sitenin Sunucu Payları - 2

Netcraft (Ekim 2014):

  • Apache: %50.19

  • Nginx: %20.34

  • IIS: %12.52

  • Google: %2.63

İstemci Payları - 1

web istemci pazar paylari

İstemci Payları - 2

StatsCounter (Haziran 2014):

  • Chrome: %48.7

  • Internet Explorer: %23

  • Firefox: %19.6

  • Safari: %4.9

  • Opera: %1.4

Uygulama Sunucuları

  • PHP: PHP-FPM, Zend Server, Appserver.io, …​

  • Java EE: JBoss, Tomcat, Weblogic, Websphere, Glassfish, …​

  • Ruby/Rails: Unicorn, Passenger, Thin, …​

Veritabanı Sunucuları

  • MySQL

  • PostgreSQL

  • Oracle

  • MsSQL

  • DB/2

  • …​

Diğer Servisler

  • MongoDB

  • Redis

  • Memcached

  • Couchbase

  • ElasticSearch

  • Solr

  • …​

Apache Tarihçesi

  • 1991 - HTTP (0.9)

  • 1994 - NCSA en popüler web sunucusu, gelişimi durdu

  • 1995 - NCSA Temelli "A Patchy Server" -→ Apache

  • 1996 - Apache en popüler web sunucusu

  • 1999 - Apache Software Foundation

  • 2014 - 150+ Apache projesi, Apache hala en popüler web sunucusu

Apache Kurulumu (RHEL türevleri)

  • yum install httpd

  • service httpd start

  • chkconfig httpd on

  • lokkit -p 80:tcp

Ayar Dosyaları (CentOS)

  • /etc/httpd/conf/httpd.conf

  • /etc/httpd/conf.d/*.conf

  • /etc/sysconfig/httpd

Çalışma Modelleri

MPM: Multi-Processing Modules

  • Prefork (Öntanımlı)

  • Worker (Threaded)

  • Event (Threaded - Apache 2.4+)

Modüler Yapısı

  • Birçok ek işlev httpd core’unun üzerine ekleniyor

  • Apache’nin kendi birçok özelliği de modül biçiminde

  • İstenilen modüller kaldırılıp, istenilenler eklenebiliyor

  • Ne kadar az modül o kadar az kaynak tüketimi

  • Modüller hem dinamik yüklenebiliyor, hem statik gömülebiliyor

  • http://modules.apache.org

Statik Derlenmiş Modüller

root@midye ~]# httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c

Modüllerin Eklenmesi / Çıkarılması

Apache ayarlarında

LoadModule auth_basic_module modules/mod_auth_basic.so

satırının önüne # işareti koyarak etkinsizleştirilir, # işareti kaldırılarak etkinleştirilir. Sistemdeki her modül için bu ayarların hazır bulunması beklenir.

Apache’nin Kendi Modüllerinden Örnekler

  • mod_dav

  • mod_deflate

  • mod_ldap

  • mod_speling

  • mod_substitute

  • mod_userdir

  • mod_usertrack

Yaygın Ek Modüller

  • mod_pagespeed: Web optimizasyonu

  • mod_security: Güvenlik

  • suhosin: PHP Güvenliği

  • mod_php: PHP Dili

  • mod_wsgi: Python

  • mod_perl: Perl

  • mod_jk: Servlet

Temel Ayarlar

  • ServerRoot /etc/httpd

  • DocumentRoot /var/www/html

  • ServerName ozguryazilim.com.tr

  • ServerAlias www.ozguryazilim.com.tr xn—​zgryazlm-m4a6d07ab.com.tr www.xn—​zgryazlm-m4a6d07ab.com.tr

Listen

  • Listen 80

  • Listen 8000

  • Listen 88.198.33.142:80

  • Listen [2001:db8::a00:20ff:fea7:ccea]:80

  • Listen 192.168.1.18:8443 https

Dizinlere Özgü Ayarlar

Tek dizin:

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

Çoklu dizin:

<DirectoryMatch /[a-d].*>
    Options -FollowSymLinks
    AllowOverride All
</DirectoryMatch>

Dosyalara Özgü Ayarlar

Tek dosya için:

<Files "wp-login.php">
    Order allow,deny
    Deny from all
</Files>

Çoklu dizin:

<FilesMatch "\.(gif|jpe?g|png)$">
    # …​
</FilesMatch>

URL’ye Özgü Ayarlar

Tek URL:

<Location /sunucu-durumu>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.1.0/24
</Location>

Çok URL:

<LocationMatch "/(extra|special)/data">
    Require all denied
</LocationMatch>

Proxy ve Virtualhost’a Özgü Ayarlar

Proxy için:

<Proxy *>
    #…​
</Proxy>
<ProxyMatch /+)>
    #…​
</ProxyMatch>

VirtualHost için:

<VirtualHost *:80>
    #…​
</VirtualHost>

DirectoryIndex

DirectoryIndex index.html index.php

İstenilen URL bir dizin ise,

  • DirectoryIndex’te tanımlı dosyayı gösterir.

  • Tanımlı dosya yoksa dizinde Indexes özelliği incelenir.

  • Indexes yetkisi varsa dosya listesi gösterilir.

  • Indexes yetkisi yoksa "403 Forbidden" döndürür.

ServerTokens

  • ServerTokens Full: Apache/2.2.15 (Unix) PHP/4.3.3

  • ServerTokens Minimal: Apache/2.2.15

  • ServerTokens Prod: Apache

Ölçekleme

  • StartServers 10

  • MinSpareServers 5

  • MaxSpareServers 20

  • MaxRequestsPerChild 40000

  • MaxClients 150

  • ServerLimit 256

KeepAlive

  • KeepAlive On

  • KeepAliveTimeout 15

  • MaxKeepAliveRequests 4000

.htaccess - 1

  • httpd.conf içinde AccessFileName ayarı ile etkinleştirilir.

AccessFileName .htaccess
  • httpd.conf’ta yapılan ayarları dizin bazlı değiştirir

  • Apache her dizinde .htaccess isimli bir dosya arar.

  • O dizin ve altındaki dizinler için bu ayarlar geçerli olur.

.htaccess - 2

  • httpd.conf’ta o dizin için AllowOverride ayarı yapılmış olmalı.

<Directory "/var/www/html">
    AllowOverride All
</Directory>

.htaccess - 3

htaccess dosyalarına web üzerinden erişim aşağıdaki ayarlarla kısıtlanır:

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>
  • Birçok web uygulaması kendi ayarlarını uygulama içindeki yönetim panelinden yapabilmek için gereksinim duyar.

.htaccess - 4

AllowOverride ayarının değerleri:

  • All: Tüm

  • AuthConfig: Doğrulama

  • FileInfo: Dosyalara erişim

  • Indexes: Dizin indeksini oluşturma

  • Limit: Erişim kısıtlama

  • Options: Dizin özellikleri

.htaccess - 5

Avantajları

  • httpd.conf’u düzenleme yetkisi gerektirmez

  • Ayarlar anında etkin olur

  • Dizin başka yere taşınırsa ayarlar da taşınır

Dezavantajları:

  • Performansı düşürür

  • Güvenliği azaltır

Dizindeki Dosya Listesinin Gösterilmesi

  • mod_autoindex

  • DirectoryIndex bulunamadığında çalışır

  • Dizindeki dosyaların bir listesini verir.

  • Çalışması için,

<Directory "/var/www/html">
    Options +Indexes
</Directory>
  • Eğer dizinde Indexes özelliği yoksa (öntanımlı) → 403 Forbidden

ErrorDocument

Belirli bir HTTP durum koduna karşılık döndürülecek sayfa

ErrorDocument 403 /403.php
ErrorDocument 404 http://ozguryazilim.com.tr
ErrorDocument 503 /cokyogunumcok.php
…​

AddDefaultCharset

AddDefaultCharset utf-8
  • HTML sayfaları bu karakter kodlaması ile sunulur

  • HTML sayfalarında kodlama belirtilmemesine karşı çözüm

  • Aynı sunucuda farklı kodlamalarda sayfalar olacaksa kullanılmamalı

  • CentOS’ta öntanımlı olarak UTF-8 gelir.

Alias

URL’yi dosya sistemine eşler:

Alias /phpmyadmin /usr/share/phpmyadmin
AliasMatch ^/phpmyadmin/(.*)$ /usr/share/phpmyadmin/$1

Redirect

Sayfa ya da dizinlerin yerinin değiştirilmesi:

Redirect 301 /eski_yeri.html http://www.ozguryazilim.com.tr/yeni_yeri.php
RedirectMatch ^/images/(.*)$ http://images.ozguryazilim.com.tr/$1

Rewrite - 1

  • Sunucuya gelen istekteki URL’yi değiştirir

  • Kural temelli çalışır

  • Dönüşümler: URL → dosya sistemi, URL → URL, URL → Proxy

  • Eşleme için düz metin ya da düzenli ifade (regexp) kullanılır.

Yaygın kullanılan alanlar:
  • Taşınan ya da yapısı değişen web sitelerinin URL yönlendirmesi

  • SEO dostu URL dönüşümleri (x.php?p=234 → /ayse-tatile-cikti)

  • Belli sayfalarda HTTP bağlantıları HTTPS’e zorlamak

Rewrite - 2

HTTPS’e zorlamak

RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

Belirli bir değişkeni içermeyen URL’leri yönlendirmesi

RewriteCond %{QUERY_STRING} !degisken=
RewriteRule ^/?baglanilan.php$ degiskensiz_cikmam_abi.php [QSA,L]

Rewrite - 3

Ne zaman kullanmayalım?

  • Basit yönlendirme işlemleri

Redirect /dizin/ http://dizin.alanadi.com.tr/
RedirectMatch (.*)\.jpg$ http://www.alanadi.com.tr$1.jpg
  • Belirli bir çevresel değişkene göre işlem

<If "req('Host') != 'www.alanadi.com.tr'">
    Redirect / http://www.alanadi.com.tr/
</If>

Rewrite - 4

  • Basit / URL dizin eşleştirmesi

Alias /kebaplar /var/www/yemekler
  • Toplu sanal host oluşturma işlemleri (mod_vhost_alias ya da mod_macro)

  • Basit proxy işlemleri (mod_proxy)

Rewrite - 5

Rewrite kullanırken önemli noktalar:

  • Sıfırdan yazmak yerine İnternet’te örnek arayın

  • URL sonu bölü işaretlerine (slash) dikkat

  • Geliştirirken 500 Internal Server hatası sık alınır (sonsuz döngü)

  • Çok karmaşık eşlemeler, performansı olumsuz etkiler

Apache Ayarları .:. Erişim Kısıtlaması - 1

IP temelli

<Directory "/var/www/web_sitesi/admin">
  AllowOverride None
  Options None
  Order deny,allow
  Deny from all
  Allow from 192.168.1.0/24
</Directory>

Apache Ayarları .:. Erişim Kısıtlaması - 2

Dosya temelli

<Files ~ "^\.ht">
  Order allow,deny
  Deny from all
  Satisfy All
</Files>

Apache Ayarları .:. Erişim Kısıtlaması - 3

Parola temelli dizin koruma:

<Directory /var/www/test.22dakika.org>
  AuthType Basic
  AuthName "Test Alani: Tas Dusebilir Balrog Cikabilir"
  AuthUserFile /var/www/test.22dakika.org/.htpasswd
  Require valid-user
</Directory>

Htpasswd dosyasının oluşturulması:

htpasswd -c /var/www/test.22dakika.org/.htpasswd

Apache Ayarları .:. Erişim Kısıtlaması - 4

Tek bir dosyanın parola ile doğrulanması:

<Files yonetim.php>
  AuthName "Prompt"
  AuthType Basic
  AuthUserFile /var/www/test_uygulamasi/.htpasswd
  Require valid-user
</Files>

Apache Ayarları .:. Erişim Kısıtlaması - 5

Birden fazla dosyanın parola ile doğrulanması:

<FilesMatch "^(deneme|phpinfo).*$">
  AuthName "Bize Ozel"
  AuthUserFile /.htpasswd
  AuthType basic
  Require valid-user
</FilesMatch>

Apache Ayarları .:. Erişim Kısıtlaması - 6

Dizine belirli bir IP’den gelenler dışındakileri başka bir sayfa (Bakım Modu):

ErrorDocument 403 http://www.ozguryazilim.com.tr/bakim-yapiliyor
Order deny,allow
Deny from all
Allow from 195.112.152.2

SSL ile Şifreleme - 1

SSL kurulumu:

yum install mod_ssl
service httpd restart
lokkit -p 443:tcp

Self-signed (kendi imzaladığımız) sertifika ile yayındayız.

SSL ile Şifreleme - 2

Sertifika otoritesi ile sertifika hazırlama:

  • Özel anahtarımızı oluşturuyoruz:

openssl genrsa -out /etc/pki/tls/certs/bizim.key 2048
  • Açık anahtar için talep oluşturuyoruz:

openssl req -new -key /etc/pki/tls/certs/bizim.key -out /etc/pki/tls/certs/bizim.csr
  • bizim.csr → Sertifika Otoritesi → bizim.crt

  • /etc/pki/tls/certs/bizim.crt altına dosya yerleştirilir

SSL ile Şifreleme - 3

  • Öntanımlı SSL ayarları → /etc/httpd/conf.d/ssl.conf

  • Sertifika dosyalarının yeri:

SSLCertificateFile /etc/pki/tls/certs/ozguryazilim.crt
SSLCertificateKeyFile /etc/pki/tls/certs/ozguryazilim.key
  • Güvenlik açısından eski SSL şifreleme yöntemleri kapatılabilir:

SSLProtocol all -SSLv2 -SSLv3

PHP Sunulması - 1

Prefork + PHP modülü
  • mod_php

  • PHP uzantılı dosyalar için PHP modülü tetiklenir.

  • Kalan dosyaları Apache sunmaya devam eder.

PHP Sunulması - 2

Worker/Event + Ters Proxy
  • fcgi:// (FastCGI) ya da http://

  • PHP uzantılı dosyalar için PHP-FPM servisi çağrılır.

  • Kalan dosyaları Apache sunmaya devam eder.

PHP Sunulması - 3

Artılar-Eksiler:
  • Modülün kurulumu kolay, dağıtımlarda prefork öntanımlı.

  • Ayrı uygulama sunucusunda sorun belirleme daha kolay.

  • Modülde uygulama performansı daha yüksek. (ne kadar?)

  • Modül olduğunda, uygulamadaki bir sorun tüm web servisini etkiliyor.

PHP Sunulması - 4

  • Modülün eklenmesi (her modül gibi) Apache’nin bellek tüketimini arttırıyor.

  • Ayrı servis olduğunda, farklı sanal host’lar için farklı kullanıcılarda çalışan süreçler tetiklenebiliyor.

  • Ayrı servis olunca, PHP servisi tüm web servisi durdurulmadan tekrar başlatılabiliyor.

  • Ayrı servis olunca, birden fazla PHP sürümü aynı sunucuda kolaylıkla çalıştırılabiliyor.

PHP’nin MySQL Destekli Kurulumu

Artılar-Eksiler:
  • Prefork + mod_php ile kurulum:

yum install php
  • PHP’nin MySQL modülü ayrıca kurulur:

yum install php-mysql
  • EPEL ya RPMForge deposundan phpMyAdmin kurulabilir:

yum install phpmyadmin

VirtualHost - 1

  • Aynı sunucuda birden fazla alan adı sunulması

  • NameVirtualHost tanımı yapılınca etkin hale gelir

NameVirtualHost *:80
NameVirtualHost *:443
  • Temel VirtualHost tanımı:

<VirtualHost *:80>
  ServerName www.alanadi.com.tr
  DocumentRoot /var/www/alanadi.com.tr
</VirtualHost>

VirtualHost - 2

  • Daha detaylı bir tanım örneği:

<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/pki/tls/certs/alanadi.crt
  SSLCertificateKeyFile /etc/pki/tls/private/alanadi.key

  DocumentRoot /var/www/alanadi.com.tr
  ServerName www.alanadi.com.tr
  ServerAlias alanadi.com.tr alanadi.com www.alanadi.com

  <Directory /var/www/alanadi.com.tr>
  AllowOverride FileInfo
  </Directory>

VirtualHost - 3

  CustomLog /var/log/httpd/alanadi.com.tr-access_log combined
  ErrorLog /var/log/httpd/alanadi.com.tr-error_log

  php_admin_value open_basedir /var/www/alanadi.com.tr:/tmp
  php_value upload_max_filesize 32M
  php_value post_max_size 32M
</VirtualHost>

Ters Proxy .:. Uygulama (Application) Sunucu Kullanımı

  • proxy_module ve proxy_http_module

  • Örnek bir tanım:

ProxyRequests Off

ProxyPass /app1 http://192.168.1.5:8080/
ProxyPassReverse /app1 http://192.168.1.5:8080/

Ters Proxy .:. Desteklenen Protokoller

  • AJP13: mod_proxy_ajp

  • SSL: mod_proxy_connect

  • FastCGI: mod_proxy_fcgi

  • FTP: mod_proxy_ftp

  • HTTP: mod_proxy_http

  • SCGI: mod_proxy_scgi

  • WS and WSS (Web-sockets): mod_proxy_wstunnel

Ters Proxy ile SSL Sonlandırması

<VirtualHost *:443>
  RequestHeader set X-Forwarded-Proto "https"
  …​
</VirtualHost>
  • Uygulama sunucu üzerindeki şifreleme yükünü kaldırır.

  • Performans artışı sağlar.

Ters Proxy ile Yük Dengeleme - 1

lb

Ters Proxy ile Yük Dengeleme - 2

  • proxy_balancer_module

  • Basit bir örnek:

<Proxy balancer://kuluster>
  BalancerMember http://192.168.1.11
  BalancerMember http://192.168.1.12
</Proxy>
ProxyPass /test balancer://kuluster/

Ters Proxy ile Yük Dengeleme - 3

Ağırlık ve yöntem belirleme:

<Proxy balancer://kuluster>
  BalancerMember http://192.168.1.11 loadfactor=20
  BalancerMember http://192.168.1.12 loadfactor=5
  ProxySet lbmethod=byrequests
</Proxy>
ProxyPass /test balancer://kuluster/

Ters Proxy ile Yük Dengeleme - 4

Sticky session (yapışkan oturum):

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://kuluster>
  BalancerMember http://192.168.1.11 route=1
  BalancerMember http://192.168.1.12 route=2
  ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /test balancer://kulster

Ters Proxy ile Yük Dengeleme - 5

mod_status ile Balancer Manager:

<Location /balancer-manager>
  SetHandler balancer-manager
  Require host ozguryazilim.com.tr
</Location>
ProxyPass /test balancer://kulster

Ters Proxy ile Yük Dengeleme - 6

balancer manager

Apache Logları (Kayıtları) - 1

  • CustomLog (Access Log)

  • ErrorLog

  • Logların formatı şöyle belirlenebilir:

    • LogFormat "%h l %u %t \"%r\" %>s %b \"{Referer}i\" \"%{User-Agent}i\"" combined

    • LogFormat "%h %l %u %t \"%r\" %>s %b" common

    • Özel tanımlı herhangi bir biçem (format)

  • Farklı host’lar için farklı loglar tutulabilir.

Apache Logları (Kayıtları) - 2

Örnek loglar:

91.76.50.241 - - [24/Nov/2014:03:58:33 +0200] "GET /anasayfa/feed/ HTTP/1.0" 200 766 "http://www.xxxx.com.tr/anasayfa/feed/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0"
[Mon Nov 24 21:12:32 2014] [error] [client 162.244.27.208] client denied by server configuration: /var/www/html/xmlr pc.php

Apache Logları’nın İmzalanması

  • 5651 kanununa göre erişim logları zaman damgasıyla imzalanmalı

  • İmzalanan loglar 2 yıl süreyle saklanmalı

  • openssl ts komutuyla damgalanabilir

Apache Log’larının İstatiksel Analizi .:. Webalizer

webalizer

Apache Log’larının İstatiksel Analizi .:. Awstats

awstats

Apache Log’larının İstatiksel Analizi .:. Piwik