那些年,我们用过的服务器软件
引言
看过这部电影的人都老了。。。
很多人都知道我是一名后端开发底层小码农,平时打交道最多的就是服务器,而关于服务器,又有一堆名词,看起来好像是一个意思,仔细想想又好像不对。
不信?
先放三个名词「Web 服务器」、「HTTP 服务器」、「应用服务器」。这三种服务器有谁能现在立刻马上区分开么。
反正我是区分不开。这个问题要是扔到一堆程序员中间,指不定还能引发一场菜鸡争夺战。
虽然我不会,不会可以度娘啊,希望经常看我文章同学可以有我这种敢于承认自己菜的精神,没啥好丢人的,不会可以学,学完了下次就会了,总比不会装会死鸭子嘴硬,下次还不会要强。
经过我一翻度娘 + 整理后,基本上这三个名词解释有了:
「Web 服务器」它一般指的是网站服务器,可以向浏览器( PC 端或者移动端)等 Web 客户端提供服务,供请求数据或者下载数据。
而由于 Web 服务器主要支持的协议就是 HTTP 或者 HTTPS ,所以通常情况下 Web 服务器和 HTTP 服务器是等同的,这两种服务器之间是可以画上等号的。
而应用服务器是一个很大的概念,微软对它的定义是「我们把应用程序服务器定义为:作为服务器执行共享业务应用程序的底层的系统软件。 就像文件服务器为很多用户提供文件一样,应用程序服务器让多个用户可以同时使用应用程序(通常是客户创建的应用程序)」。
讲的通俗一点就是一种特定应用的承载容器,一般来讲,它需要有运行时环境的支持,比如说在 Java 领域,比较常用的应用服务器 Tomcat ,它就必须要 Java 的环境支持。
站在我的角度上,一名 Java 底层码农从业人员的角度上来看,「Web 服务器」、「HTTP 服务器」、「应用服务器」之间的界限是非常模糊的,因为同样一个 Tomcat 服务器,我叫它「Web 服务器」或者「HTTP 服务器」没有问题,叫它「应用服务器」也没有半毛钱问题。
常见的「Web 服务器」有 Nginx 、 Apache 、 IIS (这个做 .Net 的同学应该不陌生),常见的「应用服务器」软件包括 WebLogic、JBoss,前者更轻量级,后者更重量级。
静态服务和动态服务
接下来科普另一个概念:「静态服务」和「动态服务」。
「静态服务」返回的是一些静态资源,比如图片、HTML 、 CSS 、 JavaScript 等资源,这些静态资源有一个显著的特点是在我们的电脑上,只要路径写对了,可以在浏览器里面直接访问。
比如我在电脑上新建一个文件,把后缀改成 html
,里面使用 html
随便写点内容:
<html>
<h1>Hello World!</h1>
</html>
静态服务就是每个人访问,得到的内容都是一样的,而动态服务就比较牛逼了,能做到每个人访问,得到的内容都是不一样的。
最直接的例子就是经常用的淘宝京东这些网站,登录以后,访问自己账号的个人中心,肯定每个人得到的结果都是不一样的结果。
还有就是我的博客,最开始我的博客是使用 Hexo 搭建的静态博客,托管在腾讯云的文件服务上,后来开了一台云服务器,就换成了使用 WordPress 构建的动态博客。
Nginx
Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件( IMAP / POP3 )代理服务器。
不查还真不知道,原来 Nginx 还提供了 IMAP / POP3 / SMTP 服务,设置过邮箱客户端的同学对这三个名词应该不陌生。
关于 Nginx ,比较令人遗憾的一件事是,它的作者伊戈尔·赛索耶夫进了监狱。
Nginx 的特点是占有内存少,并发能力强,在同类型的网页服务器中表现较好,国内比较有名的公司,比如说百度、京东、新浪、网易、腾讯、淘宝等都在使用。
Nginx 现在用途最多的应该是作为反向代理服务器在使用,因为它的特性稳定、占用系统资源少、并发能力强,一般都直接放在直面用户的最外层应对用户流量。
用户的访问请求先落到 Nginx 上,由 Nginx 进行代理转发,负载均衡到后续的 Tomcat 应用服务器上,尽可能的提升系统的稳定性。
至于 Nginx 如何复杂均衡到后面的应用服务器上,这就是另一个问题了, Nginx 有很多种的负载均衡方案,这里我就不展开介绍了。
Nginx 是一个典型的静态服务,把图片等内容放在 Nginx 上,可以通过固定的链接直接访问。
不过现在通过 Lua 的加持,我们也可以在 Nginx 做一些动态服务才能做的事情,这就是大名鼎鼎的 OpenResty 。
至于 Nginx 安装或者是 OpenResty 的安装以及简单的使用,大家可以访问各自的官网查看,我就不演示介绍了(反正都不难)。
Tomcat
在我的码农生涯中,使用最多的莫过于 Tomcat ,没有之一。
Tomcat 启动成功的话,访问它的首页,正常情况下是能看到一只猫的,虽然这只猫长得实在是有点抽象,但人家确实是只猫。
Tomcat 是 Apache 软件基金会( Apache Software Foundation )的 Jakarta 项目中的一个核心项目,由 Apache 、 Sun 和其他一些公司及个人共同开发而成。
Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,这也是为什么它可以风靡全球的重要原因。
由于这个项目有了 Sun 公司的参与和支持,所以 Tomcat 一般都会支持最新版的 Servlet 和 JSP 规范。这也是为什么 Java 初学者接触到的第一个 Web 服务总会是 Tomcat 。
但是 Tomcat 并未支持 EJB 和 JMS ,所以说 Tomcat 是一款轻量级的 Web 容器。
GlassFish
Sun 公司为 Java 提供了商业兼容的 Web 容器: Glassfish ,不过说实话,我没怎么用过这个容器,这个 Web 容器仅存在于我上大学的时候的课本上以及课后大作业上。
GlassFish 达到产品级质量,可免费用于开发、部署和重新分发。开发者可以免费获得源代码,还可以对代码进行更改。
Glassfish 既是 EJB 容器也是 WEB 容器,它支持最新版的 Java EE 标准。
而刚才前面介绍的 Tomcat 则仅仅只是一个 Web 容器。
Jboss
Jboss 是一个基于 Java EE 的开放源代码的应用服务器。 JBoss 代码遵循 LGPL 许可,可以在任何商业应用中免费使用。
Jboss 和上面的 Glassfish 一样,同样是企业级的 Web 容器,并且在 2004 年 6 月, JBoss 公司宣布, JBoss 应用服务器通过了 Sun 公司的 J2EE 认证后,一直在紧跟最新的 J2EE 规范,而且在某些技术领域引领 J2EE 规范的开发。
因此,无论在商业领域,还是在开源社区, JBoss 成为了第一个通过 J2EE 1.4 认证的主流应用服务器。 JBoss 应用服务器已经真正发展成企业级应用服务器。
之后好景不长,在 2006 年, JBoss 被 Red Hat 以三亿五千万美金并购。
之后在 2019 年,也就是去年, Red Hat 为 JBoss Application Server 换了一个新的名字,即: WildFly 。
因为 JBoss 本身是开源免费的,而 Red Hat 的企业产品 JBoss EAP 是一个收费产品,Red Hat 为了使这两个产品差异化,避免用户混淆,而进行更名。
JBoss 版本:
- 社区版:JBoss AS(Application Server) -> WildFly
- 企业版:JBoss EAP(Enterprise Application Server)
JBoss 核心服务不包括支持 servlet / JSP 的 WEB 容器,一般与 Tomcat 绑定使用, JBoss 的 Web 容器使用的是 Tomcat 。
Apache
如果不是 IT 行业,如果说起来 Apache ,是不是大多数人想到的是这个东西:
不过显然我要说的不是这个,而是这个小羽毛:
说起来惭愧,我在刚入门的很长一段时间中,一直以为 Apache 就是 Tomcat , 傻傻分不清楚。
后来接触到 PHP 以后,才知道他们俩完全不同, Logo 就不同(这不是废话)。
Apache 一般是指 Apache HTTP Server,是 Apache 软件基金会(和 Tomcat 同属一家基金会,并且 Apache 服务和 Apache 基金会名字都一样,新人能分清才见鬼了)下的一个网页服务器软件。
由于其跨平台和安全性,被广泛使用,是最流行的 Web 服务器软件之一。它快速、可靠并且可通过简单的 API 扩展。
我现在的博客站使用的就是 Apache 的服务,当时搞 WordPress 的时候着实坑了我一把,完全没想到一个 PHP 环境这么难搞,后来在网上找问题的搜索的时候才知道有 LAMP 这么个东西。
- Linux,操作系统。
- Apache,网页服务器。
- MySQL,数据库管理系统(或者数据库服务器)。
- PHP 、 Perl 或 Python,脚本语言。
不过还可以使用 Nginx 替换 Apache ,这个新的组合叫 LNMP 。
Jetty
Jetty 和 Tomcat 有很多相似之处,比如说可以为 JSP 和 Servlet 提供运行时环境。Jetty 是 Java 语言编写的,它的 API 以一组 JAR 包的形式发布。
相比较 Tomcat 而言, Jetty 更加的轻量级,因为 Tomcat 除了遵循 Servlet 规范以外,自身还扩展了大量 Java EE 特性以满足企业级应用的需求。
但对于大量普通的互联网应用而言,并不需要用到 Tomcat 其他高级特性,所以在这种情况下,使用 Tomcat 是很浪费资源的。
而这时换成 Jetty ,每个应用服务器省下那几 MB 内存,对于大的分布式环境则是节省大量资源。
Jetty 可以同时处理大量链接并且长时间的保持这些链接,例如,一些 Web 聊天应用非常适合用 Jetty 服务器。
Jetty 的架构比较简单,它有一个基本数据模型,这个数据模型就是 Handler,所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮我们管理这些 Handler 的。
Resin
最后一个放出来的是 Resin ,不知道有多少人听说过这个 Web 容器。
Resin 是 CAUCHO 公司的产品,也是一个 Web 容器,对 Servlet / JSP 提供了良好的支持,性能也比较优良, Resin 自身采用 JAVA 语言开发。
基于百度百科的介绍是说 Resin 是一个非常流行的 Web 容器。
请恕我直言,这个容器真的这么流行么,如果我不是因为维护一个公司的老系统,还真不知道还有这么个 Web 容器。
可能 Resin 流行的年代比较久远了,从我入行以后就不流行了。
其他
再说几个只听过没接触过的容器:
- Undertow: JFinal 框架的默认容器切换成了 Undertow 。
- WebLogic: 甲骨文出品,这个我没接触过,不过听朋友讲用这个大多数都是银行,据说买一买挺贵的。
- WebSphere: IBM 出品,这个和上面那个 WebLogic 一样,只听说过银行在用。
JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。用于一些小项目还是很合适的。
WebLogic 和 WebSphere 一看出品方都挺 NB 的,据说还有后台界面可以操作使用,发布程序都是点鼠标完成的。
不过现在发布程序大多数都开始用 Jenkins 了,其实也方便了很多,包括很多公司可能都上线了 DevOps 系统,程序发布只会越来越简单。