[HowTo] Webserver mit PHP-Unterstützung auf dem FreeNAS

Status
Not open for further replies.

Heliophob

Dabbler
Joined
Oct 14, 2016
Messages
12
Hallo zusammen,

da ich keine fertige (deutsche) Anleitung gefunden habe wie man das macht, habe ich mich durch die englischen Anleitungen gekämpft und versuche hier für die Nachwelt die Stolpersteine festzuhalten.

Als Grundlage dienten mir die beiden folgenden Anleitungen und natürlich Google:
https://www.digitalocean.com/commun...ginx-mysql-and-php-femp-stack-on-freebsd-10-1
https://doc.freenas.org/9.3/freenas_jails.html

Jail erstellen

Der benötigte Webserver wird innerhalb einer Jail installiert (eine Art Virtual Machine). Diese Jail ist ein in sich geschlossenes System und startet dann bei jedem Reboot automatisch mit. Auch der darin enthaltene Webserver startet später von selber.

Klickt im Webinterface vom FreeNAS auf "Jails" und dann auf "Add Jail".
Im darauf folgendem Fenster klickt ihr auf "Erweiterter Modus". Darin gebt ihr eurer Jail einen Namen und stellt die IP unter der später euer Webserver erreichbar sein soll. In meinem Fall nenne ich das Kind beim Namen: "Webserver" und dieser soll unter 192.168.1.200 erreichbar sein. So sieht es dann bei mir aus:
jail 1.png


mit einem Klick auf "OK" wird dann die Jail erstellt. Dieser Vorgang dauerte bei mir etwa 10 Minuten und ist wohl stark von der Internetverbindung abhängig. Unten wird euch aber ein Prozessbalken angezeigt.

jail 2.png


Im Anschluss kann man über den Punkt "Jails" --> "View Jails" --> Seine Jail auswählen und dann unten auf die Jail-Eigene Shell klicken.
jail 3 Shell.png

Zugriff per SSH vorbereiten
Ich möchte später mit SSH auf diese Jail zugreifen und darin dann auch SuperUser-Rechte haben. Zunächst muss dafür ein neuer User erstellt werden. Warum auch immer ist ein SSH-Zugriff mit root nicht zulässig.

User erstellen:
adduser

Nach der Eingabe eines Benutzernamens und den vollen Namen, muss dieser User noch der Gruppe "Wheel" zugeordnet werden. Dies ermöglich dem User später sich zum SuperUser zu "transformieren": Alle weiteren Angaben können auf den Defaultwerten (steht in eckigen Klammern) bleiben. Es reicht also ansonsten immer nur mit Enter zu bestätigen. Bei der Eingabe des Passwortes wird dieses Linux-typisch nicht angezeigt (auch nicht mit *sternchen*). Ganz zum Schluss bekommt man das ganze nochmal als Kontroll-Übersicht (wo das Passwort dann als Sternchen dargestellt ist) welches mal mit "Y" bestätigen muss.
Code:
													
Username: HansWurst															
Full name: Hans Wurst														 
Uid (Leave empty for default):												
Login group [HansWurst]: wheel												
Login group is wheel. Invite HansWurst into other groups? []:				 
Login class [default]:														
Shell (sh csh tcsh git-shell nologin) [sh]:									
Home directory [/home/HansWurst]:											 
Home directory permissions (Leave empty for default):						 
Use password-based authentication? [yes]:									 
Use an empty password? (yes/no) [no]:										 
Use a random password? (yes/no) [no]:										 
Enter password:																
Enter password again:														 
Lock out the account after creation? [no]:			 
Username   : HansWurst														
Password   : *****															
Full Name  : Hans Wurst														
Uid		: 1002															 
Class	  :																	
Groups	 : wheel															
Home	   : /home/HansWurst													
Home Mode  :																	
Shell	  : /bin/sh															
Locked	 : no																
OK? (yes/no):	


Passwort für root festlegen
Als nächstes ist es erforderlich, dem User "root" ein Passwort zu geben.
passwd root

SSH Starten und benutzen
Um den SSH-Dienst zu starten gebt ihr nun ein:
service sshd start

Ab jetzt sollte (hoffentlich) ein SSH-Zugriff möglich sein. Da nicht alle Befehle innerhalb des Shell-Fensters klappen (Strg-Kombinationen), nutze ich ab jetzt den Zugang über SSH. In meinem Fall ist das Betriebssystem ohnehin Linux und daher öffne ich das Terminal [Super+T]. Bei Windows-Rechnern kann man ab jetzt mit Putty weiter machen.

Für den Zugriff mit dem Terminal logge ich mich jetzt mit dem eben erstellten User ein:
ssh HansWurst@192.168.1.200
Anschließened noch das Passwort und ihr werdet freundlich begrüßt:
Welcome to FreeBSD!

