Mono bei Hostsharing: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
(initiale Version)
 
 
(5 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 24: Zeile 24:
Beispiel:
Beispiel:


<pre>
<syntaxhighlight lang=shell>
$ cd ~
cd ~
$ wget https://download.solidcharity.com/tarballs/tpokorra/mono/mono-6.8.0.105.bin.debian10.tar.gz
wget https://download.solidcharity.com/tarballs/tpokorra/mono/mono-6.8.0.105.bin.debian10.tar.gz
$ tar xzf mono-6.8.0.105.bin.debian10.tar.gz
 
$ ln -s mono-6.8.0.105 mono
echo "Prüfen der Hash Summe sollte OK zeigen:"
$ source mono/env.sh
echo "f2c27f11141f81a131b6417084c31ab3ae9d050aab8f13d75b406b377a7a1c670bdfc386f276317115e791af0ad34842 *mono-6.8.0.105.bin.debian10.tar.gz" | sha384sum --check
$ mono --version
 
tar xzf mono-6.8.0.105.bin.debian10.tar.gz
ln -s mono-6.8.0.105 mono
source mono/env.sh
mono --version
Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-3 Sun Dec 13 21:52:01 CET 2020)
Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-3 Sun Dec 13 21:52:01 CET 2020)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
Zeile 43: Zeile 47:
Suspend:      hybrid
Suspend:      hybrid
GC:            sgen (concurrent by default)
GC:            sgen (concurrent by default)
</pre>
</syntaxhighlight>


=== Beschreibung zur Erstellung des binären Pakets ===
=== Beschreibung zur Erstellung des binären Pakets ===
Zeile 56: Zeile 60:
Diese werden auf einem Build Server ausgeführt, und es werden die folgenden Schritte ausgeführt:
Diese werden auf einem Build Server ausgeführt, und es werden die folgenden Schritte ausgeführt:


* Es werden Namen der aktuell installierten Pakete auf dem Hostsharing Server heruntergeladen.
* Es werden die Namen der aktuell installierten Pakete auf dem Hostsharing Server heruntergeladen.
* Dann wird eine Liste angefertigt von Paketen, die wir lokal installieren wollen für Mono.
* Dann wird eine Liste angefertigt von Paketen, die wir lokal installieren wollen für Mono.
* Dann werden lokal die gewünschten Mono Pakete installiert.
* Dann werden lokal die gewünschten Mono Pakete installiert.
Zeile 71: Zeile 75:


index.aspx
index.aspx
<pre>
<syntaxhighlight lang=html>
<%@ Page Language="C#" %>
<%@ Page Language="C#" %>
<html xmlns="www.w3.org/1999/xhtml">
<html xmlns="www.w3.org/1999/xhtml">
Zeile 86: Zeile 90:
     </div>
     </div>
</body>
</body>
</pre>
</syntaxhighlight>


Um Kompilierfehler im Browser zu sehen, diese Datei anlegen:
Um Kompilierfehler im Browser zu sehen, diese Datei anlegen:


web.config
web.config
<pre>
<syntaxhighlight lang=html>
<configuration>
<configuration>
     <system.web>
     <system.web>
Zeile 97: Zeile 101:
     </system.web>
     </system.web>
</configuration>
</configuration>
</pre>
</syntaxhighlight>


Eigene IP Adresse herausfinden:
Eigene IP Adresse herausfinden:
$ ping -4 xyz00.hostsharing.net
<syntaxhighlight lang=shell>
 
ping -4 xyz00.hostsharing.net
Nun kann der Server gestartet werden:
</syntaxhighlight>
$ xsp4 --port=8080 --address=83.223.xx.yyy
Nun kann der Server mit dieser IP Adresse gestartet werden:
 
<syntaxhighlight lang=shell>
xsp4 --port=8080 --address=aa.bbb.cc.ddd
</syntaxhighlight>
Die Seite ist nun über http://xyz00.hostsharing.net:8080 erreichbar.
Die Seite ist nun über http://xyz00.hostsharing.net:8080 erreichbar.


Zeile 114: Zeile 120:


bin/start-mono.sh
bin/start-mono.sh
<pre>
<syntaxhighlight lang=shell>
#!/bin/bash
#!/bin/bash


Zeile 127: Zeile 133:
   > /dev/null 2>&1 &
   > /dev/null 2>&1 &
echo $! > $HOME/var/run/mono.pid
echo $! > $HOME/var/run/mono.pid
</pre>
</syntaxhighlight>


bin/stop-mono.sh
bin/stop-mono.sh
<pre>
<syntaxhighlight lang=shell>
#!/bin/bash
#!/bin/bash


kill -QUIT $( cat $HOME/var/run/mono.pid )
kill -QUIT $( cat $HOME/var/run/mono.pid )
</pre>
</syntaxhighlight>


.monitrc
.monitrc
<pre>
<syntaxhighlight lang=shell>
set daemon 60 with start delay 10
set daemon 60 with start delay 10
set logfile /home/pacs/xyz00/users/meinuser/var/log/monit.log
set logfile /home/pacs/xyz00/users/meinuser/var/log/monit.log
Zeile 147: Zeile 153:
     start program "/home/pacs/xyz00/users/meinuser/bin/start-mono.sh"
     start program "/home/pacs/xyz00/users/meinuser/bin/start-mono.sh"
     stop program "/home/pacs/xyz00/users/meinuser/bin/stop-mono.sh"
     stop program "/home/pacs/xyz00/users/meinuser/bin/stop-mono.sh"
</pre>
</syntaxhighlight>


Es sollten die entsprechenden leeren Verzeichnisse erstellt werden, und die Rechte für .monitrc geändert werden:
Es sollten die entsprechenden leeren Verzeichnisse erstellt werden, und die Rechte für .monitrc geändert werden:
<pre>
<syntaxhighlight lang=shell>
$ mkdir -p $HOME/var/log
mkdir -p $HOME/var/log
$ mkdir -p $HOME/var/run
mkdir -p $HOME/var/run
$ chmod 600 .monitrc
chmod 600 .monitrc
</pre>
</syntaxhighlight>
 
Und dann noch einen systemd service für Monit anlegen:
 
''~/.config/systemd/user/monit.service''
<syntaxhighlight lang=ini>
[Unit]
Description=monit
 
[Service]
Type=exec
ExecStart=rm -f $HOME/var/run/monit.id && /usr/bin/monit -c "$HOME/.monitrc"
</syntaxhighlight>


Und dann noch in crontab den Monit Service eintragen, mit <code>crontab -e</code>
Service aktivieren und starten:
<pre>
@reboot rm -f $HOME/var/run/monit.id && /usr/bin/monit -c "$HOME/.monitrc"
</pre>


Dieser Befehl muss zum ersten Mal manuell ausgeführt werden:
<syntaxhighlight lang=shell>
<pre>
$ systemctl --user enable monit.service
$ /usr/bin/monit -c "$HOME/.monitrc"
$ systemctl --user start monit.service
</pre>
</syntaxhighlight>


Nun muss noch dem Apache mitgeteilt werden, wie er auf den fastcgi Server zugreift:
Nun muss noch dem Apache mitgeteilt werden, wie er auf den fastcgi Server zugreift:


doms/meine-domain.de/subs-ssl/www/.htaccess
doms/meine-domain.de/subs-ssl/www/.htaccess
<pre>
<syntaxhighlight lang=apache>
DirectoryIndex index.aspx
DirectoryIndex index.aspx
RewriteEngine on
RewriteEngine on
RewriteBase /
RewriteBase /
RewriteRule ^(.*) fcgi://127.0.0.1:4001/$1 [proxy,last]
RewriteRule ^(.*) fcgi://127.0.0.1:4001/$1 [proxy,last]
</pre>
</syntaxhighlight>


Dann sollte unter https://www.meinedomain.de/ die Mono Applikation erreichbar sein!
Dann sollte unter https://www.meinedomain.de/ die Mono Applikation erreichbar sein!
Zeile 182: Zeile 197:
[[Kategorie:Installationsanleitungen]]
[[Kategorie:Installationsanleitungen]]
[[Kategorie:Software]]
[[Kategorie:Software]]
[[Kategorie:Mono]]
[[Kategorie:Eigene Daemons]]
[[Kategorie:Eigene Daemons]]

Aktuelle Version vom 3. Dezember 2024, 12:50 Uhr

Allgemein

Mono [1] ist ein Open Source .NET Framework und ermöglicht es, .NET Anwendungen in C# unter Linux auszuführen.

Mono bei Hostsharing

Momentan ist Mono nicht zentral auf den Hostsharing Servern installiert.

Mono wird als Debian Paket bereitgestellt, siehe https://packages.debian.org/de/buster/mono-complete

Das könnten wir bei Bedarf einrichten, allerdings ist die Version von Mono in unserem aktuell verwendeten Debian 10 (Buster) schon ziemlich alt (Mono 5.18).

Das ist ganz normal, bei nodejs/npm sieht es ähnlich aus, weil die Entwicklung solcher Projekte etwas schneller fortschreitet als die Debian Releases, die auf Stabilität bedacht sind.

Mono lokal im Benutzer installieren

Es gibt aber einen Weg, ein binäres Paket im eigenen Benutzerverzeichnis zu installieren, welches die gewünschte Funktionalität einer ziemlich aktuellen Mono Version (Mono 6.8) bietet.

Das binäre Paket kann hier heruntergeladen werden: https://download.solidcharity.com/tarballs/tpokorra/mono/mono-6.8.0.105.bin.debian10.tar.gz

Es enthält eine env.sh Datei, die ausgeführt werden muss, um die entsprechenden Pfade zu aktivieren.

Beispiel:

cd ~
wget https://download.solidcharity.com/tarballs/tpokorra/mono/mono-6.8.0.105.bin.debian10.tar.gz

echo "Prüfen der Hash Summe sollte OK zeigen:"
echo "f2c27f11141f81a131b6417084c31ab3ae9d050aab8f13d75b406b377a7a1c670bdfc386f276317115e791af0ad34842 *mono-6.8.0.105.bin.debian10.tar.gz" | sha384sum --check

tar xzf mono-6.8.0.105.bin.debian10.tar.gz
ln -s mono-6.8.0.105 mono
source mono/env.sh
mono --version
	Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-3 Sun Dec 13 21:52:01 CET 2020)
	Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
		TLS:           __thread
		SIGSEGV:       altstack
		Notifications: epoll
		Architecture:  amd64
		Disabled:      none
		Misc:          softdebug 
		Interpreter:   yes
		LLVM:          supported, not enabled.
		Suspend:       hybrid
		GC:            sgen (concurrent by default)

Beschreibung zur Erstellung des binären Pakets

Natürlich muss man immer hinterfragen, ob man fremden binären Paketen vertraut. Alternativ kann man anhand der folgenden Anleitung das binäre Paket gegebenenfalls selber herstellen:

Zuerst werden aktuelle Mono Pakete für Debian Buster benötigt. Diese können aus den Quellen der Mono Pakete von Debian Bullseye für Debian Buster gebaut werden. Die entsprechenden Skripte liegen hier: https://github.com/tpokorra/lbs-mono/tree/master/mono und https://github.com/tpokorra/lbs-mono/tree/master/xsp Beim XSP wurde allerdings eine neuere Version verwendet (4.7.1) als momentan von Debian bereitgestellt wird (4.2, siehe https://packages.debian.org/de/bullseye/mono-xsp).

Es gibt ein Bash Skript [2] und ein Python Skript [3]. Diese werden auf einem Build Server ausgeführt, und es werden die folgenden Schritte ausgeführt:

  • Es werden die Namen der aktuell installierten Pakete auf dem Hostsharing Server heruntergeladen.
  • Dann wird eine Liste angefertigt von Paketen, die wir lokal installieren wollen für Mono.
  • Dann werden lokal die gewünschten Mono Pakete installiert.
  • Dann werden die Pakete, die installiert worden sind, mit den Paketen auf dem Hostsharing Server abgeglichen. Die Inhalte der zusätzlichen Pakete werden in das binäre Paket gepackt.
  • Auch einige spezifische Mono Dateien, die teilweise erst mit den Installationsskripten installiert wurden (z.B. aot Cache, config Dateien), werden in das binäre Paket gepackt.
  • Die Pfade in den bash Skripten zum Starten von Mono werden angepasst, damit es im Benutzerverzeichnis ausgeführt werden kann.
  • Es wird eine env.sh Datei dazu gepackt.

Mono Anwendung mit xsp debuggen

Man kann eine Mono Anwendung direkt mit xsp ausführen, ohne den Umweg über den Apache. Das kann beim Debuggen nützlich sein.

Beispiel:

index.aspx

<%@ Page Language="C#" %>
<html xmlns="www.w3.org/1999/xhtml">
<%@ Import Namespace="System" %>
<head runat="server">
    <title></title>
</head>
<body>
    <div>
        <%
            Response.Write( "Hello World<br/>");
            Response.Write( String.Format("Current Time is {0}<br/>", DateTime.Now));
        %>
    </div>
</body>

Um Kompilierfehler im Browser zu sehen, diese Datei anlegen:

web.config

<configuration>
    <system.web>
        <customErrors mode="Off"/>
    </system.web>
</configuration>

Eigene IP Adresse herausfinden:

ping -4 xyz00.hostsharing.net

Nun kann der Server mit dieser IP Adresse gestartet werden:

xsp4 --port=8080 --address=aa.bbb.cc.ddd

Die Seite ist nun über http://xyz00.hostsharing.net:8080 erreichbar.

Mono und fastcgi Server im Produktiveinsatz

Für den produktiven Einsatz benutzt man den fastcgi Server.

Dazu muss man im Shared Hosting den zusätzlichen Dienst für den fastcgi Server buchen, und beim Service um einen freien Port bitten. Wir benutzen im Beispiel den Port 4001.

bin/start-mono.sh

#!/bin/bash

cd $HOME/aspnetapp
. $HOME/mono/env.sh
exec fastcgi-mono-server4 \
  /socket=tcp:127.0.0.1:4001 \
  /applications=/:$HOME/aspnetapp \
  --logfile=$HOME/var/log/monoserver.log \
  --loglevels=All \
  --verbose \
  > /dev/null 2>&1 &
echo $! > $HOME/var/run/mono.pid

bin/stop-mono.sh

#!/bin/bash

kill -QUIT $( cat $HOME/var/run/mono.pid )

.monitrc

set daemon 60 with start delay 10
set logfile /home/pacs/xyz00/users/meinuser/var/log/monit.log
set idfile /home/pacs/xyz00/users/meinuser/var/run/monit.id
set statefile /home/pacs/xyz00/users/meinuser/var/run/monit.state
set mailserver localhost
set mail-format { from: monit@xyz00.hostsharing.net }
check process mono with pidfile /home/pacs/xyz00/users/meinuser/var/run/mono.pid
    start program "/home/pacs/xyz00/users/meinuser/bin/start-mono.sh"
    stop program "/home/pacs/xyz00/users/meinuser/bin/stop-mono.sh"

Es sollten die entsprechenden leeren Verzeichnisse erstellt werden, und die Rechte für .monitrc geändert werden:

mkdir -p $HOME/var/log
mkdir -p $HOME/var/run
chmod 600 .monitrc

Und dann noch einen systemd service für Monit anlegen:

~/.config/systemd/user/monit.service

[Unit]
Description=monit

[Service]
Type=exec
ExecStart=rm -f $HOME/var/run/monit.id && /usr/bin/monit -c "$HOME/.monitrc"

Service aktivieren und starten:

$ systemctl --user enable monit.service
$ systemctl --user start monit.service

Nun muss noch dem Apache mitgeteilt werden, wie er auf den fastcgi Server zugreift:

doms/meine-domain.de/subs-ssl/www/.htaccess

DirectoryIndex index.aspx
RewriteEngine on
RewriteBase /
RewriteRule ^(.*) fcgi://127.0.0.1:4001/$1 [proxy,last]

Dann sollte unter https://www.meinedomain.de/ die Mono Applikation erreichbar sein!