Nginx攻略

目录

[1.Nginx 架构和安装](#1.Nginx 架构和安装)

[1.1 Nginx 概述](#1.1 Nginx 概述)

[1.1.1 Nginx 介绍](#1.1.1 Nginx 介绍)

[1.1.2 Nginx 功能介绍](#1.1.2 Nginx 功能介绍)

[1.1.3 基础特性](#1.1.3 基础特性)

[1.1.4 Web 服务相关的功能](#1.1.4 Web 服务相关的功能)

[1.2 Nginx 架构和进程](#1.2 Nginx 架构和进程)

[1.2.2 Nginx 进程结构](#1.2.2 Nginx 进程结构)

[1.2.3 Nginx 进程间通信](#1.2.3 Nginx 进程间通信)

[1.2.4 Nginx 启动和 HTTP 连接建立](#1.2.4 Nginx 启动和 HTTP 连接建立)

[1.2.5 HTTP 处理过程](#1.2.5 HTTP 处理过程)

[1.3 Nginx 模块介绍](#1.3 Nginx 模块介绍)

[1.4 Nginx 安装](#1.4 Nginx 安装)

[1.4.1 Nginx版本和安装方式](#1.4.1 Nginx版本和安装方式)

[1.4.2.Nginx 编译安装](#1.4.2.Nginx 编译安装)

[1.4.2.1 编译安装 Nginx](#1.4.2.1 编译安装 Nginx)

[1.4.2.2 验证版本及编译参数](#1.4.2.2 验证版本及编译参数)

1.5平滑升级和回滚

[1.5.1 平滑升级流程](#1.5.1 平滑升级流程)

[1.5.2 平滑升级和回滚案例](#1.5.2 平滑升级和回滚案例)

[2.Nginx 核心配置详解](#2.Nginx 核心配置详解)

[2.1 配置文件说明](#2.1 配置文件说明)

[2.2 全局配置](#2.2 全局配置)

[2.3 http 配置块](#2.3 http 配置块)

[2.4 核心配置示例](#2.4 核心配置示例)

[2.4.1 新建一个 PC web 站点](#2.4.1 新建一个 PC web 站点)

[2.4.2 root 与 alias](#2.4.2 root 与 alias)

[2.4.3 location 的详细使用](#2.4.3 location 的详细使用)

[2.4.3.1 匹配案例-精确匹配](#2.4.3.1 匹配案例-精确匹配)

[2.4.5 自定义错误页面](#2.4.5 自定义错误页面)

[2.4.6 自定义错误日志](#2.4.6 自定义错误日志)

[2.4.7 检测文件是否存在](#2.4.7 检测文件是否存在)

[2.4.8 长连接配置](#2.4.8 长连接配置)

[2.4.9 作为下载服务器配置](#2.4.9 作为下载服务器配置)

[​编辑3. Nginx 高级配置](#编辑3. Nginx 高级配置)

[3.1 Nginx 状态页](#3.1 Nginx 状态页)

[3.2 Nginx 压缩功能](#3.2 Nginx 压缩功能)

[3.3 Nginx的版本隐藏](#3.3 Nginx的版本隐藏)

[3.4 Nginx 变量使用](#3.4 Nginx 变量使用)

[3.4.1 内置变量](#3.4.1 内置变量)

[4. Nginx Rewrite 相关功能](#4. Nginx Rewrite 相关功能)

[4.1 ngx_http_rewrite_module 模块指令](#4.1 ngx_http_rewrite_module 模块指令)

[4.1.1 if 指令](#4.1.1 if 指令)

[4.1.2 set 指令](#4.1.2 set 指令)

[4.1.3 break 指令](#4.1.3 break 指令)

[4.1.4 return 指令](#4.1.4 return 指令)

[4.2 rewrite 指令](#4.2 rewrite 指令)

[4.2.1 rewrite案例: 域名永久与临时重定向](#4.2.1 rewrite案例: 域名永久与临时重定向)

[4.2.3 rewrite 案例: break 与 last](#4.2.3 rewrite 案例: break 与 last)

[4.2.3.1 break和last区别案例](#4.2.3.1 break和last区别案例)

[4.2.4 rewrite案例: 自动跳转 https](#4.2.4 rewrite案例: 自动跳转 https)

[4.3 Nginx 防盗链](#4.3 Nginx 防盗链)

[4.3.1 实现盗链和防盗链](#4.3.1 实现盗链和防盗链)

[5.Nginx 反向代理功能](#5.Nginx 反向代理功能)

[5.1 实现 http 反向代理](#5.1 实现 http 反向代理)

5.1.1反向代理动静分离实现

5.1.2准备缓存配置

[5.1.3 http 反向代理负载均衡](#5.1.3 http 反向代理负载均衡)

​编辑

[5.2 实现 Nginx 四层负载均衡](#5.2 实现 Nginx 四层负载均衡)

5.2.1负载均衡实例:DNS和Mysql

5.3实现FastCGI

[5.3.1 FastCGI配置指令](#5.3.1 FastCGI配置指令)

[5.3.2 FastCGI实战案例 : Nginx与php-fpm在同一服务器](#5.3.2 FastCGI实战案例 : Nginx与php-fpm在同一服务器)

[5.3.3 php的动态扩展模块(php的缓存模块)](#5.3.3 php的动态扩展模块(php的缓存模块))

[5.3.4 php高速缓存](#5.3.4 php高速缓存)

[6.nginx 二次开发版本](#6.nginx 二次开发版本)

6.1openresty

[6.2编译安装 openresty](#6.2编译安装 openresty)


1.Nginx 架构和安装

1.1 Nginx 概述

1.1.1 Nginx 介绍

Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus )

2019年3月11日 F5 Networks 6.7亿美元的价格收购

Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务 器

解决C10K问题(10K Connections)

Nginx官网:http://nginx.org

nginx的其它的二次发行版:

Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加 了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了 很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始, Tengine成为一个开源项目官网: http://tengine.taobao.org/

OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,官网:http://openr esty.org/cn/

1.1.2 Nginx 功能介绍

静态的web资源服务器html,图片,js,css,txt等静态资源

http/https协议的反向代理

结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求

tcp/udp协议的请求转发(反向代理)

imap4/pop3协议的反向代理

1.1.3 基础特性

模块化设计,较好的扩展性

高可靠性

支持热部署:不停机更新配置文件,升级版本,更换日志文件

低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存

event-driven,aio,mmap,sendfile

1.1.4 Web 服务相关的功能

虚拟主机(server)

支持 keep-alive 和管道连接(利用一个连接做多次请求)

访问日志(支持基于日志缓冲提高其性能)

url rewirte

路径别名

基于IP及用户的访问控制

支持速率限制及并发数限制

重新配置和在线升级而无须中断客户的工作进程

1.2 Nginx 架构和进程

1.2.2 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调用,获取响应数据

与后端服务器通信,接收后端服务器的处理结果

缓存数据,访问缓存索引,查询和调用缓存数据

发送请求结果,响应客户的请求

接收主程序指令,比如重启、升级和退出等

1.2.3 Nginx 进程间通信

工作进程是由主进程生成的,主进程使用fork()函数,在Nginx服务器启动过程中主进程根据配置文件决 定启动工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生 成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进 程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出 的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。

主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送 正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就 会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互。

1.2.4 Nginx 启动和 HTTP 连接建立

Nginx 启动时,Master 进程,加载配置文件

Master 进程,初始化监听的 socket

Master 进程,fork 出多个 Worker 进程

Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求

1.2.5 HTTP 处理过程

1.3 Nginx 模块介绍

nginx 有多种模块

核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件 驱动机制 、进程管理等核心功能

标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应 头设置 等等

可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash

多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等

邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的 支持

Stream服务模块: 实现反向代理功能,包括TCP协议代理

第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支 持等

nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载

1.4 Nginx 安装

1.4.1 Nginx版本和安装方式

Nginx版本

Mainline version 主要开发版本,一般为奇数版本号,比如1.19

Stable version 当前最新稳定版,一般为偶数版本,如:1.20

Legacy versions 旧的稳定版,一般为偶数版本,如:1.18

Nginx安装可以使用yum或源码安装,但是推荐使用源码编译安装

yum的版本比较旧

编译安装可以更方便自定义相关路径

使用源码编译可以自定义相关功能,更方便业务的上的使用

1.4.2.Nginx 编译安装

源码安装需要提前准备标准的编译器,GCC的全称是(GNU Compiler collection),其有GNU开发,并以
GPL即LGPL许可,是自由的类UNIX即苹果电脑Mac OS X操作系统的标准编译器,因为GCC原本只能处理C语
言,所以原名为GNU C语言编译器,后来得到快速发展,可以处理C++,Fortran,pascal,objective C,
java以及Ada等其他语言,此外还需要Automake工具,以完成自动创建Makefile的工作,Nginx的一些模块
需要依赖第三方库,比如: pcre(支持rewrite),zlib(支持gzip模块)和openssl(支持ssl模块)
等。
1.4.2.1 编译安装 Nginx

官方源码包下载地址:

https://nginx.org/en/download.html

将从官网下载的版本移动到虚拟机上

关闭debug

添加环境变量

测试

nginx完成安装以后,有四个主要的目录
[root@Nginx 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二进制启动脚本,可以接受不同的参数以实现不同的功能。
1.4.2.2 验证版本及编译参数
[root@Nginx ~]# vim ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
[root@Nginx ~]# source ~/.bash_profile
[root@Nginx ~]# 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: --group=nginx --with-http_ssl_module --with-http_v2_module -
-with-http_realip_module --with-http_stub_status_module --withhttp_gzip_static_module
 --with-pcre --with-stream --with-stream_ssl_module --
with-stream_realip_module

1.5平滑升级和回滚

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

1.5.1 平滑升级流程

将旧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

1.5.2 平滑升级和回滚案例

开机自启配置

2.Nginx 核心配置详解

2.1 配置文件说明

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

Nginx的配置文件的组成部分:

主配置文件:nginx.conf

子配置文件: include conf.d/*.conf

fastcgi, uwsgi,scgi 等协议相关的配置文件

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

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

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

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 配置文件格式说明

#全局配置端,对全局生效,主要设置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
}

2.2 全局配置

Main 全局配置段常见的配置指令分类

正常运行必备的配置

优化性能相关的配置

用于调试及定位问题相关的配置

事件驱动相关的配置

全局配置说明:

user nginx nginx; #启动Nginx工作进程的用户和组
worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ; 
#将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进
程独占以一核心CPU,但是可以保证此进程不运行在其他核心上,这就极大减少了nginx的工作进程在不同的
cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务
器的性能。
CPU MASK: 00000001:0号CPU
 00000010:1号CPU
 10000000:7号CPU
 
#示例
worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU
worker_cpu_affinity 0101 1010; 
#示例
worker_processes  4;
worker_cpu_affinity 00000010 00001000 00100000 10000000;
[root@centos8 ~]# ps axo pid,cmd,psr | grep nginx
31093 nginx: master process /apps   1
34474 nginx: worker process         1
34475 nginx: worker process         3
34476 nginx: worker process         5
34477 nginx: worker process         7
#错误日志记录配置,语法:error_log file [debug | info | notice | warn | error | crit 
| alert | emerg]
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log /usr/local/nginx/logs/error.log error; 
#pid文件保存路径
pid       /usr/local/nginx/logs/nginx.pid;
worker_priority 0; #工作进程优先级,-20~20(19)
worker_rlimit_nofile 65536; #所有worker进程能打开的文件数量上限,
 #包括:Nginx的所有连接(例如与代理服务器的连接等)
 #而不仅仅是与客户端的连接
 #另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件
数的限制
 #最好与ulimit -n 或者limits.conf的值保持一致,
#修改pam限制
[root@Nginx ~]# sudo -u nginx ulimit -n
1024
[root@Nginx ~]# vim /etc/security/limits.conf
*               -       nofile         100000
[root@Nginx ~]# sudo -u nginx ulimit -n
100000
daemon off;   #前台运行Nginx服务用于测试、docker等环境。
master_process off|on; #是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为
on
events {
worker_connections 65535;   #设置单个工作进程的最大并发连接数
   use epoll; #使用epoll事件驱动,
   #Nginx支持众多的事件驱动,
   #比如:select、poll、epoll,只能设置在events模块中
设置
    
   accept_mutex on;   #on为同一时刻一个请求轮流由work进程处理,
   #而防止被同时唤醒所有worker
   #避免多个睡眠进程被唤醒的设置,默认为off
   #新请求会唤醒所有worker进程,此过程也称为"惊群"
   #因此nginx刚安装完以后要进行适当的优化。建议设置为on
   
   multi_accept on; #on时Nginx服务器的每个工作进程可以同时接受多个新的网
络连接
   #此指令默认为off,
   #即默认为一个工作进程只能一次接受一个新的网络连接
   #打开后几个同接受多个。建议设置为on
   
}

示例: 实现 nginx 的高并发配置

2.3 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;
}

2.4 核心配置示例

基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块 ngx_http_core_module实现。

2.4.1 新建一个 PC web 站点

2.4.2 root 与 alias

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

server {
   listen 80;
   server_name lee.timinglee.org;
   location / {
       root /webdata/nginx/timinglee.org/lee/html;
   }
   location /dirtest { #必须建立/mnt/dirtest才能访问
       root /mnt;
   }
}
[root@Nginx ~]# mkdir /mnt/dirtest/
[root@Nginx ~]# echo dirtest page > /mnt/dirtest/index.html
[root@Nginx ~]# nginx -s reload
#重启Nginx并访问测试
[root@node100 ~]# curl lee.timinglee.org/dirtest/
dirtest page

alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制;仅能用于 location上下文,此指令使用较少 alias示例:

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

2.4.3 location 的详细使用

在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;

ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配, 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最 高的一个uri

uri是用户请求的字符串,即域名后面的web文件路径

然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理 此请求。

2.4.3.1 匹配案例-精确匹配

在server部分使用location配置一个web界面,例如:当访问nginx 服务器的/logo.jpg的时候要显示指定 html文件的内容,精确匹配一般用于匹配组织的logo等相对固定的URL,匹配优先级最高

1.精确匹配 logo

2.4.5 自定义错误页面

自 定义错误页,同时也可以用指定的响应状态码进行响应, 可用位置:http, server, location, if in location

error_page code ... [=[response]] uri;

示例:

2.4.6 自定义错误日志

可以自定义错误日志

Syntax: error_log file [level];
Default:
error_log logs/error.log error;
Context: main, http, mail, stream, server, location
level: debug, info, notice, warn, error, crit, alert, emerg

示例:

测试

2.4.7 检测文件是否存在

try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如 果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一 个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内 部500错误。

语法格式
Syntax: try_files file ... uri;
try_files file ... =code;
Default: ---
Context: server, location

2.4.8 长连接配置

keepalive_timeout timeout [header_timeout];     #设定保持连接超时时长,0表示禁止长连接,
默认为75s
 #通常配置在http字段作为站点全局配置
keepalive_requests 数字;   #在一次长连接上所允许请求的资源的最大数量
 #默认为100次,建议适当调大,比如:500

示例:

下载长连接测试工具

长连接控制

2.4.9 作为下载服务器配置

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,同时设置,此项优级高.

示例:

3. Nginx 高级配置

3.1 Nginx 状态页

基于nginx 模块 ngx_http_stub_status_module 实现,

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

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

allow:允许某ip进入

3.2 Nginx 压缩功能

Nginx支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文 件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相 应的CPU资源。

Nginx对文件的压缩功能是依赖于模块 ngx_http_gzip_module,默认是内置模块

配置指令如下:

#启用或禁用gzip压缩,默认关闭
gzip on | off; 
#压缩比由低到高从1到9,默认为1,值越高压缩后文件越小,但是消耗cpu比较高。基本设定未4或者5
gzip_comp_level 4;
#禁用IE6 gzip功能,早期的IE6之前的版本不支持压缩
gzip_disable "MSIE [1-6]\."; 
#gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k; 
#启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_http_version 1.0 | 1.1; 
#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;
gzip_buffers number size;  
#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
gzip_types mime-type ...; 
#如果启用压缩,是否在响应报文首部插入"Vary: Accept-Encoding",一般建议打开
gzip_vary on | off; 
#预压缩,即直接从磁盘找到对应文件的gz后缀的式的压缩文件返回给用户,无需消耗服务器CPU
#注意: 来自于ngx_http_gzip_static_module模块
gzip_static on | off;

示例:

查看压缩

3.3 Nginx的版本隐藏

用户在访问nginx的时候,我们可以从报文中获得nginx的版本,相对于裸漏版本号的nginx,我们把其隐 藏起来更安全

3.4 Nginx 变量使用

nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用

变量可以分为内置变量和自定义变量

内置变量是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值。

3.4.1 内置变量

官方文档

http://nginx.org/en/docs/varindex.html

常用内置变量

$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的对应的首部字段名需要为小写,如果有
横线需要替换为下划线
#示例: 
echo $http_user_agent; 
echo $http_host;
$sent_http_<name>
#name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有
问题
echo $sent_http_server;
$arg_<name>
#此变量存放了URL中的指定参数,name为请求url中指定的参数
echo $arg_id;

示例:

4. Nginx Rewrite 相关功能

Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求 此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库 rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能 比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的 链接,就可以设置为访问 另外还可以在一定程度上提高网站的安全性。

4.1 ngx_http_rewrite_module 模块指令

官方文档: :Module ngx_http_rewrite_module

4.1.1 if 指令

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行 配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:

if (条件匹配) { 
 action
}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间 使用以下符号链接:

= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
location /test {
   index index.html;
   default_type text/html;
   if ( $scheme = http ){
     echo "if ---------> $scheme";
   }
   if ( $scheme = https ){
     echo "if ---------> $scheme";
   }
 }
 location /test2 {
   if ( !-e $request_filename ){
       echo "$request_filename is not exist";
       return 409;
   }
 }
测试:
[root@client ~]# curl lee.timinglee.org/test/
if ---------> http
[root@client ~]# curl lee.timinglee.org/test2/test
/webdata/nginx/timinglee.org/lee/test2/test is not exist

4.1.2 set 指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key

另外set定义格式为set $key value,value可以是text, variables和两者的组合。

4.1.3 break 指令

用于中断当前相同作用域(location)中的其他Nginx配置

与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效

位于后面的 ngx_http_rewrite_module 模块中指令就不再执行

Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,、 该指令可以在server块和locationif块中使用

4.1.4 return 指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重 定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配 置都将不被执行,return可以在server、if 和 location块进行配置

语法格式:

return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容
 #可以调用变量,其中text如果有空格,需要用单或双引号
 
return code URL; #返回给客户端的URL地址

4.2 rewrite 指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配, rewrite主要是针对用户请求的URL或者是URI做具体处理

语法格式 :

rewrite regex replacement [flag];

rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI

注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成 后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的 标志位用于控制此循环机制

如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301

正则表达式格式

. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W   #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^lee] #匹配除了magedu 这几个字母以外的任意字符

4.2.1 rewrite案例: 域名永久与临时重定向

Rewrite 临时和永久

永久重定向301

域名永久型调整,即域名永远跳转至另外一个新的域名,之前的域名再也不使用,跳转记录可以缓存到 客户端浏览器

永久重定向会缓存DNS解析记录, 浏览器中有 from disk cache 信息,即使nginx服务器无法访问,浏览器也 会利用缓存进行重定向

比如: 京东早期的域名 www.360buy.com 由于与360公司类似,于是后期永久重定向到了 www.jd.com

临时重定向302

域名临时重定向,告诉浏览器域名不是固定重定向到当前目标域名,后期可能随时会更改,因此浏览器 不会缓存当前域名的解析记录,而浏览器会缓存永久重定向的DNS解析记录,这也是临时重定向与永久 重定向最大的本质区别。

即当nginx服务器无法访问时,浏览器不能利用缓存,而导致重定向失败

4.2.3 rewrite 案例: break 与 last

测试:

访问break请求被rewrite至test1,而访问test1转递请求再次被rewrite发送至test2,此测试last和break 分别有什么区别

4.2.3.1 break和last区别案例

4.2.4 rewrite案例: 自动跳转 https

案例:基于通信安全考虑公司网站要求全站 https,因此要求将在不影响用户请求的情况下将http请求全 部自动跳转至 https,另外也可以实现部分 location 跳转

4.3 Nginx 防盗链

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标 记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗 链,referer就是之前的那个网站域名,正常的referer信息有以下几种:

none: #请求报文首部没有referer首部,
 #比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
 
blocked: #请求报文有referer首部,但无有效值,比如为空。
server_names: #referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string: #自定义指定字符串,但可使用*作通配符。示例: *.timinglee.org 
www.timinglee.*
regular expression: #被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:
~.*\.timinglee\.com


正常通过搜索引擎搜索web 网站并访问该网站的referer信息如下:

172.25.254.1 - - [22/Jul/2024:09:27:36 +0800] "GET /favicon.ico HTTP/1.1" 404 149 
"http://lee.timinglee.org/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) 
Gecko/20100101 Firefox/115.0"
2024/07/22 09:27:36 [error] 34596#0: *205 open() 
"/webdata/nginx/timinglee.org/lee/favicon.ico" failed (2: No such file or 
directory), client: 172.25.254.1, server: lee.timinglee.org, request: "GET 
/favicon.ico HTTP/1.1", host: "lee.timinglee.org", referrer: 
"http://lee.timinglee.org/"

4.3.1 实现盗链和防盗链

盗链:在一个web 站点盗链另一个站点的资源信息,比如:图片、视频等

防盗链:基于访问安全考虑,nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有效 实现防盗链功能

盗链机

点击后跳转至主站

5.Nginx 反向代理功能

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

逻辑调用关系:

同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器 异构代理:用户访问的资源时需要经过处理后才能返回的,比如php,python,等等,这种访问资源需 要经过处理才能被访问

5.1 实现 http 反向代理

5.1.1反向代理动静分离实现

针对特定的资源实现代理

示例:

本案例用三台机器,ip分别为:172.25.254.100、172.25.254.10、172.25.254.20

172.25.254.100配置

172.25.254.20配置

172.25.254.10配置

实现效果:

5.1.2准备缓存配置

进行压力测试

5.1.3 http 反向代理负载均衡

5.2 实现 Nginx 四层负载均衡

Nginx在1.9.0版本开始支持tcp模式的负载均衡,在1.9.13版本开始支持udp协议的负载,udp主要用于 DNS的域名解析,其配置方式和指令和http 代理类似,其基于ngx_stream_proxy_module模块实现tcp 负载,另外基于模块ngx_stream_upstream_module实现后端服务器分组转发、权重分配、状态监测、 调度算法等高级功能。

如果编译安装,需要指定 --with-stream 选项才能支持ngx_stream_proxy_module模块

5.2.1负载均衡实例:DNS和Mysql

搭建dns

dns.conf的内容

配置数据库

20机器同理

为了使用命令下载客户端

实现数据库的负载均衡

5.3实现FastCGI

CGI的由来:

最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏 览器,也就是静态html文件,但是后期随着网站功能增多网站开发也越来越复杂,以至于出现动态技 术,比如像php(1995年)、java(1995)、python(1991)语言开发的网站,但是nginx/apache服务器并不 能直接运行 php、java这样的文件,apache实现的方式是打补丁,但是nginx缺通过与第三方基于协议实 现,即通过某种特定协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户 的请求,处理完成后返回数据给Nginx并回收进程,最后nginx在返回给客户端,那这个约定就是通用网 关接口(common gateway interface,简称CGI),CGI(协议) 是web服务器和外部应用程序之间的接口 标准,是cgi程序和web服务器之间传递信息的标准化接口。

5.3.1 FastCGI配置指令

Nginx基于模块ngx_http_fastcgi_module实现通过fastcgi协议将指定的客户端请求转发至php-fpm处 理,其配置指令如下:

fastcgi_pass address:port;
#转发请求到后端服务器,address为后端的fastcgi server的地址,可用位置:location, if in 
location
fastcgi_index name;
#fastcgi默认的主页资源,示例:fastcgi_index index.php;
fastcgi_param parameter value [if_not_empty];
#设置传递给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义
key
fastcgi_param REMOTE_ADDR        $remote_addr; #客户端源IP
fastcgi_param REMOTE_PORT        $remote_port; #客户端源端口
fastcgi_param SERVER_ADDR        $server_addr; #请求的服务器IP地址
fastcgi_param SERVER_PORT        $server_port; #请求的服务器端口
fastcgi_param SERVER_NAME        $server_name; #请求的server name
Nginx默认配置示例:
   location ~ \.php$ {
     root           /scripts;
     fastcgi_pass   127.0.0.1:9000;
     fastcgi_index index.php;
     fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; #默认脚本路径
     #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     include       fastcgi_params;    #此文件默认系统已提供,存放的相对路径为
prefix/conf
   }

5.3.2 FastCGI实战案例 : Nginx与php-fpm在同一服务器

#解压源码并安装
[root@Nginx ~]# ./configure \
--prefix=/usr/local/php \ #安装路径
--with-config-file-path=/usr/local/php/etc \ #指定配置路径
--enable-fpm \ #用cgi方式启动程序
--with-fpm-user=nginx \ #指定运行用户身份
--with-fpm-group=nginx \
--with-curl \ #打开curl浏览器支持
--with-iconv \ #启用iconv函数,转换字符编码
--with-mhash \ #mhash加密方式扩展库
--with-zlib \ #支持zlib库,用于压缩http压缩传输
--with-openssl \ #支持ssl加密
--enable-mysqlnd \ #mysql数据库
--with-mysqli \ 
--with-pdo-mysql \
--disable-debug \ #关闭debug功能
--enable-sockets \ #支持套接字访问
--enable-soap \ #支持soap扩展协议
--enable-xml \ #支持xml
--enable-ftp \ #支持ftp
--enable-gd \ #支持gd库
--enable-exif \ #支持图片元数据
--enable-mbstring \ #支持多字节字符串 
--enable-bcmath \ #打开图片大小调整,用到zabbix监控的时候用到了这个模块
--with-fpm-systemd #支持systemctl 管理cgi

php相关配置优化

[root@Nginx ~]# cd /usr/local/php/etc
[root@Nginx etc]# cp php-fpm.conf.default php-fpm.conf
[root@Nginx etc]# vim php-fpm.conf
去掉注释
pid = run/php-fpm.pid #指定pid文件存放位置
[root@Nginx etc]# cd php-fpm.d/
[root@Nginx php-fpm.d]# cp www.conf.default www.conf
#生成主配置文件
[root@Nginx php-fpm.d]# cd /root/php-8.3.9/
[root@Nginx php-8.3.9]# cp php.ini-production /usr/local/php/etc/php.ini
[root@Nginx ~]# vim /usr/local/php/etc/php.ini
[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
date.timezone = Asia/Shanghai #修改时区
#生成启动文件
[root@Nginx ~]# cd /root/php-8.3.9/
[root@Nginx php-8.3.9]# cp sapi/fpm/php-fpm.service /lib/systemd/system/
# Mounts the /usr, /boot, and /etc directories read-only for processes invoked by 
this unit.
#ProtectSystem=full #注释该内容
[root@Nginx php-8.3.9]# systemctl start php-fpm.service
[root@Nginx php-8.3.9]# netstat -antlupe | grep php
tcp       0     0 127.0.0.1:9000         0.0.0.0:*               LISTEN     0 
        820758     176202/php-fpm: mas

浏览器测试

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

安装memcache模块

[root@Nginx ~]# tar zxf memcache-8.2.tgz
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# yum install autoconf
[root@Nginx memcache-8.2]# phpize
[root@Nginx memcache-8.2]# ./configure && make && make install
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-nonzts-20230831/
[root@Nginx
 memcache-8.2]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts20230831/
memcache.so
opcache.so

复制测试文件到nginx发布目录中

[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# ls
autom4te.cache config.log     configure.ac example.php Makefile.fragments 
README
build           config.m4     config.w32   include     Makefile.objects runtests.php
config9.m4
    config.nice   CREDITS       libtool     memcache.la         src
config.h       config.status docker       LICENSE     memcache.php       
tests
config.h.in     configure     Dockerfile   Makefile     modules
[root@Nginx memcache-8.2]# cp example.php memcache.php /data/php/
[root@Nginx ~]# vim /data/php/memcache.php
define('ADMIN_USERNAME','admin');   // Admin Username
define('ADMIN_PASSWORD','lee');   // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array

浏览器测试

压力测试

清理memcache:

[root@nginx-note1 ~]# systemctl restart memcached.service

5.3.4 php高速缓存

部署方法

[root@Nginx ~]# rm -fr /apps/nginx/
[root@Nginx ~]# tar zxf srcache-nginx-module-0.33.tar.gz
[root@Nginx ~]# tar zxf memc-nginx-module-0.20.tar.gz
[root@Nginx ~]# cd nginx-1.26.1/
[root@Nginx nginx-1.26.1]# ./configure --prefix=/apps/nginx --user=nginx --
group=nginx --with-http_ssl_module --with-http_v2_module --withhttp_realip_module
 --with-http_stub_status_module --with-http_gzip_static_module 
--with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --
add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module0.33
[root@Nginx
 nginx-1.26.1]# make && make install
[root@Nginx ~]# vim /apps/nginx/conf.d/php.conf
upstream memcache {
   server 127.0.0.1:11211;
   keepalive 512;
}
server {
 listen 80;
 server_name php.timinglee.org;
 root /data/php;
 location /memc {
   internal;
   memc_connect_timeout 100ms;
   memc_send_timeout 100ms;
   memc_read_timeout 100ms;
   set $memc_key $query_string; #使用内置变量$query_string来作为key
   set $memc_exptime 300; #缓存失效时间300秒
   memc_pass memcache;
 }
 location ~ \.php$ {
 set $key $uri$args; #设定key的值
   srcache_fetch GET /memc $key; #检测mem中是否有要访问的php
   srcache_store PUT /memc $key; #缓存为加载的php数据
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
   include fastcgi.conf;
 }
}
[root@Nginx ~]# systemctl start nginx.service

6.nginx 二次开发版本

6.1openresty

Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中, 实现了 OpenResty 这个高性能服务端解决方案

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方 模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服 务和动态网关。

OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言 调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高 性能 Web 应用系统。

OpenResty 由于有功能强大且方便的的API,可扩展性更强,如果需要实现定制功能,OpenResty是个不错的 选择

官网: http://openresty.org/cn/

6.2编译安装 openresty

[root@Nginx ~]#dnf -yq install gcc pcre-devel openssl-devel perl
[root@Nginx ~]#useradd -r -s /sbin/nologin nginx
[root@Nginx ~]#cd /usr/local/src
[root@Nginx src]#wget https://openresty.org/download/openresty-1.17.8.2.tar.gz
[root@Nginx src]#tar xf openresty-1.17.8.2.tar.gz 
[root@Nginx src]#cd openresty-1.17.8.2/
[root@Nginx openresty-1.17.8.2]#./configure \
--prefix=/apps/openresty \
--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
[root@Nginx openresty-1.17.8.2]#make && make install
[root@Nginx openresty-1.17.8.2]#ln -s /apps/openresty/bin/* /usr/bin/
[root@Nginx openresty-1.17.8.2]#openresty -v
nginx version: openresty/1.17.8.2
[root@Nginx openresty-1.17.8.2]#openresty 
[root@Nginx openresty-1.17.8.2]#ps -ef |grep nginx
[root@Nginx ~]#curl 10.0.0.18

浏览器测试

相关推荐
代码中の快捷键3 分钟前
MySQL数据库存储引擎
数据库·mysql
只因在人海中多看了你一眼3 分钟前
数据库体系
数据库
东华果汁哥4 分钟前
【linux 免密登录】快速设置kafka01、kafka02、kafka03 三台机器免密登录
linux·运维·服务器
尘浮生25 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
肖永威35 分钟前
CentOS环境上离线安装python3及相关包
linux·运维·机器学习·centos
六月闻君39 分钟前
MySQL 报错:1137 - Can‘t reopen table
数据库·mysql
mengao123440 分钟前
centos 服务器 docker 使用代理
服务器·docker·centos
布鲁格若门42 分钟前
CentOS 7 桌面版安装 cuda 12.4
linux·运维·centos·cuda
Eternal-Student1 小时前
【docker 保存】将Docker镜像保存为一个离线的tar归档文件
运维·docker·容器
SelectDB技术团队1 小时前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris