Nginx


Nachdem der Lamp-Server mit Performanceproblemen zu kämpfen hat, die allem Anschein nach vom Analysewerkzeug Piwik kommen, habe ich beschlossen, einige Alternativen auszuprobieren, unter anderem den Webserver Nginx. Nginx soll um ein Vielfaches ressourcenschonender und performanter als der Apache sein und mit einer einfacheren Konfiguration aufwarten.

Installation

Nginx muss aus den Quellen kompiliert werden. Vor der Installation sind noch einige Abhängigkeiten zu lösen, u. a. werden die Entwicklerpakete von prce3, zlib1g und openssl benötigt:

apt-get install libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev 


Danach muss Nginx heruntergeladen und entpackt werden. Anders als beim Apache werden in Nginx alle Module bereits beim Kompilieren implementiert. Was gewünscht ist, wird configure mitgeteilt, fehlende Abhängigkeiten, wie etwa die gd-Bibliotheken oder Google-Performance-Tools (jawohl, für das Sprachenzentrum bohren wir den Nginx gleich ein bisschen auf) sollten vorher aufgelöst werden. Die Installation erfolgt im klassischen Dreischritt ./configure, make, make install. In der folgenden Konfiguration laufen alle Worker-Processe mit den Rechten des Nutezrs www-data, ... eigentlich ist alles selbsterklärend, bei Fragen bitte Doku nachschlagen.

aria2c http://google-perftools.googlecode.com/files/libgoogle-perftools0_1.7-1_i386.deb
aria2c http://google-perftools.googlecode.com/files/libgoogle-perftools-dev_1.7-1_i386.deb
dpkg -i libgoogle-perftools0_1.7-1_i386.deb libgoogle-perftools-dev_1.7-1_i386.deb
apt-get install libgd2-xpm-dev
aria2c http://nginx.org/download/nginx-1.0.5.tar.gz
tar -xzf nginx-1.0.5.tar.gz
cd nginx-1.0.5
./configure --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/run/nginx.lock --user=www-data --group=www-data --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/ --http-fastcgi-temp-path=/tmp/nginx/fastcgi/ --http-uwsgi-temp-path=/tmp/nginx/uwsgi/ --http-scgi-temp-path=/tmp/nginx/scgi/ --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-google_perftools_module --add-module=../mod_wsgi/
make
make install


PHP installieren


Nginx soll mit PHP laufen. Die performanteste Lösung ist laut Hörensagen PHP 5.3 FMP. Um das komfortabel über apt zu installieren, packen nehmen wir das entsprechende Paketrepository in die /etc/apt/sources.list auf und installieren den ganzen Spaß mit apt-get, was gleich den Vorteil hat, ein Startscript für PHP-FPM mitgeliefert zu bekommen.

echo "deb http://php53.dotdeb.org lenny all" >> /etc/apt/sources.list
apt-get update
apt-get upgrade
apt-get install php5-fpm
apt-get clean



Konfiguration

Ein Großteil der Konfiguration wurde bereits mit der Parameterübergabe beim Kompilieren erledigt. In /etc/ ist nun der Ordner nginx gelandet, der die wichtigste Konfig-Datei ngninx.conf enthält. Diese passen wir wie folgt an:

#User, der Worker-Prozess ausführt
user  www-data www-data;
#anzahl Worker-Prozesse
worker_processes  1;
#Als Daemon laufen lassen
daemon on;

events {
	worker_connections  1024;
	use epoll;
}