Um jetzt root-Privilegien zu haben gebt ihr den Befehl su ein [ACHTUNG: Dieser ist NICHT zu verwechseln mit sudo ]. Der Befehl su ist nur einmal alleine erforderlich. Nach der Passworteingabe ist man dann SuperUser bis zum logout mit exit. Ob die Eingabe von su erfolgreich war, wird sofort ersichtlich durch die Darstellung von root@webserver:~#

Nano als Texteditor installieren
um es bei der Konfioguration von Dateien etwas leichter zu haben, installiere ich mir das Programm "nano"
pkg install nano
Nach der Eingabe nochmal mit "Y" bestätigen.
Der Download von nano erfolgt automatisch

SSH automatisch starten
Damit bei reboot der SSH-Dienst von selber startet, muss noch ein Eintrag in der rc.conf geändert werden. Zum bearbeiten der Datei öffne ich diese mit nano
nano /etc/rc.conf

Darin enthalten findet Ihr den Eintrag
Code:
sshd_enable="NO"


der dann geändert wird auf
Code:
sshd_enable="YES"


Die Datei wird gespeichert mit Strg-o (Buchstabe "o" nicht Ziffer "0")
Den Dateinamen dann mit Enter bestätigen.
Anschließend kann man nano mit Strg-x wieder verlassen.

Installation vom Webserver nginx und PHP
Mit dem folgendem Befehl wird der Webserver und php installiert. Dabei werden zwei Mal Eingaben von "Y" erforderlich sein:
pkg install nginx php56
Der Download von Nginx und php erfolgt auch hier automatisch

Sobald die Installation abgeschlossen ist, ist der folgende Befehl nötig:
rehash

Damit auch diese Dienste automatisch starten, ist wieder ein Eintrag in der rc.conf notwenig. Also öffne ich wieder die Datei mit Nano:
nano /etc/rc.conf

Ich erweitere die Datei am Ende um die beiden folgenden Zeilen:
Code:
nginx_enable="YES"
php_fpm_enable="YES"


PHP konfigurieren:
Nun muss die Datei php-fpm.conf bearbeitet werden. Auch hier arbeite ich natürlich wieder mit nano:
nano /usr/local/etc/php-fpm.conf

Darin geht ihr zur Position...
Code:
listen = 127.0.0.1:9000


...und ersetzt diese durch:
Code:
listen = /var/run/php-fpm.sock


Dann sucht ihr nach der Position:
Code:
;listen.owner = www
;listen.group = www
;listen.mode = 0660

und entfernt die Semikolons davor (Semikolon davor = Kommentar/unwirksam). Es sieht dann so aus:
Code:
listen.owner = www
listen.group = www
listen.mode = 0660


Die Datei php-fpm.conf dann wieder mit Strg-o speichern und nano mit Strg-x schließen

Nun brauchen wir noch eine php.ini. Diese kann zunächst aus der Vorlage kopiert werden:
Wechselt das Verzeichnis mit
cd /usr/local/etc
und kopiert aus der Vorlage mit:
cp php.ini-production php.ini

Die php.ini muss nun wieder mit nano bearbeitet werden.
nano php.ini

Darin sucht ihr den Eintrag...
Code:
cgi.fix_pathinfo=1


...entfernt auch hier das Semikolon davor und stellt den Eintrag auf "0"
wieder mit Strg-o speichern und nano mit Strg-x schließen

PHP starten
Die Konfiguration von PHP ist damit abgeschlossen und php kann gestartet werden mit:
service php-fpm start

Konfiguration vom Webserver "Nginx"
Damit dieser konfiguriert werden kann, muss er erst gestartet werden. Das geht mit dem Befehl:
service nginx start

Anschließend wechselt das Verzeichnis...
cd /usr/local/etc/nginx

Öffnet die Datei nginx.conf mit nano:
nano nginx.conf

Den Inhalt könnt ihr nun komplett ersetzten zu:
Code:
load_module /usr/local/libexec/nginx/ngx_mail_module.so;
load_module /usr/local/libexec/nginx/ngx_stream_module.so;

user  www;
worker_processes  2;
error_log /var/log/nginx/error.log info;

events {
	worker_connections  1024;
}

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

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

	sendfile		on;
	keepalive_timeout  65;

	server {
		listen	   80;
		server_name  192.168.1.200;
		root /usr/local/www/nginx;
		index index.php index.html index.htm;

		location / {
			try_files $uri $uri/ =404;
		}

		error_page	  500 502 503 504  /50x.html;
		location = /50x.html {
			root /usr/local/www/nginx-dist;
		}

		location ~ \.php$ {
				try_files $uri =404;
				fastcgi_split_path_info ^(.+\.php)(/.+)$;
				fastcgi_pass unix:/var/run/php-fpm.sock;
				fastcgi_index index.php;
				fastcgi_param SCRIPT_FILENAME $request_filename;
				include fastcgi_params;
		}
	}
}


