网上找遍google/bing/baidu, 完全没有近几年LINUX跑asp+mssql的文章,都是十年前的centos 6/ ubuntu10时代的,而我服务器采用的debian11并且上面有跑别的应用,不想为架ASP/MSSQL还去DD个UBUNTU10老爷车来弄.
首先安装iasp, 这个也是上世纪产物了,早就停止开发了,并且最后的版本也停止在十年前的iasp2.1.01.tar.gz
因为iasp只支持最高apache2.0, 别装更高版本,肯定不兼容,所以我选择了httpd-2.0.59.tar.gz
第一步apache
这个简单解压出来之前编译安装就行
make && make install
默认就安装到/usr/local/apache2下了
第二步安装java
为什么要安装java呢,因为iasp是运行在java环境的, 这一步非常重要, 我试着安装了好几个版本, 这个也是花我时间最多的,因为考虑到你用什么数据库版本,对应就得安装对应的JAVA版本.
ubuntu/debian能找到mssql最老的版本也是sqlserver2017,
而java中JDBC能连接sqlserver2017的最低要求兼容版本的就是sqljdbc_6.2.2.1_cht.tar.gz(mssql-jdbc-6.2.2.jre7.jar
mssql-jdbc-6.2.2.jre8.jar) ,所以要么安装7要么安装8,我最开始就安装了8,
后来跑起来后发现我ASP代码中只要调用比如date time相关时间函数, 就会出错,
跑去看异常发现"java.lang.ClassNotFoundException: sun.io.ByteToCharConverter"
google在stackOverflw一贴子才查到,原来java8已抛弃了sun/io, 但java7也仅是[deprecated]. 所以后来装了java7解决 版本选择的是jdk-7u80-linux-i586.tar.gz(记得安装32位版本)
第三步安装iasp
解压iasp2.1.01.tar.gz包
运行install.sh
/usr/jdk1.7.0_80/bin
/usr/local/iasp
Instant ASP native servlet interface
Apache 2.X
/usr/local/apache2/conf
重新编译mod_iasp.so
cd /usr/local/iasp/ iasp21/bin/apache/source/2.0
/usr/local/apache2/bin/apxs –i –c *.c
编辑apache配置文件
/usr/local/apache/conf/httpd.conf
在文件末尾部分将/usr/local/iasp/iasp21/bin/apache/linux/2.0/mod_iasp.so修改为
/usr/local/apache2/modules/mod_iasp.so
安装sqlserver2017
这个就按微软官网提示步骤安装就行了,也没啥难度
但有一点重要就是ubuntu18+默认系统使用的是openssl1.1, (那18+就是我debian11更不用说了),而sqlserver2017需要使用openssl1.0的动态库,所以需要手动指定一下 .
先停止mssql-server服务
创建两个软链接
sudo ln -s /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 /opt/mssql/lib/libssl.so sudo ln -s /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /opt/mssql/lib/libcrypto.so
编译mssql-server的systemd服务, /etc/systemd/system/multi-user.target.wants/mssql-server.service
增加代码
[Service]
Environment="LD_LIBRARY_PATH=/opt/mssql/lib"
再重启mssql-server服务
启动apache
/usr/local/apache2/bin/apachectl start
启动iasp
ASP里连接Sqlserver使用不了odbc驱动, 得改用JDBC
就得修改IASP的启动脚本start-server.sh, 其实就是将JAVA启动的classpath增加mssql-jdbc-6.2.2.jre7.jar, 打开/usr/local/iasp/iasp21/start-server.sh, 修改如下
/opt/jdk1.7.0_80/bin/java -mx32768000 -classpath /opt/jdk1.7.0_80/bin/../lib/classes.zip:/opt/jdk1.7.0_80/bin/../lib/tools.jar:/usr/local/iasp/iasp21/lib/jsdk.jar:/usr/local/iasp/iasp21/lib/iasplib.jar:/usr/local/iasp/iasp21/lib/activation.jar:/usr/local/iasp/iasp21/lib/asp2j.jar:/usr/local/iasp/iasp21/lib/rjax.jar:/usr/local/iasp/iasp21/lib/ejbcorba.jar:/usr/local/iasp/iasp21/lib/jndi.jar:/usr/local/iasp/iasp21/lib/samples.jar:/usr/local/iasp/iasp21/lib/hado.jar:/usr/local/iasp/iasp21/lib/pop3.jar:/usr/local/iasp/iasp21/lib/mail.jar:/usr/local/iasp/iasp21/lib/iasp_fileup.jar:/usr/local/iasp/iasp21/lib/iasp_mail.jar:/usr/local/iasp/iasp21/lib/iasp_grid.jar:/usr/local/iasp/iasp21/lib/iasp_nntp.jar:/usr/local/iasp/iasp21/lib/iasp_exec.jar:/usr/local/iasp/iasp21/lib/iasp_inet.jar:/usr/local/iasp/iasp21/lib/iasp_upload.jar:/usr/local/iasp/iasp21/lib/iasp_http.jar:/usr/local/iasp/iasp21/lib/iasp_pop3.jar:/usr/local/iasp/iasp21/lib/iasp_chart.jar:/usr/local/iasp/iasp21/lib/iasp_image.jar:/usr/local/iasp/iasp21/lib/iasp_sock.jar:/usr/local/iasp/iasp21/lib/iasp_xmldom.jar:/usr/local/iasp/iasp21/servlets:/usr/local/iasp/iasp21/lib/rjaxADODB.jar:/opt/msSQLjdbc/mssql-jdbc-6.2.2.jre7.jar: servlet.http.HttpServer
然后启动:
/usr/local/iasp/iasp21/start-server.sh
说下我在中间遇到的几个问题和解决方法:
- 如果你也是64位系统,编译的mod_iasp.so时,
得修改一下源码,这是iasp的一个BUG. 估计当时只考虑在32位运行导致的.
就是utils.c中的调用apr_pstrcat函数返回的是int型, 而返回的int型在64位是只占4字节的,
再将这地址转成char*,再去strlen计算, 当然就出错了.
我看过mod_iasp源码(开源的好处啊,若干年后有人需要你的代码还可以修复使用),发现apr_string.h里面有apr_pstrcat有返回char *类型的定义.
解决办法是在utils.c文件头增加一条#include "apr_strings.h" - 安装32位的java需要支持
apt install lib32z1代替ia32-libs - asp代码调用response.Redirect无效,改用
response.write "<script type='text/javascript'>location.href='URL';</script>"
我的运行环境就是腾迅云轻量无忧1h2G
整体运行速度和稳定性, 还有内存CPU占用率还挺满意
debian11+apache+iasp+sqlserver2017
总共大概刚好1G(sqlserver进程就占了800M = =!)
CPU几呼是0(已经关闭腾迅云预警/usr/local/qcloud/YunJing/uninst.sh的环境下)
root@VM-4-6-debian:~# uptime 00:01:08 up 1 day, 5:20, 1 user, load average: 0.00, 0.00, 0.00