企业高性能web服务器---nginx详解(基础介绍配置,核心配置)

news2024/11/15 8:42:56

目录

一、web服务器介绍

1.1 Apache prefork 模型 

1.2  Apache worker 模型

​编辑 1.3 Apache event模型

1.4 Nginx-高性能的web服务端 

 1.5 服务端 I/O 流程

1.5.1  磁盘 I/O

1.5.2 网络 I/O

二 、nginx 架构及安装

 2.1 nginx 进程结构

 2.2源码编译安装nginx

2.2.1下载源码包

2.2.2 下载依赖包,并编译。

2.2.3 启动nginx,编译参数

 三、nginx 启动脚本编写

四、nginx平滑升级和回滚

4.1 nginx的平滑升级

4.2 版本回滚

五、nginx核心配置详解

5.1 配置文件说明

5.2 全局配置优化

5.2.1 高并发配置双核心

​编辑

 5.3 nginx配置中的root和alias

5.3.1  local定义目录

​编辑5.3.2 alias ----类似与软链接

5.4 location 的详细使用

 5.5 账户认证

 5.6 自定义错误页面

5.7 自定义日志

5.8 检测文件是否存在

 5.9 长连接配置

 5.10 作为下载服务器配置


一、web服务器介绍

1.1 Apache prefork 模型 

  • 预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
  • 每个子进程有一个独立的线程响应用户请求
  • 相对比较占用内存,但是比较稳定,可以设置最大和最小进程数
  • 是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景

优点:稳定
缺点:每个用户请求需要对应开启一个进程 , 占用资源较多,并发性差 , 不适用于高并发场景

1.2  Apache worker 模型

  • 一种多进程和多线程混合的模型
  • 有一个控制进程,启动多个子进程
  • 每个子进程里面包含固定的线程
  • 使用线程程来处理请求
  • 当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,
  • 由于其使用了线程处理请求,因此可以承受更高的并发

优点:相比 prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keepalive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超 时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用(该问题在prefork 模式下,同样会发生)

 1.3 Apache event模型

Apache 中最新的模式, 2012 年发布的 apache 2.4.X 系列正式支持 event 模型 , 属于事件驱动模型(epoll) 每个进程响应多个请求,在现在版本里的已经是稳定可用的模式

它和 worker 模式很像,最大的区别在于,它解决了 keepalive场景下长期被占用的线程的资源浪费问题 (某些线程因为被 keepalive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)event MPM 中,会有一个专门的线程来管理这些 keepalive 类型的线程
当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keepalive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
缺点:没有线程安全控制

1.4 Nginx-高性能的web服务端 

        Nginx历经十几年的迭代更新( https://nginx.org/en/CHANGES ), 目前功能已经非常完善且运行稳 定,另外 Nginx 的版本分为开发版、稳定版和过期版, nginx 以功能丰富著称,它即可以作为 http服务器,也可以作为反向代理服务器或者邮件服务器能够快速的响应静态网页的请求。
        支持FastCGI/SSL/Virtual Host/URL Rwrite /Gzip / HTTP Basic Auth/http 或者 TCP 的负载均衡 (1.9版本以上且开启 stream 模块 ) 等功能,并且支持第三方的功能扩展。
nginx的工作场景:

 1.5 服务端 I/O 流程

I/O 在计算机中指 Input/Output IOPS (Input/Output Per Second) 即每秒的输入输出量 ( 或读写次数 ), 是衡量磁盘性能的主要指标之一。 IOPS 是指单位时间内系统能处理的 I/O请求数量,一般以每秒处理的I/O 请求数量为单位, I/O 请求通常为读或写数据操作请求。
一次完整的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用 户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而 是需要经历一次从内核空间中的内存数据 copy 到用户空间的进程内存当中,所以简单说 I/O就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。
服务器的 I/O
  • 磁盘I/O
  • 网络I/O : 一切皆文件,本质为对socket文件的读写

1.5.1  磁盘 I/O

磁盘 I/O 是进程向内核发起系统调用,请求磁盘上的某个资源比如是html 文件或者图片,然后内核通过相 应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存, 如果是比较大的数据也需要等待时间
机械磁盘的寻道时间、旋转延迟和数据传输时间:
寻道时间:是指磁头移动到正确的磁道上所花费的时间,寻道时间越短则I/O处理就越快,目前磁盘的寻道时间一般在3-15毫秒左右。

旋转延迟:是指将磁盘片旋转到数据所在的扇区到磁头下面所花费的时间,旋转延迟取决于磁盘的转速,通常使用磁盘旋转一周所需要时间的1/2之一表示,比如7200转的磁盘平均训传延迟大约为
60*1000/7200/2=4.17毫秒,公式的意思为 (每分钟60秒*1000毫秒每秒/7200转每分/2),如果是
15000转的则为60*1000/15000/2=2毫秒。

数据传输时间:指的是读取到数据后传输数据的时间,主要取决于传输速率,这个值等于数据大小除以传输速率,目前的磁盘接口每秒的传输速度可以达到600MB,因此可以忽略不计。

常见的机械磁盘平均寻道时间值:
7200转/分的磁盘平均物理寻道时间:9毫秒
10000转/分的磁盘平均物理寻道时间:6毫秒
15000转/分的磁盘平均物理寻道时间:4毫秒

常见磁盘的平均延迟时间:
7200转的机械盘平均延迟:60*1000/7200/2 = 4.17ms
10000转的机械盘平均延迟:60*1000/10000/2 = 3ms
15000转的机械盘平均延迟:60*1000/15000/2 = 2ms

每秒最大IOPS的计算方法:
7200转的磁盘IOPS计算方式:1000毫秒/(9毫秒的寻道时间+4.17毫秒的平均旋转延迟时
间)=1000/13.13=75.9 IOPS
10000转的磁盘的IOPS计算方式:1000毫秒/(6毫秒的寻道时间+3毫秒的平均旋转延迟时
间)=1000/9=111IOPS
15000转的磁盘的IOPS计算方式:15000毫秒/(4毫秒的寻道时间+2毫秒的平均旋转延迟时
间)=1000/6=166.6 IOPS

1.5.2 网络 I/O

网络通信就是网络协议栈到用户空间进程的IO就是网络IO .

网络 I/O 处理过程
  • 获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3
  • 构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4
  • 返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7

 不论磁盘和网络I/O

每次 I/O ,都要经由两个阶段:
  • 第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
  • 第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短

二 、nginx 架构及安装

Nginx 是免费的、开源的、高性能的 HTTP 和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器
解决 C10K 问题( 10K Connections
架构如下:

 2.1 nginx 进程结构

 web请求处理机制

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求
  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

 Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。

 

 主进程(master process)的功能:

  • 对外接口:接收外部的操作(信号)
  • 对内转发:根据外部的操作的不同,通过信号管理 Worker
  • 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
  • 读取Nginx 配置文件并验证其有效性和正确性
  • 建立、绑定和关闭socket连接
  • 按照配置生成、管理和结束工作进程
  • 接受外界指令,比如重启、升级及退出服务器等指令
  • 不中断服务,实现平滑升级,重启服务并应用新的配置
  • 开启日志文件,获取文件描述符
  • 不中断服务,实现平滑升级,升级失败进行回滚处理
  • 编译和处理perl脚本

 工作进程(worker process)的功能:

  • 所有 Worker 进程都是平等的
  • 实际处理:网络请求,由 Worker 进程处理
  • Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
  • 增加上下文切换的损耗
  • 接受处理客户的请求
  • 将请求依次送入各个功能模块进行处理
  • I/O调用,获取响应数据
  • 与后端服务器通信,接收后端服务器的处理结果
  • 缓存数据,访问缓存索引,查询和调用缓存数据
  • 发送请求结果,响应客户的请求
  • 接收主程序指令,比如重启、升级和退出等

 2.2源码编译安装nginx

环境要求:需要一台虚拟机作为nginx服务器(ip为172.25.254.100,主机名为nginx)。后续可能需要两台虚拟机做web服务器来使用,这边我们后面再详细说明。

2.2.1下载源码包

https://nginx.org/en/download.html
源码的下载地址在上面,我是下载的 nginx-1.24.0。为了后面进行平滑升级到1.26.
源码上传后直接解压到根目录下。然后我们可以在里面看到一些nginx的配置文件。

2.2.2 下载依赖包,并编译。

然后我们下载其配置的依赖包。并添加用户。

[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx

然后下载配置模块。

[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \
--user=nginx \ # 指定nginx运行用户
--group=nginx \ # 指定nginx运行组
--with-http_ssl_module \ # 支持https://
--with-http_v2_module \ # 支持http版本2
--with-http_realip_module \ # 支持ip透传
--with-http_stub_status_module \ # 支持状态页面
--with-http_gzip_static_module \ # 支持压缩
--with-pcre \ # 支持正则
--with-stream \ # 支持tcp反向代理
--with-stream_ssl_module \ # 支持tcp的ssl加密
--with-stream_realip_module # 支持tcp的透传ip

下载完成功会有以下界面。

最后make&&make install下载

2.2.3 启动nginx,编译参数

通过以下命令启动。

[root@nginx-node1 sbin]# ./nginx

查看进程端口

 访问成功

由于 每次编译ngin的命令太长了就把它放到环境变量里面。

[root@Nginx ~]# vim ~/.bash_profile
添加下面的内容

然后source编译一下

[root@Nginx ~]# source ~/.bash_profile

启动

可以访问---注意要关闭防火墙

查看版本

 三、nginx 启动脚本编写

就是将配置写到配置文件中然后我们可以使用systemctl 模块来启动。

编写配置文件

[root@Nginx ~]# vim /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

重载并启动

[root@Nginx ~]# systemctl daemon-reload
[root@Nginx ~]# systemctl start nginx

四、nginx平滑升级和回滚

4.1 nginx的平滑升级

有时候我们需要对 Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx 又在跑着业务无法停掉,这时我们就可能选择平滑升级

然后下面开始配置
首先我们要下载1.26 的源码包并解压。这边我们需要这两个包。
然后解压
然后我们直接编译就行,因为上面的依赖包我们已经下载过了。
[root@nginx-node1 nginx-1.26.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --with-http_ssl_module --with-http_v2_module  --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module 

然后我们只需要make就行了
[root@Nginx nginx-1.26.1]# make
生成的命令在这里面
# 把之前的旧版的 nginx 命令备份
[root@Nginx ~]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# cp nginx nginx.24

#把新版本的nginx命令复制过去

[root@Nginx sbin]# \cp -f /root/nginx/nginx-1.26.1/objs/nginx
/usr/local/nginx/sbin
# 检测一下有没有问题
[root@Nginx sbin]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
#平滑升级
[root@Nginx sbin]# kill -USR2 48732 #nginx worker ID
#USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的 nginx
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进
程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
[root@Nginx sbin]# ps aux | grep nginx
root 48732 0.0 0.1 9868 2436 ? Ss 14:17 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 48733 0.0 0.2 14200 4868 ? S 14:17 0:00 nginx: worker
process
root 52075 0.0 0.3 9876 6528 ? S 15:41 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 52076 0.0 0.2 14208 4868 ? S 15:41 0:00 nginx: worker
process
[root@Nginx sbin]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.24.0 ##依旧是旧版本生生效
Date: Thu, 18 Jul 2024 07:45:58 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 18 Jul 2024 03:41:13 GMT
Connection: keep-alive
ETag: "66988ed9-267"
Accept-Ranges: bytes

# 回收旧版本
[root@Nginx sbin]# kill -WINCH 48732
[root@Nginx sbin]# ps aux | grep nginx
root 48732 0.0 0.1 9868 2436 ? Ss 14:17 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
root 52075 0.0 0.3 9876 6528 ? S 15:41 0:00 nginx: master
process /usr/local/nginx/sbin/nginx

然后已经更新完成了

4.2 版本回滚

激活老的,新的回收
kill  -HUP激活老的
将nginx命令备份还原。
[root@Nginx sbin]# cp nginx nginx.26
[root@Nginx sbin]# ls
nginx nginx.24 nginx.26
[root@Nginx sbin]# mv nginx.24 nginx
版本回滚
[root@Nginx sbin]# kill -HUP 48732
[root@Nginx sbin]# ps aux | grep nginx
root 48732 0.0 0.1 9868 2436 ? Ss 14:17 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
root 52075 0.0 0.3 9876 6528 ? S 15:41 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 52076 0.0 0.2 14208 5124 ? S 15:41 0:00 nginx: worker
process
nobody 52130 0.0 0.2 14200 4868 ? S 16:30 0:00 nginx: worker
process
[root@Nginx sbin]# kill -WINCH 52075
[root@Nginx sbin]# ps aux | grep nginx
root 48732 0.0 0.1 9868 2436 ? Ss 14:17 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
root 52075 0.0 0.3 9876 6528 ? S 15:41 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 52130 0.0 0.2 14200 4868 ? S 16:30 0:00 nginx: worker
process
root 52137 0.0 0.1 221664 2176 pts/0 S+ 16:31 0:00 grep --
color=auto nginx
[root@Nginx sbin]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.24.0 ##版本回滚完成
Date: Thu, 18 Jul 2024 08:31:51 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 18 Jul 2024 03:41:13 GMT
Connection: keep-alive
ETag: "66988ed9-267"
Accept-Ranges: bytes

五、nginx核心配置详解

5.1 配置文件说明

Nginx 的配置文件的组成部分:
  • 主配置文件:nginx.conf
  • 子配置文件: include conf.d/*.conf
  • fastcgi uwsgiscgi 等协议相关的配置文件
  • mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮
  • 件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某
  • 种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动
  • 使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
主配置文件结构:四部分
main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {
...
}
默认的 nginx.conf 配置文件格式说明
#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路
径,日志路径等。
user nginx nginx;
worker_processes 1; #启动工作进程数数量
events { #events #设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多
个网络连接,使用哪种事件驱动模型 #处理请求,每个工作进程可以同时支持的
最大连接数,是否开启对多工作进程下的网络连接进行序列化等。
worker_connections 1024; #设置单个nginx工作进程可以接受的最大并发,作为web服务器
的时候最大并发数为 #worker_connections *
worker_processes,作为反向代理的时候为
#(worker_connections * worker_processes)/2
}
http { #http块是Nginx服务器配置中的重要部分,缓存、代理和日志格
式定义等绝大多数功能和第三方模块都 #可以在这设置,http块可
以包含多个server块,而一个server块中又可以包含多个location块,
#server块可以配置文件引入、MIME-Type定义、日志自定义、是
否启用sendfile、连接超时时间和 #单个链接的请求上限等。
include mime.types;
default_type application/octet-stream;
sendfile on; #作为web服务器的时候打开sendfile加快静态文件传输,指定是
否使用
#sendfile系统调用来传输文件
#sendfile系统调用在两个文件描述符之间直接传递数据(完全在
内核中操作)
#从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率
很高,被称之为零拷贝,
#硬盘 >> kernel buffer (快速拷贝到kernelsocket
buffer) >>协议栈。
keepalive_timeout 65; #长连接超时时间,单位是秒
server { #设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多
个location模块
#比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个
server 可以使用一个端口比如都使用 #80端口提供web服务
listen 80; #配置server监听的端口
server_name localhost; #本server的名称,当访问此名称的时候nginx会调用当前serevr
内部的配置进程匹配。
location / { #location其实是server的一个指令,为nginx服务器提供比较
多而且灵活的指令
#都是在location中体现的,主要是基于nginx接受到的请求字符
串
#对用户请求的UIL进行匹配,并对特定的指令进行处理
#包括地址重定向、数据缓存和应答控制等功能都是在这部分实现
#另外很多第三方模块的配置也是在location模块中配置。
root html; #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使
用绝对路径配置。
index index.html index.htm; #默认的页面文件名称
}
error_page 500 502 503 504 /50x.html; #错误页面的文件名称
location = /50x.html { #location处理对应的不同错误码的页面定
义到/50x.html
#这个跟对应其server中定义的目录下。
root html; #定义默认页面所在的目录
}
}
#和邮件相关的配置
#mail {
# ...
# } mail 协议相关配置段
#tcp代理配置,1.9版本以上支持
#stream {
# ...
# } stream 服务器相关配置段
#导入其他路径的配置文件
#include /apps/nginx/conf.d/*.conf
}

5.2 全局配置优化

是在主配置文件中修改

5.2.1 高并发配置双核心

重载有两个worker核心

5.2.2 修改pam限制

 查看打开的最大文件数

[root@Nginx ~]# vim /etc/security/limits.conf
* - nofile 100000

 

 压力测试:

 5.3 nginx配置中的root和alias

root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location

然后在主配置添加子配置文件来写。

include "/usr/local/nginx/conf.d/*.conf";

子配置文件目录/usr/local/nginx/conf.d,然后我们可以在这里子配置文件。

示例:

[root@nginx-node1 ~]# vim /usr/local/nginx/conf.d/vhost.conf
[root@nginx-node1 ~]# cat /usr/local/nginx/conf.d/vhost.conf
server {
	listen 80;
	server_name www.haha.com;
	root /date/web/html;
	index index.html;
}

校验刷新 nginx -t

重启 nginx -s reload

然后测试

5.3.1  local定义目录

示例:

注意:这里用到的域名都要写到解析文件中。

[root@nginx-node1 ~]# mkdir -p /data/web/html/test1
[root@nginx-node1 ~]#  echo /data/web/html/test1 > /data/web/html/test1/index.html
[root@nginx-node1 ~]# cat  /usr/local/nginx/conf.d/vhost.conf
server {
	listen 80;
	server_name www.haha.com;
	root /data/web/html;
	index index.html;
	location /test1 {
		root /data/web/html;
	}
}

注意要刷新,之后就可以访问到。

5.3.2 alias ----类似与软链接

 定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于

location 上下文 , 此指令使用较少
示例:
server {
listen 80;
server_name lee.timinglee.org;
location / {
root /webdata/nginx/timinglee.org/lee/html;
}
location /dirtest {
root /mnt;
}
location /alias { #注意about后不要加/
#使用alias的时候uri后面如果加了斜杠,则下面的路径配置
必须加斜杠,否则403
alias /mnt/dirtest; #当访问alias的时候,会显示alias定义的/mnt/dirtest
里面的内容
}
}
#重启Nginx并访问测试
[root@node100 ~]# curl lee.timinglee.org/alias/
dirtest page
注意:location 中使用 root 指令和 alias 指令的意义不同
root # 给定的路径对应于 location 中的 /uri 左侧的 /
alias # 给定的路径对应于 location 中的 /uri 的完整路径

5.4 location 的详细使用

  • 在一个serverlocation配置段可存在多个,用于实现从uri到文件系统的路径映射;
  • ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,
  • 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri
  • uri是用户请求的字符串,即域名后面的web文件路径
  • 然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立
即处理请求
^~ #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
#对uri的最左边部分做匹配检查,不区分字符大小写
~ #用于标准uri前,表示包含正则表达式,并且区分大小写
~* #用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
\ #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号

 5.5 账户认证

先创建用户账号。

写配置文件。

[root@Nginx ~]# mkdir /data/web/lee
[root@Nginx ~]# echo lee > /data/web/lee/index.html
[root@Nginx ~]# cat /usr/local/nginx/conf.d/vhosts.conf
server {
    listen 80;
    server_name www.haha.com;
    location /login {
    root /data/web/lee;
    index index.html;
    auth_basic "login password";
    auth_basic_user_file "/usr/local/nginx/.htpasswd";
    }
}

测试访问。

 访问浏览器

 5.6 自定义错误页面

自定义错误页,同时也可以用指定的响应状态码进行响应 , 可用位置: http, server, location, if in
location。
error_page code ... [=[response]] uri;
[root@Nginx ~]# mkdir /data/web/errorage  -p
[root@Nginx ~]# echo error page > /data/web/errorpage/40x.html

 重载测试访问。访问测试。

5.7 自定义日志

修改子配置文件,主要是下面的标红的地方起作用。

 测试:访问存在和不存在的,并查看日志

5.8 检测文件是否存在

修改配置文件添加如下标红内容。

创建删除文件并测试访问。

[root@nginx-node1 ~]# mkdir /data/web/html/error
[root@nginx-node1 ~]# echo error default > /data/web/html/error/default.html
[root@nginx-node1 ~]# curl www.haha.com
www.haha.com
[root@nginx-node1 ~]# rm -rf /data/web/html/index.html 
[root@nginx-node1 ~]# nginx -s reload
[root@nginx-node1 ~]# curl www.haha.com
error default

 5.9 长连接配置

在主配置文件里面设置--/usr/local/nginx/conf/nginx.conf

keepalive_requests 3;
keepalive_timeout 65 60;
#开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,第二个数字60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
Keep-Alive:timeout=60 #浏览器收到的服务器返回的报文
#如果设置为0表示关闭会话保持功能,将如下显示:
#Connection:close 浏览器收到的服务器返回的报文
#使用命令测试

测试我是通过telnet来测试,如果没有就去下载:

修改,第二个值变为keep alive60

 

 5.10 作为下载服务器配置

ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表 ,可以做为下载服务配置使用
#创建目录,并做数据来下载
mkdir /data/web/download
编写子配置文件。添加如下标红部分。
下载:
在网页访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode+pyqt5环境搭建

参考:https://blog.csdn.net/qq_37080185/article/details/121616507 一、安装Python 从Python官网上下载安装包(https://www.python.org/) 安装Python,将安装目录添加到环境变量中。 二、安装Pyqt5 PyQt5以及PyQt5-tools(des…

将光谱数据图片转换成数值格式

文章目录 任务所需工具步骤一:安装必要的Python库步骤二:图像OCR识别步骤三:提取光谱数值并存储完整代码 任务 现测量收集到一批目标色彩样本的光谱响应数据截图(图片保存在spectrum_screenshots文件夹内,截图样例见图1)。其中&a…

PyQt5中如何只使用一个dateEdit控件实现自动选择日期区间功能

wxpython设计GUI:选中wxFormBuilder工具wxCalendarCtrl控件,实现自动选择日期功能 wxPython设计界面转PyQt5设计界面,相同的界面功能,通过移植wxPython源代码实现PyQt5相同界面功能,在实现上述链接提到的自动选择日期…

Windows电脑设置开启自启动Java程序,并且不出现黑窗口

第一步:创建需要运行的批处理文件(.bat 文件) 在jar文件同级目录下新建文本输入以下内容,其中tunnel-monitoring-server.jar改为自己的程序名称,保存文件后缀改为bat。如下图1: echo off java -jar tunne…

开源的Umi-OCR 文字识别工具

开源的Umi-OCR 文字识别工具:OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。 可以将图片PDF识别文字,并可以保存…

python | 字符串编码问题怎么破

python字符串常见两种类型:str和 bytes类型 str表示Unicode字符,bytes表示二进制数据 两者之间转换使用:encode()和decode()方法 一、enocde()和decode()方法 (一)encode()方法 encode()—编码,语法&…

软件测试之常见逻辑思维题

一个岔路口分别通向诚实国和说谎国。来了两个人,已知一个是诚实国的,另一个是说谎国的。诚实国永远说实话,说谎国永远说谎话。现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。请问应该怎么问? 如…

[HDCTF 2023]Welcome To HDCTF 2023

方法一:找个炸弹死掉,flag就出现 方法二:查看页面源码,发现底部assets/js/game.js 复制后访问看到jsfuck编码 复制到控制台查看flag

上海交大周冰心博士:锚定稀缺生物数据挑战,图神经网络重塑蛋白质理解与生成

8 月 12 日,上海交通大学 AI for Bioengineering 暑期学校正式开幕,吸引了来自国内外 30 余所高校和 27 家企业的百余名业内人士。在为期 3 天的学习交流中,多位行业专家、企业界代表及优秀青年学者,围绕 AI 与生物工程的融合与创…

【前缀和算法】--- 一维和二维前缀和模板

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本文开始,博主开始讲解有关前缀和的算法,本篇博客我们先来了解一下有关前缀和的两个模板。 🏠 一维前缀和模板 &…

CPU内部单总线数据通路各阶段的微操作序列利控制信号

1.内部总线与系统总线 内部总线是指同一部件,如CPU内部连接各寄存器及运算部件之间的总线; 系统总线是指同一台计算机系统的各部件,如CPU、内存、通道和各类/0接口间互相连接的总线。 2.寄存器之间数据传送 比如把PC内容送至MAR&#xff…

利用多Lora节省大模型部署成本|得物技术

一、背景 近期,我们在大模型集群的部署过程中遇到了一些挑战。公司有多个业务场景,每个场景都基于自身的数据进行微调,训练出相应的大模型并上线。然而,这些场景的调用量并不高,同时大模型的部署成本较为昂贵&#xf…

从0到1!如何利用GPT创作高质量的儿童绘本故事?(附提示词)

儿童绘本故事需要有趣、富有教育意义,并且简单易懂。利用GPT来创作这样的故事,可以让创意过程变得轻松且高效。以下是一份详细教程,帮助你用GPT创作出吸引孩子们的高质量绘本故事。 1. 明确故事目标和受众 在开始创作之前,明确故事…

Synchronized重量级锁原理和实战(五)

在JVM中,每个对象都关联这一个监视器,这里的对象包含可Object实例和Class实例.监视器是一个同步工具,相当于一个凭证,拿到这个凭证就可以进入临界区执行操作,没有拿到凭证就只能阻塞等待.重量级锁通过监视器的方式保证了任何时间内只允许一个线程通过监视器保护的临界区代码. …

Linux基础环境开发工具gcc/g++ make/Makefile

1.Linux编译器-gcc/g使用 1. 预处理(进行宏替换) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。 选项“-o”是指目标…

第2章-01-网站中的资源介绍

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲。 🎉欢迎 👍点赞✍评论⭐收…

代码随想录算法训练营第二十一天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目: 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除&…

类与对象(中(2))

开头 大家好啊,上一期内容我们介绍了类与对象中六大默认成员函数中的两种--->构造函数与析构函数,相信大家多少都形成了自己的独到见解。那么今天,我将继续就拷贝构造函数与运算符重载函数来展开讲解,话不多说,我们…

在 Vue.js 中使用 Ant Design 实现表格开关功能:详细教程

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

秃姐学AI系列之:池化层 + 代码实现

目录 池化层 二维最大池化层 Max Pooling 池化层超参数 平均池化层 Mean Pooling 总结 代码实现 池化层 卷积对位置非常敏感的,但是我们在实际应用中我们需要一定程度的平移不变性。比如照明、物体位置、比例、外观等因素会导致图片发生变化。所以卷积对未…