Bei "server_name" müsst ihr natürlich die IP bzw. den Namen euren Servers angeben.
wieder mit Strg-o speichern und nano mit Strg-x schließen

Verzeichnis für die Log-Daten erstellen:
mkdir -p /var/log/nginx

Leer Logdateien erstellen:
sudo touch /var/log/nginx/access.log
sudo touch /var/log/nginx/error.log


Da es sich bei dem Documentroot um eine symbolische Verlinkung handelt, löschen wird das Verzeichnis und erstellen es anschließend neu:
sudo rm /usr/local/www/nginx
sudo mkdir /usr/local/www/nginx


Die neue Konfiguration kann jetzt mit der Eingabe von...
nginx -t
...auf Syntaxfehler geprüft werden. Die Ausgabe sollte wie folgt sein:
Code:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful


Anschließend nginx neu starten mit:
service nginx restart

Zur Prüfung ob alles klappt, erstellt ihr eine index.php im Dokumentroot mit nano
nano /usr/local/www/nginx/index.php
und gebt dieser den Inhalt:
Code:
<?php
phpinfo();
?>

wieder mit Strg-o speichern und nano mit Strg-x schließen

Wenn alles geklappt hat, kann man nun mit einem Browser auf den neuen Webserver zugreifen (also in meinem Fall 192.168.1.200) und seht die Ausgabe von phpinfo().

Einfacher Zugriff auf Documentroot
SSH vom FreeNAS muss dafür eingeschaltet und konfiguriert sein!

Ich starte eine sftp-Verbindung mit FileZilla und gebe bei der IP die IP vom FreeNAS ein (NICHT vom Webserver!). Beim Port gebe ich 22 an und die root-Zugangsdaten vom FreeNAS. Im Anschluss finde ich das Documentroot hier:
/mnt/[Name vom FreeNAS-Pool]/jails/[Name des Jails (also Webserver)]/usr/local/www/nginx

Dort ist dann auch die eben erstellte Datei index.php zu finden. Aus Sicherheitsgründen sollte diese nach erfolgreichem Test wieder entfernt werden!

Beste Grüße
Heliophob
 
Last edited:

Heliophob

Dabbler
Joined
Oct 14, 2016
Messages
12
So jetzt im Anschluss mal noch eine Frage an die Vollprofis hier:
Kann ich eine symbolische Verlinkung vom Dokumentroot zu einem der vorhandenen Volumes des Freenas erstellen? Also außerhalb der Jail?

Wenn ich unter FreeNAS --> Freigaben Eine Freigabe erstelle zu...
/mnt/freenaspool/jails/Webserver/usr/local/www/nginx

habe ich dort keine Schreibrechte. Soweit ich weiß, hat diese Schreibrechte nur root.
Wenn ich also die Rechte rekursiv beim Jail auf Schreibrechte der Gruppe ändere, dann sind diese "zu offen" weshalb die Dienste der Jail nicht mehr starten.

any idea?

Besten Dank !
 
Last edited:

Ericloewe

Server Wrangler
Moderator
Joined
Feb 15, 2014
Messages
20,194
Kann ich eine symbolische Verlinkung vom Dokumentroot zu einem der vorhandenen Volumes des Freenas erstellen?
Wofür denn? Jails können so konfiguriert werden, dass sie Zugriff auf bestimmte Datasets haben.
 

Heliophob

Dabbler
Joined
Oct 14, 2016
Messages
12
Danke, das hatte ich zwar gesehen aber mir ist due richtige Konfiguration nicht klar damit es auch mit den Rechten klappt. Kannst Du mir ein Beispiel posten?
 

Ericloewe

Server Wrangler
Moderator
Joined
Feb 15, 2014
Messages
20,194

Heliophob

Dabbler
Joined
Oct 14, 2016
Messages
12
Da habe ich eindeutig zu kompliziert gedacht - geht natürlich auf Anhieb ;):D

Danke
 

TiboTake

Dabbler
Joined
Apr 13, 2016
Messages
42
Wenn ich jetzt mal ganz blöde fragen kann, mit den settings kann ich mir nun ein phpbb board oder ne php basierende page über freeenas erstellen die auch von aussen per weiterleitung erreichbar wäre?
 

Heliophob

Dabbler
Joined
Oct 14, 2016
Messages
12
Hallo,

IMHO benötigt PHPbb einen MySQL-Server der natürlich noch zudem installiert und konfiguriert werden muss. Ganz oben im ersten Link ist aber in englisch die Vorgensweise erklärt.

Beste Grüße
 
Status
Not open for further replies.
Top