http {
	server_names_hash_bucket_size  64;
	#caching aktivieren
	expires       30d;
	add_header    Cache-Control  public;
	add_header    Last-Modified: $date_gmt;

	include       mime.types;
	default_type  application/octet-stream;

	sendfile        on;
	#tcp_nopush     on;
	#timeouts
	#client_body_timeout   15;
	#client_header_timeout 15;
	keepalive_timeout     65 20;
	fastcgi_read_timeout 60;
	#send_timeout         15;

	#gzip-komprimierung aktivieren
	gzip  on;
	gzip_comp_level  5;
	gzip_vary       on;
	gzip_proxied    any;
	gzip_types      text/css text/javascript text/xml text/plain application/xml application/xhtml+xml application/x-httpd-php application/x-httpd-fastphp application/rss+xml application/javascript application/x-javascript ;
	#vermisste Seiten, z.B. favicon.ico oder robots.txt sollen nicht geloggt werden
	log_not_found off;

	#Seiten hinzufügen
	include sites-enabled/*;
}


Wie gut zu sehen ist, werden die virtuellen Server mit
include sites-enabled/*;
eingebunden. Um den Spaß übersichtlich zu gestalten, sollten die Config-Dateien für die virtuellen Server in einem separaten Verzeichnis liegen und nach sites-enabled verlinkt werden. So lässt sich sicherstellen, dass einzelne Seiten schnell ein- und ausgeschaltet werden können.

Das nachfolgende Listing zeigt am Beispiel des Wordpress-Blogs, wie die Dateien für die virtuellen Server in etwa ausschauen:

		 server {
				listen       80;
				server_name  blog.sprachenzentrum.hu-berlin.de;
				root   /var/www/blog/;
				index  index.php; # index.html index.htm;

				location / {
						if (!-e $request_filename) {
								rewrite ^ /index.php last;
						}
				}

				location ~* \.php$ {
						fastcgi_pass 127.0.0.1:9000;
						fastcgi_param SCRIPT_FILENAME /var/www/blog$fastcgi_script_name;
						fastcgi_param PATH_INFO $fastcgi_script_name;
						include fastcgi_params;
				}

				#error_page  404              /404.html;

				# redirect server error pages to the static page /50x.html
				#
				#error_page   500 502 503 504  /50x.html;
				#location = /50x.html {
				#       root   /var/www/blog/;
				#}
		}


Der Server ist betagt, das macht sich auch bemerkbar, indem ihm schnell die Puste ausgeht. Meist ist php5-fpm schuld, hier darum sollten in /etc/php5/fpm/ noch ein paar Einstellungen geändert werden. In der php.ini sollte der Wert
max_execution_time = 120
auf 120 Sekunden gesetzt werden, denn Piwik-Abfragen brauchen etwas Zeit. in der php5-fpm.conf sind gleich mehrere Änderungen vorzunehmen (alles noch experimentell):

listen.backlog = 4096
pm.max_children = 35
pm.start_servers = 15
pm.min_spare_servers = 5
pm.max_spare_servers = 25
request_terminate_timeout = 120


So sollte es erst einmal gehen. Es ist zu beobachten, wie sich der Server schlägt. Mit
/usr/local/nginx/sbin/nginx -t
lässt sich die Konfiguration vor dem Start auf Fehler überprüfen.

Startscript

Wir erstellen jetzt ein Startscript, das in /etc/init.d abgelegt wird und mit dessen Hilfe wir Nginx bei jedem Systemstart automatisch aktivieren.

#! /bin/sh

### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx

test -x $DAEMON || exit 0

# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
	. /etc/default/nginx
fi

set -e

. /lib/lsb/init-functions

case "$1" in
  start)
	echo -n "Starting $DESC: "
	start-stop-daemon --start --quiet --pidfile /var/run/nginx/$NAME.pid \
		--exec $DAEMON -- $DAEMON_OPTS || true
	echo "$NAME."
	;;
  stop)
	echo -n "Stopping $DESC: "
	start-stop-daemon --stop --quiet --pidfile /var/run/nginx/$NAME.pid \
		--exec $DAEMON || true
	echo "$NAME."
	;;
  restart|force-reload)
	echo -n "Restarting $DESC: "
	start-stop-daemon --stop --quiet --pidfile \
		/var/run/nginx/$NAME.pid --exec $DAEMON || true
	sleep 1
	start-stop-daemon --start --quiet --pidfile \
		/var/run/nginx/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
	echo "$NAME."
	;;
  reload)
	  echo -n "Reloading $DESC configuration: "
	  start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/nginx/$NAME.pid \
		  --exec $DAEMON || true
	  echo "$NAME."
	  ;;
  status)
	  status_of_proc -p /var/run/nginx/$NAME.pid "$DAEMON" nginx && exit 0 || exit $?
	  ;;
  *)
	N=/etc/init.d/$NAME
	echo "Usage: $N {start|stop|restart|reload|force-reload|status}" >&2
	exit 1
	;;
esac

exit 0


Den Apache sollte mit
/etc/init.d/apache2 stop
angehalten und nginx mit
/usr/local/nginx/sbin/nginx
gestartet werden. Läuft alles, ist das Startscript ist noch ausführbar zu machen, und der Apache in den einzelnen Runleveln durch nginx zu ersetzen:
chmod +x /etc/init.d/nginx
update-rc.d -f apache2 remove
update-rc.d -f nginx defaults



zurück zu Server
CategoryServer
There are no comments on this page.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki