PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nginx + PHP5 + VHOST unter Debian GNU/Linux 6.0


D@rk-€vil™
15.04.2012, 17:29
Dieses How-To habe ich von Nginx + PHP5 unter Debian GNU/Linux 6.0 "Squeeze" Howto — Asconix Systems - IT Management, Web & Mobile Development (http://www.asconix.com/howtos/debian/nginx-php-postgresql-debian-howto) gefunden, alledingst habe ich es zu der nginx 1.1.9 angepasst.
Desweiteren habe ich in den How-To eine Vhost Konfiguration hinzugefügt.

Nun zum How-To

Installation von benötigter Software

Da wir die aktuellste Version von Nginx installieren wollen, werden ich im Folgenden die Sourcen des Webservers kompilieren (das Debian Repository enthält lediglich die veraltete Version 0.7.67). Dazu benötigen wir zunächst eine entsprechende Entwicklungsumgebung, die alle benötigten Werkzeuge, wie die Compiler-Suite GCC und die verwendeten Bibliotheken enthält. Diese installieren wir mittels:



aptitude install build-essential libpcre3-dev libssl-dev libbz2-devVorbereitungen

Zunächst einmal erstellen wir den Systembenutzer und die gleichnamige Gruppe nginx:



groupadd nginx
useradd -g nginx nginxInstallation von Nginx

Nachdem wir eine entsprechende Build-Umgebung installiert haben, laden wir das Quellcode-Archiv des Projekts herunter und entpacken es. Dabei verwenden wir die aktuelle Version 1.1.9:

wget http://nginx.org/download/nginx-1.5.0.tar.gz -P /usr/local/srccd /usr/local/src
tar xzvf nginx-1.5.0.tar.gzrm nginx-1.5.0.tar.gzAnmerkung: da die Entwicklung des HTTP-Servers Nginx sehr schnell voranschreitet, empfiehlt es sich stets, die zum Zeitpunkt der Installation aktuelle Version zu verwenden!
Nun kompilieren wir Nginx mittels:


cd nginx-1.5.0
./configure --prefix=/var/www --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log \ --error-log-path=/var/log/nginx/error.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx \ --with-debug --with-http_ssl_module --with-http_dav_module --with-http_stub_status_module --http-client-body-temp-path=/var/lib/nginx/body/ \ --http-proxy-temp-path=/var/lib/nginx/proxy/ --http-fastcgi-temp-path=/var/lib/nginx/fastcgi/ --http-uwsgi-temp-path=/var/lib/nginx/uwsgi/ \ --http-scgi-temp-path=/var/lib/nginx/scgi/ --with-http_flv_module --with-http_gzip_static_moduleAnmerkung: ich bevorzuge an dieser Stelle die einheitliche Integration von Nginx in das Debian Dateisystem-Schema, statt auf lokale Verzeichnisse, wie /usr/local oder /opt auszuweichen. Dem Leser bleibt die Wahl überlassen, diesem Schema zu folgen.
Das System bestätigt den obigen Aufruf des Configure-Skripts mittels:


Configuration summary + using system PCRE library + using system OpenSSL library + md5: using OpenSSL library + sha1: using OpenSSL library + using system zlib library nginx path prefix: "/var/www" nginx binary file: "/usr/sbin/nginx" nginx configuration prefix: "/etc/nginx" nginx configuration file: "/etc/nginx/nginx.conf" nginx pid file: "/var/run/nginx.pid" nginx error log file: "/var/log/nginx/error.log" nginx http access log file: "/var/log/nginx/access.log" nginx http client request body temporary files: "/var/lib/nginx/body/" nginx http proxy temporary files: "/var/lib/nginx/proxy/" nginx http fastcgi temporary files: "/var/lib/nginx/fastcgi/" nginx http uwsgi temporary files: "/var/lib/nginx/uwsgi/" nginx http scgi temporary files: "/var/lib/nginx/scgi/"Anschließend installieren wir Nginx:

make && make installNachbearbeiten

Aus Sicherheitsgründen sollte ein Webserver stets unter einer eigenen UID/GID betrieben werden und dessen Prozesse auf keinen Fall Root-Rechte besitzen! Daher haben wir bei der obigen Installation die beiden Konfigurations-Switches --user und --group dementsprechend auf die eindeutige UID/GID nginx gesetzt. Nun setzen wir die Benutzer- und die Gruppenzugehörigkeit des DocumentRoot- und des Logverzeichnisses von Nginx fest:


chown -R nginx.nginx /var/www /var/log/nginxZuletzt erstellen wir ein lokales Arbeitsverzeichnis, das von Nginx benötigt wird:

mkdir /var/lib/nginxchown -R nginx.nginx /var/lib/nginxKonfiguration von Nginx

Der Webserver Nginx verwendet in unserem Fall die Konfigurationsdatei /etc/nginx/nginx.conf. Nginx kommt soweit vorkonfiguriert aus, dass wir wenig daran ändern müssen. Zum einen starten wir den Nginx Webserver als Benutzer nginx, indem wir diesen in der ersten Zeile der Konfigurationsdatei festlegen:


user nginx;Durch die Konfigurationsoption --prefix (s.o.) haben wir zudem festgelegt, dass sich das DocumentRoot-Verzeichnis sich in /var/www befindet. Daher ersetzen wir das DocumentRoot-Verzeichnis (ca. Zeile 44):

root htmldurch

root /var/wwwBei der Installation von Nginx wurde eine entsprechende Test-Index-Datei /var/www/html/index.html angelegt. Wir verschieben diese in das Verzeichnis /var/www und löschen das ursprüngliche Dokumentenverzeichnis:

mv /var/www/html/index.html /var/www/rm -rf /var/www/htmlStarten des Webservers Nginx

Nachdem wir den Webserver installiert haben, können wir diesen zunächst manuell starten mittels:


/usr/sbin/nginxDaraufhin sollten wir die obige HTML-Datei als Feedback unter http://127.0.0.1 erhalten.
Im Verlauf dieses Howtos werde ich ein Init-Skript vorstellen, mit dessen Hilfe der Nginx Webserver automatisch gestartet und gestoppt werden kann (s.u.).
Erweiterung der Nginx-Installation um PHP (optional)

In vielen Fällen wird Nginx als Frontend-Server für eine typische PHP5- und MySQL- bzw. PostgreSQL-Anwendung benötigt. Nginx bringt von sich aus jedoch keine entsprechenden Module für PHP-Anwendungen mit (ähnlich wie bei Lighttpd). Von daher werde ich nun einen Weg aufzeigen, wie PHP5 in Form von FastCGI in Nginx eingebunden werden kann.
Zunächst installieren wir die PHP5-Umgebung aus dem Debian-Repository mittels:


aptitude install php5-cgi php5-cliAnschließend löschen wir die Standard Index-Seite:

rm /var/www/index.html... und erstellen ein einfaches PHP-Skript unter /var/www/index.php, das den folgenden Einzeiler enthält:

<?php
phpinfo();
?>Da wir PHP-Skripte in Form von FastCGI ausführen wollen, entkommentieren wir den entsprechenden Konfigurationsteil in der Datei /etc/nginx/nginx.conf (ca. Zeile 65) und passen diesen an. Wir leiten hierbei alle PHP-Skripte an einen FastCGI Server weiter:

location ~ \.php$ { root /var/www; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; }Damit der Webserver die Index-Datei index.php entsprechend interpretieren kann, ersetzen wir in der Hauptkobfigurationsdatei /etc/nginx/nginx.conf die Zeile 45:

index index.html index.htm;durch

index index.html index.htm index.php;Anschließend starten wir manuell den FastCGI-Daemon:

/usr/bin/php5-cgi -q -b 127.0.0.1:9000... und den Webserver Nginx in einem anderen Terminal mittels:

killall nginx && /usr/sbin/nginxNun sollte das obige PHP-Skript beim Aufruf der URL Object not found! (http://localhost/index.php) automatisch ausgeführt werden und wir einen entsprechenden Status über unsere PHP5-Umgebung erhalten.
Start und Stop via Init-Skript

Ist der Leser bis hierhin dem Howto gefolgt, kann dieser nun sowohl den Webserver Nginx als auch den FastCGI-Daemon lediglich manuell starten und stoppen. Im Produktivbetrieb benötigen wir entsprechende Init-Skripte, die diese Aufgaben kontrolliert übernehmen. Von daher werde ich im Folgenden jeweils ein solches Skript pro Dienst vorstellen.
Nginx

Zunächst erzeugen wir das Init-Skript /etc/init.d/nginx, mit dessen Hilfe wir den Webserver Nginx kontrollieren können:


#! /bin/sh ### BEGIN INIT INFO # Provides: nginx # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # 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/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 case "$1" in start) echo -n "Starting $DESC: " start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON -- $DAEMON_OPTS || true echo "$NAME." ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON || true echo "$NAME." ;; restart|force-reload) echo -n "Restarting $DESC: " start-stop-daemon --stop --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON || true sleep 1 start-stop-daemon --start --quiet --pidfile \ /var/run/$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/$NAME.pid \ --exec $DAEMON || true echo "$NAME." ;; configtest) echo -n "Testing $DESC configuration: " if nginx -t > /dev/null 2>&1 then echo "$NAME." else exit $? fi ;; *) echo "Usage: $NAME {start|stop|restart|reload|force-reload|configtest}" >&2 exit 1 ;; esac exit 0Anschließend machen wir das neue Init-Skript ausführbar:

chmod +x /etc/init.d/nginxDamit der Webserver Nginx bei jedem Rechnerstart mitgestartet wird, fügen das obige Skript dem Default-Init-Level hinzu:

update-rc.d nginx defaultsAnschließend stoppen wir eine eventuell noch laufende Nginx Instanz:

killall nginxVon nun an können wir das Init-Skript zum Starten und Stoppen von Nginx nutzen:
Start des Webservers:

/etc/init.d/nginx startStop des Webservers:

/etc/init.d/nginx stopFast-CGI

Damit der Webserver Nginx alle PHP-Anfragen entsprechend an den FastCGI-Daemon delegieren kann, muss auch dieser gestartet sein. In unserem Fall verwenden wir den eigenständigen FastCGI Daemon spawn-fcgi. Während dieser früher ein Teil des alternativen Webservers Lighttpd war, wird dieser nun als eigenständiges Projekt geführt. Daher laden wir zunächst den Quellcode von spawn-fcgi in der aktuellen Version 1.6.3 (Stand: Februar 2011) herunter, entpacken das Archiv und kompilieren und installieren spawn-fcgi mittels (Bitte selbst nachschauen, welche Version die aktuelle ist.):


wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz -P /usr/local/srccd /usr/local/srctar xzvf spawn-fcgi-1.6.3.tar.gzrm spawn-fcgi-1.6.3.tar.gzcd spawn-fcgi-1.6.3./configuremake && make installAnschließend erstellen wir ein einfaches Skript /usr/local/bin/php-fastcgi:

#!/bin/sh /usr/local/bin/spawn-fcgi -F 1 -C 1 -a 127.0.0.1 -p 9000 -u nginx -g nginx -f "/usr/bin/php5-cgi -c /etc/php5/cgi/php.ini" -P /var/run/fastcgi-php.pid... und machen dieses ausführbar:

chmod a+x /usr/local/bin/php-fastcgiDamit spawn-fcgi automatisch nach jedem Rechnerstart mitgestartet wird, erstellen wir ein entsprechendes Init-Skript /etc/init.d/fastcgi:

#!/bin/sh ### BEGIN INIT INFO # Provides: fastcgi # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts the FastCGI server # Description: starts spawn-fcgi using start-stop-daemon ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/local/bin/php-fastcgi test -x $DAEMON || exit 0 set -e RETVAL=0 case "$1" in start) $DAEMON RETVAL=$? ;; stop) killall -9 php5-cgi RETVAL=$? ;; restart) killall -9 php5-cgi $DAEMON RETVAL=$? ;; *) echo "Usage: php-fastcgi {start|stop|restart}" exit 1 ;; esac exit $RETVALAuch dieses Init-Skript machen wir ausführbar:

chmod a+x /etc/init.d/fastcgi... und fügen es dem Default-Init-Level hinzu:

update-rc.d fastcgi defaultsPerformance-Tuning des Nginx- und PHP5-Setups

Da wir ein sehr performantes Setup anstreben, möchte ich in diesem Abschnitt einige Tricks und Kniffe zeigen, wie unser Webserver noch weiter beschleunigt werden kann.
Zunächst einmal aktivieren wir die gzip-Kompression, so dass alle statischen HTML- und CSS-Dateien, sowie alle Bilder komprimiert übertragen werden. Dazu fügen wir der Hauptkonfiguration /etc/nginx/nginx.conf die folgenden Definitionen hinzu (ca. Zeile 33):


# Compression gzip on; gzip_buffers 16 8k; gzip_comp_level 9; gzip_http_version 1.1; gzip_min_length 10; gzip_types text/plain text/css image/png image/gif image/jpeg application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon; gzip_vary on; gzip_proxied any; gzip_disable "MSIE [1-6]\.";Anschließend starten wir den Webserver neu mittels:

/etc/init.d/nginx restartInstallation eines relationalen Datenbanksystems (optional)

In vielen Fällen wird neben einem Webserver mit PHP5-Unterstützung ein relationales Datenbanksystem benötigt. Da einige Projekte MySQL verwenden, während andere auf PostgreSQL basieren, möchte ich im Folgenden die Installation und Konfiguration von beiden Datenbanksystemen erläutern.
MySQL

In den meisten Fällen verwenden insbesondere PHP5-Projekte MySQL als Datenbankbankend. Daher installieren wir zunächst MySQL auf unserem Debian GNU/Linux 6.0 “Squeeze” System mittels:


aptitude install mysql-serverDamit eine PHP5-Applikation auf unsere MySQL-Datenbank zugreifen kann, benötigen wir zudem die entsprechende PHP-Bibliothek:

PostgreSQL

Sollten wir PostgreSQL für eine PHP5-Webanwendung benötigen, gestaltet sich die Installation genauso einfach:


aptitude install postgresqlDamit eine PHP5-Anwendung auf die Datenbank zugreifen kann, benötigen wir zudem die entsprechende PHP-Bibliothek:

aptitude install php5-pgsqlEinrichten des Vhost unter Nginx

Nach der ganzen installiation legen wir uns ein Vhost eintrag an.


Als erstes erstellen wir uns erstmal zwei Ordner mit zb.:


mkdir /home/your_sitemkdir /home/your_site/htmlNun legen wir unsere Config Datei an für unseren Vhost:

vim /etc/nginx/sites-available/your_site.confund fügen folgendes in die Config datei:

server
{
server_name .your_site;

access_log /var/log/nginx/your_site.access.log;

error_log /var/log/nginx/your_site.error.log;

root /home/your_site/html;

index index.php index.html index.htm;

# use fastcgi for all php files
location ~ \.php$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

# deny access to apache .htaccess files
location ~ /\.ht
{
deny all;
}
}

und speichern das ganze dann ab.

Nun legen wir eine verknüpfung an und zwar mit folgenden Befehl:

ln -s /etc/nginx/sites-available/your_site.conf /etc/nginx/sites-enabled/your_site.confNun Starten wir den nginx neu und zwar mit:

/etc/init.d/nginx restartJetzt ist nun euer nginx einsatzbereit....

PS: BEI DEN BEFEHLEN BITTE DAS CD (http://www.netvision-technik.de/forum/glossary.php?do=viewglossary&term=24) KLEIN SCHREIBEN!

Lg

SP4C3
15.04.2012, 18:01
bitte unter debian statt make install das tool checkinstall verwenden...

D@rk-€vil™
22.05.2013, 07:44
Ich habe mal den Thread auf den neusten Stand gebracht, da die neure Version nähmlich die 1.5.0 ist.

Lg

ike
22.05.2013, 10:16
1.4.1 ist die letzte stable und auf einem Produktivsystem sollte diese auch genutzt werden.

Lex
22.05.2013, 10:42
chown -R nginx.nginx /var/www /var/log/nginxDa hast du dich glaube ich vertippt


chown -R nginx:nginx /var/www /var/log/nginx

SP4C3
22.05.2013, 19:07
@lex:
je nachdem wie die regeln für usernamen auf dem system aussehen, klappt auch der . als trenner.
Im Debian default z.B.