nginx, passenger und debian

Ich selbst bevorzuge mitlerweile nginx als Webserver wenn es darum geht etwas im Netz verfügbar zu machen. Aber leider ist die aktuelle Version unter Debian Squeeze mit 0.7.67 nicht gerade aktuell und es gibt gerade in den neueren Versionen Funktionen welche man gerne nutzen würde.

Einen Weg bietet es sich jetzt an beim dotdeb Projekt zu schauen und zu sehen das es hier die aktuelle Stable Version 1.2.7 gibt. Es gibt nginx sehr spartanisch oder mit einigen Patches und eine Auflistung bringt folgendes zutage.

 nginx-dbg - Debugging symbols for nginx
 nginx - small, powerful, scalable web/proxy server
 nginx-common - small, powerful, scalable web/proxy server - common files
 nginx-doc - small, powerful, scalable web/proxy server - documentation
 nginx-extras - nginx web/proxy server (extended version)
 nginx-extras-dbg - nginx web/proxy server (extended version) - debugging symbols
 nginx-full - nginx web/proxy server (standard version)
 nginx-full-dbg - nginx web/proxy server (standard version) - debugging symbols
 nginx-light - nginx web/proxy server (basic version)
 nginx-light-dbg - nginx web/proxy server (basic version) - debugging symbols
 nginx-naxsi - nginx web/proxy server (version with naxsi)
 nginx-naxsi-dbg - nginx web/proxy server (version with naxsi) - debugging symbols
 nginx-naxsi-ui - nginx web/proxy server - naxsi configuration front-end
 nginx-passenger - nginx web/proxy server (Passenger version)
 nginx-passenger-dbg - nginx web/proxy server (Passenger version) - debugging symbols

Schaut man sich jetzt Beispielhaft an, was Guillaume Plessis der Maintainer von dotdeb alles eingebunden hat in die Packete und welche zusätzlichen Patche eingespielt wurden, kann man sich freuen und einfach loslegen oder noch einmal darüber nachdenken ob man das wirklich braucht. Ziel soll es ja sein, einen nginx mit passenger auszustatten und das in möglichst aktueller Version.

 Description: nginx web/proxy server (Passenger version)
 Nginx ("engine X") is a high-performance web and reverse proxy server
 created by Igor Sysoev. It can be used both as a standalone web server
 and as a proxy to reduce the load on back-end HTTP or mail servers.
 .
 This package provides a version of nginx with the standard modules, plus
 extra features and modules such as the Passenger module, which allows
 running Ruby on Rails applications.
 .
 STANDARD HTTP MODULES: Core, Access, Auth Basic, Auto Index, Browser,
 Charset, Empty GIF, FastCGI, Geo, Gzip, Headers, Index, Limit Requests,
 Limit Zone, Log, Map, Memcached, Proxy, Referer, Rewrite, SCGI,
 Split Clients, SSI, Upstream, User ID, UWSGI.
 .
 OPTIONAL HTTP MODULES: Addition, Debug, GeoIP, Gzip Precompression,
 HTTP Sub, Image Filter, IPv6, Real IP, Stub Status, WebDAV, XSLT.
 .
 MAIL MODULES: Mail Core, IMAP, POP3, SMTP, SSL.
 .
 THIRD PARTY MODULES: Echo, Upstream Fair Queue, Passenger.
 .
 MODULES ADDED BY DOTDEB : File AIO, Secure link, Auth PAM, Headers more,
 Syslog, Cache purge, Pinba, HTTP substitution filter

Hat man keine weitere Software im Einsatz, welche auch von dotdeb
angeboten wird, ist dies sicherlich eine Option. Installatieren und
glücklich sein.

Jetzt bevorzuge ich jedoch bei MySQL die von Percona bereitgestellten Builds. Versucht man diese beiden Repositories parallel zu betreiben stellt man fest, hier gibt es konflikte bei den Bibliotheken bzw. libs. Also ist der gleichzeitige nutzen beider Repositories nicht ohne Probleme möglich.

Eine andere Möglichkeit ist das von den nginx Entwicklern bereitgestellte Repositorie zu nutzen. Hier bekommt man vanilla nginx angeboten und weiter nichts. Das ganze macht also keinerlei Probleme in kombination mit Percona. Es gibt also jetzt auf dem System Persona MySQL und nginx, jedoch kein passenger um z.B. ruby on rails Applicationen auf dem Server anzubieten.

Bisher habe ich keine andere Möglichkeit gefunden das ganze sauber und nachvollziehbar zu installieren, als hier selbst den Compiler anzuwerfen. Sicherlich könnte man hier auch Pakete selber bauen, aber das war mir bisher immer zu umständlich.

Ich will zwar eigentlich vermeiden auf einem Produktiv System etwas zu kompilieren, aber hier gilt es wie immer den richtigen Weg für einen selbst zu finden.

Als Basis will ich das aktuelle Ruby 1.9.2 unter Debian nutzen, welches benötigt wird. Sicherlich könnte jetzt auch noch mittels rbenv oder rvm eine gekapselte Umgebung geschaffen werden, aber für mich ist es in diesem Fall nicht notwendig.

Als erstes muss sichergestellt werden, das es es nur Ruby 1.9.2 aus den Debian Quellen auf dem System gibt.

$ ruby -v
-bash: ruby: command not found
$ apt-get install ruby1.9.2
$ ruby -v
-bash: ruby: command not found
$ ruby1.9.1 -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]

Unter Ubuntu kann jetzt mittels update-alternatives --config ruby gearbeitet werden, unter Debian bleibt nichts anderes als händisches eingreifen.

$ cd /usr/bin && ln -sf ruby1.9.1 ruby && ln -sf gem1.9.1 gem && ln -sf
erb1.9.1 erb && ln -sf irb1.9.1 irb && ln -sf rake1.9.1 rake && ln -sf
rdoc1.9.1 rdoc && ln -sf testrb1.9.1 testrb

Jetzt gibt es ein aktuelles Ruby unter Debian, welches recht genutzt werden kann um Passenger zu installieren. Aber immer der reihe nach. Als erstes wird jetzt die Build Umgebung benötigt.

$ apt-get install -y libcurl4-openssl-dev libssl-dev zlib1g-dev libpcre3
libpcre3-dev libgeoip-dev

Dann wollen wir in /usr/local/src die Sourcen von nginx haben

$ cd /usr/local/src/ && wget http://nginx.org/download/nginx-1.2.7.tar.gz && tar xzvf nginx-1.2.7.tar.gz && rm nginx-1.2.7.tar.gz

Mit den vorliegenden Sourcen kann jetzt weitergearbeitet werden, wobei darauf zu achten ist, das es sich um das aktuelle Stable Release handelt welches dann auch mittels apt-get installiert werden würde. Darauf folgend wird jetzt Passenger installiert und nginx mit Passenger Modul kompiliert.

$ gem install passenger
$ /var/lib/gems/1.9.1/bin/passenger-install-nginx-module

In der Menügesteuerten Installation ist Option 2 ( Advanced Installation ) zu wählen, als Source dann das nginx Source Verzeichnis (/usr/local/src/nginx-1.2.7), als Prefix /usr und folgende Argumente sollten zum kompilieren übergeben werden.

--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid
--http-proxy-temp-path=/var/lib/nginx/proxy
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi
--http-client-body-temp-path=/var/lib/nginx/body --with-http_ssl_module
--with-http_realip_module --with-http_geoip_module
--with-http_sub_module --with-http_dav_module --with-http_flv_module
--with-http_gzip_static_module --with-http_stub_status_module
--with-mail --with-mail_ssl_module --with-ipv6 --with-debug

Nach dem kompilieren hat man jetzt einen nginx mit Passenger und den Einstellungen wie es unter Debian als default zu betrachten ist. Damit das System jetzt auch noch etwas davon mitbekommen, das wir einen http Server installiert haben, wird etwas getrickst.

$ cd /usr/sbin && mv nginx nginx-passenger
$ mv /etc/nginx /etc/nginx.passenger
$ apt-get install -y nginx
$ mv nginx nginx-debian
$ ln -s nginx-passenger nginx

Jetzt haben wir einen nginx Server mit Passenger und das System kann auch etwas damit anfangen. Als letztes bleibt jetzt noch in der nginx.conf Passenger zu aktivieren und in den entsprechenden vhost ebenfalls.

In die http definition von nginx muss folgendes Eingefügt werden

    passenger_root /var/lib/gems/1.9.1/gems/passenger-3.0.19;
    passenger_ruby /usr/bin/ruby1.9.1;

Im entsprechenden vhost reicht ein simples passenger_enabled on; und nach einem nginx neustart läuft alles wie erwartet. Zu beachten ist noch das im vhost das DocumetRoot auf das public Verzeichniss der Rails Applikation zeigen muss.

Show Comments