Установка и настройка FastCGI Mono Server под Linux

06.07.2023 - Zadrot

На днях потербовалось показывать C# (или ASP.NET, я точно не понимаю) веб страницы на новом сервере. Долго тупил, поэтому решил написать руководство по установке, настройке и автозапуску соответствующего софта.

Нам потребуется Nginx (если нужен), FastCGI Mono Server и три бутылки пива

1
2
apt-get install nginx
apt-get install mono-fastcgi-server4

Для работы с Mono, в конфиге сайта Nginx нужно прописать fastcgi_pass

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server
{
	listen 80;
	server_name zadrot.ru;
	root /var/www/zadrot.ru;

	location /
	{
		index default.aspx;
		fastcgi_index default.aspx;
		fastcgi_pass 127.0.0.1:9000;
		include /etc/nginx/fastcgi_params;
	}
}

Ещё разработчик рекомендует добавить в /etc/nginx/fastcgi_params следующие строчки (у меня и без них прекрасно работает)

1
2
fastcgi_param PATH_INFO "";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

С настройкой Nginx закончили, автозапускается он сам. Можно выпить

Далее создаём 2 директории, чтобы быть как Nginx
В первой мы создаём кофиги сайтов, для которых требуется поддержка C#, а во вторую делаем символическую ссылку из первой :)

1
2
mkdir /etc/mono/fcgi/apps-available
mkdir /etc/mono/fcgi/apps-available

Пример файла zadrot.ru.webapp в директории apps-available

1
2
3
4
5
6
7
8
9
<app>
	<web-application>
		<name>zadrot.ru</name>
		<vhost>*</vhost>
		<vport>80</vport>
		<vpath>/</vpath>
		<path>/var/www/zadrot.ru</path>
	</web-application>
</app>

Теперь, чтобы не запускать Mono Server каждый раз руками, засовываем скрипт с именем monoserve в директорию с сервисами /etc/init.d

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/bin/bash
### BEGIN INIT INFO
# Provides: monoserve.sh
# Required-Start: $local_fs $syslog $remote_fs
# Required-Stop: $local_fs $syslog $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Запуск FastCGI Mono Server
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/mono
NAME=monoserver
DESC=monoserver

## Begin -- Настройки --
PROGRAM=fastcgi-mono-server4
ADDRESS=127.0.0.1
PORT=9000
USER=www-data
GROUP=$USER
LOGFILE=/var/log/mono/fastcgi.log
LOGLEVELS=Standard # All если нужно больше информации
FCGI_CONFIG_DIR=/etc/mono/fcgi/apps-enabled
## End -- Настройки --

# Переменные
MONOSERVER=$(which $PROGRAM)
MONOSERVER_PID=""

# Запуск сервера
start_up()
{
	get_pid
    if [ -z "$MONOSERVER_PID" ]; then
    	start-stop-daemon -S -c $USER:$GROUP -x $MONOSERVER -- --appconfigdir $FCGI_CONFIG_DIR /socket=tcp:$ADDRESS:$PORT /logfile=$LOGFILE /loglevels=$LOGLEVELS &
        echo "FastCGI Mono Server $PROGRAM запущен от $USER на $ADDRESS:$PORT"
	else
		echo "FastCGI Mono Server уже запущен - PID $MONOSERVER_PID"
	fi
}

# Остановка сервера
shut_down()
{
    get_pid
    if [ -n "$MONOSERVER_PID" ]; then
		kill $MONOSERVER_PID
		echo "FastCGI Mono Server остановлен"
    else
		echo "FastCGI Mono Server не запущен"
	fi
}

# Обновление PID
get_pid()
{
	MONOSERVER_PID=$(ps auxf | grep $PROGRAM.exe | grep -v grep | awk '{print $2}')
}

case "$1" in
	start)
		start_up
	;;
	stop)
		shut_down
	;;
	restart)
		shut_down
		start_up
	;;
    status)
		get_pid
		if [ -z "$MONOSERVER_PID" ]; then
			echo "FastCGI Mono Server не запущен"
		else
			echo "FastCGI Mono Server запущен - PID $MONOSERVER_PID"
		fi
	;;
	*)
		echo "Пиши так: monoserve (start|stop|restart|status)"
	;;
esac

exit 0

Руками создаём лог на случай проблем с правами и устанавливаем для него владельца www-data. Такого же владельца ставим файлам в директории /etc/mono/fcgi

1
2
3
touch /var/log/mono/fastcgi.log
chown -R www-data:www-data /var/log/mono
chown -R www-data:www-data /etc/mono/fcgi

Всё готово. Можно выпить

Нет, не всё, ещё нужно выдать bash скрипту рут и сделать запускаемым. А так же добавить его в автозапуск

1
2
3
chmod +x /etc/init.d/monoserve
systemctl daemon-reload
update-rc.d monoserve defaults

Вроде ничего не забыл. Писал по памяти и не проверял.
Можно выпить