Jexus 用户手册

version: 8.0 for jexus 8.x

作者:宇内流云(j66x@163.com)


目 录

一、Jexus 概述 ......

二、Jexus 的安装与更新 ......

三、Jexus 的操作命令 ......

四、Jexus 的全局配置 ......

五、Jexus 的网站配置 ......

六、问 答 ......

七、授权与交流 ......

一、Jexus 概述

Jexus 是“Jexus Web Server”的简称,可缩写为“JWS”,中文读音近似于“杰克瑟斯”,也可称着“杰克斯”。

Jexus是Linux平台上具有高安全性、高可靠性、高稳定性的高性能WEB服务器、反向代理网关服务器和自宿主WEB应用程序的托管(容器)服务器。

Jexus除了具备通用WEB服务器所必备的静态文件处理和缓存功能外,还直接支持ASP.NET WEB应用程序,支持PHP,支持反向代理。自6.0版开始,Jexus开创性地设计了“AppHost”功能(HTTP应用程序容器),通过此功能,Jexus可以为Asp.Net Core、Tomcat、GoLang Web、Python Web等“自带HTTP功能的WEB应用程序”提供一体化集成管理。

就中国而言,Jexus是一款完全由中国人自主研发的具有原创性特质的国产服务器软件,支持国产操作系统和国产CPU芯片,真正做到了“安全、可靠、可信、可控”,具备我国党政机关和重要企事业单位信息化建设所需要的关键品质。

Jexus 有如下特点:

1、性能强劲:

在操作系统支持方面,Jexus的设计目标非常明确:只考虑支持Linux和国产操作系统。正因为目标明确,定位清晰,针对性极强,所以在设计过程中完全不需要考虑兼容其它操作系统而不得不编写的大量冗余代码,也无需使用低性能的折衷方案,而是直接使用Linux的长项技术,比如epoll技术、sendfile零拷贝技术等等,核心技术直通操作系统。在编程技术方面,Jexus使用了c/c++与c#的混合编程技术,.Net Native技术,从语言层面为Jexus提供了坚实的保证。

2、安全可靠:

安全性是Jexus有别于其它Web服务器(比如Nginx、Apache、IIS等)的一个重要特色。Jexus初始开发于2006年,2008年在www.linuxdot.net上公开发布1.0版,最初开发的目的是为某政府网站提供Asp.Net跨平台支持,因此,Jexus从诞生开始,就已将其安全性作为开发的首要目标,不但在编码中努力避免漏洞和安全缺陷,而且还开创性地内置了"入侵检测和控制"技术,并在长期的运行实践中不断地完善其策略,优化其算法,为Jexus托管的网站提供了强有力的安全保护。

可靠性是Jexus另一个突出优点。可靠性主要表现在两个方面,一是稳定性,二是"可信可控"特性。在稳定性方面,由于Jexus采用了独特的混合编程技术,通过语言层面的扬长避短,在高性能与高可用性方面得到了平衡。另外,10多年来,Jexus在各种生产场景中摸爬滚打,在"实战"环境中不断地发现问题解决问题,不断地完善,保证了Jexus持续可靠的稳定性。在"可信可控"特质方面,Jexus是我国唯一一款由中国人(宇内流云/刘冰先生)从0开始原生开发的国产WEB服务器,整个Jexus程序系统没有使用任何特殊的第三方组件,甚至连开源代码也基本上没有"参考"使用,是纯粹的"中国血统",从程序开发者身份到程序源代码、程序运行环境等方面确保了Jexus"安全可靠""可控可信"的"信创"品质。

3、功能强大:

首先,Jexus是一款如同Nginx、Apache那样的"通用web服务器",具有通用web服务器必要的功能,除此之外,Jexus还具备如下功能特征:

(1)支持ASP.NET。在Linux上支持Asp.Net运行,是Jexus的重要的特色功能之一(甚至一度被部分用户误认为Jexus就是一款单纯的Asp.Net服务器)。Jexus直接支持.NET Framework 3.5--4.8范围内的所有版本的Asp.Net Web程序。Jexus6.0以上版本已经集成.NET运行环境,服务器无需另行安装mono之类的.NET运行时。

(2)提供Fast-CGI协议支持。通过Fast-CGI,Jexus能支持包括PHP在内的所有拥有Fast-CGI服务接口的WEB应用;

(3)具有强劲的反向代理功能。Jexus支持全站反向代理、部分路径反向代理,支持多目标服务器反向代理(负载均衡),支持TCP“穿透”技术。Jexus的反向代理配置简洁灵活,性能好,功能强。

(4)"AppHost"(自宿主WEB应用程序托管容器)是Jexus独创功能,它的作用是将ASP.NET Core或Node.js、Tomcat、Golang Web等“自宿主(自带HTTP服务)”型的以控制台方式运行的web应用程序以Jexus子进程的形式纳入Jexus统一管控与守护,而无需进行反向代理设置,也无需采用其它方式对这些目标程序进行运行和守护;

(5)具备基于标准的正则表达式语法的强大的“URL重写”功能;

(6)支持HTTPS,具有SSL(TLS v1.0-1.3)加密数据安全传输能力;

(7)支持“国密”,这对于我国“信创”建设具有重要的意义;

(8)直接内置“入侵检测”安全模块,具有入侵检测和防御功能,能自动识别和阻止非法请求。这是Jexus有别于其它Web服务器的重要的特色功能之一;

(9)支持符合OWIN标准的WEB应用程序,如Nancy、SignalR等符合OWIN标准的应用框架,支持WebSocket;

(10)支持包括龙芯在内的国产CPU和国产操作系统。

二、Jexus 的安装与更新

(一)安装前的准备工作:

1、GLIBC版本:目前,Jexus v8 的编译环境是CentOS7.9,对GLIBC版本的最低要求是2.17,因此,Jexus应该在CentOS 7.9、Ubuntu 16.04以上版本或者满足GLIBC版本要求的国产操作系统上运行。

2、依赖库:Jexus使用了.NET NativeAOT技术,集成了Mono环境,因此,安装Jexus的Linux系统需要存在或安装libicu、libkrb5函数库。常用Linux一般默认已经安装了libkrb6或libicu,部分系统需要手工安装。

3、管理员身份:Jexus的安装、启动、停止等操作,操作者必须具备服务器管理员身份(即能使用su或sudo等命令提供root权限)。

(二)在线安装:

指的是服务器能够连接互联网,服务器通过互联网从Jexus官方网站获取最新正式版安装包进行自动安装。安装命令是:

curl https://jexus.org/release/x64/install.sh | sudo sh

curl https://jexus.org/release/arm64/install.sh | sudo sh

curl https://jexus.org/release/la64/install.sh | sudo sh

* 强调:使用上述命令前应该确定自己当前身份是否是root身份。

(三)离线安装:

指的是从jexus官方网站下载Jexus安装包进行安装。这种安装方式常常用于服务器无法访问互联网的内网服务器。

Jexus安装包是一个"tar.gz"压缩包,因此,"离线安装"过程,其实就是下载安装包,传输到目标服务器,解压到工作目录这样的操作过程。

  1. 下载:到www.jexus.org下载你需要的Jexus安装包。

  2. 将安装包上传到服务器的安装目录。Jexus习惯上使用"/usr/jexus"作为工作目录,因此,建议你把安装包上传到"/usr/"文件夹中。

  3. 解压:在jexus安装包所在文件夹中,以root身份解压Jexus压缩包(安装包)。如:sudo tar -zxvf jexus-8.0.x-x64.tar.gz

  4. 删除安装包。

  5. 从备份文件夹中恢复之前Jexus的配置文件(如果有)。

(四)关于Jexus的更新或重装:

由于Jexus是绿色软件,所谓的"安装"其实就是下载和解压,因此,Jexus的更新、重装,其实与上述安装过程是相似的,不同点就是在安装之前多两个步骤:

(1)停止Jexus运行;

(2)删除或更名(备份)之前的Jexus的工作文件夹。

(五)检查版本和初始化:

1、检查Jexus版本号的命令是“/usr/jexus/jws -V”,如果Jexus安装正常,此命令将打印出Jexus的版本号以及集成的 mono.net 运行时的版本号。

2、初始化命令是“sudo /usr/jexus/jws init”,这是安装Jexus后的非必要操作,但是建议执行一次。

三、Jexus 的操作命令

(一)基本操作命令:

Jexus核心命令是“jws”,如果你把jexus安装在“习惯位置”,即“/usr/jexus/”文件夹中,那么,含绝对路径的完整命令将是“/usr/jexus/jws”。

“jws”其实是一个shell脚本文件,具体内容可以自行查看。

Jexus的操作是通过为“jws”提供不同的操作参数实现的,包括“启动(start)”“停止(stop)”“重启(restart)”“运行状态(status)”“初始化(init)”“显示版本(-V)”。初始化和显示版本号已经在前文进行了说明,不再此处复述。

1、启动命令

(1)启动Jexus程序并同时启动所有的网站:

sudo /usr/jexus/jws start

(2)在Jexus运行期间单独启动一个网站:

sudo /usr/jexus/jws start 网站名

* 注:"网站名"在Jexus中,指的是网站配置文件名,jexus的网站配置文件即是"网站名"。

2、停止命令

(1)停止Jexus程序同时停止所有的网站:

sudo /usr/jexus/stop

(2)停止一个指定的网站(web应用程序)

sudo /usr/jexus/stop 网站名

3、重启命令

(1)重启jexus程序和所有的网站程序

sudo /usr/jexus/jws restart

(2)重启指定的网站程序

sudo /usr/jexus/jws restart 网站名

4、显示Jexus是否处理于运行状态

sudo /usr/jexus/jws status

注意:以上命令都加有sudo命令,指的是以管理员身份发起操作,如果你本来就是管理员身份,就不必使用sudo。

(二)关于开机启动:

让Jexus实现开机启动,有两个办法(强调:只能选其中之一):

方法一:通过“/etc/rc.local”进行。

具体方法是:在“/etc/rc.local”文件中加入“/usr/jexus/jws start”一行。

此方法使用简便,但要注意:一是要把jws的路径和文件名写正确,要使用“jws”命令文件的绝对路径;二是rc.local文件要有"可执行"属性,建议运行一下这个命令:“sudo chmod +x /etc/rc.local”。

方法二:将jexus注册到systemd中成为系统服务。

具体方法如下:

1、注册服务:sudo systemctl enable /usr/jexus/jws.service

2、启动服务:sudo systemctl start jws

3、停止服务:sudo systemctl stop jws

4、重启服务:sudo systemctl restart jws

5、注销服务:sudo systemctl disable jws

*** 特别强调:一旦jexus被注册为系统服务之后,jexus的启动、停止、重启等操作只能使用systemctl命令进行操作,不能再使用不带网站参数的“jws start”“jws stop”“jws restart”等命令进行操作。

四、Jexus 的全局配置

1、jws.conf 配置

在jexus的工作文件夹中(一般是"/usr/jexus")有一个基本的配置文件,文件名是"jws.conf",这是Jexus的最重要的全局配置文件。

主要配置项如下:

SiteConfigDir:指定网站配置文件夹的路径,默认配置是jexus程序文件夹下的"siteconf"子目录。该项配置不建议修改。

SiteLogDir:指定jexus日志和网站访问日志的存放路径。默认配置是jexus程序文件夹下的"log"子目录。该项配置不建议修改。

Httpd.Processes:指的是jexus的httpd工作进程的数量(不是ASP.NET工作进程数量),默认为1,设为0表示自动,即由jexus根据服务器cpu数量自行确定。

该项配置能影响Jexus处理html等静态文件以及数据转发等方面的性能,其具体数量应该结合服务器cpu数量、内存富余度和并发请求数量综合考虑,一般来情况下配置2个进程就行,如果服务器负载重、并发量大、cpu核心数量多,可以按cpu核心数的四分之一(最多二分之一)设置。

Httpd.MaxTotalMemory:指的是允许Jexus的httpd工作进程最多使用多少内存,单为是"兆字节",设为0表示"自动"。

Httpd.MaxCpuTime:表示Jexus的httpd工作进程最多能使用多少cpu时间,单位为秒,达到这个时间值后,jexus的httpd工作进程就会自动重启。设为0表示禁用这个选项(不建议启用这个先选项)。

Httpd.MaxConnPerIp:表示jexus httpd工作进程允许每个IP地址能同时发出多少个TCP连接,当某IP地址超过这个数量的连接时,Jexus将拒绝接受。设为0表示禁用这个选项。

Jexus统计每IP发出的连接数是由与它连接的socket所反映的IP地址决定的,如果你在Jexus服务器前边没配备了其它反向代理服务器,Jexus只能得到该反向代理服务器的地址,这次架构下,请不要在Jexus上设置IP数限制。

Php-fcgi.Set:Jexus的PHP FastCGI管理器配置。本设置的值分两部分,两个部分之间用英文逗号分开。第一部分是指定php-cgi命令文件的完整路径(一般是"/usr/bin/php-cgi"),第二部分是设定php-cgi的最大工作进程数量。本项设置不是必须的,如果你服务器没有PHP网站或者有其它的方式提供PHP环境(比如使用了php-fpm),就不必启用该选项。

2、mime.conf 配置

Jexus 中,描述数据类型的配置文件是 jexus 根文件夹中的 mime.conf 文件,它是一个文本文件,可以使用 vim 等任何文本工具进行编辑修改。

mime.conf 文件中,每一行代表一个类型的数据,由“文件扩展名”和“数据类型描述”两部分组成,两部分由英文冒号分开,如:

wasm:   application/wasm

五、Jexus 的网站配置

Jexus Web Server 可以同时运行多个站点,没有数量限制。

一个具体的站点,由"端口""域名""虚拟根路径"三个基本要素确定,三个要素中任何一项不同,即表示不同的站点。

必须把所有网站配置文件放到全局配置文件"jws.conf"所指定的网站配置文件夹内(默认是jexus工作目录内的"siteconf"子文件夹)。这个文件夹除了网站配置文件,不能有其它任何文件,因为jexus会认为该文件夹中的任何一个文件都代表着一个具体的网站配置(子文件夹除外,不在jexus搜索之列)。

每个网站有且只有一个配置文件,配置文件的文件名代表这个网站的名称,因此配置文件的文件名应该尽量具有网站个性特点,以便管理员容易记忆和识别。要特别注意:文件名不能有空格!支持中文,但不建议使用。

