ASP.NET跨平台佳实践
作者:网络转载 发布时间:[ 2015/11/19 16:12:04 ] 推荐标签:C# 测试开发技术 数据库
前言
八年的坚持敌不过领导的固执,终还是不得不阔别已经成为我第二语言的C#,转战Java阵营。有过短暂的失落和迷茫,但技术转型真的没有想象中那么难。回头审视,其实单从语言本身来看,C#确实比Java更(并非C#天生丽质,而是它站在了巨人的肩膀上)。
本文并非为.NET正名而来,而仅仅是分享作者近几年在ASP.NET跨平台方面的研究与实践经验,算是对八年的.NET之路作一个阶段性的总结。
.NET技术自诞生以来,便一直因其跨平台能力差而广受诟病。这里面有微软有意为之,也有别有用心之人在混淆视听。.NET在一开始便是按公开的语言规范进行设计,随着微软的逐渐妥协,.NET Framework已完全开源。.NET跨平台技术迎来了前所未有的机会,各种.NET跨平台技术必将如雨后春笋般涌现。本文将介绍作者在.NET跨平台方面的佳实践经验,希望藉以降低.NET跨平台的技术难度,让.NET真正成为跨平台的生产技术。
环境
操作系统选择开源社区较有代表性的Linux服务器版本CentOS(本文所述的跨平台思路可以成功应用于绝大多数的Linux系统,也包括国产操作系统如中标麒麟);技术平台选择久负盛名的Mono;Web应用中间件选择中国制造的Jexus。涉及的环境与技术详细情况为:
操作系统:CentOS_6.4_64bit
.NET框架:Mono_4.0.4.1
Web应用中间件:Jexus_5.6.5
数据库:MySQL_5.1.73
目标
本文所述实践,将实现ASP.NET应用程序在Linux系统进行部署,并作产品化尝试,使ASP.NET应用在Linux平台易于部署和维护。
Web应用程序
本文的Web应用程序选用ASP.NET MVC 4技术开发,持久层选用ADO.NET Entity Framework 6技术。你可以在src/demo目录下找到它。
跨平台部署
一、安装系统
小化安装CentOS系统。作为实验环境,可以考虑选用具有快照功能的虚拟机,作者选用的VMWare虚拟机进行试验。系统安装在此不再赘述。系统安装好后,做一个快照留待后续验证产品化安装包正确性所用。
如果你对跨平台部署ASP.NET应用的实现过程没有兴趣,只想看结果的话,可以直接跳过后续步骤,直接进入产品化章节的通过安装包部署ASP.NET应用部分。
二、搭建Linux编译环境
由于本文选择源码安装Mono,所以需要先搭建Linux编译环境。搭建Linux编译环境需要让系统连接互联网,并进行系统更新。
首先,需要让你的系统连接互联网。此处以VMWare虚拟机为例讲解如何连接互联网。VMWare虚拟机连接互联网的方式很多,作者选择NAT方式,首先需要将虚拟机网络连接方式设为NAT,如图 1所示。
图 1 VMWare虚拟机网络连接方式设置
设置VMnet8为自动获取IP,如图 2所示。
图 2 设置VMnet8为自动获取IP地址
然后将Linux虚拟机设为DHCP自动分配IP,编辑网卡配置文件:
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改该配置文件内容如下:
DEVICE=eth0
HWADDR=00:0C:29:F5:09:30
TYPE=Ethernet
UUID=74b949f0-57bb-4baa-a5f2-2c97fb533a8b
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
重启网络服务,让网卡设置生效:
[root@localhost ~]# service network restart
确认虚拟机已连接互联网:
[root@localhost ~]# ping yilin.cnblogs.com
PING yilin.cnblogs.com (42.121.252.58) 56(84) bytes of data.
64 bytes from 42.121.252.58: icmp_seq=1 ttl=128 time=77.7 ms
64 bytes from 42.121.252.58: icmp_seq=2 ttl=128 time=78.1 ms
64 bytes from 42.121.252.58: icmp_seq=3 ttl=128 time=77.5 ms
更新系统:
[root@localhost ~]# yum –y update
安装Mono源码安装需要的组件:
[root@localhost ~]# yum -y install wget glib2-devel libtiff libtiff-devel libjpeg libjpeg-devel giflib giflib-devel libpng libpng-devel libX11 libX11-devel freetype freetype-devel fontconfig fontconfig-devel libexif libexif-devel gcc-c++ gettext unzip zip
三、安装GDI+组件
安装Mono之前,需要先安装其依赖的GDI+组件。联网下载libgdiplus源码安装包(如果在Linux系统中直接下载源码包出现停滞的情况,请返回Windows系统下载libgdiplus源码安装包,并将其上传到Linux系统相应路径后进行安装。后续其他组件安装遇此情况与此雷同,不再赘述):
[root@localhost ~]# cd /usr
[root@localhost usr]# wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.tar.bz2
解压libgdiplus源码安装包:
[root@localhost usr]# tar jxvf libgdiplus-2.10.tar.bz2
配置libgdiplus组件安装路径(这里指定安装路径,是为后文产品化制作安装包做准备,Mono、Jexus和MySQL安装也是如此,不再赘述):
[root@localhost usr]# cd libgdiplus-2.10
[root@localhost libgdiplus-2.10]# ./configure --prefix=/usr/apollo/hostd/mono/
编译libgdiplus源码:
[root@localhost libgdiplus-2.10]# make
安装libgdiplus组件:
[root@localhost libgdiplus-2.10]# make install
四、安装Mono
Mono是Linux平台的.NET Framework实现,是.NET程序移植到Linux平台的不二选择。首先,联网下载Mono源码安装包:
[root@localhost libgdiplus-2.10]# cd /usr
[root@localhost usr]# wget http://download.mono-project.com/sources/mono/mono-4.0.4.1.tar.bz2
解压Mono源码安装包:
[root@localhost usr]# tar jxvf mono-4.0.4.1.tar.bz2
配置Mono安装路径:
[root@localhost usr]# cd mono-4.0.4
[root@localhost mono-4.0.4]# ./configure --prefix=/usr/apollo/hostd/mono
编译Mono源码(此过程耗时一般为半小时到一小时,视系统软硬件配置而定):
[root@localhost mono-4.0.4]# make
安装Mono:
[root@localhost mono-4.0.4]# make install
通过查看Mono版本,确认Mono是否安装成功(出现如下的版本信息表示Mono安装成功):
[root@localhost mono-4.0.4]# cd /usr/apollo/hostd/mono/bin/
[root@localhost bin]# ./mono -V
Mono JIT compiler version 4.0.4 (Stable 4.0.4.1/5ab4c0d Fri Oct 30 06:56:35 CST 2015)
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
LLVM: supported, not enabled.
GC: sgen
五、安装Jexus
Jexus是国人开发的Linux平台上的ASP.NET Web应用中间件,类似于Windows平台的IIS。实践证明Jexus安装简单,运行稳定,是Linux平台架设ASP.NET应用的不错选择。首先,联网下载Jexus安装包:
[root@localhost ~]# cd /usr
[root@localhost usr]# wget http://www.linuxdot.net/down/jexus-5.6.5.tar.gz
解压Jexus安装包:
[root@localhost usr]# tar zxvf jexus-5.6.5.tar.gz
修改Jexus安装路径:
[root@localhost usr]# cd jexus-5.6.5
[root@localhost jexus-5.6.5]# vi install
#!/bin/sh
SRC_DIR=$(cd $(dirname $0);pwd)
DAT_DIR=${SRC_DIR}/data
JWS_DIR='/usr/apollo/hostd/jexus'
…
安装Jexus:
[root@localhost jexus-5.6.5]# sudo ./install
修改Jexus关于mono路径的配置:
[root@localhost jexus-5.6.5]# cd /usr/apollo/hostd/jexus
[root@localhost jexus]# vi jws
#!/bin/sh
JWS_HOME=$(cd $(dirname $0);pwd)
export LANG="zh_CN.UTF-8"
export PATH=/usr/bin:${JWS_HOME}/../mono/bin:$PATH
export LD_LIBRARY_PATH=/usr/lib:${JWS_HOME}/../mono/lib:$LD_LIBRARY_PATH
…
启动Jexus服务,测试Jexus安装是否正确:
[root@localhost jexus]# ./jws start
设置Jexus服务开机自启动,增加如下高亮行::
[root@localhost jexus]# vi /etc/rc.d/rc.local
touch /var/lock/subsys/local
/usr/apollo/hostd/jexus/jws start
修改该文件权限并重启:
[root@localhost jexus]# chmod +x /etc/rc.d/rc.local
六、部署网站
创建网站目录:
[root@localhost jexus]# cd /usr/apollo/
[root@localhost apollo]# mkdir webapps
[root@localhost apollo]# cd webapps/
[root@localhost webapps]# mkdir default
[root@localhost webapps]# cd default/
[root@localhost default]# touch index.html
[root@localhost default]# vi index.html
<html>
<head>
<title>ASP.NET跨平台佳实践</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
ASP.NET跨平台佳实践,看到该页面,表示你的第一个网站已成功部署到Linux系统。
</body>
</html>
修改Jexus网站配置:
[root@localhost default]# cd /usr/apollo/hostd/jexus/siteconf
[root@localhost siteconf]# vi default
######################
# Web Site: Default
########################################
port=80
root=/ /usr/apollo/webapps/default
hosts=* #OR your.com,*.your.com
…
开放防火墙80端口:
[root@localhost siteconf]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
重启iptables,使防火墙设置生效:
[root@localhost siteconf]# /etc/init.d/iptables restart
重启Jexus服务:
[root@localhost siteconf]# /usr/apollo/hostd/jexus/jws restart
终端浏览器输入网址http://ip:port/index.html访问网站:
图 3 ASP.NET网站成功部署到Linux平台
七、数据库
Linux平台免费关系数据库当然是MySQL,首先下载MySQL源码安装包:
[root@localhost siteconf]# cd /usr
[root@localhost usr]# wget http://downloads.mysql.com/archives/get/file/mysql-5.1.72-linux-x86_64-glibc23.tar.gz
解压MySQL源码安装包到指定目录,并修改目录名称:
[root@localhost usr]# tar zxvf mysql-5.1.72-linux-x86_64-glibc23.tar.gz -C /usr/Apollo
[root@localhost usr]# cd apollo
[root@localhost apollo]# mv mysql-5.1.72-linux-x86_64-glibc23 data
将mysql配置文件拷贝至指定目录:
[root@localhost apollo]# cd data
[root@localhost data]# cp support-files/my-medium.cnf /etc/my.cnf
编辑mysql配置文件,在[client]节和[mysqld]节中加入以下高亮行::
[root@localhost data]# vi /etc/my.cnf
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir = /usr/apollo/data
datadir = /usr/apollo/data/data
character-set-server = utf8
collation-server = utf8_general_ci
…
创建mysql组及用户,并设定目录访问权限:
[root@localhost data]# groupadd mysql
[root@localhost data]# useradd -g mysql mysql
[root@localhost data]# chown -R mysql .
[root@localhost data]# chgrp -R mysql .
[root@localhost data]# chown -R root .
[root@localhost data]# chown -R mysql data
初始化数据库:
[root@localhost data]# scripts/mysql_install_db --user=mysql
运行mysql服务:
[root@localhost data]# bin/mysqld_safe --user=mysql &
这种方式启动MySQL是阻塞式的,需要另开一个会话登录Linux系统,继续后续操作。
设置root用户密码:
[root@localhost data]# bin/mysqladmin -uroot password 11111111
设置mysql服务开机自动启动:
[root@localhost data]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost data]# chmod 700 /etc/init.d/mysqld
[root@localhost data]# chkconfig --add mysqld
[root@localhost data]# chkconfig --level 345 mysqld on
现在,可以停止之前会话启动的MySQL服务(快捷键Ctrl + C),使用service命令后台启动MySQL服务。
[root@localhost data]# service mysqld start
将mysql命令加入系统环境变量中,在文件末尾加上以下两行代码:
[root@localhost data]# vi /etc/profile
...
PATH=$PATH:/usr/apollo/data/bin
export
执行配置,并重启系统,让环境变量生效:
[root@localhost data]# source /etc/profile
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11