企业高性能web服务器

发布于:2025-08-13 ⋅ 阅读:(16) ⋅ 点赞:(0)

web服务器基础介绍

Apache 经典的 Web 服务端

Apache prefork 模型

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

Apache worker 模型

· 一种多进程和多线程混合的模型
· 有一个控制进程,启动多个子进程
· 每个子进程里面包含固定的线程
· 使用线程程来处理请求
· 当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,
· 由于其使用了线程处理请求,因此可以承受更高的并发
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keepalive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用(该问题在prefork模式下,同样会发生)

Apache event模型

Apache中最新的模式,2012年发布的apache 2.4.X系列正式支持event 模型,属于事件驱动模型(epoll)
· 每个进程响应多个请求,在现在版本里的已经是稳定可用的模式
· 它和worker模式很像,最大的区别在于,它解决了keepalive场景下长期被占用的线程的资源浪费问题(某些线程因为被keepalive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)

· event MPM中,会有一个专门的线程来管理这些keepalive类型的线程

· 当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
缺点:没有线程安全控制

Nginx-高性能的 Web 服务端

官网地址:http://www.nginx.org

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

基于Nginx的工作场景:

服务端 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文件的读写

磁盘 I/O

磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源比如是html 文件或者图片,然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间

网络 I/O

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

网络I/O 处理过程

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

不论磁盘和网络I/O

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

I/O 模型相关概念

同步/异步:关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
        同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者          主动询问事情是否处理完成
        异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者            的运行状态

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
        阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
        非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。

零拷贝(sendfile):文件过来本来要给用户空间,这个直接省略了内核到用户的过程

Nginx架构和安装

概述

Nginx 功能介绍

静态的web资源服务器html,图片,js,css,txt等静态资源
http/https协议的反向代理
结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
tcp/udp协议的请求转发(反向代理)
imap4/pop3协议的反向代理

基础特性

模块化设计,较好的扩展性
高可靠性
支持热部署:不停机更新配置文件,升级版本,更换日志文件
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
event-driven,aio,mmap,sendfile

Web 服务相关的功能

虚拟主机(server)
支持 keep-alive 和管道连接(利用一个连接做多次请求)
访问日志(支持基于日志缓冲提高其性能)url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程

Nginx 架构和进程

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调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等

Nginx 安装

Nginx版本和安装方式

Nginx版本
Mainline version 主要开发版本,一般为奇数版本号,比如1.19
Stable version 当前最新稳定版,一般为偶数版本,如:1.20
Legacy versions 旧的稳定版,一般为偶数版本,如:1.18


Nginx安装可以使用yum或源码安装,但是推荐使用源码编译安装
yum的版本比较旧
编译安装可以更方便自定义相关路径
使用源码编译可以自定义相关功能,更方便业务的上的使用

Nginx 编译安装

官方源码包下载地址:https://nginx.org/en/download.html

下载所需的包

