Apache Web Sunucusu
Web Mimarisi
HTTP
Web istemci ve sunucuları HTTP ile haberleşir
HTTP : Hyper Text Transfer Protocol : 80. port
HTTPS : HTTP Secure (Güvenli) : 443. port
URL : http://alanadi.com.tr ya da https://alanadi.com.tr
En Yoğun Bir Milyon Sitenin Sunucu Payları - 1
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
İ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
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:
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.
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
mod_php
PHP uzantılı dosyalar için PHP modülü tetiklenir.
Kalan dosyaları Apache sunmaya devam eder.
PHP Sunulması - 2
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
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
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
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
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
Apache Log’larının İstatiksel Analizi .:. Awstats
Apache Log’larının İstatiksel Analizi .:. Piwik
Apache’nin Gözetlenmesi .:. ApacheTop
Apache’nin Gözetlenmesi .:. GoAccess
Apache’nin Gözetlenmesi .:. ExtendedStatus - 1
Web sunucu ile ilgili detaylı anlık kullanım bilgileri sunar.
İstekleri sunan süreç sayısı
Boştaki süreçlerin sayısı
Her sürecin durumu, sürece gelen istek sayısı ve sunduğu byte
Toplam erişim sayısı ve sunulan toplam byte
Sunucunun kaç kere başlatıldığı/yeniden başlatıldığı ve ne kadar zamandır çalışmakta olduğu
Saniyedeki ortalama istek sayısı, sunduğu byte/s ve istek başına ortalama byte miktarı
Her sürecin ayrı ayrı ve tüm süreçlerin toplam işlemci kullanım yüzdesi
O an işlem görmekte olan hostların ve isteklerin sayısı
Apache’nin Gözetlenmesi .:. ExtendedStatus - 2
Apache’nin Gözetlenmesi .:. ExtendedStatus - 3
Etkinleştirilmesi:
ExtendedStatus On <Location /server-status> SetHandler server-status Order allow,deny Deny from all Allow from 192.168.1.0/24 </Location>
Debian/Ubuntu’ya Özgü Farklılıklar - 1
apt-get install apache2
/etc/apache2/*
/etc/apache2/conf-available dizinine yerleşir
a2enconf komutuyla elle etkinleştirilir (ve servis tekrar başlatılır)
a2disconf komutuyla elle etkinsizleştirilir (ve servis tekrar başlatılır)
Debian/Ubuntu’ya Özgü Farklılıklar - 2
/etc/apache2/sites-available dizinine ayarlar her bir host için yerleştirilir
a2ensite komutuyla elle etkinleştirilir (ve servis tekrar başlatılır)
a2dissite komutuyla elle etkinsizleştirilir (ve servis tekrar başlatılır)
Sorular
?