admin管理员组文章数量:1651785
一、HTTP 介绍
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP工作在 TCP/IP协议体系中的TCP协议上,是一个基于 TCP/IP 通信协议来传递数据(HTML 文件、图片文件、查询结果等)。
1、HTTP 工作原理
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端(web服务端)发送的请求报文,这个请求报文包含了请求方法、URL协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或错误代码、服务器信息、响应头部和响应数据。 Web服务器有:Nginx,Apache服务器,IIS服务器(Internet Information Services)等。 Web服务器根据接收到的请求后,向客户端发送响应信息。 HTTP默认端口号为80,但是你也可以改为其他端口。
以下图表展示了
CGI 通用网关接口(Common Gateway Interface/CGI)描述了客户端和服务器程序之间传输数据的一种标准,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI 程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行
2、HTTP 消息结构
HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。HTTP是无状态协议,意味着服务器不会保留关于客户端或请求的任何信息,每个请求都是独立的,即使是在持久连接(如Keep-Alive)的情况下也是如此。
一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。
1、特点
1.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
3.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
5、支持B/S及C/S模式。
2、URI
URL(UniformResourceLocator)统一资源定位符,是互联网上用来标识某一处资源的地址。
URN(uniform resource name),统一资源命名,通过名字来标识资源
URI(Uniform Resource Identifiers),HTTP使用统一资源标识符来传输数据和建立连接。URL和URN都是一种URI,包含了用于查找某个资源的足够的信息
3、客户端请求消息
HTTP 报文可以分为两类:请求报文(request message)和响应报文(response message),两者的基本报文结构相同。
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。
4、服务器响应消息
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
实例
下面实例是一点典型的使用GET来传递数据的实例:
客户端请求:
curl -v baidu #-v 查看请求信息,如请求头、响应头、请求体、响应体
> GET / HTTP/1.1 # 请求方式与版本协议
> User-Agent: curl/7.29.0 #用什么客户端访问
> Host: baidu #主机名,域名。
> Accept: */* ##匹配什么文件类型,*是通用匹配。匹配所有类型
> #大于号 (>):这表示从客户端向服务器发送的数据,也就是请求的一部分。
* Empty reply from server
* Connection #0 to host baidu left intact
curl: (52) Empty reply from server
服务端响应:
# curl -I baidu #-I 查看响应信息
< HTTP/1.1 200 OK #状态码为 200,表示请求成功
< Server: nginx/1.16.0 #请求的服务和版本号
< Date: Thu, 04 Jul 2019 08:19:40 GMT #服务器响应的时间戳,北京时间为GMT+8小时
< Content-Type: text/plain #mime类型,test/plain:普通文本,比如image/png...、video
< Content-Length: 12 #内容的长度
< Last-Modified: Thu, 04 Jul 2019 08:13:25 GMT #最后修改时间
< Connection: keep-alive #是否支持长连接
< ETag: "5d1db525-c" #标识,每次访问如果与最开始的值一样返回304否则校验不一致返回200
< Accept-Ranges: bytes #接受的范围单位
HTTP/1.1 200 OK #请求返回的状态码
Date: Tue, 30 Jul 2024 09:29:12 GMT #当前时间,北京时间为GMT+8小时
Server: Apache #请求的服务和版本号
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Wed, 31 Jul 2024 09:29:12 GMT
Connection: Keep-Alive
Content-Type: text/html
经典面试题
在浏览器地址栏键入 URL,按下回车之后会经历什么?
浏览器向 DNS 服务器请求解析该 URL 中域名对应的 IP 地址;
解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
服务器发出读取文件的HTTP请求(URL 中域名后面部分对应的文件),该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
服务器对浏览器请求作出响应,并把对应的HTML文本发送给浏览器;
释放TCP连接;
浏览器将HTML文档渲染并显示内容;
5、HTTP 请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
6、HTTP 响应头信息
HTTP请求头提供了关于请求,响应或者其他的发送实体的信息。
应答头 | 说明 |
---|---|
Allow | 服务器支持哪些请求方法(如GET、POST等)。 |
Content-Encoding | 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。 |
Content-Length | 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。 |
Content-Type | 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。 |
Date | 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。 |
Expires | 应该在什么时候认为文档已经过期,从而不再缓存它? |
Last-Modified | 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。 |
Location | 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。 |
Refresh | 表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。 注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。 注意Refresh的意义是"N秒之后刷新本页面或访问指定页面",而不是"每隔N秒刷新本页面或访问指定页面"。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。 注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。 |
Server | 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。 |
Set-Cookie | 设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。 |
WWW-Authenticate | 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。 注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问(例如.htaccess)。 |
7、HTTP 状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
HTTP状态码的英文为HTTP Status Code。
下面是常见的HTTP状态码:
-
200 - 请求成功
-
301 - 资源(网页等)被永久转移到其它URL
-
404 - 请求的资源(网页等)不存在
-
500 - 内部服务器错误
-
403 - 禁止访问,表示服务器拒绝了请求
-
302 - 临时重定向,表示请求的资源存在但要求客户端进一步请求其他资源
-
304 - 未修改,表示客户端缓存的资源为最新版本,不需要重新请求
HTTP状态码分类
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:
HTTP状态码列表
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
306 | Unused | 已经被废弃的HTTP状态码 |
307 | Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
二、nginx 进阶基础
1、nginx 介绍
Nginx (engine x) 是一个轻量级,高性能的 HTTP 和 反向代理 服务,也是一个IMAP/POP3/SMTP服务。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
创始人伊戈尔·赛索耶夫
面试:为什么选择 nginx(优势)
1.高并发,高性能
2.高可靠---可以7*24小时不间断运行
3.可扩展性强--模块化设计,使得添加模块非常的平稳。
4.热部署--可以在不停止服务器的情况下升级nginx
5.BSD许可证--nginx开源免费,允许自由使用、修改和分发,对商业用途没有限制
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应。
作为负载均衡服务器:可以进行自定义配置,支持虚拟主机,支持URL重定向。Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。
Nginx 安装非常的简单,配置文件非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。还能够在不间断服务的情况下进行软件版本的升级。
2、IO多路复用
I/O multiplexing【多进程并发】
第一种方法就是最传统的多进程并发模型 :每进来一个新的I/O流会分配一个新的线程管理。
在这种模型中,服务器为每个新的连接创建一个新的进程来处理客户端的请求。
每个进程都有独立的内存空间,因此可以独立地运行。
(1)优点:
实现简单。
进程间的隔离性好,一个进程的崩溃不会影响其他进程。
(2)缺点:
创建和销毁进程的成本较高,因为涉及到操作系统资源的分配和回收。
进程之间不能共享数据,这可能会导致额外的数据复制开销。
对于大量并发连接来说,可能会消耗大量的系统资源(如内存和文件描述符)。
第二种方法就是I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流 。)
I/O multiplexing 的 multiplexing 多路复用指:单个线程通过记录跟踪每一个Sock(I/O流)状态来同时管理多个I/O流。能够尽量多得提高服务器的吞吐能力。在同一个线程里面,通过拨开关的方式,来同时传输多个I/O流
(1)优点
效率高,因为不需要创建额外的进程或线程。
单个进程可以处理成千上万个并发连接。
资源消耗相对较少,因为只需要维护少量的进程或线程。
(2)缺点
实现起来比多进程模型复杂。
需要对事件驱动编程有一定了解。
如果处理不当,可能会出现复杂的错误状态,比如死锁。
2、nginx基于事件驱动模型实现I/O多路复用
一个请求到来了,nginx使用epoll接收请求的过程是怎样的?
-
epoll.
• epoll 线程安全的。
• epoll 不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。
#ngnix会有很多连接进来, 默认采用epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。
3、异步,非阻塞
$ pstree |grep nginx |-+= 81666 root nginx: master process nginx | |--- 82500 nobody nginx: worker process | --- 82501 nobody nginx: worker process
1个master进程,n个work进程
异步:指的是提交任务后不需要在原地等待,可以继续往下执行代码。例如开启多线程多进程可以实现异步,会产生阻塞
阻塞:指调用结果返回之前,当前线程会被挂起(如遇到IO操作),函数只有在得到结果之后才会将阻塞的线程激活
非阻塞:指不能立刻得到返回结果之前也会立刻返回,同时不会阻塞当前线程
每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么一直等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。这就是异步。此时,如果再有request 进来,他就可以很快再按这种方式处理。这就是非阻塞和IO多路复用。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。这就是异步回调。
Nginx 相对Apache 的优点
- 轻量级,同样是web服务nginx比Apache占用更少的内存及资源
- 静态处理,Nginx 静态处理性能比 Apache 高 3倍以上
- 抗并发,Nginx 处理请求是异步非阻塞的,而Apache则是阻塞型的。在高并发下Nginx 能保持低资源低消耗高性能。
- 高度模块化的设计,编写模块相对简单
3.nginx安装部署和配置管理
1、nginx部署-Yum安装
访问nginx的官方网站:nginx news
Nginx版本类型
Mainline version: 主线版,即开发版
Stable version: 最新稳定版,生产环境上建议使用的版本
Legacy versions: 遗留的老版本的稳定版
Yum安装nginx
配置Yum源的官网:nginx: Linux packages
1、配置nginx的Yum源
安装说明:在新计算机上首次安装nginx之前,需要设置nginx软件包存储库。 之后,您可以从存储库安装和更新nginx。
RHEL/CENTOS
方法一:
# yum install yum-utils -y
# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx/keys/nginx_signing.key
module_hotfixes=true
# yum install -y nginx-1.18.0 # 参考官方版本号格式,推荐安装较旧版本如1.18或1.16等
方法二
方法一
#我们在Centos下使用yum安装时往往找不到rpm的情况,官方的rpm repository提供的rpm包也不够丰富,
#很多时候需要自己编译很痛苦,而EPEL恰恰可以解决这两方面的问题
yum -y install epel-release
yum -y update #更新yum源
方法二
rpm -Uvh http://nginx/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
#安装 yum install -y nginx-1.18.0
这里我们用稳定版本
[root@nginx-server yum.repos.d]# yum install -y nginx
[root@nginx-server yum.repos.d]# nginx -V //格式化打印
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
[root@nginx-server yum.repos.d]# nginx -v #查看版本号
nginx version: nginx/1.16.0
关闭防火墙和selinux
~]# getenforce
Enforcing
~]# sed -i 's/^SELINUX.*/SELINUX=disabled/' /etc/selinux/config
~]# systemctl stop firewalld
~]# systemctl disable firewalld
启动并设置开机启动
~]# systemctl start nginx
~]# systemctl enable nginx
浏览器输入ip访问:访问前确保防火墙和selinux关闭
2、nginx 编译安装与配置使用
(1)安装nginx编译和相关模块
yum install -y gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel libtermcap-devel readline-devel ncurses-devel bison libtool-ltdl bzip2-devel libicu-devel libunwind-devel libaio-devel
gcc: GNU Compiler Collection 的一部分,用于编译 C 和 C++ 代码。
gcc-c++: 提供 C++ 编译器。
pcre: Perl Compatible Regular Expressions,Nginx 使用 PCRE 库来支持正则表达式。
pcre-devel: PCRE 的开发文件,包括头文件和库文件,用于编译 Nginx。
openssl: 用于加密和安全通信的工具集,Nginx 用它来支持 HTTPS。
openssl-devel: OpenSSL 的开发文件,同样包括头文件和库文件。
zlib: 一个广泛使用的压缩库,Nginx 用它来支持 gzip 压缩。
zlib-devel: zlib 的开发文件。
libtermcap-devel: 提供终端能力的库,虽然 Nginx 本身不需要这个库,但在某些情况下可能会用到。
readline-devel: 用于提供命令行编辑功能的库,同样不是 Nginx 必需的,但在某些情况下可能会有用。
ncurses-devel: 提供文本用户界面功能的库,Nginx 不直接需要这个库,但在某些依赖项中可能会用到。
bison: 一个用于生成解析器的工具,Nginx 编译过程中可能会用到。
libtool-ltdl: 一个跨平台的库链接工具,可以帮助解决库链接问题。
bzip2-devel: bzip2 压缩库的开发文件。
libicu-devel: International Components for Unicode 的开发文件,用于国际化支持。
libunwind-devel: 一个用于获取程序栈信息的库,用于调试。
libaio-devel: Linux AIO (Asynchronous Input/Output) 库的开发文件,Nginx 的某些模块可能需要这个库的支持。
(2)创建nginx用户
useradd nginx
passwd nginx 或 useradd nginx -M -s /bin/nologin
(3)编译安装nginx
~]# wget http://nginx/download/nginx-1.20.0.tar.gz #下载nginx安装包
~]# tar xzf nginx-1.20.0.tar.gz -C /usr/local/ #解压
~]# cd /usr/local/nginx-1.20.0/
nginx-1.20.0]# ./configure --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-stream
nginx-1.20.0]# make && make install && mkdir -p /usr/local/nginx/tmp/
(4)创建nginx命令软链接,查看安装路径和模块
# 查看 nginx 安装的模块
~]# ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx #创建软连接,挂载启动命令
~]# nginx -V
--prefix=/usr/local/nginx //指向安装目录
--conf-path=/etc/nginx/nginx.conf //指定配置文件
--http-log-path=/var/log/nginx/access.log //指定访问日志文件
--error-log-path=/var/log/nginx/error.log //指定错误日志文件
--lock-path=/var/lock/nginx.lock //指定lock文件
--pid-path=/run/nginx.pid //指定pid文件
--http-client-body-temp-path=/var/lib/nginx/body //设定http客户端请求临时文件路径
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi //设定http fastcgi临时文件路径
--http-proxy-temp-path=/var/lib/nginx/proxy //设定http代理临时文件路径
--http-scgi-temp-path=/var/lib/nginx/scgi //设定http scgi临时文件路径
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi //设定http uwsgi临时文件路径
--with-debug //启用debug日志
--with-ipv6 //启用ipv6支持
--with-http_ssl_module //启用ssl支持
--with-http_stub_status_module //获取nginx自上次启动以来的状态
--with-http_realip_module //允许从请求标头更改客户端的IP地址值,默认为关
--with-http_auth_request_module //实现基于一个子请求的结果的客户端授权。如果该子请求返回的2xx响应代码,所述接入是允许的。如果它返回401或403中,访问被拒绝与相应的错误代码。由子请求返回的任何其他响应代码被认为是一个错误。
--with-http_addition_module //作为一个输出过滤器,支持不完全缓冲,分部分响应请求
--with-http_dav_module //增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法 默认关闭,需编译开启
--with-http_geoip_module //使用预编译的MaxMind数据库解析客户端IP地址,得到变量值
--with-http_gunzip_module //它为不支持“gzip”编码方法的客户端解压具有“Content-Encoding: gzip”头的响应。
--with-http_gzip_static_module //在线实时压缩输出数据流
--with-http_spdy_module //SPDY可以缩短网页的加载时间
--with-http_sub_module //允许用一些其他文本替换nginx响应中的一些文本
--with-http_xslt_module //过滤转换XML请求
--with-mail //启用POP3/IMAP4/SMTP代理模块支持
--with-mail_ssl_module //启用ngx_mail_ssl_module支持启用外部模块支持
#--with 表示在编译过程中需要给nginx添加的模块
#--without 表示将nginx默认编译的模块移除
(5)按需配置主配置文件/etc/nginx/nginx.conf
# 全局参数设置
user nginx; #设置nginx使用的用户
worker_processes 4; #设置nginx启动进程的数量,一般设置成与逻辑cpu数量相同或auto
error_log /var/log/nginx/error.log; #指定错误日志
pid /var/run/nginx.pid;
events {
worker_connections 1024; #设置一个进程的最大并发连接数
}
# http 服务相关设置
http {
include mime.types; #关联mime类型,关联资源的媒体类型
default_type application/octet-stream; #根据文件的后缀来匹配相应的MIME类型
log_format main 'remote_addr - remote_user [time_local] "request" '
'status body_bytes_sent "$http_referer" '
'"http_user_agent" "http_x_forwarded_for"';
access_log /var/log/nginx/access.log main; #设置访问日志的位置和格式
sendfile on; #用于开启文件高效传输模式,一般设置为on,若nginx
是用来进行磁盘IO负载应用时,可以设置为off,降低系统负载
tcp_nopush on; #减少网络报文段数量,当有数据时,先别着急发送, 确保数据包已经装满数据, 避免了网络拥塞
gzip on; #是否开启gzip压缩,将注释去掉开启,默认关闭
keepalive_timeout 65; #设置长连接的超时时间,请求完成之后还要保持连接多久,
# 虚拟服务器的相关设置
server { #一个虚拟主机一个server
listen 80; #设置监听的端口
server_name localhost; #设置绑定的主机名或域名或ip地址
charset koi8-r; #设置编码字符
location / {
root /var/www/nginx; #设置服务器默认网站的根目录位置,需要手动创建
index index.html index.htm; #设置默认打开的文档
}
error_page 500 502 503 504 /50x.html; #设置错误信息返回页面
location = /50x.html {
root html; #这里的绝对位置是/usr/local/nginx/html
}
}
}
1.nginx.conf的组成
nginx.conf一共由三部分组成,分别为:全局块、events块、http块。
在http块中包含http全局块、多个server块。每个server块中又包含server全局块以及多个location块。
在统一配置块中嵌套的配置块,各个之间不存在次序关系。
2.Nginx的组成:
nginx的二进制可执行文件----启动关闭,有各个模块编译出来的
nginx.conf配置文件----控制nginx
access.log访问日志--记录每条http请求
error.log 错误日志--定位问题
(6)检测nginx配置文件是否正确
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
[root@localhost ~]# mkdir -p /tmp/nginx
(7)启动nginx服务
[root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost ~]# nginx #已创建软链接
(8)nginx 常用控制命令
nginx -c /path/nginx.conf # 以特定目录下的配置文件启动nginx:
nginx -s reload # 修改配置后重新加载生效(不需要停止nginx服务)
nginx -s stop # 快速停止nginx
nginx -s quit # 正常停止nginx(等待所有工作进程完成后退出)
nginx -t # 测试当前配置文件是否正确
nginx -t -c /path/to/nginx.conf # 测试特定的nginx配置文件是否正确
#注意:
nginx -s reload 命令加载修改后的配置文件,命令下达后发生如下事件
(1)检查配置文件正确性
Nginx的master进程会首先检查新的配置文件是否有效。
如果配置文件无效,Nginx输出错误信息,并且不会进行任何更改。此时所有worker进程将继续使用旧的配置文件处理请求。
(2)启动新的 worker进程
如果配置文件有效,master进程会创建一组新的worker进程,这些新的worker进程会根据新配置文件启动并开始接收请求。
(3)分配新的请求给新的worker进程:
新的worker进程准备好后,master 进程会将所有新的连接请求分配给新的 worker 进程,而旧的 worker 进程会继续处理它们已有的连接。
(4)等待旧worker进程完成请求处理:
一旦新的 worker 进程接管了新的请求,旧的 worker 进程会继续处理正在进行的请求,直到这些请求被完全处理完毕。
(5)关闭旧的worker进程:
当旧的 worker 进程完成了所有正在处理的请求后,它们会被 master 进程优雅地关闭。
这个过程会重复进行,直到所有的旧worker进程都被关闭。
nginx的 reload 机制确保了服务的连续性,即使在重新加载配置文件的过程中也能保持服务可用,不会丢失任何请求。这种方式被称为“平滑重启”或“热更新”,因为它允许 Nginx 在不中断服务的情况下更新其配置。
12、nginx 日志文件详解
nginx 日志文件分为 log_format 和 access_log 两部分
log_format 定义记录的格式,其语法格式为
log_format 样式名称 样式详情
配置文件中默认有
log_format main 'remote_addr - remote_user [time_local] "request" '
'status body_bytes_sent "$http_referer" '
'"http_user_agent" "http_x_forwarded_for"';
卸载nginx
1. 检查一下nginx服务是否在运行
ps -ef | grep nginx
2. 停止Nginx
/usr/local/nginx/sbin/nginx -s stop
nginx -s stop #已创建nginx命令的软链接
3. 删除nignx安装的相关文件
find / -name nginx | xargs rm -rf
4. 如果设置了Nginx开机自启动的话,可能还需要下面两步
chkconfig nginx off
rm -rf /etc/init.d/nginx
5. 卸载Nginx相关的依赖
yum remove nginx
一次性完成查询和卸载的过程
rpm -qa | grep nginx | xargs yum remove -y
4、使用 limit_rate 限制客户端传输数据的速度
1、编辑/etc/nginx/nginx.conf
location / {
root /var/www/nginx/;
index index.html index.htm;
limit_rate 2k; #对每个连接的限速为2k/s
}
重启服务
注意要点:配置文件中的每个语句要以 ; 结尾
5、nginx 虚拟机配置
什么是虚拟主机?
虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响。
nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置。
1、基于域名的虚拟主机 (server_name来区分虚拟主机——应用:外部网站)
2、基于ip的虚拟主机, (一块主机绑定多个ip地址)
3、基于端口的虚拟主机 (端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台)
1、 基于域名的虚拟主机
(1)配置通过域名区分的虚拟机
# vim /etc/nginx/nginx.conf
worker_processes 4;
#error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name web.testpm;
location / {
root /var/www/nginx/;
index index.html index.htm;
limit_rate 2k;
}
}
server {
listen 80;
server_name www.testpm;
location / {
root /1000phone/html;
index index.html index.htm;
}
}
}
(2)创建访问页面index 文件
# mkdir -p /1000phone/html
# vim /1000phone/html/index.html
<html>
<p>
this is my 1000phone
</p>
</html>
(3)重新加载配置文件
# /usr/local/nginx/sbin/nginx -s reload
# nginx -s reload
(4)客户端配置路由映射
在 C:\Windows\System32\drivers\etc\hosts 文件中添加两行(linux:/etc/hosts)
10.0.105.199 web.testpm
10.0.105.199 web.1000phone
(5)测试访问
浏览器输入:http://web.testpm/
浏览器输入:http://web.1000phone/
2、 基于ip的虚拟主机
(1)配置虚拟ip
[root@localhost ~]# ip a
[root@localhost ~]# ifconfig ens33:1 10.0.105.201/24 up #up默认可不加
[root@localhost ~]# ifconfig
(2)配置nginx主配置文件
[root@localhost ~]# vim /etc/nginx/nginx.conf
user root;
worker_processes 4;
#error_log logs/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 10.0.105.199:80;
server_name web.testpm;
location / {
root /var/www/nginx/;
index index.html index.htm;
limit_rate 2k;
}
server {
listen 10.0.105.201:80;
server_name www.testpm;
location / {
root /1000phone/html/;
index index.html index.htm;
}
}
}
(3)重新加载配置文件
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
(4)测试访问
浏览器输入:http://10.0.105.199
浏览器输入:http://10.0.105.201
(5)关闭虚拟ip
[root@localhost ~]# ifconfig ens33:1 10.0.105.201/24 down
(6)重启nginx
[root@localhost ~]# systemctl restart nginx
3、 基于端口的虚拟主机
# cat /etc/nginx/nginx.conf
user root;
worker_processes 4;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name web.testpm;
location / {
root /var/www/nginx/;
index index.html index.htm;
limit_rate 2k;
}
server {
listen 8080;
server_name www.testpm;
location / {
root /1000phone/html/;
index index.html index.htm;
}
}
}
重新加载配置文件:
# /usr/local/nginx/sbin/nginx -s reload
测试访问:
浏览器输入:http://web.testpm/
浏览器输入:http://web.1000phone:8080
本文标签: Nginx
版权声明:本文标题:Nginx服务 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1729566184a1206551.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论