[root@localhost ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y

将nginx源码编译包解压并编译安装

[root@localhost mnt]# ls
hgfs  nginx-1.24.0.tar.gz
[root@localhost mnt]# tar zxf nginx-1.24.0.tar.gz
[root@localhost mnt]# ls
hgfs  nginx-1.24.0  nginx-1.24.0.tar.gz
[root@localhost mnt]# cd nginx-1.24.0/
[root@localhost nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
[root@localhost 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

[root@localhost nginx-1.24.0]# make && make install

nginx完成安装以后,有四个主要的目录

[root@localhost nginx-1.24.0]# ls /usr/local/nginx/
conf  html  logs  sbin

conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他
的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params
两个文件,配置文件一般都有一个样板配置文件,是以.default为后缀,使用时可将其复制并将default后缀
去掉即可。

html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web
文件是默认的错误页面提示页面。

logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比
如/var/logs/nginx里面。

sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。

验证版本及编译参数

[root@localhost nginx-1.24.0]# vim ~/.bash_profile

[root@localhost nginx-1.24.0]# source ~/.bash_profile

查看当前nginx所包含的软件包和版本 

[root@localhost nginx-1.24.0]# nginx -V
nginx version: nginx/1.24.0
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC)
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/local/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

#nginx所带指令参数
-?,-h        : this help
  
-v           : show version and exit
  
-V           : show version and configure options then exit    #显示版本和编译参数
  
-t           : test configuration and exit                     #测试配置文件是否异
 
-T           : test configuration, dump it and exit            #测试并打印
  
-q           : suppress non-error messages during configuration testing #静默模式
  
-s signal    : send signal to a master process: stop, quit, reopen, reload #发送信号,reload信号 会生成新的worker,但master不会重新生成
  
-p prefix     : set prefix path (default: /etc/nginx/)         #指定Nginx 目录
  
-c filename   : set configuration file (default: /etc/nginx/nginx.conf) #配置文件路径
  
-g directives : set global directives out of configuration file #设置全局指令,注意和配置文件不要同时配置,否则冲突

配置nginx的启动文件

[root@localhost ~]# 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@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start nginx

nginx的编辑文档

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

这里我的内核为2所以就改为2

查看当前nginx版本号

平滑升级和回滚

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

平滑升级流程

· 将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
· 向master进程发送USR2信号
· master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
· master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个      Nginx主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生    成的master进程的PID存放至新生成的pid文件nginx.pid
· 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
· 向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
· 如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT

平滑升级和回滚案例

#下载nginx1.26.1版本源码包并解压
[root@localhost mnt]# tar zxf nginx-1.26.1.tar.gz
[root@localhost mnt]# cd nginx-1.26.1/

#进行检测编译(不下载)
[root@localhost nginx-1.26.1]# ./configure --prefix=/usr/local/nginx --user=nginx --grou   p=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-ht   tp_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-st   ream_ssl_module --with-stream_realip_module

[root@localhost nginx-1.26.1]# make

平滑升级版本

#做好旧版备份
[root@localhost sbin]# cp nginx.24 nginx
cp: overwrite 'nginx'? yes
[root@localhost sbin]# ls
nginx  nginx.24

#将新版移入nginx
[root@localhost sbin]#  \cp -f /mnt/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/nginx

回滚

Nginx核心配置

配置文件说明

官方文档:http://nginx.org/en/docs/

配置文件的组成部分:

主配置文件:nginx.conf
子配置文件: include conf.d/*.conf
fastcgi, uwsgi,scgi 等协议相关的配置文件
mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

配置文件格式说明:

配置文件由指令与指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
使用#符号添加注释,提高可读性
使用$符号使用变量
部分指令的参数支持正则表达式

主配置文件的配置指令方式

directive value [value2 ...];

注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
         内建变量:由Nginx模块引入,可直接引用
         自定义变量:由用户使用set命令定义,格式: set variable_name value;
         引用变量:$variable_name

主配置文件结构:四部分

main block:主配置段,即全局配置段,对http,mail都有效


#事件驱动相关的配置
event {
 ...
}  

#http/https 协议相关配置段
http {
 ...
} 

#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
 ...
}

#stream 服务器相关配置段
stream {
 ...
} 

默认nginx.conf配置文件说明

文件路径:

[root@localhost mnt]# cd /usr/local/nginx/conf/
[root@localhost conf]# ls
fastcgi.conf            koi-win             scgi_params
fastcgi.conf.default    mime.types          scgi_params.default
fastcgi_params          mime.types.default  uwsgi_params
fastcgi_params.default  nginx.conf          uwsgi_params.default
koi-utf                 nginx.conf.default  win-utf
[root@localhost conf]# vim nginx.conf

配置说明:

[root@localhost conf]# ps aux | grep nginx
root        6450  0.0  0.1   9868  3204 ?        Ss   16:56   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       6507  0.0  0.2  14216  5108 ?        S    16:56   0:00 nginx: worker process
nginx       6508  0.0  0.2  14216  5108 ?        S    16:56   0:00 nginx: worker process
nginx       6509  0.0  0.2  14216  5108 ?        S    16:56   0:00 nginx: worker process
nginx       6510  0.0  0.2  14216  5108 ?        S    16:56   0:00 nginx: worker process
root        6665  0.0  0.1   6408  2176 pts/0    S+   16:56   0:00 grep --color=auto nginx

为了防止worker交错切换核心产生不必要的开销,因此将worker和CPU核心进行绑定

将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。

对当前nginx进行压测

[root@localhost conf]# dnf install httpd-tools -y
[root@localhost conf]# ab -n100000 -c5000 http://172.25.254.100/index.html
This is ApacheBench, Version 2.3 <$Revision: 1903618 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.254.100 (be patient)
socket: Too many open files (24)

-n请求总量  -c并发量    总共100000个请求,每次发送5000个并发

实现nginx的高并发

为解决并发数目很多导致的问题使用epoll模型(异步非阻塞)

改完文件后还要调整系统可打开文件个数

[root@localhost conf]# ulimit -n
1024
[root@localhost conf]# vim /etc/security/limits.conf

[root@localhost conf]# ulimit -n
1024
[root@localhost conf]# ulimit -n 100000
[root@localhost conf]# ulimit -n
100000

#进行测试---成功
[root@localhost conf]# ab -n100000 -c5000 http://172.25.254.100/index.html
This is ApacheBench, Version 2.3 <$Revision: 1903618 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 172.25.254.100 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:        nginx/1.24.0
Server Hostname:        172.25.254.100
Server Port:            80

Document Path:          /index.html
Document Length:        615 bytes

Concurrency Level:      5000
Time taken for tests:   17.156 seconds
Complete requests:      100000
Failed requests:        0
Total transferred:      84800000 bytes
HTML transferred:       61500000 bytes
Requests per second:    5828.77 [#/sec] (mean)
Time per request:       857.813 [ms] (mean)
Time per request:       0.172 [ms] (mean, across all concurrent requests)
Transfer rate:          4826.95 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0  414 156.5    379    1229
Processing:    96  405 128.4    385    1225
Waiting:        1  262 127.9    259     773
Total:        563  820 133.2    802    1456

Percentage of the requests served within a certain time (ms)
  50%    802
  66%    851
  75%    880
  80%    905
  90%    966
  95%   1037
  98%   1260
  99%   1354
 100%   1456 (longest request)

防止惊群

避免新的请求同时唤起所有worker

http配置块

#在响应报文中将指定的文件扩展名映射至MIME对应的类型
include           /etc/nginx/mime.types;
default_type     application/octet-stream; #除mime.types中的类型外
 #指定其它文件的默认MIME类型,浏览器一般会提示下载
types {
   text/html html;
   image/gif gif;
   image/jpeg jpg;
}

在默认发布目录中建立文件写入php页面

[root@localhost conf]# vim /usr/local/nginx/html/index.php
<?php
  phpinfo();
?>

[root@localhost conf]# curl -I 172.25.254.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 12 Aug 2025 12:20:37 GMT
Content-Type: application/octet-stream    #兼容模式
Content-Length: 22
Last-Modified: Tue, 12 Aug 2025 12:17:49 GMT
Connection: keep-alive
ETag: "689b30ed-16"
Accept-Ranges: bytes

由兼容模式改为自己指定的模式

[root@localhost conf]# nginx -s reload
[root@localhost conf]# curl -I 172.25.254.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 12 Aug 2025 12:27:00 GMT
Content-Type: test/html    #模式改变
Content-Length: 22
Last-Modified: Tue, 12 Aug 2025 12:17:49 GMT
Connection: keep-alive
ETag: "689b30ed-16"
Accept-Ranges: bytes

可以让浏览器识别过来的请求是是什么类型,这样方便浏览器去修饰

打开日志类型

核心配置实例

基于域名建立站点

在主配置文件里指定了子配置文件目录,放前面防止覆盖

[root@localhost conf]# mkdir -p /usr/local/nginx/conf.d
[root@localhost conf]# cd /usr/local/nginx/conf.d
[root@localhost conf.d]# vim vhosts.conf

建立了简单的虚拟主机

[root@localhost conf.d]# mkdir -p /web/html
[root@localhost conf.d]# echo web_html > /web/html/index.html
[root@localhost conf.d]# nginx -s reload
[root@localhost conf.d]# curl 172.25.254.100
172.25.254.100
[root@localhost conf.d]# curl www.syawen.org
web_html

alias与root

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

server {
   listen 80;
   server_name www.suyawen.org;
   location / {
       root /webdata/nginx/suyawen.org/les/html;
   }
   location /dirtest {     #必须建立/mnt/dirtest才能访问
       root /mnt;
   }
}

alias指定了一个文件后,可以把你指定到你想要去的文件,不需要加location后面的路径

[root@localhost conf.d]# vim /mnt/test.html
/mnt_test page

[root@localhost conf.d]# vim vhosts.conf
server{
    listen  80;
    server_name www.suyawen.org;
    root    /web/html;
    index   index.html;
    location /test {
        alias /mnt/test.html;
    }
}
[root@localhost conf.d]# nginx -s reload
[root@localhost conf.d]# curl www.suyawen.org/test
/mnt_test page

location 的详细使用

· 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;
· ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,

· 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri

· uri是用户请求的字符串,即域名后面的web文件路径
· 然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。

#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }

=     #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求

^~    #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
      #对uri的最左边部分做匹配检查,不区分字符大小写
 
~            #用于标准uri前,表示包含正则表达式,并且区分大小写
~*           #用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号      #匹配起始于此uri的所有的uri
\            #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号

#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号

Nginx 账户认证功能

当认证文件不存在是需要用-c建立,当认证文件存在时如果加-c参数会覆盖原文件内容

指定用户文件

[root@localhost ~]# curl -uadmin:123 www.suyawen.org/login/
login

自定义错误页面

[root@localhost ~]# mkdir /web/errorpage
[root@localhost ~]# echo "糟糕!出错了!" > /web/errorpage/error.html
[root@localhost ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server{
    listen  80;
    server_name www.suyawen.org;
    root    /web/html;
    index   index.html;
    error_page 500 502 503 504 404 403 /errorpage/error.html;
    location /login/ {
        root /web/;
        index index.html;
        auth_basic "login password";
        auth_basic_user_file "/usr/local/nginx/.htpasswd";
    }
    location /errorpage {
        root /web/;
    }
}
[root@localhost ~]# nginx -s reload
[root@localhost ~]# curl www.suyawen.org/a/
糟糕!出错了!

指定错误日志

[root@localhost ~]# vim /usr/local/nginx/conf.d/vhosts.conf

长连接

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

nginx作为下载服务器

ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务配置使用

相关命令:

autoindex on | off;             #自动文件索引功能,默为off

autoindex_exact_size on | off;  #计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认on

autoindex_localtime on | off ;  #显示本机时间而非GMT(格林威治)时间,默认off

autoindex_format html | xml | json | jsonp;  #显示索引的页面文件风格,默认html

limit_rate rate;       #限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,bytes/second,     
                       #默认值0,表示无限制,此指令由ngx_http_core_module提供
set $limit_rate 4k;    #也可以通变量限速,单位B/s,同时设置,此项优级高.

配置文件

[root@localhost ~]# vim /usr/local/nginx/conf.d/vhosts.conf
...
}
    location /download/ {
        root /web/;
        autoindex on;
    }
...
[root@localhost ~]# curl www.suyawen.org/download/
<html>
<head><title>Index of /download/</title></head>
<body>
<h1>Index of /download/</h1><hr><pre><a href="../">../</a>
<a href="les">les</a>                                                12-Aug-2025 14:12           524288000
</pre><hr></body>
</html>

Nginx 高级配置

Nginx 状态页

基于nginx 模块 ngx_http_stub_status_module 实现,

在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module

否则配置完成之后监测会是提示法错误

注: 状态页显示的是整个服务器的状态,而非虚拟主机的状态

#配置示例:
location /nginx_status {
  stub_status;
   auth_basic           "auth login";
   auth_basic_user_file /apps/nginx/conf/.htpasswd;
   allow 192.168.0.0/16;
   allow 127.0.0.1;
   deny all;
 }

#状态页用于输出nginx的基本状态信息:
#输出信息示例:
Active connections: 291
server accepts handled requests
 16630948 16630948 31070465
 上面三个数字分别对应accepts,handled,requests三个值
Reading: 6 Writing: 179 Waiting: 106

Active connections:   #当前处于活动状态的客户端连接数
                      #包括连接等待空闲连接数=reading+writing+waiting
 
accepts:             #统计总值,Nginx自启动后已经接受的客户端请求连接的总数。
handled:              #统计总值,Nginx自启动后已经处理完成的客户端请求连接总数
                      #通常等于accepts,除非有因worker_connections限制等被拒绝的连接
 
requests:             #统计总值,Nginx自启动后客户端发来的总的请求数

Reading:              #当前状态,正在读取客户端请求报文首部的连接的连接数
                      #数值越大,说明排队现象严重,性能不足
 
Writing:              #当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大

Waiting:             #当前状态,正在等待客户端发出请求的空闲连接数 开启 keep-alive的情况下,这个值等于active – (reading+writing)

Nginx 反向代理功能

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。
Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能

ngx_http_proxy_module:   #将客户端的请求以http协议转发至指定服务器进行处理
ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass
                         #等指令引用的后端服务器分组
 
ngx_stream_proxy_module: #将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module: #将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module:   #将客户端对Python的请求以uwsgi协议转发至指定服务器处理


网站公告

今日签到

点亮在社区的每一天
去签到