HTTP协议概述
HTTP协议采用了请求/响应模型。 客户端发送一个请求,请求头包含请求信息(请求的方法、URL、协议版本、修饰符、客户信息内容)服务器以一个状态行作为响应,响应的内容包括消息协议的版本、成功或者错误编码,再加上服务器信息、实体元信息以及可能的实体内容。
HTTP请求方式
HTTP方法 | 描述 |
---|---|
GET | 请求获取Request-URI |
PUT | 请求服务器存储一个资源,并用·Requset-URI作为其标识 |
DELETE | 请求服务器删除Requset-URI标识的资源 |
POST | 在Requset-URI所标识的资源后附加新的数据 |
HEAD | 请求获取由Requset-URI所标识的资源的响应消息报头 |
HTTP协议版本
HTTP/0.9
:已经过时的协议。只接受GET一种请求方式,没有在通信中指定版本号,且不支持请求头。由于该版本
HTTP/1.0
:这是第一个在通信中指明的HTTP版本号的HTTP版本,至今任然广泛使用,它与HTTP/0.9的最大区别在于支持更多的HTTP请求方式
HTTP/1.1
:当前版本。与HTTP/1.0的最大区别在于支持长链接(HTTP/1.0一次链接多次下载,一次链接一次下载,每进行一次链接要进行三次握手和四次挥手)(HTTP/1.1一次链接多次下载)并且能很好的配合代理服务器工作:还支持以管理方式同时发送多个不同版本请求,以便于降低线路负载,提高传输速度
HTTP常见的状态码![请添加图片描述](https://img-blog.csdnimg.cn/2e0032cdcded4ae3ae17c279922cc795.jpeg)
HTTP请求流程(服务端)
服务端处理HTTP请求的流程通常包括以下步骤:
-
建立连接:
- 当客户端发送HTTP请求时,服务器端会监听指定的端口并等待连接请求。
- 一旦有连接请求到达,服务器会接受连接并与客户端建立TCP连接。
-
接收请求:
- 服务器端接收到客户端通过TCP连接发送的HTTP请求。
- 这包括接收HTTP请求头和(如果存在)请求体。
-
处理请求:
- 服务器端对接收到的HTTP请求进行解析,以确定请求方法、URI、请求头等信息。
- 服务器根据请求的内容和路由规则将请求传递给相应的处理程序(通常是Web应用程序代码)。
-
访问资源:
- 处理程序可能需要访问数据库、文件系统或其他资源来执行请求所需的操作。
- 这包括检索数据、进行身份验证、执行业务逻辑等。
-
构建响应报文:
- 处理程序生成HTTP响应,包括响应状态码、响应头和响应体。
- 响应状态码表示请求的结果,响应头包含元数据,响应体包含实际的响应数据。
-
发送响应报文:
- 服务器端通过之前建立的TCP连接将生成的HTTP响应发送回客户端。
- 这使客户端能够接收并处理响应数据。
-
记录日志:
- 服务器通常会在请求处理过程中记录日志,以便监控和故障排除。
- 日志可以包括请求信息、响应时间、响应状态码、客户端IP地址等信息。
这些步骤构成了服务器端处理HTTP请求的基本流程。值得注意的是,这个流程可能会因具体的服务器软件、编程语言和应用程序框架而有所不同,但通常都遵循这些通用原则。
常见http 服务器程序
- httpd apache,存在C10K(10K connections)问题
- nginx 解决C10K问题lighttpd
- IIS .asp 应用程序服务器
- tomcat .jsp 应用程序服务器
- jetty 开源的servlet容器,基于Java的web容器
- Resin CAUCHO公司,支持servlets和jsp的引擎
- webshpere:IBM公司
- weblogic:BEA,Oracle
- jboss:RedHat,IBM
- oc4j:Oracle
prefork 工作模式
prefork
:多进程I/O模型,每一个请求生成一个子进程,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
Prefork工作模式还具有一个关键的配置优势,可以设置最大和最小进程数。这使得它适用于各种工作负载和服务器规模,因为您可以根据需要动态调整进程数。
总结而言,Prefork工作模式是最古老且最稳定的Apache工作模式之一,特别适用于访问量不是很大的场景。它的可维护性和稳定性使其成为一些需要高度可靠性的应用程序的选择。
worker工作模式
Worker MPM
是Apache HTTP服务器的一种工作模式,旨在提供更高性能和资源利用率。
Apache HTTP工作特点如下
多线程模型
:Worker MPM采用多线程方式处理请求。每个子进程内部创建多个线程来处理请求,相比于每个请求生成一个子进程的Prefork模式,节省了内存开销。
高并发性
:多线程使Worker MPM适合处理高并发情况。每个线程可以独立处理请求,提高服务器的吞吐量。
资源效率
:相对于Prefork模式,Worker模式通常更节省内存,因为线程比进程占用更少内存。这使得它在处理大量连接时更有效。
适用性
:Worker MPM适用于访问量较大的Web服务器,特别是需要处理大量并发连接的情况。它在性能方面表现出色,但需要更多的线程安全性考虑。
线程安全性
:Worker MPM需要更多的线程安全性考虑,因为多个线程可能同时访问和修改共享数据结构,需要谨慎编程和配置。
Worker MPM
工作模式通过多线程提高性能和资源利用率,是Apache中用于高并发环境的一种选择。配置和管理多线程服务器需要更多技术和资源。
event工作模型
事件驱动模型(worker模型的变种)
URI urn url
URN(Uniform Resource Name,统一资源名称):
URN是一种URI,用于提供资源的唯一性和持久性标识,而不涉及资源的位置或获取方式。
URN通常是一个字符串,它与资源的特性或内容相关,不会因资源的位置而改变。
例如,urn:isbn:0451450523 是一个URN,它用来唯一标识一本书,不管这本书放在互联网上的哪个位置。
URL(Uniform Resource Locator,统一资源定位符):
URL
也是一种URI
,不仅提供了资源的唯一标识,还包含了获取该资源的方法和位置信息。
URL包括了协议(如HTTP、FTP)、主机名或IP地址、端口和资源路径等信息,以便能够定位和访问资源。
例如,http://www.example.com/index.html 是一个URL,它不仅标识了资源(index.html),还指示了使用HTTP协议在www.example.com服务器上获取该资源的方式和位置。
总结
:URN是确定资源的一种标志符,但不管资源的位置,而 URL
表明了资源存放的路径,可以直接通过URL来访问它指向的文件。
Nginx服务基础
Nginx主要功能概述
Nginx(通常发音为"engine-x")是一款高性能的开源Web服务器软件,它也可以用作反向代理服务器、负载均衡器、HTTP缓存和应用程序服务器。以下是Nginx的主要功能介绍:
-
Web服务器:Nginx最常用的功能是作为Web服务器。它能够处理大量的并发连接和请求,因此适用于高流量的网站和应用程序。Nginx的性能优化使其成为处理静态内容的理想选择。
-
反向代理:Nginx可以作为反向代理服务器,将客户端请求转发给后端服务器。这对于隐藏后端服务器的实际IP地址、负载均衡和提供SSL终止等功能非常有用。
-
负载均衡:Nginx可以在多个后端服务器之间分发负载,以确保高可用性和性能。它支持各种负载均衡算法,如轮询、IP哈希、最小连接数等。
-
HTTP缓存:Nginx可以缓存静态和动态内容,以减轻后端服务器的负担,提高响应速度,并降低网络延迟。它还可以根据缓存规则控制内容的过期时间和刷新策略。
-
SSL/TLS终止:Nginx能够终止SSL/TLS连接,从而减轻后端服务器的加密负担。这使得配置和管理HTTPS变得更加容易。
-
虚拟主机:Nginx支持虚拟主机配置,允许多个域名共享同一个服务器,并根据域名或请求头将请求路由到正确的站点。
-
HTTP/2支持:Nginx支持HTTP/2协议,这是HTTP/1.1的后续版本,具有更高的性能和效率。
-
动态模块:Nginx具有模块化的架构,允许用户根据需要添加各种功能,因此它可以适应不同的用例和需求。
-
日志和监控:Nginx生成详细的访问日志,可用于分析网站和应用程序的性能。此外,它也支持各种监控工具和第三方模块,以便实时监控服务器状态。
-
可扩展性:Nginx设计用于处理高负载和大规模流量,因此它在高可用性和可扩展性方面表现出色。
总之,Nginx是一个多功能的Web服务器和反向代理服务器,具有出色的性能和可定制性,适用于各种Web应用程序和用例。它已成为许多大型网站和应用程序的关键组件之一。
Apache 经典的 Web 服务端
Apache起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发,目前经历了两大版本分别是1.X和2.X,其可以通过编译安装实现特定的功能
官方网站:Apache官网
Nginx安装
编译安装
- 1.用yum安装Nginx的运行环境
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
- 2 创建nginx用户,不创建家目录和不允许登录
useradd -M -s /sbin/nologin nginx
- 官网下载安装包
这里使用官网的nginx1.18.0
wget http://nginx.org/download/nginx-1.18.0.tar.gz
解归档压缩包
tar -xf nginx-1.18.0.tar.gz
进入新Nginx-1.18.0文件夹
cd ./nginx-1.18.0/
查看安装说明
./configure --help
运行安装脚本
./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
编译安装
make -j 8
编译完成
make install
将编译过的程序移动到指定位置
修改 nginx用户的权限
chown -R nginx.nginx /apps/nginx
创建Nginx服务的 service文件
-
1复制同版本yum安装的service文件
-
2自己编写
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
重载文件
systemctl daemon-reload
设置属主 属组
chown -R nginx.nginx /apps/nginx
建立软连接
ln -s /apps/nginx/sbin/nginx /usr/sbin/
编译安装完成
Nginx信号与平滑升级
nginx 当做单独命令使用有以下选项
信号
nginx 当做单独命令使用有以下选项
nginx -h #查看帮助
--h :这个帮助
-v :显示版本并退出
-V :显示版本和配置选项,然后退出
-t :测试配置和退出
-T :测试配置,转储并退出
-q :在配置测试期间抑制非错误消息
-s 信号:向主进程发送信号:停止、退出、重新打开、重新加载
-p 前缀:设置前缀路径(默认值:/apps/nginx/)
-c filename:设置配置文件(默认值:conf/nginx.conf)
-g 指令:从配置文件中设置全局指令
显示版本
nginx -V
nginx -v
发送信号
查看信号大全
kill -l
关闭或修改版本号
关闭版本号
用第第二台主机访问Nginx服务器
curl -I 192.168.2.30
在 Nginx安装路径/conf/nginx.conf 里的 http模块加入server_tokens off;即可隐藏版本号
server_tokens off;
刷新配置文件
第二台主机curl -I 192.168.2.30
curl -I 192.168.2.30
自定义版本名
去修改源码,在安装包里, 再重新编译
路径 解归档文件夹/src/core/nginx.h
重新编译安装
./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
make && make install
要去设置里把隐藏版本号的选项注释掉
重启服务
成功改成Apache 2.3.9
修改启动的进程数
ps axo pid,cmd,psr,ni|grep nginx
可以可以看到 nginx的 worker数量
1个主进程 1个工作进程
修改nginx.conf里的worker_processes 1;
修改成worker_processes auto
会根据服务器CPU内核数量开启work窗口
把auto换成数字,则会开启数字对应数量窗口
worker_processes auto;
重新加载配置文件
可以看到有8个worker窗口
worke窗口数量建议设置成CPU线程数
nginx 亲缘性绑定
将 CPU 与工作进程绑定在一起,通常称为 CPU 亲和性,是为了优化性能和资源管理的目的。这种绑定可以在多处理器系统上更有效地利用 CPU 资源
性能优化: 通过将特定的工作进程绑定到特定的 CPU 核心上,可以减少进程之间的竞争和干扰,从而提高性能。这对于需要高吞吐量和低延迟的应用程序特别重要,如 Web 服务器、数据库服务器和科学计算应用程序。
避免资源竞争:
在多核 CPU 上运行多个进程可能会导致这些进程竞争有限的 CPU 资源。通过将进程绑定到不同的核心上,可以减少资源竞争,提高系统的响应能力。
稳定性:
CPU 亲和性还可以提高系统的稳定性。如果某个 CPU 核心执行了关键任务,你可以将该任务的进程绑定到该核心上,以确保它获得足够的处理能力,不受其他任务的影响。
可预测性:
在某些情况下,如实时系统或嵌入式系统,对任务的执行时间和延迟有严格要求。通过将任务绑定到特定的 CPU 核心上,可以提高执行的可预测性。
资源隔离:
如果你在同一台服务器上运行多个不同类型的工作负载,可以将它们分别绑定到不同的 CPU 核心上,以确保它们不会相互干扰。
需要注意的是,虽然 CPU 亲和性可以提高性能和资源管理,但它并不总是适用于所有情况。在某些情况下,操作系统的调度器可能会更好地管理进程的分配,因此,应该根据具体的应用场景进行测试和优化。此外,应谨慎配置 CPU 亲和性,以避免过度绑定导致的不必要的复杂性和资源浪费。
实际操作
序号绑定cpu 亲缘性
实际操作
worker_cpu_affinity 0001 0010 0100 1000; # 将进程绑定到不同的 CPU 核心上
在上面的示例中,worker_cpu_affinity 中的四个二进制位表示四个 CPU 核心,分别对应于核心编号 0、1、2 和 3。每个位可以设置为 0 或 1,1 表示允许绑定到该核心,0 表示禁止。你可以根据自己的需求进行调整。
指定日志文件需要新创建日志文件夹
nginx进程的优先级
下面这个命令可以查看nginx的优先级
ps axo pid,cmd,psr,ni|grep nginx|sort -n
可以看到nginx的优先级现在是0
修改配置文件
加入
worker_priority -20;
可以看见worker进程优先级变成-20了
event事件
修改最大单个工作进程连接数
修改
worker_connections
如图修改单个工作进程最大连接数为 65565
-
打开 Nginx 配置文件: 默认情况下,Nginx 的主配置文件通常位于
/etc/nginx/nginx.conf
。你可以使用文本编辑器(例如vi
或nano
)以 root 权限打开此文件:sudo vi /etc/nginx/nginx.conf
-
找到
events
模块: 在配置文件中,找到events
模块。它通常位于文件的开头或中间。如果找不到,请自行添加:events { # 在这里设置参数 }
-
设置
worker_connections
: 在events
模块内,添加或编辑worker_connections
配置项,以指定每个 Nginx worker 进程可以处理的最大连接数。例如,设置为 1024:events { worker_connections 65565; }
-
检查配置文件: 在编辑配置文件后,可以运行以下命令来验证配置文件的语法是否正确:
sudo nginx -t
如果输出显示 “syntax is okay”,说明配置文件语法正确。
-
重新加载 Nginx: 保存配置文件后,重新加载 Nginx 以应用更改:
sudo systemctl reload nginx
这样,你就已经成功设置了 Nginx 的最大连接数。确保你的设置考虑了服务器硬件资源和应用程序性能需求,以便获得最佳性能。同时,也要确保操作系统本身的文件描述符限制(ulimit)允许 Nginx 使用所需的连接数。如果需要增加文件描述符限制,可以编辑 /etc/security/limits.conf
文件。
ulimit -n #查看Linux上最大连接数
vim /etc/systemd/system.conf #可修改系统层面最大连接数
在DefaultLimitNOFILE和DefaultLimitNPROC加上需要设置的最大连接数
重启服务
修改成功
server块构建虚拟主机,配置子文件
新建文件夹
mkdir -p /apps/nginx/conf.d/
在主配置文件中加入
include /apps/nginx/conf.d/*.conf;
/apps/nginx/conf.d/是我存放子配置文件的路径
编写配置文件
vim /apps/nginx/conf.d/pc.conf
server {
listen 80;
server_name localhost;
root /data/nginx/html/pc/;
}
可以配置子配置文件
创建pc项目文件夹
mkdir -p /apps/nginx/html/pc
构建测试文件
echo pc > /apps/nginx/html/pc/index.html
访问192.168.2.30
成功
alias 别名
别名设置
server
{
listen 80;
server_name localhost;
location /nwes {
root /apps/nginx/html/pc/;
#相当于追加 将 文件夹news追加到/apps/nginx/html/pc/news
}
location /study{
alias /mnt/nginx/sports/;
#相当于替换 你访问 study 就是访问/mnt/nginx/sports
}
}
作为下载服务器配置
创建资源仓库文件夹
mkdir /opt/download
location /download {
autoindex on;
#开启下载服务器
autoindex_exact_size on;
#开启确切大小不建议开启
autoindex_localtime on;
#使用当地时间
limit_rate 1024k;
#所有人限速1024k,默认单位是字节数
alias /opt/download;
}
创建测试文件,并刷新配置文件
访问192.168.2.30/download
成功