在Linux中運行Nancy應用程序


最近在研究如何將.NET應用程序移植到非Windows操作系統中運行,逐漸會寫一些文章出來。目前還沒有太深的研究,所以這些文章大多主要是記錄我的一些實驗。

這篇文章記錄了我如何利用NancyFx編寫一個自托管(Self-host)的應用程序,並且將其發布到Linux系統中。

 

什么是NancyFx?

簡單地說,這真是一個神奇的框架。它給自己的定義是:lightweigh web framework for .NET。不用不知道,一用嚇一跳哈

http://nancyfx.org/

image

與微軟官方的ASP.NET MVC或者ASP.NET Web API這種框架來比較,它確實是輕量級的。簡單易用,而且基於模塊化的設計,也確實有些自己的 特點。它實現了OWIN,所以可以托管在IIS,或者其他任何的程序里面。

閑話少說,我們可以快速開發一個范例程序。

創建一個自托管的Web應用程序

我這里使用的是Visual Studio 2013,創建了一個最簡單的Console Application,命令為 ConsoleApplicationNancy

添加兩個包的引用

Install-Package Nancy.Hosting.Self
Install-Package Mono.Posix
在Program.cs文件的Main方法中添加如下代碼
using Mono.Unix;
using Mono.Unix.Native;
using Nancy.Hosting.Self;
using System;

namespace ConsoleApplicationNancy
{
    class Program
    {
        static void Main(string[] args)
        {
            var uri = "http://localhost:8888";
            Console.WriteLine("Nancy on :" + uri);
            var host = new NancyHost(new Uri(uri));
            host.Start();

            if (Type.GetType("Mono.Runtime") != null)
            {
                UnixSignal.WaitAny(new[]{
                   new UnixSignal(Signum.SIGINT),
                   new UnixSignal(Signum.SIGTERM),
                   new UnixSignal(Signum.SIGQUIT),
                   new UnixSignal(Signum.SIGHUP)
                });
            }
            else
            {
                Console.Read();
            }

            Console.WriteLine("Stopping Nancy");
            host.Stop();
        }
    }
}

這段代碼的意思是指,要在本地機器上面的8888端口啟動一個NancyHost進行監聽,並且如果檢測到Mono運行環境的話,還要添加一些特的監聽信號的功能。

接下來我們需要添加一個具體處理清楚的模塊,NancyFx中的模塊就是一個最普通的class文件,只要繼承NancyModule就可以了。而且每個模塊可以注冊自己的路徑解析規則。

using Nancy;

namespace ConsoleApplicationNancy
{
    public class HelloModule:NancyModule
    {
        public HelloModule()
        {
            Get["/"] = parameters => "Hello,Nancy......";
        }
    }
}

 

現在就可以按下F5進行調試了。請注意,要將VisualStudio用管理員身份打開,因為這里涉及到了端口監聽。

image

image

很神奇的,不是嗎? 如果我們希望這個程序可以在非Windows操作系統(如Linux)中運行,是不是更有意思呢?

 

在Linux中運行Nancy應用程序

我這里做實驗用的是Ubuntu 15.04 LTS。

image

 

為了在Linux中運行.NET的應用程序,目前需要首先安裝Mono(很佩服這個項目組)。目前微軟自己也在開發.NET Core,但還沒有全部完成。

使用下面的命令可以很方便地安裝mono(一句一句地執行)

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update
sudo apt-get install mono-complete

通過mono –V 可以查看當前安裝的mono的版本

image

 

接下來就是要將我們編譯好的程序上傳到我的服務器上面去了

首先,我在服務器上面創建了一個目錄 /var/www/nancydemo,並且分配了必要的權限(可寫入,可執行)

然后通過winSCP這個工具,將編譯結果上傳到該目錄

image

image

通過mono ConsoleApplicationNancy.exe 這樣的指令就可以基於mono框架啟動我們的應用程序了

image

然后,我們就可以通過以下的方式進行訪問了

image

看起來確實很不錯,不是嗎?沒想到.NET應用程序可以這么簡單地遷移到Linux中來運行吧?這個得感謝mono。沒想到網站可以這么容易編寫吧?這個得好好研究Nancy啊

不過,這樣啟動應用程序有一個問題,就是只要我的控制台被關閉,那么網站也就關閉了。有沒有什么辦法讓這個程序一直運行呢?

image

使用supervisor將這個程序一直在后台執行

首先,使用下面的命令安裝supervisor

apt-get install supervisor
創建一個配置文件 /etc/supervisor/conf.d/nancydemo.conf  
在文件中輸入如下的內容,並保存
[program:nancydemo]
command=mono ConsoleApplicationNancy.exe  -d
user=www-data
stderr_logfile = /var/log/supervisor/nancydemo-err.log
stdout_logfile = /var/log/supervisor/nancydemo-stdout.log
directory=/var/www/nancydemo/

然后,使用下面的命令切換到supervisor命令行

image

最后,啟動nancydemo這個應用程序吧

image

這樣的話,就算我們的控制台被關閉了,網站將一直在后台運行

image

 

如果什么時候想要停止nancydemo這個應用,可以使用下面的方式

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM