高性能web服务器nginx

目录

nginx简介

服务端 I/O 流程

Nginx 进程结构

Nginx启动流程

nginx的源码编译下载

nginx命令常见参数

nginx的配置文件详解

全局配置优化

nginx的平滑升级和回滚

nginx目录匹配优先级测试(因为=只支持访问文件,所有不比对=匹配目录优先级)

nginx中自定义错误页面

nginx中自定义错误日志

nginx中检测文件是否存在

nginx中长连接配置

nginx作为下载服务器配置

nginx高级配置

Nginx 状态页设置

Nginx 压缩功能

nginx的变量

常用内置变量

自定义变量的使用

ngx_http_rewrite_module 模块指令

Nginx Rewrite

全站加密:

nginx动静分离的实现

nginx反向代理的负载均衡

nginx的防盗链

php的动态扩展模块(php的缓存模块)

php高速缓存(使nginx跳过php-fpm,php直接向缓存中的memcached读取数据)


nginx简介

Nginx是一款轻量级和高性能的Web服务器、反向代理服务器、电子邮件代理服务器,是带有BSD-like协议的开源产品。Nginx由俄罗斯程序员伊戈尔·赛索耶夫开发,其第一个公开版本0.1.0发布于2004年10月4日。在技术设计上,Nginx采用事件驱动架构,能够处理大量并发连接,这使得它在面对高流量网站时表现出色。官方测试显示,Nginx能够支撑高达50,000个并发链接,同时CPU和内存消耗非常低,运行非常稳定。Nginx因其高性能、低资源占用和灵活的功能特性,成为全球许多网站首选的Web服务器和反向代理服务器。无论是静态资源服务、动态内容代理、负载均衡还是HTTPS加强,Nginx基本都能胜任。

主要功能:Nginx可以作为静态和动态内容的HTTP服务器。它也可以作为反向代理服务器,将客户端请求转发到后端服务器,并将后端服务器的响应返回给客户端。在现代网站架构中,Nginx经常被用作负载均衡器,通过算法(如轮询、权重、IP哈希等)将客户端请求均匀分配到多个服务器,从而增强系统性能和可靠性。对于动态内容(如PHP脚本),Nginx可以将请求转发到专门的应用程序服务器(例如Apache或PHP-FPM),而由Nginx负责处理静态内容(如图片、CSS、JavaScript文件)

服务端 I/O 流程

服务端I/O流程包括磁盘I/O和网络I/O,主要用于处理数据从内核空间到用户空间的传输。这一过程对于服务器性能和响应速度有重要影响。

基本概念:
I/O即输入输出,指在计算机中进行数据交换的过程。
服务端I/O涉及磁盘I/O和网络I/O,两者在原理上有所不同但互相补充。
磁盘I/O:
进程向内核发起系统调用,请求磁盘上的某个资源,如HTML文件或图片。
内核通过相应的驱动程序将目标文件加载到内核内存空间(缓冲区)。
数据准备完成后,内核将其从缓冲区复制到用户空间的进程内存中。
网络I/O:
网络I/O主要处理网络协议栈与用户空间进程之间的数据传输。
服务器通过网络接口接收到请求数据,经内核预处理后交给应用程序。
 应用程序处理完请求并构建响应,再通过内核空间的网络I/O返回给客户端。
设备控制器:
设备控制器是管理CPU信号传入和传出的系统,它连接外部设备并通过寄存器进行数据存储和管理
设备控制器通常以芯片或印刷电路卡形式插入主板。
内存映射I/O:
内存映射I/O是一种将控制寄存器映射到内存空间的方法,使CPU能够直接访问这些寄存器。
这种方法简化了CPU与设备通信,提高了数据处理效率。
阻塞和非阻塞:
阻塞I/O指在完成操作前,调用者必须等待,无法进行其他操作。
非阻塞I/O允许调用者在等待期间执行其他任务,提高系统整体效率。

Nginx 进程结构

Nginx的进程结构主要包含一个master进程和多个worker进程,以及在某些配置下可能包括cache进程。这种多进程结构设计旨在保证Nginx的高可用性和高可靠性。

Master Process(主进程):负责整个Nginx的启动、加载配置文件、管理worker进程以及处理外部信号。Master进程是所有worker进程的父进程。当系统启动Nginx时,首先运行的是master进程,然后由它根据配置创建相应的worker进程。

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

Worker Processes(工作进程):负责处理具体的客户端请求,如页面请求、反向代理等。Worker进程的数量一般设置为与服务器的CPU核数相同,这样可以利用多核CPU的并行处理能力。每个worker进程都是独立运行的,它们之间不共享地址空间,确保了系统的高可靠性。

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

Cache Processes(缓存进程):包括cache manager和cache loader进程,主要用于反向代理时的缓存处理。Cache Manager负责管理缓存,而Cache Loader负责加载缓存内容到内存中。

Nginx启动流程

Master进程启动:当Nginx启动时,首先运行Master进程,它会加载配置文件并进行一系列初始化操作。这些操作包括设置进程ID、加载并初始化各模块(如HTTP模块、event模块等),以及设置好用于监听的socket。

Worker进程启动:Master进程根据配置文件中指定的worker_processes数量,fork出多个Worker进程。每个Worker进程都会进行一些自身的初始化操作,比如设置进程优先级、打开文件描述符的数量限制,并将监听的socket设置为可读状态以便接收客户端的连接请求。Worker进程会竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求

nginx的源码编译下载

1.下载好所需的安装包以及创立用户nginx

yum install gcc pcre-devel zlib-devel openssl-devel -y
useradd -s /sbin/nologin -M nginx

2.解压提前上传的nginx包并进入解压后的目录(可以去阿里云镜像站上获取)

3.配置信息并进行编译下载

./configure --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

4.配置环境变量

5.修改nginx启动文件并重启服务(vim /lib/systemd/system/nginx.service)

测试(nginx -V 查看版本)

nginx命令常见参数

-v:显示nginx的版本信息。

-t:测试配置文件是否有语法错误。

-T:测试配置文件并打印出配置信息。

-q:在测试配置文件时,不输出非错误信息。

-s signal:向主进程发送信号,如stop、quit、reopen、reload等。

-p prefix:指定nginx的安装目录,默认为/etc/nginx/。

-c filename:指定配置文件路径,默认为/etc/nginx/nginx.conf。

-g directives:设置全局指令,这些指令不在配置文件中

nginx的配置文件详解

# 全局配置端,对全局生效,主要设置 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; # 定义默认页面所在的目录
}
}

全局配置优化

user nginx;:指定运行Nginx进程的用户为"nginx"

orker_processes auto;:设置工作进程的数量,"auto"表示根据可用CPU核心数自动选择合适数量的工作进程。

worker_cpu_affinity 01 10;:绑定工作进程到特定的CPU核心上。因为我设置的两核所以这里将第一个工作进程绑定到CPU核心0和1,第二个工作进程绑定到CPU核心10。(如果是四核则0001 0010 0100 1000,以此类推)

nginx的平滑升级和回滚

1.解压提前上传的nginx包并进入解压后的目录

2.编译新版本

./configure --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

3.查看两个版本并把之前的版本备份,新版的nginx挪过去

4.查看进程,进行平滑升级

#USR2 平滑升级可执行程序 , 将存储有旧版本主进程 PID 的文件重命名为 nginx.pid.oldbin ,并启动新的nginx
5.回收旧版本
平滑升级测试
回滚
1. 重新拉起旧版本的 worker
2.向之前的nginx.24的进程发送HUP(挂起)信号并将新版本nginx.26回收
回滚测试

nginx目录匹配优先级测试(因为=只支持访问文件,所以不比对=匹配目录优先级)

Nginx 账户认证功能

1.创建用户认证表

2.生成默认访问页面

3.修改配置文件启用认证并重启服务

测试

nginx中自定义错误页面

1.在配置文件中编写错误时访问页面

2.向默认错误页面里输入内容

测试

nginx中自定义错误日志

1.在配置文件中定义日志存放目录

2.创建存放目录并重启服务

测试

nginx中检测文件是否存在

try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如

果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一

个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内

部500错误

1.编写配置文件定义检测文件范围

2.编写找不到时默认访问的default文件

重启服务并测试

nginx中长连接配置

keepalive_timeout timeout [header_timeout]; #设定保持连接超时时长,0表示禁止长连接,默认为75s

#通常配置在http字段作为站点全局配置

keepalive_requests 数字; #在一次长连接上所允许请求的资源的最大数量

#默认为100次,建议适当调大,比如:500

例:如图,keepalive_timeout 65 60;此配置会设置超时时间为65s,但是客户端会看到是60s,

keepalive_requests 500;在一次长连接上所允许请求的资源的最大数量为500,超过500自动中断

nginx作为下载服务器配置

1.创建存放下载资源的目录并传输供下载的资源

这个命令将创建一个名为xufile的文件,大小为100MB。它使用/dev/zero作为输入文件,这意味着它将从全零文件中读取数据。然后,它将数据写入到/data/web/download/目录下的xufile文件中,每次读写1MB的数据块

2.编写配置文件

  • root /data/web;:指定该路径下的文件应该从/data/web目录中提供。

  • autoindex on;:启用自动索引功能,当访问/download路径时,会显示目录下的文件列表。

  • autoindex_localtime on;:在文件列表中显示文件的本地时间。

  • autoindex_exact_size off;:禁用显示文件的精确大小,只显示大致的大小。

  • limit_rate 1024K;:限制下载速度为1024KBps(即1MBps)。

这个配置块的作用是设置Nginx服务器如何处理来自客户端的/download路径的请求。具体来说,它会将请求映射到/data/web目录下的文件,并提供一个文件列表供用户浏览和下载。同时,它还限制了下载速度,以防止过大的流量占用过多的带宽

重启服务进行测试

nginx高级配置

Nginx 状态页设置

编辑配置文件,定义状态页

该配置文件定义一个名为域名为status.xujiahao.org的主机。该主机监听80端口,并将根目录设置为/data/web/html,默认首页为index.html。同时,它还定义了一个名为/status的位置块,用于显示服务器的状态信息。在这个位置块中,使用了stub_status指令来提供状态信息,只允许IP地址为172.25.254.1的客户端访问,其他所有客户端都被拒绝访问。

测试

Nginx 压缩功能

在配置文件中启用压缩功能并定义压缩配置

  • gzip on;:启用gzip压缩功能。

  • gzip_comp_level 5;:设置压缩级别为5(范围是1到9,数值越大表示压缩率越高,但CPU消耗也越大)。

  • gzip_min_length 1k;:设置最小压缩文件大小为1KB,小于这个大小的文件不会被压缩。

  • gzip_http_version 1.1;:指定使用HTTP/1.1协议进行压缩。

  • gzip_vary on;:启用Vary头,告诉代理服务器根据不同的请求头来缓存压缩后的文件。

  • gzip_types ...;:指定需要压缩的文件类型,包括文本、JavaScript、CSS、XML、PHP脚本以及图片格式等。

重启服务进行测试

nginx的变量

常用内置变量

$remote_addr;

\#存放了客户端的地址,注意是客户端的公网IP

$args;

\#变量中存放了URL中的所有参数

\#例如:https://search.jd.com/Search?keyword=手机&enc=utf-8

\#返回结果为: keyword=手机&enc=utf-8

$is_args

\#如果有参数为? 否则为空

$document_root;

\#保存了针对当前资源的请求的系统根目录,例如:/webdata/nginx/timinglee.org/lee。

$document_uri;

\#保存了当前请求中不包含参数的URI,注意是不包含请求的指令

\#比如:http://lee.timinglee.org/var?\id=11111会被定义为/var

\#返回结果为:/var

$host;

\#存放了请求的host名称

limit_rate 10240;

echo $limit_rate;

\#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0

$remote_port;

\#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口

$remote_user;

\#已经经过Auth Basic Module验证的用户名

$request_body_file;

\#做反向代理时发给后端服务器的本地资源的名称

$request_method;#请求资源的方式,GET/PUT/DELETE等

$request_filename;

\#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,

\#如:webdata/nginx/timinglee.org/lee/var/index.html

$request_uri;

\#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,

\#例如:/main/index.do?id=20190221&partner=search

$scheme;

\#请求的协议,例如:http,https,ftp等

$server_protocol;

\#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等

$server_addr;

\#保存了服务器的IP地址

$server_name;

\#虚拟主机的主机名

$server_port;

\#虚拟主机的端口号

$http_user_agent;

\#客户端浏览器的详细信息

$http_cookie;

\#客户端的所有cookie信息

$cookie_<name>

\#name为任意请求报文首部字部cookie的key名

$http_<name>

\#name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有

横线需要替换为下划线

在配置文件中定义访问页面时输出变量

访问测试

自定义变量的使用

在配置文件中自定义变量并输出

访问测试

ngx_http_rewrite_module 模块指令

if指令

`<!--= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false-->

<!--!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false-->

<!--~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假-->

<!--!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假-->

<!--~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假-->

<!--!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真-->

<!---f 和 !-f #判断请求的文件是否存在和是否不存在-->

<!---d 和 !-d #判断请求的目录是否存在和是否不存在-->

<!---x 和 !-x #判断文件是否可执行和是否不可执行-->

<!---e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)-->

break和return

Nginx Rewrite

编辑配置文件,当访问时临时重定向到www.xujiahao.com

编辑配置文件,当访问时永久重定向到www.xujiahao.com

全站加密:

1.创建存放RSA密钥对和自签名证书的目录,并生成RSA密钥对和自签名证书

2.修改配置文件

配置一个名为www.xujiahao.org的网站。它监听80和443端口,分别用于HTTP和HTTPS连接。网站的文件根目录设置为/data/web/html,首页文件为index.html。同时,配置SSL证书和密钥的路径,以及SSL会话缓存和超时设置。最后,定义了一个location块,用于将所有HTTP请求重定向到HTTPS。

访问时自动转入了https

nginx动静分离的实现

1.编辑配置文件

监听80端口,并将域名www.xujiahao.edu的请求转发到不同的后端服务器。当访问根路径(/)时,请求会被转发到IP地址为172.25.254.30的服务器。当访问包含/static路径的URL时,请求会被转发到IP地址为172.25.254.20,端口为8080的服务器。

2.在172.25.254.10和172.25.254.20上制作界面,并在172.25.254.20上改变监听端口为8080

nginx反向代理的负载均衡

编辑配置文件

该配置定义了一个服务集群webserver其中包含了三个服务器172.25.254.10,172.25.254.20,172.25.254.100,当访问定义的test.xujiahao.test域名时会将请求打向172.25.254.10,172.25.254.20(因为默认的是轮询算法,可以根据具体情况选择其他算法如源地址hash目标地址hash等)。当172.25.254.10和172.25.254.20都不可用时会打向备用的服务器172.25.254.100

测试

nginx的防盗链

1.创建存放测试图片的目录以及在该目录下上传照片

2.编辑配置文件,使可以访问到这张图片

3.制作盗链。另起一台虚拟机如172.25.254.10,修改其默认页面

4.防盗链的制作,编辑配置文件

测试:图片已经不显示,点击跳转直接404

php的动态扩展模块(php的缓存模块)

安装memcache模块

网上下载资源传输过去后进行解压。再利用phpize命令准备PHP扩展的构建环境。然后,运行./configure脚本来检查系统环境和配置编译选项。接下来,使用make命令编译扩展。最后,使用make install命令将编译好的扩展安装到系统的PHP扩展目录中。

复制测试文件到nginx发布目录中并修改管理员用户名和密码

配置php加载memcache模块(vim /usr/local/php/etc/php.ini)

(如果编译的时候没有加上--with-config-file-path=/usr/local/php/etc可能会导致不读配置文件过滤不出来,可以通过cp /usr/local/php/etc/php.ini /usr/local/php/lib/命令解决)

部署**memcached**

在Linux系统中安装并启动memcached服务,然后使用netstat命令检查memcached服务的端口。cat /etc/sysconfig/memcached命令用于查看Memcached的配置文件内容。这个文件包含了Memcached服务的配置选项,如端口号、最大连接数、缓存大小等

测试:通过不断刷新xujiahao.org/example.php查看MEMCACHE INFO (xujiahao.org)变化

通过压力测试进行性能对比:

没有通过memcached进行缓存介入的500次失败了47次

通过memcached进行缓存了的

php高速缓存(使nginx跳过php-fpm,php直接向缓存中的memcached读取数据)

编辑配置文件

在这个配置中,有一个名为memcache的上游服务器组,其中包含一个Memcached服务器(127.0.0.1:11211)。

server块中,监听80端口,并将所有请求代理到名为php.xujiahao.org的域名。根目录设置为/data/web/html,默认索引文件为index.html

location /memc块中,定义了一个内部位置,用于处理与Memcached相关的请求。设置了连接、发送和读取超时时间,并将查询字符串作为键值存储在Memcached中。

location ~ \.php$块中,处理PHP文件的请求。首先尝试从缓存中获取数据,如果缓存中没有数据,则将请求传递给PHP-FPM进行处理。最后,将结果存储回缓存中。

  • 22
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值