Zurück zur “Webseiten beschleunigen” – Übersicht
5.) Webserver beschleunigen
5.1) Apache-Module deaktivieren
Ggf. kann man auch einige Module (Erweiterungen) von Apache abschaltet, wer z.B. auf seiner Webseite gar keine SSL-Verschlüsselung verwendet, könnte das entsprechende Modul deaktivieren.
a2dismod ssl
/etc/init.d/apache2 restart
Die momentan aktiven Erweiterungen kann man unter “/etc/apache2/mods-enabled/” einsehen, die installierten Erweiterungen sind unter “/etc/apache2/mods-available/” zu finden.
Dynamische Seiten:
– mod_log_config erlaubt die access_log-Dateien in div. Formaten.
– mod_cgi braucht man, wenn man CGI zulassen will.
– mod_suexec erlaubt CGIs als ein bestimmter User zu laufen.
– mod_perl braucht man nicht um Perl als CGI auszuführen!
– mod_php5 ist schneller als suphp (aber nicht so sicher).
– mod_suphp führt php Skript mit den Rechten des entsprechenden webs aus.
– mod_include erlaubt die Verwendung von SSI.
URL-Manipulationen:
– mod_alias braucht man zum Einblenden von virtuellen Verzeichnissen.
– mod_rewrite erlaubt URL-Manipulationen, kostet aber Performance.
– mod_autoindex & mod_dir erlauben eine Navigation ohne index.html
– mod_userdir erlaub User-URLs mit z.B.: www.huschi.net/~huschi/
– mod_negotiation analysiert Accept-Anfragen.
– mod_vhost_alias erlaubt das Anlegen von virtuellen Hosts.
Environment- & Header-Manipulation:
– mod_mime setzt automatisch den richtigen Header anhand der Dateiendung.
– mod_env & mod_setenvif erlauben die modifizierung von ENV-Variablen.
– mod_expires erlaubt die HTTP-Header Manipulation des Expires-Date (Verfall-Zeit).
– mod_ssl erlaubt die Verwendung von SSL (https).
Zudem kann man folgende Option in der Apache-Konfiguration ändern, so dass man DNS-Lookups reduziert.
vim /etc/apache2/apache2.conf
HostNameLookups off
5.2) Reverse Proxy (Nginx)
Wir wollen unsere Webseite mal wieder ein wenig beschleunigen, dies können wir auf verschiedenen Wegen bewerkstelligen, heute beschäftigen wir uns mit dem Reverse-Proxy vor einem Webserver, in diesem Beispiel nutzen wir für diesen Zweck Nginx + apache2. Der große Vorteil von einen Proxy vor dem Webserver ist, dass mehrere Anfragen gleichzeitig gestellt werden könne, um die Performance von statischen Daten zu steigern. Die Anfragen an dynamische Inhalte werden dann noch immer an einen zweiten bzw. an mehrere Webserver, hinter dem Proxy weitergereicht.
Wer sich jetzt fragt, warum man nicht komplett auf Nginx umsteigen sollte, da die Benchmarks zeigen, dass dieser schneller ist als der Apache Webserver, derjenige hat nicht bedacht, dass bei diesen Tests nur die Reaktionen des Webservers auf eine gewisse Anzahl von Anfragen geprüft wird, wenn man jedoch mit “nginx + fcgi” viele php-Dateien verarbeiten möchte, ist ein “apache + mod_php” schneller, zudem kann man diese Daten z.B. mittels eAccelerator zusätzlich cachen, was die Geschwindigkeit von php-Daten noch einmal positiv beeinflusst.
Update: Inzwischen konnte ich die ganzer Sache ausgiebig testen und setzte momentan eine Kombination aus “Varnish” + “Nginx” + “php5-fpm” (+ xcache) ein, so werden die Seiten von Varnish zwischengespeichert alle neue Anfragen von Nginx entgegengenommen, Bilder etc. sofort ausgeliefert und PHP-Anfragen an einen laufendem PHP-Daemon weitergereicht, jedoch erst-einmal zurück zum Beispiel mit Nginx als Reverse-Proxy…
Als Lösung für diese Problem habe ich mir einen Nginx-Proxy gebastelt, der statische Daten (Bilder…) ausliefert und diese zusätzlich für 24 Stunden zwischenspeichert, alle andern dynamischen Inhalte (php,cgi…) werden sofort an apache durch-gereicht. In diesem Beispiel laufen sowohl der Proxy als auch Apache auf einem Server.
5.2.1.) Apache auf einem neuen Port laufen lassen
Folgende Datei öffnen…
vim /etc/apache2/ports.conf
…Port “80” durch z.B. “127.0.0.1:8080” ersetzen.
[stextbox id=”warning”]!!! Wichtig ist hier, darauf zu achten, dass der Apache selber nicht mehr über eine Öffentliche IP-Adresse erreichbar ist. !!![/stextbox]
Ggf. helfen dir die folgenden Zeilen weiter, um alle Einträge in einer Datei zu Ändern (mit vi / vim).
:%s/^80/127.0.0.1:8080/g
:%s/SERVER_IP_ADRESSE:80/127.0.0.1:8080/g
SERVER_IP_ADRESSE muss nun noch mit der IP-Adresse des Servers ersetzte werden und anschließend musst du den Apache Webserver noch neu-starten. Ggf. müssen noch weitere Dateien von Apache angepasst werden.
Mit dem folgendem Befehl kannst du prüfen, ob noch weitere Einträge (Port 80) in der Apache Konfiguration sind.
/bin/grep -wr 80 /etc/apache2/
5.2.2) Ggf. ISPConfig anpassen
Falls du z.B. ISPConfig installiert hat, werden wie Änderungen am Apache Webserver, bei der nächsten Änderung über die Admin-Oberfläche wieder verworfen, daher müssen wir das Template von ISPConfig dementsprechend anpassen.
vim ~/ispconfig/isp/conf/vhost.conf.master
NameVirtualHost 127.0.0.1:8080
5.2.3.) Reverse-Proxy: nginx installieren & konfigurieren
aptitude install nginx
vim /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
worker_rlimit_nofile 3000;
pid /var/run/nginx.pid;
# [ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log;
#google_perftools_profiles /tmp/profile/;
events {
worker_connections 2048;
# use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ;
use epoll;
multi_accept on;
}
http {
server_names_hash_bucket_size 64;
## Size Limits
client_max_body_size 10M;
client_header_buffer_size 32k;
client_body_buffer_size 128k;
large_client_header_buffers 64 8k;
## Timeouts
client_body_timeout 3m;
client_header_timeout 3m;
send_timeout 3m;
#expires 24h;
keepalive_timeout 120 120;
## General Options
ignore_invalid_headers on;
keepalive_requests 100;
limit_zone normal $binary_remote_addr 5m;
recursive_error_pages on;
sendfile on;
server_name_in_redirect off;
server_names_hash_max_size 512;
server_tokens off;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
## TCP options
#tcp_nopush on;
tcp_nodelay off;
#send_lowat 12000;
include mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
log_format main '$remote_addr - $remote_user [$time_local] $status '
'\"$request\" $body_bytes_sent \"$http_referer\" '
'\"$http_user_agent\" \"http_x_forwarded_for\"';
## Cache
open_file_cache max=1000 inactive=24h;
open_file_cache_valid 24h;
open_file_cache_min_uses 2;
open_file_cache_errors on;
## Compression
gzip on;
gzip_static on;
gzip_disable "MSIE [1-6]\.";
gzip_buffers 32 8k;
gzip_comp_level 5;
gzip_http_version 1.0;
gzip_min_length 0;
gzip_proxied any;
gzip_types text/plain text/css text/xml text/javascript application/json application/xml application/xml+rss application/x-javascript image/x-icon application/x-perl application/x-httpd-cgi;
gzip_vary on;
output_buffers 10 128k;
postpone_output 1500;
# Beispiel: Loadbalance
#upstream webbackend {
#ip_hash;
#server web1.domain.lan weight=10 max_fails=3 fail_timeout=30s;
#server web2.domain.lan weight=1 backup;
#}
# Beispiel: Reverse-Proxy
#server {
#access_log /var/log/nginx/access.proxy.log main;
#error_log /var/log/nginx/error.proxy.log;
#listen 80;
#server_name _;
## PROXY - Web
#location ~ \.php$ {
#proxy_cache cache;
#proxy_pass http://127.0.0.1:8080;
#}
#}
# Beispiel: HTTP Server (sollte jedoch besser unter /etc/nginx/sites-available/ angelegt werden)
#server {
#listen 8000;
#listen somename:8080;
#server_name somename alias another.alias;
#location / {
#root html;
#index index.html index.htm;
#}
#}
# Beispiel: HTTPS Server (sollte jedoch besser unter /etc/nginx/sites-available/ angelegt werden)
#server {
#listen 443;
#server_name localhost;
#ssl on;
#ssl_certificate cert.pem;
#ssl_certificate_key cert.key;
#ssl_session_timeout 5m;
#ssl_protocols SSLv2 SSLv3 TLSv1;
#ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#ssl_prefer_server_ciphers on;
#location / {
#root html;
#index index.html index.htm;
#}
#}
include /etc/nginx/proxy.conf;
include /etc/nginx/sites-enabled/*.conf;
}
vim /etc/nginx/proxy.conf
proxy_buffering on;
proxy_cache_min_uses 3;
proxy_cache_path /usr/local/nginx/proxy_cache/ levels=1:2 keys_zone=cache:10m inactive=24h max_size=1000M;
proxy_cache cache;
proxy_cache_valid 200 24h;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_ignore_client_abort off;
proxy_intercept_errors on;
proxy_next_upstream error timeout invalid_header;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffers 32 1M;
proxy_busy_buffers_size 31M;
proxy_temp_file_write_size 30M;
proxy_buffer_size 30M;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_ignore_headers Expires Cache-Control;
mkdir /usr/local/nginx/proxy_cache/
chown -R www-data:www-data /usr/local/nginx/proxy_cache/
Link:
wiki.nginx.org/NginxHttpProxyModule
/etc/init.d/apache2 restart
/etc/init.d/nginx restart
Nginx läuft nun auf Port 80 und nimmt die Anfragen von Client an und der Apache wartet auf die weitergeleiteten Anfragen von Reverse-Proxy.
[stextbox id=”info”]Bei mir hat der cache (Zwischenspeicherung) jedoch Probleme verursacht, so dass Captcha’s nicht mehr funktioniert haben, daher habe ich diesen im Nachhinein abgeschaltet.[/stextbox]
Links:
www.joeandmotorboat.com/2008/02/28/apache-vs-nginx
5.2.4.) Logfiles korrigieren
Nun stehen wir noch vor dem Problem, dass im Logfile von apache die IP-Adresse vom Reverse-Proxy auftauscht und zwar nur noch diese, um dies zu umgehen installieren wir nun noch folgendes…
aptitude install libapache2-mod-rpaf
Nun noch folgendes in den Vhost-Einträgen bzw. in dem ISPConfig Template ergänzen.
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
/etc/init.d/apache2 reload
…und schon haben wir einen Reverse-Proxy (“Apache” + “Nginx”) installiert. Unter Punkt 5.3 zeige ich wie du ganz auf Nginx setzten kannst und somit nicht zwei Webserver, betreiben & konfigurieren musst.