我们首先来看看三个内容的含义:
nginx is a free,open-source,high-performance http server and reverse proxy,as well as an IMAP/POP3 proxy.通俗的说Nginx提供web服务,反向代理,以及IMAP/POP3代理,那么什么是web服务?反向代理?IMAP/POP3代理?
web服务:服务端通过网络可以提供给客户端所请求的资源,
反向代理:代表资源服务器来回应客户端的请求(或者正向代理的请求),至于资源服务器为什么不自己回应,想想被告与被告律师的关系(被告的律师看做反向代理,被告是什么?自己猜吧(ˇˍˇ) 想~),正向代理是什么?原告的代理律师就是正向代理)
IMAP/POP3:是一种stream传输协议,常常被用来做一些邮件传输
IMAP:Internet Mail Access Protocol 是一种交互式的邮件邮件传输协议,交互式说的就是客户端可以和服务端针对邮件的各种操作同步,一份邮件,客户端有,服务端也有,客户端有什么操作会同步到服务端,反之亦然。
POP3:Post Office Protocol 3邮件传输协议相比IMAP协议只是服务器不保留邮件,一旦给了客户端,自行删除对应的邮件,客户端对邮件的各种操作与服务器无关
Porxy&reverseProxy
(注意代理的概念只要把握准正向和反向都是以客户端为参考的,从客户端出的是正向,客户端接受的是反向)
扯了半天其他的东西,现在是nginx的时间:
学习一个东西吾以为了解其框架架构,最初是出于什么目的设计,为解决什么问题,以及怎样设计是最重要的,所以下面的重点就是这些:
为什么会出现nginx或者其他相似功能的web服务,一方面是因为http的历史局限型,而最重要的还是C10K问题,高并发访问,好吧什么历史局限型,说的通俗点就是httpd(apache)老了不太能适应现在的网络环境了,毕竟人家Apache是95年的东西了,现代的计算机网络已经和当时远远不同了,倒不如说现在还大量使用httpd已经是一个小奇迹了(之所以不说奇迹,就担心较真的人太过在意,毕竟做it较真的人还是很多大的,毕竟我就是一个较真的人),还有一个问题C10K,什么意思?The C10k problem is the problem of optimising network sockets to handle a large number of clients at the same time.The name C10k is a numeronym for concurrently handling ten thousand connections.Apache的致命缺陷就是同时不可以处理一万个请求(建立套接字处理),对电商站点的影响,自己(╯▽╰)
Nginx战斗民族设计的一款轻量级的web服务,免费开源,高性能:
nginxArchitecture
一个master进程负责生产各种子进程,为什么要说是各种?缘由在于其每个子进程所具有的功能可以是nginx所有功能的一部分,也可以是全部。这个在于我们背锅侠的设置了,当然nginx的一些基本功能,每个子进程是必须要有的。看到连接后端的HTTP,FastCGI以及memcache了么,这些都是连接后端服务器(也叫Backend)的协议,HTTP协议,FastCGI协议以及memcached分布式缓存系统。
是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。但是,不能将Tomcat和Apache HTTP服务器混淆,Apache HTTP服务器是一个用C语言实现的HTTPWeb服务器;这两个HTTP web server不是捆绑在一起的。Apache Tomcat包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。
Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。最早支持Servlet标准的是JavaSoft的Java Web Server。
一般来说,通用Servlet由javax.servlet.GenericServlet实作Servlet界面。程序设计人员可以通过使用或继承这个类来实现通用Servlet应用。
javax.servlet.http.HttpServlet实现了专门用于响应HTTP请求的Servlet,提供了响应对应HTTP标准请求的doGet()、doPost()等方法。
当servlet被部署在应用服务器中(应用服务器中用于管理Java组件的部分被抽象成为容器)以后,由容器控制servlet的生命周期。除非特殊指定,否则在容器启动的时候,servlet是不会被加载的,servlet只会在第一次请求的时候被加载和实例化。servlet一旦被加载,一般不会从容器中删除,直至应用服务器关闭或重新启动。但当容器做内存回收动作时,servlet有可能被删除。也正是因为这个原因,第一次访问servlet所用的时间要大大多于以后访问所用的时间。
servlet在服务器的运行生命周期为,在第一次请求(或其实体被内存垃圾回收后再被访问)时被加载并执行一次初始化方法,跟着执行正式运行方法,之后会被常驻并每次被请求时直接执行正式运行方法,直到服务器关闭或被清理时执行一次销毁方法后实体销毁。
Java服务器页面(JSP)是HttpServlet的扩展。由于HttpServlet大多是用来响应HTTP请求,并返回Web页面(例如HTML、XML),所以不可避免地,在编写servlet时会涉及大量的HTML内容,这给servlet的书写效率和可读性带来很大障碍,JSP便是在这个基础上产生的。其功能是使用HTML的书写格式,在适当的地方加入Java代码片段,将程序员从复杂的HTML中解放出来,更专注于servlet本身的内容。
JSP在首次被访问的时候被应用服务器转换为servlet,在以后的运行中,容器直接调用这个servlet,而不再访问JSP页面。JSP的实质仍然是servlet。
JSP(全称JavaServer Pages)是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。
JSP使Java代码和特定的预定义动作可以嵌入到静态页面中。JSP句法增加了被称为JSP动作的XML标签,它们用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库提供了一种和平台无关的扩展服务器性能的方法。
JSP被JSP编译器编译成Java Servlets。一个JSP编译器可以把JSP编译成JAVA代码写的servlet然后再由JAVA编译器来编译成机器码,也可以直接编译成二进制码。
从架构上说,JSP可以被看作是从Servlets高级提炼而作为JAVA Servlet 2.1 API的扩展而应用。Servlets和JSP最早都是由Sun Microsystems(太阳公司)开发的。从JSP1.2版本以来,JSP处于Java Community Process开发模式下。
静态数据在输入文件中的内容和输出给HTTP响应的内容完全一致。此时,该JSP输入文件会是一个没有内嵌JAVA或动作的HTML页面。而且,客户端每次请求都会得到相同的响应内容。
互联网这个历史已经不算很短了,它大大方便了人类获取信息,开阔了人类的眼界,使得让这个世界变得小了起来,人与人之间的距离感也不会存在了,娱乐也更加丰富,听音乐、看电影等等这一系列,都能从网上进行,这些功能,都是由www服务器来提供服务,在Linux中,提供网络的服务器有很多种,那么今天我们就讲一个比较老牌,且依然能存活的服务器“阿帕奇”英文:Apache。
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源代码的网页服务器软件,可以在大多数电脑操作系统中运行,由于其跨平台和安全性。被广泛使用,是最流行的Web服务器软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。
Apache支持许多特性,大部分通过编译的模块实现。这些特性从服务器端的编程语言支持到身份认证方案。一些通用的语言接口支持Perl,Python,Tcl, 和PHP。流行的认证模块包括mod_access,mod_auth和mod_digest。其他的例子有SSL和TLS支持(mod_ssl),代理服务器(proxy)模块,很有用的URL重写(由mod_rewrite实现),定制日志文件(mod_log_config),以及过滤支持(mod_include和mod_ext_filter)。Apache日志可以通过网页浏览器使用免费的脚本AWStats或Visitors来进行分析。
Apache工作在应用层,是实现http协议的服务器软件之一,http是超文本传输协议,工作于应用层tcp的80端口,用户发起http协议的请求报文,服务器收到之后进行对客户端的响应,客户端收到之后,通过浏览器显示,其背后为html语言。而html是超文本标记语言,那么一次完整的http报文请求处理过程以如下步骤进行:
1、建立或处理连接:接收请求或拒绝请求。
2、接收请求:接收来自于网络上的主机请求报文中对某些特定资源的一次请求过程。
3、处理请求:对请求报文进行分析,获取客户端进行请求的资源以及请求方法等相关信息。
4、访问资源:获取请求报文中的请求资源。
5、构建响应报文。
6、发送响应报文。
7、记录日志。
早期发布的是apache-1.3,不过现在已经停止支持,之后发布了2.2的版本,但不支持event事件驱动机制,现在最新的版本是2.4,我们就以2.4为例进行说明。
我们都知道在Linux系统当中的安装方式无非有两种,一种是RPM包(RedHat公司提供的二进制包)安装,报名叫httpd,其服务程序也叫httpd,另一种是共官方网站上去下载源码包来进行安装,在本次的实验中,这两种方式我们都会进行,其配置方式也是不尽相同,如果你配置好yum仓库,现在就可以很简单的以RPM方式来进行安装,我们使用以下命令:
[root@node1 ~]# yum -y install httpd
就这一条命令,我们的RPM包就安装好了,可以直接启动程序打开浏览器来访问
[root@node1 ~]# systemctl start httpd.service
打开浏览器,访问方式直接输入IP地址就可以,因为http协议浏览器自动加上去的,如果看到了apache的测试页,则证明你成功了。
那么为什么可以成功?我们可以使用ss命令用来查看:
[root@node1 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
从以上命令显示我们看出,当服务启动时,就会开启80端口,我们说过,80端口是提供WEB服务的。
以上就是以RPM包方式的安装,那么现在我们看一下如何以源码包方式进行安装,源码包的安装过程方式很是繁杂,但是其有点是可以自由定制功能,我们使用--enable来使用是否开启次功能,--with用来是否添加此功能,还可以用 --with-out用来取消此功能,意思是在安装上默认添加的功能给去除掉,现在我们可以从官网上下载源码包,其下载地址为:http://mirrors.cnnic.cn/apache//httpd/httpd-2.4.25.tar.gz,直接复制就能够下载,在Linux上,使用wget就可以。
[root@node1 ~]# wget http://mirrors.cnnic.cn/apache//httpd/httpd-2.4.25.tar.gz
下载完成之后,由于是压缩包,所以我们必须要解压才能够使用安装,把它解压到/usr/src/目录下。
[root@node1 ~]# tar -xf httpd-2.4.25.tar.gz -C /usr/src/
之后我们下载两个依赖包,一个是apr包,另一个是apr-util包,那么apr是什么?其实它是一个底层支撑Apache跨平台特性的一个安装包,有了这个包就可以不用修改整个程序,就像是一个虚拟机一样,提供一个环境让系统跑起来,apache也亦是如此,现在我们可以使用wget命令下载下来:
[root@node1 src]# wget http://mirrors.hust.edu.cn/apache//apr/apr-1.5.2.tar.gz
[root@node1 src]# wget http://mirrors.hust.edu.cn/apache//apr/apr-util-1.5.4.tar.gz
下载完成之后,由于都在/usr/src的目录下,所以就直接加压。
[root@node1 src]# tar -xf apr-1.5.2.tar.gz
[root@node1 src]# tar -xf apr-util-1.5.4.tar.gz
我们首先进入apr目录,开始安装,不过在安装之前,我们首先要安装开发包组:
[root@node1 ~]# yum -y groupinstall "Development Tools" "Server Platform Development"
[root@node1 src]# cd apr-1.5.2/
[root@node1 apr-1.5.2]# ./configure --prefix=/usr/local/apr-1.5
[root@node1 apr-1.5.2]# make && make install
[root@node1 src]# cd apr-util-1.5.4/
[root@node1 apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util-1.5 --with-apr=/usr/local/apr-1.5
如果以上程序包都安装完成的话,恭喜你,可以安装http了,首先进入该目录,之后进行安装,如果中途出现一些错误的话,是可以解决的。
[root@node1 httpd-2.4.25]# ./configure --prefix=/usr/local/apache-2.4 --enable-so --enable-ssl --with-pcre --with-rewrite --with-mpm=prefork --enable-cgi --with-zlib --with-libxml2=/usr --with-apr=/usr/local/apr-1.5 --with-apr-util=/usr/local/apr-util-1.5 --with-openssl --enable-modules=most --enable-mpms-shared=all
[root@node1 httpd-2.4.25]# make && make install
之后打开浏览器,步骤一样,输入IP,只不过出现的是 It Works的页面。
安装过程中,可能会报错,但这些错误都可以解决,以上成功的话,则代表第一阶段完成。
接下来可以启动源码包安装的程序,不过必要先要关闭RPM包的apache,因为一个端口不能为两个程序所使用。
[root@node1 ~]# /usr/local/apache-2.4/bin/apachectl start
其实两种安装方式任意选一种都可以,毕竟这只是实验,并没有好坏,最后的配置方法都是差不多的,接下来说一下配置文件的详解,以及我们可以搭建什么服务,我们就以RPM包所安装的来进行配置,我们的主配置文件在/etc/httpd/conf和/etc/httpd/conf.d,注意:我们要把主配置文件复制出来进行备份,不然的话,如果到了不可挽回的余地,最起码覆盖掉,解决一下,从头再来,那么其配置结构如下:
我们使用的响应模型是默认是prefork,它是开启多个进程来处理不同的请求,其模式共有三个,另外两个是worker和event模型,那么我们首先来介绍一下prework模型,它是一个多进程模型,由一个主进程和多个子进程组成,一个主进程负责创建和销毁子进程以及套接字,也负责接收请求,并将请求转发到子进程来进行处理。那么多个子进程,每一个子进程分别处理一个请求,其工作模型为会预先生成几个空闲进程,用来等待处理用户请求。
接下来是worker模型,它是多进程多线程的模型,有一个主进程和多个子进程,主进程和以上一样,创建并销毁子进程以及建立套接字并接受请求,然后将请求转发给子进程,而多个子进程却没有直接处理请求,而是交给了它所生成的线程处理,每个子进程生成多个线程,每个线程都会去响应用户请求。其并发的响应数量为 m*n。
最后一个是event模型,它是一个事件驱动的模型,每个进程响应多个用户请求,也是由一个主进程个子进程组成,主进程的功能和以上的两种模式一样,那么子进程是基于事件驱动直接响应多个用户请求,在httpd-2.4中是支持的。
以上就是对模式的介绍,那么接下来其它文件的位置,我们安装完成之后就必然开启它进行web服务,那么在 CentOS 6中,它的服务脚本在/etc/rc.d/init.d/httpd路径下,站点文件在/var/www/html的路径下,为什么会配置在哪儿?因为在httpd.conf配置文件中,定义了DocumentRoot "/var/www/html"的文档根目录,日志文件保存在/var/log/httpd目录下,访问日志为access_log错误日志为error_log。服务控制和启动在CentOS7是不一样的,分别是:
CentOS 6:
[root@node1 ~] # service httpd { start | stop | restart | status }
CentOS 7:
[root@node1 ~] # systemctl { start | stop | restart | status } https.service
在配置文件下使用alias来定义别名,其格式如下:
[root@node1 conf.d]# vim alias.conf
Alias /web1/ /web/html1/
options None
allowOverride None
Require all granted
[root@node1 ~]# systemctl reload httpd.service
接下来为定义的配置文件建立目录。
[root@node1 conf.d]# mkdir /web/html1 -pv
定义主页。
[root@node1 conf.d]# cd /web/html1/
[root@node1 html1]# vim index.html
Alias Page
打开浏览器访问。
认证其实很好理解,就是让用户向服务器提供用户名和密码,这是证明自己的一种手段,其配置如下:
[root@node1 ~]# cd /etc/httpd/conf.d/
[root@node1 ~]# vim auth.conf
Alias /apps/ "/apps/html/"
Options None
AllowOverride None
Authtype basic
AuthUserFile "/apps/html/.htpasswd"
AuthName "Admin String"
Require valid-user
[root@node1 conf.d]# cd /apps/html/
[root@node1 html]# vim index.html
Auth Page
[root@node1 ~]# systemctl reload httpd.service
重新启动打开浏览器进行访问,输入用户名和密码就可以,创建用户和密码的命令是htpasswd,格式如下:
[root@node1 conf.d]# htpasswd -c -m /apps/html/.htpasswd user1
虚拟主机是可以在一个主机上提供多个访问站点,共有三种实现方案,分别是基于IP、基于端口、基于域名,我们就以基于域名的方式来配置虚拟主机,配置如下:
[root@node1 conf.d]# vim vhost.conf
ServerName www1.stux.com
DocumentRoot "/apps/www"
Options None
AllowOverride None
Require all granted
[root@node1 ~]# mkdir /apps/www
[root@node1 ~]# vim /apps/www/index.html
Test Virtual Page
[root@node1 ~]# systemctl reload httpd.service
现在我们可以测试一下,如果成功,那我恭喜你。