linux ubuntu安装 mono,在 Ubuntu Server 上安装配置 Mono 生产环境

在 Ubuntu Server 上安装配置 Mono 生产环境

在 Ubuntu Server 上安装和配置 Apache2 + Mono 生产环境的记录。 服务器环境是 Ubuntu Server 13.04 虚拟机模式 (Virtual Machine Mode), 安装的 Mono 的版本是 3.2.1 , 最终环境如下图所示:

f4df05a2f026dc200032159a74335a9a.png

准备编译环境

还是老话题, 先准备 GCC 编译环境, 这样才可以从源代码编译安装所需要的软件。 首先需要安装的是基本的编译工具, 只要输入下面的命令即可:

sudo apt-get install g++ gettext autoconf

接下来输入用户名和密码, 就可以自动安装必须的命令行编译工具了。

从源代码编译安装 libgdiplus

对于服务器来说, 主要运行 Apache、 ASP.Net、 Mvc 以及 WCF 等服务端程序, 一般不会运行图形界面, 因为图形界面会消耗额外的内存和处理器资源, 所以说 libgdiplus 不是必须安装的, 不过一个常见的场景是需要在服务端动态生成图片, 也会用到 libgdiplus , 因此 libgdiplus 还是推荐安装的。 如果服务器上不需要生成图片, 则可以不用安装 libgdiplus 。

先安装编译 libgdiplus 所需的依赖项, 输入下面的命令:

sudo apt-get install libglib2.0-dev libpng12-dev libexif-dev libx11-dev libfreetype6-dev libfontconfig1-dev libjpeg62-dev libgif-dev libxrender-dev

下载 libgdiplus 最新版的源代码:

wget https://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.9.tar.bz2

下载完成之后解压, 并且换到源代码的目录:

tar -jxvf libgdiplus-2.10.9.tar.bz2

cd libgdiplus-2.10.9

配置并检查 libgdiplus 的编译选项:

./configure

这是最关键的步骤, 如果 configure 命令中途出错, 则一般是缺少了某个依赖的库, 只要根据提示安装相应的依赖库就可以了, configure 命令运行结果如果如下图所示, 则表示可以进行下一步了:

44c9f6d52acbe1a298d93190eef4963a.png

上图中的配置结果不支持 tiff , 因为在服务端动态生成 tiff 图片的需求很小, 所以这个 tiff 可以直接忽略了, 如果需要生成 tiff, 只要安装 libtiff-dev 再次执行 configure 命令即可。

接下来接着输入下面的命令就可以编译并安装 libgdiplus 了:

make

sudo make install

常见问题:

如果在 make 的过程中出现类似如下错误:

Making all in pixman

make[4]: Entering directory `/usr/local/src/libgdiplus-2.10.9/pixman/pixman'

source='pixman-access.c' object='pixman-access.lo' libtool=yes \

DEPDIR=.deps depmode=none /bin/sh ../depcomp \

/bin/sh ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -Wall -fvisibility=hidden -c -o pixman-access.lo pixman-access.c

../libtool: line 852: X--tag=CC: command not found

../libtool: line 885: libtool: ignoring unknown tag : command not found

../libtool: line 852: X--mode=compile: command not found

../libtool: line 1018: *** Warning: inferring the mode of operation is deprecated.: command not found

../libtool: line 1019: *** Future versions of Libtool will require --mode=MODE be specified.: command not found

../libtool: line 1162: Xgcc: command not found

../libtool: line 1162: X-DHAVE_CONFIG_H: command not found

../libtool: line 1162: X-I.: command not found

../libtool: line 1162: X-I..: command not found

../libtool: line 1162: X-g: command not found

../libtool: line 1162: X-O2: command not found

../libtool: line 1162: X-Wall: command not found

../libtool: line 1162: X-fvisibility=hidden: command not found

../libtool: line 1162: X-c: command not found

../libtool: line 1214: Xpixman-access.lo: command not found

../libtool: line 1219: libtool: compile: cannot determine name of library object from `': command not found

make[4]: *** [pixman-access.lo] Error 1

make[4]: Leaving directory `/usr/local/src/libgdiplus-2.10.9/pixman/pixman'

make[3]: *** [all-recursive] Error 1

make[3]: Leaving directory `/usr/local/src/libgdiplus-2.10.9/pixman'

make[2]: *** [all] Error 2

解决方法是输入下面的命令, 然后再继续执行 make 命令:

export echo=echo

如果出现类似这样的错误:

/usr/lib64/libglib-2.0.so.0: could not read symbols: Invalid operation

collect2: error: ld returned 1 exit status

make[2]: *** [testgdi] Error 1

make[2]: Leaving directory `/usr/local/src/libgdiplus-2.10.9/tests'

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory `/usr/local/src/libgdiplus-2.10.9'

make: *** [all] Error 2

解决方法是:

先执行 ./configure 命令, 然后编辑 test/Makefile 文件;

将 130 行的 LIBS = -lpthread -lfontconfig 改为 ` LIBS = -lpthread -lfontconfig -lglib-2.0 -lX11`;

再次执行 make 命令即可。

最终, 在 make 命令执行成功之后, 在继续执行 sudo make install 命令进行安装。

从源代码编译安装 mono 、 xsp

安装好了 libgdiplus 之后, 接下来的 mono 和 xsp 就是一路顺风了, 只要简单的敲几行命令就可以了:

wget https://download.mono-project.com/sources/mono/mono-3.2.3.tar.bz2

tar -jxvf mono-3.2.3.tar.bz2

cd mono-3.2.3

make

sudo make install

wget https://download.mono-project.com/sources/xsp/xsp-2.10.2.tar.bz2

tar -jxvf xsp-2.10.2.tar.bz2

cd xsp-2.10.2.tar.bz2

make

sudo make install

执行上面的命令, 一般都不会出现什么错误了。 现在可以测试一下安装的 mono 和 xsp , 在终端输入:

mono --version

可以得到如下图的提示:

353759c5e384c66fc78c9cf80b841348.png

编译安装 xsp 之后, 会在 /usr/local/lib/xsp/test 目录下生成一个 .net 测试网站, 我们可以用这个测试站点来测试 mono + xsp 的安装, 输入下面的命令:

cd /usr/local/lib/xsp/test

ls

xsp

可以看到的命令行输出如下:

52f7197da07a5b0e5a735d2e538df8cc.png

打开浏览器, 访问服务器的 8080 端口, 可以看到的如下的画面, 说明 mono + xsp 已经安装成功了。

37f7cccad13b8e858209f56f8631f950.png

安装 apache2 和 apache2-dev

前面已经安装好了 mono + xsp , 用来测试应用的话足够了, 但是不能做为服务器生产环境使用, 因此还需要继续安装 apache http server , 并将 mono 做为 apache 的模块挂载上去。 Apache http server 我们选择从 Ubuntu Server 的软件仓库中安装, 只要输入下面的命令即可:

sudo apt-get install apache2 apache2-prefork-dev apache2-threaded-dev

第一个软件包是 Apache Http 服务器, 另外两个是 Apache 的开发包, 接下来要安装的 mod_mono 依赖这两个开发包, 因此一并安装。

从源代码编译安装 mod_mono

现在, 安装 mod_mono 也是非常简单的:

wget https://origin-download.mono-project.com/sources/mod_mono/mod_mono-2.10.tar.bz2

tar -jxvf mod_mono-2.10.tar.bz2

cd mod_mono-2.10

./configure

make

sudo make install

这个一般也不会出现什么错误, 基本上都能正确安装。

配置 apache2 和 mod_mono

现在, 可以说万事具备, 只欠东风, 只要将 mod_mono 配置并加载到 apache 中就可以了, apache 在 Ubuntu Server 上的配置目录是 /etc/apache2 , 在编译安装 mod_mono 的时候, 已经将 mod_mono.conf 复制到这个目录了, 我们只要修改 apache2 的配置, 引用这个文件即可, /etc/apache2 的目录结构如下:

5c8bd4a95c05fd7f66b4af4392ec61e5.png

通过查看 /etc/apache2/apache2.conf 文件可以知道各个目录的含义, 只要在 /etc/apache2/mods_enabled 目录新建一个链接文件, 指向 /etc/apache2/mod_mono.conf 即可加载 mod_mono , 切换到 /etc/apache2/mods-enabled 目录, 输入下面的命令添加链接:

cd /etc/apache2/mod-enabled

sudo ln -s ../mod_mono.conf ./mod_mono.conf

现在输入 ls -l /etc/apache2/mods-enabled/mod_*.conf , 输出如下所示:

ls -l /etc/apache2/mods-enabled/mod_*.conf

lrwxrwxrwx 1 root root 16 Sep 6 13:34 mod_mono.conf -> ../mod_mono.conf

看到有 mod_mono.conf -> ../mod_mono.conf 的输出提示, 说明链接链接已经做好了, 重启 Apache 服务就会加载 mod_mono 。

有兴趣的可以输入命令 more /etc/apache2/mod_mono.conf 查看一下这个文件的内容, 看是不是很熟悉的 aspx 、 asmx 、 ashx 等都出现了。

现在在默认站点下添加一个名为 MonoTest 的测试程序, 需要编辑 /etc/apache2/sites-available/default 文件, 在文件的最后, CustomLog 指令之前, 插入下面的配置:

Alias /MonoTest "/usr/local/lib/xsp/test"

MonoServerPath MonoTest "/usr/bin/mod-mono-server2"

MonoDebug MonoTest true

MonoSetEnv MonoTest MONO_IOMAP=all

MonoApplications MonoTest "/MonoTest:/usr/local/lib/xsp/test"

Allow from all

Order allow,deny

MonoSetServerAlias MonoTest

SetHandler mono

SetOutputFilter DEFLATE

SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript

保存并关闭这个文件, 然后输入下面的命令重启 Apache2 服务:

sudo service apache2 restart

然后再次打开浏览器, 输入地址: https://server-name-or-address/MonoTest , 看到类似下面的画面就大功告成了:

fb2579f92b16855c6d098a684e4c463c.png

当然, 一切只是个开始, 接下来将继续测试 ASP.Net MVC 、 EntityFramework 、 NHibernate 等常用组件在 Mono 上的表现。

参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言程序设计算机基础知识,2018春C语言程序设计(合肥工业大学)

大家好!欢迎你们!无论是新同学还是老朋友,都非常高兴能在这里和大家相聚!我们一如既往还说C,因为它称霸于计算机语言,超乎我们的想象。如果想深刻的理解这个时代,就要理解计算机编程! 编程完成了…

linux 修改ldap密码,centos – ldap强制用户更改密码

我正在使用CentOS-ds(基于Redhat-DS和389目录服务器).我有LDAP设置,并努力验证用户(和Sudo,这是一个方便的功能!).甚至passwd也很好地改变了存储在Ldap中的密码.但是,我有一个小问题.登录服务器后,如何强制所有用户帐户创建新密码?我会这样做的正常方式&…

c语言之函数存储属性,C语言:链接属性与存储类型

一、 链接属性C语言中链接属性决定如何处理在不同文件中出现的标示符。标示符的作用域与它的链接属性有关,但这两个属性并不相同。链接属性有3种: external(外部),internal(内部) 和 none(无)。1. none: 没有链接的标示符,总是被当…

c语言 malloc 源码详解,dlmalloc源码剖析之:mALLOc

/*如果你使用linux, douglea malloc已经默认作为glibc的malloc,新的版本可能用的是ptmalloc(dlmalloc的多线程版本)如果你用的bsd4.2及以前系统libc用的kingsley的malloc;BSD(包括freebsd,netbsd,openbsd)4.2以后版本libc用的是PHKmalloc;如果你用的windows系统用的是microsoft…

数数C语言,(旧)子数涵数·C语言——让C帮你做计算

之前,我们学过了我们的第一个C程序——hello World。现在开始进一步学习,想一想如何让C帮你做计算。我们先来看代码(我没有新建,还是用之前的hello world.cpp):好,因为之前在hello World的时候就已经学过了C的基本框架…

求10 翻译c语言,求助:谁能帮我翻译下最基础的C语言,我是新手,谢谢了!

main(){int i,j,p,q,s,n,a[11]{127,3,6,28,54,68,87,105,162,18};/*定义i,j,q,p,s,n和a[11]&#xff0c;并对a数组赋值*/for(i0;i<10;i){pi;qa[i];/* 用p存储i的数值&#xff0c;也就是记住数组的下标。用q记录a[i]的数值&#xff0c;用作比较 */for(ji1;j<10;j)if(qif(p…

c语言之优先级 结合性与自增运算,C语言之优先级、结合性与自增运算

优先级、结合性这些概念在初学的时候并没有放在心上&#xff0c;今天又碰到这个问题&#xff0c;查了不少资料&#xff0c;再次做个总结。在标准C语言的文档里&#xff0c;对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是&#xff1a;它是仲裁者&#xff0c;在几个…

android设置输入框输入字符限制,Android EditText限制输入字符的方法总结

Android EditText限制输入字符的方法总结最近项目要求限制密码输入的字符类型&#xff0c; 例如不能输入中文。 现在总结一下EditText的各种实现方式&#xff0c; 以比较各种方法的优劣。第一种方式&#xff1a; 设置EditText的inputType属性&#xff0c;可以通过xml或者Ja…

android动态改变菜单栏,Android动态设置主题(使用RxBus模式)

之前写过一篇文章&#xff1a;RxBus的实现及简单使用。今天我们尝试使用RxBus动态切换主题。一、定义主题颜色color.xml#F44336#D32F2F#F44336#E91E63#C2185B#E91E63#795548#5D4037#795548#2196F3#1976D2#2196F3#607D8B#455A64#607D8B#FFEB3B#FBC02D#FFEB3B#673AB7#512DA8#673A…

android 图片分析,Android图片处理实例分析

本文实例讲述了Android图片处理的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;package cn.szbw.util;import Android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.…

android开发按钮颜色,Android编程实现简单设置按钮颜色的方法

本文实例讲述了Android编程实现简单设置按钮颜色的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1.工程目录a.在res目录-新建drawble文件夹放入自定义图片2.main.xmlandroid:orientation"vertical"android:layout_width"fill_parent"androi…

艾默生变频器ev1000故障代码_国产变频器型号大全,梳理国产变频的前世今生!...

在工控领域&#xff0c;变频器已经广为所知且应用范围广泛&#xff0c;各方对变频器能给出形形色色的描述。维基百科给出的定义&#xff1a;“变频器(variable frequency drive&#xff0c;常见缩写VFD)&#xff0c;也称为变频驱动器或驱动控制器。变频器是可调速驱动系统的一种…

android音乐播放器案例,Android MediaPlayer实现音乐播放器实例代码

Android MediaPlayer实现音乐播放器1、布局文件android:layout_width"fill_parent"android:layout_height"fill_parent"android:orientation"vertical" >android:id"id/hint"android:layout_width"wrap_content"android:…

单边指数信号的特点_今日股市分析:上证指数若能守住3400,蓄力反弹就有戏...

昨日整体概况上涨&#xff1a;848只 下跌&#xff1a;3009只涨停&#xff1a;69只 跌停&#xff1a;12只昨天的上证指数低开低走&#xff0c;午后冲红又回落&#xff0c;另一边的创业板却是单边下行跌超3%&#xff0c;板块方向农业、洪水概念股、还有电力板块较强。按照昨日置顶…

万丰科技机器人排名_机器人系统集成“7宗最”

摘要&#xff1a;对于众多集成商而言&#xff0c;作为典型的“夹心饼奥利奥”&#xff0c;面对客户的各种要求&#xff0c;“不敢勉强你&#xff0c;只好为难自己”系真实写照。1、企业数量最多GGII统计数据显示&#xff0c;截至2019年年底&#xff0c;中国工业机器人产业企业数…

android 电池高温关机,Android 关机问题分析指南

本篇文章主要介绍 Android 开发中的 关机 部分知识点&#xff0c;通过阅读本篇文章&#xff0c;您将收获以下内容:1 . 确认是亮屏关机还是灭屏关机&#xff1f;关机时是否有播放关机动画&#xff1f;2 . 是直接关机还是关机后会自动重启&#xff1f;3.异常关机时&#xff0c;连…

android switch 未定义,在switch语句中初始化时未定义的变量?

问题本身就是一个明显的答案.无论如何,这是我的代码片段......switch(cSet)...case 8:{ //Special CharactersfinalSet special;char* charSet new char[special.size() 1];charSet[special.size()] 0; //Append null terminatormemcpy(charSet, special.c_str(), special.…

android 克隆对象,克隆会破坏单例对象吗?

假设有这样一个场景&#xff0c;如果复制的目标对象恰好是单例对象&#xff0c;那会不会破坏单例对象呢&#xff1f;当然&#xff0c;我们在已知的情况下肯定不会这么干&#xff0c;但如果发生了意外怎么办&#xff1f;不防来修改一下代码。public class ConcretePrototype imp…

转网口显示未识别的网络_已有1700万用户携号转网 超99%用户1小时内办结

携号转网是利国利民的大举措&#xff0c;受到了很多电信用户的拥护和支持。12月15日&#xff0c;工信部副部长刘烈宏在某会议上进行报告指出&#xff0c;目前我国 “携号转网”服务已经累计有 1700 万用户完成携转&#xff0c;一小时携转成功办结率超过 99%。已有1700万用户携号…

adb 更新 android sdk,[转载]安装Android时SDK AVD MANAGER时更新报错的解决办法

最近安装Android SDK时&#xff0c;发现更新时出现“A folder failed to be renamed ormoved.”等类似错误。经过测试和G后发现解决办法目前有两种情况&#xff1a;1、确实是因为打开了相关目录或者其他程序占用率文件夹句柄。关闭相关资源管理器或者关闭相关程序即可&#xff…