一个网站可以拥有任意多的域名或"泛域名",不同网站不能有相同的域名,每个端口最多只能有一个没有域名的网站(域名栏填"*"号)。在80端口,这个没有域名的网站叫做"默认网站"。

(一)网站配置文件的基本配置项:

port:站点服务端口,这是必填项。http的标准端口是80,https的标准端口是443,最大值是65535。

root:根路径。指定网站虚拟根路径(URL根路径)和存放网站文件的物理文件夹路径(物理根),两种路径用一个以上英文空格符分开。URL根路径常常是“/”。如果你的网站文件存放在“/var/www/default”这个文件夹中,那么,root项就应该是“root=/ /var/www/default”。

root 项是必填项。如果遇上在当前服务器并没有网站程序的"全站反向代理"这种情况,你可以在服务器单独创建一个空白文件夹并设定它,也可以设为"/tmp"。

hosts:配置网站的域名。一个站可以指定多个域名,各域名间用英文逗号分隔。也可以配置“泛域名”代指某个域名下的所有子域名,比如“*.mysite.com”。如果填“*”号,就表示访问这个站可以是任意的域名或是服务器IP地址,即,区分这个网站不是用域名区分,而是用端口或虚拟根路径进行区分。

(二)网站配置文件的拓展(高级)配置

一个网站配置了前述的三项基本选项一般就能正常运行了。本部分指的是基本配置之外的拓展(高级)配置,包括"反向代理""URL重写""端口转发""AppHost""IP地址黑(白)名单"等等。

具体说明如下:

1、默认首页(Indexes):

Jexus已经内置默认首页的定义,包括index.html、index.htm、default.html、default.htm、index.aspx、default.aspx。如果你网站的首页没有被包括在这些默认首页中,可以通过启用该选项指定你的默认首页。

2、URL重写(rewrite):

"URL重写"是指WEB服务器将访问者向服务器发起的URL请求按指定的匹配规则解释和匹配到另外的一个真实RUL路径资源上。比如,当访问者访问".php"、".asp"等类型的文件时,服务器以 "/404.html" 这个URL应答,你可以设为:

rewrite=^/.+?\.(asp|php|cgi)$ /404.html
rewrite格式:

"rewrite="的后面是两部分阻成,两部分之间由一个空格分开。

空格前是匹配的条件:用正则表达式描述URL的匹配条件。

空格后是匹配的目标:指的是如果用户访问的路径合乎前面的匹配条件时,服务器将以哪个规则回应。

如:

把"/bbs"匹配到"/bbs/index.aspx",把"/bbs/file-编号" 匹配到"/bbs/show.aspx?id=编号":

rewrite=^/bbs$ /bbs/index.aspx
rewrite=^/bbs/file-([0-9]{1,6})$ /bbs/show.aspx?id=$1
格式解释:rewrite的等号后含有两部分内容,用空隔分开。前半部分是一个正则表达式,用于描述需要URL重写的(用户浏览器中的)url路径样式,后半部分是当用户的URL合乎前面的正则表达式时,JWS应该重写和访问的真实URL路径。

3、禁止或允许某IP或IP段访问网站(denyfrom、allowfrom)

A、只允许某些IP地址访问网站(白名单功能)

默认情况下,允许所有IP地址访问。如果手工设置IP地址白名单,那么,白名单之外的IP地址会自动划入黑名单而禁止访问服务器。

配置格式,形如:

allowfrom=1.2.3.*   # 一个IP地址段
AllowFrom=2.2.3.3   # 一个具体的IPv4地址

B、禁止某IP或某IP段访问网站(黑名单功能)

默认情况下,本配置为空。如果手工添加需要禁止访问的IP地址(段),必须合乎一个规则:黑名单必须是白名单的真子集。

配置格式,形如:

denyfrom=111.222.111.*   # 一个IP地址段
denyfrom=101.201.1.132   # 一个IP地址

注:为了不使配置复杂化,建议只使用“黑名单”或只使用“白名单”。

4、禁止访问某文件夹及其子文件夹中的内容(DenyDirs):

格式是:DenyDirs=PATH

PATH指的是相对于网站根文件夹的URL路径,如 "/abcfiles"或"~/abcfiles"。可以同时指定多个路径,用英文逗号分开。

5、是否对请求的URL参数等进行安全检测(CheckQuery)

本选项的值包括true和false之一,默认是true,即需要进行安全检查,除非你的确需要关掉这个选项,否则可以不填。格式如下:

CheckQuery=false

注:关掉本项可以提高服务器速度,但就安全而言,不建议关掉它。

6、NOFILE(无文件替代)功能:

本功能是Jexus的特有功能,指的是如果服务器找不到真实文件时,服务器将用使用一个什么文件去替代。格式是:

NoFile=PATH

PATH:指定的替代文件和相当于网站根文件夹的完整路径,如:

Nofile=/mvc/controller.aspx或者Nofile=/index.php

(提示:替换后,Jexus会把原始请求的路径资源保存到一个名为"X-Real-Uri"的HTTP请求头中,以便目标文件作进一步处理)

7、关闭网站访问日志(NoLog):

nolog=yes

(注:禁用网站日志功能会轻微提高WEB服务器系统的处理速度,但不足也是明显的,就是你无法详细了解网站的访问情况了)

8、长连接开关(Keep_Alive):

Keep_Alive=true或false

注:其值为true、false或yes、no,默认使用长连接(true),大多数情况可以不使用该选项,除非你认为真有必要禁止长连接。

9、反向代理功能(Reproxy):

这是Jexus的一个重要功能。指的是当用户访问某个路径或任何路径时,Jexus将这个请求转发给其它的服务器。

通过Reproxy功能,我们可以实现负载均衡或"高可用性"。

格式是:

Reproxy=请求路径 目标服务器IP:端口 | 附加参数,如:

Reproxy=/  http://1.1.1.1:800                   #全站反代
Reproxy=/  http://1.1.1.1:800 | HostFixed       #带附加参数的反代
Reproxy=/abc  http://1.1.1.1:900/abc            #部分路径反代
Reproxy=/  http://1.1.1.1:5000, https://2.2.2.2:5000  #多目标反代

值得强调的是,“多目标服务器的反向代理”将产生负载均衡(WEB集群)和高可用性效果,即,当用户访问该站时,Jexus就会随机选择一台后端服务器进行处理,如果Jexus发现某台服务器已经宕机而没有应答,Jexus就会把请求转发给其它剩余的服务器。

* 需要注意:

  1. 当“部分反代”和“全站反代”多条规则同时出现时,一定要把“全站反代”那一条规则放到最后。
  2. Jexus v8.0 开始支持对后端(上游)工作服务器为 HTTPS 协议的反向代理,在Reproxy配置中,如果目标路径不写“https://”,则默认为 HTTP 协议。
  3. Jexus Reproxy配置行中支持“参数”,参数应放在最后,与主配置之间用英文“|”字符分隔。
  4. Jexus 8.0的Reproxy配置还在进化中,目前的配置只对应当前的发行版。

10、透明反代(反代中的 transparent 参数):

在反向代理设置项中,加上“Transparent”字串参数后,反向代理即成为“透明的”反向代理,即,后端服务器可以直接获得前端访问者的IP地址。

但透明代理是否有效,还将涉及到网络配置,更多相关表述请参数本手册“问答”部分。

11、使用FAST-CGI提供的服务(FastCGI.Add):

对于TCP连接的fast-cgi:

fastcgi.add=php | tcp:127.0.0.1:9000

对于unix sockets连接的FastCGI:

fastcgi.add=php,php3 | socket:/tmp/phpsvr

12、启用或关闭gzip压缩功能(UseGZIP):

UseGzip=true或false

* 注:Jexus默认已经启用gzip压缩功能,所以,除非你希望禁止该功能,才需要显式地设置此选项。

13、指定网站的用户身份(User):

格式是:User=用户名

"用户名"指的是Linux系统中已经存在的一个用户名称,比如 www-data。

默认情况下,jexus将使用"root"作为网站工作进程的用户身份,这种身份的权限很高,为了网站更加安全,建议指定一个权限低的用户身份,而"www-data"是大多数Linux系统的内置的专为网站准备的一个用户名,其权限较低,适合指定给网站使用。

14、启用HTTPS进行SSL安全传输(UseHttps):

要为网站启用https,首先需设置UseHttps=ture选项,表示该站启用Https安全连接。另外,对于https,网站端口应该设为443(https默认端口)。

然后是设置SSL证书、私钥、协议版本、加密套件。

(1)设置证书文件:

ssl.certificate=完整的证书路径和文件名

(2)设置密钥文件:

ssl.certificatekey=密钥文件的完整路径和文件名

(3)协议版本:

ssl.protocol=版本列表

指的是ssl及tls协议及版本号,包括:TLSv1.0、TLSv1.1、TLSv1.2和TLSv1.3。可以同时多个版本号,各版本号之间用空格分隔。

* 该选项不是必填项,但为了安全起见,建议启用并只选择TLSv1.1、TLSv1.2、1.3三个版本号,甚至只使用TLSv1.2、TLSv1.3两个版本号。

(4)加密套件:

指定SSL/TLS加解密过程中使用和不使用的算法套件的列表,格式是“ssl.ciphers=套件列表”,如:

ssl.ciphers=ECDHE-RSA-AES256-GCM-SHA384:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE

本选项不是必填项。

15、ASP.NET网站专用配置:

(1)配置Asp.Net工作进程数量(默认为1):

格式为:AspNet.Workers=工作进程数

默认情况下,Jexus为Asp.Net提供1个工作进程,单工作进程的好处是节约内存,但也有弱点,比如,难以充分发挥多CPU(多核)的性能优势,大并发承受力、容灾能力等方面比多工作进程弱等等。

为Asp.Net开启"多进程"工作模式后,ASP.NET网站的web.config中的Session状态服务不能再使用"InProc"模式,而应该使用"StateServer"等其它非程序内存贮模式,否则极易出现Session数据丢失问题。

另外,当Asp.Net使用多进程并行处理时,为了在验证数据的加密、解密方面保证一致性,还应该在web.config文件夹中的"system.web"节中配置"machineKey"项。例如作如下配置:

<machineKey 
    validationKey="32E35872597989D14CC1D5D9F5B1E94238D0EE32CF10AA2D2059533DF6035F4F" 
    decryptionKey="B179091DBB2389B996A526DE8BCD7ACFDBCAB04EF1D085481C61496F693DF5F4" 
/>

设置ASP.NET多进程数量并非越多越好,要综合考虑服务器CPU核数、可用内存、并发压力等多方面因素。一般来说,进程数量配置为CPU核数的一半就行了,最多不要超过CPU的核心数。

(2)限制ASP.NET消耗CPU的时间数(默认为0,无限制):

格式是:AspNet.MaxCpuTime=单位为秒的时间值

配置该选项后,当该网站使用cpu的时间累积到你指定的最大值之后,Jexus将重启这个网站。

(3)限制Asp.Net使用内存的最大值(默认为0,无限制):

格式是:AspNet.MaxMemory=以兆为单位的内存数

设置该选项后,当你的网站程序使用的内存超过指定的最大值时,Jexus将重启该站,释放之前占用的内存空间。

16、WEB应用程序端口转发(AppHost.Port):

这是Jexus特有功能。

格式是:AppHost.Port=端口号

本项配置指的是将当前网站的请求数据全部转发到本机某WEB应用程序侦听端口,比如把请求转发到Asp.net Core应用程序的5000端口上。

可以使用多个端口,各端口号之间用英文逗号分开。

端口转发与反向代理功能相近,但端口转发的性能更高。

注意:一是端口转发不能用于虚拟根路径不是"/"的网站;二是端口转发只能在同一服务器上进行。

17、自宿主WEB应用程序托管服务(AppHost):

“自宿主web应用程序托管”是Jexus的一项独有的富有创造性的重要功能,它为Asp.Net Core的Kestrel、Java的Tomcat甚至Node.js、golang web等自带Http服务的“自宿主Web应用程序”提供了简单可靠、可控的一体化集成管理。

格式:AppHost={Cmd=命令及参数; AppRoot=程序文件夹路径; AppPort=应用程序端口号}

也可以分行书写(分行书写时,“AppHost={”必须在同一行),例如:

AppHost={
  Cmd=命令及参数;
  AppRoot=应用程序文件夹路径;
  AppPort=应用程序端口号;
}
子配置项说明:

注意:

1、AppHost像AppHost.Port一样,不支持虚拟路径;

2、AppHost功能是将指定的具有http服务能力的web应用程序纳入jexus工作进程进行管理,对Asp.Net Core或tomcat、spring、node.js等自宿主web应用程序用于生产环境时具有重要的意义。

3、不要同时启用AppHost和AppHost.Port。

18、OWIN 配置

Jexus支持各种符合OWIN协议的 .NET WEB 应用。OWIN应用应该添加一个“适配器”(一个.NET class)提供给Jexus调用,该适配器中必须包括一个名叫 OwinMain 的公共方法,该方法是Jexus与OWIN WEB应用进行数据交换的核心通道。

有关OWIN应用及适配器代码编写方面的问题和技术,由于专业性较强,需要进一步了解的朋友可以与Jexus作者联系。或参考github上的Jexus开源项目中的 OwinTest 的源代码

具备“适配器”这个前提后,网站开启OWIN应用的办法是在网站配置文件中,添加 OwinMain 项,这个项的值就是具有OwinMain方法的类库(程序集)的名称,如:

OwinMain = MyOwinApp.dll

六、问 答

Jexus从2008年正式公开发布以来,一直受到了国内外Web建设者们的关注,涉及到了各种规模和不同类型的项目,通过与开发者们的互动,我们得到比较丰富的使用经验和问题处理经验。本章节我们以问答的形式向大家共享一些具有普遍性的经验或常识。

1、如何评估传统的Asp.Net是否能迁移到Linux平台?

一个重要的观察点就是你的Asp.Net应用程序以及所引用的第三方库是否是“标准的”、“通用的”,即是否不依赖Windows系统所特有的功能、组件和系统函数。比如,不能使用Windwos特有的ActivX/COM技术,不能通过Dllmport方法调用windows特有的kernel.dll、user32.dll等函数库的函数。另外,要符合linux的文件与路径命名规则,比如文件名大小写敏感等。

2、传统Asp.Net在Linux平台上性能如何?

“传统Asp.Net”指的是有别于“Asp.Net Core”的基于传统的“.NET Framework(.NET 1.0-4.8.x)”运行环境的 .NET WEB应用程序框架。 传统的ASP.NET程序在Linux上运行是依赖“mono”这个开源的跨平台运行时及其相应的跨平台通用类库(Jexus已集成mono环境,不需要单独安装)。现在,mono在技术上已经成熟,性能也很优秀,但由于它需要照顾“跨平台”这个特殊需求,部分特性必须作出一些折中处理,因此部分性能可能略弱于只能在Windows系统上运行的.NET Framework。

3、为什么说Jexus是Asp.Net Core的最理想的宿主服务器?

Jexus通过“AppHost”配置支持ASP.NET Core应用程序。“AppHost”是Jexus专门针对那些自身具有http通讯功能的WEB应用程序设计的一项服务功能,该功能相当于一个容器,把HTTP自宿主应用程序作为Jexus的一个子进程纳入Jexus的统一管理、守护和进程间数据转发,ASP.NET Core等HTTP自宿主程序不再需要寻求其它方式运行和守护,具有维护简单,管理方便和数据转发高效稳定的优势。

* 值得一提的是,Jexus不但是ASP.NET Core的理想宿主,也可以是tomcat、node.js等自带HTTP功能的WEB应用程序的理想容器,它们都可以纳入Jexus的AppHost容器进行管控和运行。

4、作反向代理服务器,用Jexus还是用Nginx?

Nginx是一款在中国国内使用得比较广泛的一款优秀的反向代理服务器,与Nginx相同的是,Jexus同样也具有灵活高效的反向代理能力,与nginx不同的是,Jexus的反向代理具有安全检测功能,较nginx那种单纯的数据转发,Jexus的反向代理更加安全可靠。

* 因此,从安全角度看,Jexus更适合做反向代理服务器、负载均衡网关服务器,更适合成为大型WEB项目面向公众一侧的“入口服务器”;从国内信息化建设角度看,Jexus作为一款性价比极高、安全性极强的具有完全自主知识产权的纯国产Web服务器中间件,更是“信创”建设中Web服务器、反向代理服务器最明智的首选项。

5、迁移Asp.Net应用程序到Linux平台时要注意些什么?

(1)编译发布:建议使用预编译发布而不是直接将源码上传到服务器。

(2)清理web.config:

确保你的web.config是使用的UTF-8字符集编码,如果不是UTF-8编码,必须去掉所有的中、日、韩等各种非英文文字。字符集方面的问题,是造成ASP.NET程序无法启动或web.config配置无效的主要原因。

将web.config中的所有“\”号改为“/”号;将所有的windows路径字串改为符合linux规范的linux路径。

(3)最小化引用:

用Visual Studio的ASP.NET模板创建的默认网站,VS会自动给你添加大量的程序集引用,大量的引用,看似更加完整,实际上负面作用也不小:一方面很多程序集对你项目来说是用不上的,浪费空间和内存,另一方面是会给跨平台的兼容性造成隐患,所以,要认真请理引用,让引用的程序集数量“最小化”。

具体的办法是在VS中打开“NuGet包管理器”,把用不上的引用卸载掉,比如“Microsoft.CodeDom.Providers.DotNetCompilerPlatform”这个引用就应该卸载掉。

(4)清理网站bin文件夹:

你的ASP.NET程序是在Windows上开发的,用的dll是Windows的,所以,为了更好地保证跨平台的兼容性,你 必须消除网站bin文件夹中多余程序集,精简dll数量。原则上,Jexus已经自带了的dll(在Jexus的“runtime/lib/mono”文件夹下),网站bin文件夹中就不应该再出现同名同版本的。要尽可能减少从windows(VS开发环境)中带过来的dll,提高兼容性,减少跨平台风险。

清理网站bin文件夹的最简单办法是“排除法”:首先删除网站bin文件夹中的所有文件(项目自身的dll除外),然后通过浏览器访问该网站,查看错误页,错误页中提示差什么dll,你就上传什么dll,反复重复这个步骤,直到网站不再提示缺少某个dll为止。

6、AppHost与AppHost.Port有什么区别?

相同之处是,AppHost与AppHost.Port都具有向本地指定端口进行数据转发的能力,不同之处在于,AppHost.Port只负责向指定的端口转发数据,而AppHost不仅具有向指定端口转发数据的功能,而且同时具备启动、管理、守护WEB应用程序的能力。AppHost.Port只是AppHost的一个子集,它更适合于向已经用其他方式启动并运行着的WEB应用程序提供全站式的反向代理服务。

* 需要注意的是,AppHost和AppHost.Port不要同时启用。

7、透明代理有什么好处,如何在反向代理中设置透明代理?

透明代理最明显的好处是,应用程序可以直接获取访问者的IP地址。要在反向代理中启用“透明代理”,只需在反向代理配置项中添加字串“Transparent”属性标记就行。

* 注:在Jexus中,设置透明代理是很容易的事,但是,透明代理能不能正常使用,还涉及到服务器物理网络配置方面的复杂内容,如果需要使用,请与Jexus作者联系。

8、反向代理时,如何把域名传给后端目标服务器?

在反向代理配置中,添加“HostFixed”或者“Host=Fixed”字串作为属性标记

9、由于IP端口数有限,如何让Jexus支持超大并发的反向代理?

当反向代理服务器向后端目标服务器转发数据时,每一个连接都将占用一个本地端口,而一个IP地址上只能绑定65535个端口,因此,解决超过65535个并发连接的办法是添加更多的本地IP地址。

自V7.1版本开始,Jexus已经在反向代理服务中启用多地址绑定功能,具体的设置是:在网站配置文件中,将可以使用的面向后端的本地IP地址列表添加到 forward_bind 项。

10、为什么说不要在ASP.NET会话过程中开启多线程或使用async、await异步操作?

简单地说,就是为了保证ASP.NET上下文的连贯性,让运行时正确把握会话的生命周期。如果我们在处理请求过程中使用了多线程等异步操作,ASP.NET引擎将失去对该会话的运行状态和生命周期的把握,其直接后果就是在会话处理并没有真正完成之前就提前结束了会话。

11、使用HttpClient对象与远程https服务器连接时出现验证失败的错误,怎么处理?

一般来说,新安装的Linux系统的SSL根证书是不完整的也不是最新的,所以,当我们用HttpClient之类的组件访问某些https网站时就可能出现SSL握手失败的情况,这时,我们可以有两种处理方式:

处理办法一:更新根证书。Jexus文件夹中自带了根证书更新程序“cert-sync”,它的参数是操作系统根证书的路径和文件名,不同的系统有不同的位置。比如:

Ubuntu等Debian系操作系统:
sudo /usr/jexus/cert-sync /etc/ssl/certs/ca-certificates.crt
CentOS等RedHat系操作系统:
sudo /usr/jexus/cert-sync /etc/pki/tls/certs/ca-bundle.crt

处理办法二:对HttpClient设置参数,让其忽略服务器端证书验证。可参考下边的代码进行:

var handler = new System.Net.Http.HttpClientHandler(){
    ServerCertificateCustomValidationCallback = (a, b, c, d) => true
};
var client = new System.Net.Http.HttpClient(handler);

12、Jexus在同一个端口号能支持配置多少个网站?

Jexus在同一个端口号可以支持配置无数个网站。

但要强调的是

13、网页出现乱码是怎么回事,应怎么解决?

网页出现乱码可能是由两方面的原因造成的。第一种可能性是网页声明的字符集与实际用的字符集不统一,比如<meta>中指明正文的charset是utf8,但是网页实际用的却是GB2312;第二种可能性是数据库存储文本的格式用的字符集也网页所用的字符集不同。

解决的办法:网页字符集声明(如果有的话)、网页本身以及网页对应的cs文件、数据库文本,全部统一使用UTF8格式。

七、授权与交流

(一)Jexus的使用授权与相互支持

1、Jexus 6.x及之前的版本属免费软件,任何人可以自由下载、传播和使用,但Jexus作者不对Jexus的用途、作用、效果、技术支持以及其它相关内容作任何明确或暗含的承诺,不承担任何直接或间接的责任。

2、Jexus v7.0及更高版本,允许个人、20人以下的私营企业或非营利社会组织免费使用,也允许WEB项目开发厂商作为测试环境免费使用。其它情况下使用,原则上需要获得Jexus作者刘冰先生(网名:宇内流云)的商业授权。

3、Jexus作者对所有Jexus版本提供技术支持或定制开发等有偿服务。

4、为了让Jexus可持续发展,欢迎广大用户及热心朋友对作者提供力所能及的支持,包括但不限于:

(1)您可以利用各种机会宣传Jexus优良品质、实用价值及成功案例,分享使用心得和技术理论,为推广、普及Jexus付出努力;

(2)您可以为初学者解难答疑;

(3)你可以将Jexus的一些重要的技术文档翻译为英文或其它文字并公开、免费发布,为Jexus跨出国门走向国际添砖加瓦;

(4)您可以利用开发新工程或升级旧工程的机会,利用Jexus把原来部署在windows上的web应用部署到Linux上,拓展Jexus的使用量;

(5)您可以通过Jexus社区、QQ群、邮箱等各种渠道及时反馈Jexus的BUG,或者向Jexus的开发者、维护者提供富有建设性意义的各种建议;

(6)您可以为Jexus提供广告支持,或者向Jexus作者提供力所能及的经费赞助,为Jexus的持续发展提供动力源泉。

(二)Jexus官网、社区及联系方式

官方网站:www.jexus.org

项目仓库:[GitHub][Gitee]

QQ群号码:700864320、102732979

邮箱地址:j66x@163.com