Nginx学习总结

1.1 Nginx架构

Nginx 中, Master 进程和 Worker 进程分别承担不同的角色,共同协作以提供高性能的服务
Nginx 通过灵活的配置文件来实现各种功能的地址
Nginx 使用简洁而灵活的配置文件来定义服务器的行为。
配置文件通常包括全局配置、 HTTP 模块配置、 Server 配置以及 Location 配置。

1.2 Master进程和Worker进程

Master进程:
负责管理 Worker 进程的生命周期。
处理来自管理员的信号。
负责配置文件的加载和重新加载。
启动、停止 Worker 进程,管理共享资源(如缓存)。
- 启动过程:
启动 Nginx 后, Master 紧随启动。读取配置并初始化全局资源,并创建指定数量的 Worker 进程
- 创建 Worker 进程:
Master 创建的 Worker 进程来处理实际的客户端请求。
每个 Worker 进程都是一个独立的进程,它们之间相互独立,互不影响
- 管理 Worker 进程:
Master 进程负责监控 Worker 进程的状态。
若某个 Worker 进程异常退出, Master 会重新启动一个新的 Worker 进程,确保服务可用
Worker进程:
- 处理客户端请求:
Worker 进程是实际处理客户端请求的进程。
每个 Worker 进程是单线程的,但通过多进程的方式, Nginx 能够同时处理多个请求,实现高并发
- 事件驱动和异步处理:
Worker 进程采用事件驱动的异步模型。
它使用事件循环和非阻塞 I / O 操作,允许在不同的连接之间高效切换,以处理大量并发请求
- 负载均衡:
如果配置了负载均衡,多个 Worker 进程可以分担负载,均衡地分配请求,提高系统的整体性能
两者之间的联系
在运行时, Master 进程 负责监控 Worker 进程的状态,
如果某个 Worker 进程异常退出, Master 进程会重新启动一个新的 Worker 进程,确保服务的
稳定性。
Master 进程和 Worker 进程之间通过信号进行通信,
例如在重新加载配置时, Master 进程会向 Worker 进程发送信号,通知它们重新加载配置而无
需停止服务。

1.3 设计原则

异步非阻塞的事件驱动模型
Nginx 采用单线程(或说主线程和工作线程组合)的事件驱动模型,通过事件驱动的方式处理请求和连接。使用非阻塞 I / O 来处理客户端的请求和与后端服务器的通信,以提高并发处理能力和系统性能。所有 I / O 操作都通过事件通知机制完成,不会阻塞进程。

1.4 Nginx模块

核心模块(Core Modules

Nginx 的核心模块主要有三部份,分别是
   
- Events Module : 处理与事件相关的操作,如连接的接受和关闭。包括事件驱动机制等    
- HTTP Module : 处理 HTTP 请求和响应,包括配置 HTTP 服务器、反向代理和负载均衡等  
- Mail Module :提供邮件代理服务顺的功能,支持 IMAP POP3 等协议
基础模块 (Base Modules)
包含众多子模块,用于实现Nginx的各种功能,这些模块主要是 HTTP 级别。
    - Core Module: 包含基本的 HTTP 功能,如配置服务器块、location 块等
    - Access Module: 处理访问控制,包括允许或拒绝特定的 IP 地址或用户
    - FastCGI Module: 支持 FastCGI 协议,用于与 FastCGI 进程通信
    - Proxy Module: 提供反向代理功能,用于将请求代理到后端服务器
    - Upstream Module: 用于定义负载均衡的后端服务器组
    - Rewrite Module:重写模块,用于修改客户端请求的URL。
    - SSL Module:用于支持HTTPS协议,提供加密传输和安全认证功能。
    - Gzip Module:压缩模块,用于对HTTP响应数据进行压缩,减少数据传输量,提高访问速度。

第三方模块(HTTP Modules)
Nginx提供了一套模块化的架构,允许开发者编写自定义的模块来扩展功能。这些第三方模块可以包括但不限
于以下几类
    - HTTP 模块: 扩展HTTP模块的功能,添加自定义的处理逻辑
    - Filter 模块: 提供对HTTP请求和响应进行过滤的功能
    - Load Balancer 模块: 实现负载均衡策略
    - Access Control 模块: 控制对资源的访问权限
    - Security 模块: 提供安全性增强的功能,如防火墙、DDoS防护等
    - Authentication 模块: 处理用户认证逻辑

1.5 Nginx和Apache

Nginx采用异步非阻塞工作模式   
Nginx 接收到一个请求时,它不会阻塞等待该请求的处理完成,而是立即返回继续处理其他请求。这种模式使得 Nginx 能够高效地处理大量并发连接,因为它可以在一个进程中同时处理多个请求。
 
Apache则采用同步阻塞工作模式
   
Apache 接收到一个请求时,它会阻塞等待该请求的处理完成,然后才能继续处理下一个请求。  
在高并发场景下,这种模式可能会导致 Apache 需要创建大量的进程或线程来处理请求,从而增加系统资源的消耗和上下文切换的损耗。

1.6 三种IO操作的处理模式

FD文件描述符(File Descriptor,FD)每个进程所能使用的文件描述符数量是有限制的,默认情况下,这个限制通常是 1024。不过,这个限制可以通过修改系统参(如/etc/security/limits.conf 文件)或在程序中使用 setrlimit() 函数来调整。其中 0、1、2 是特殊的文件描述符,分别对应标准输入、标准输出和标准错误输出。 

0代表标准输入(Standard Input,通常缩写为 stdin) 

1 代表标准输出(Standard Output,通常缩写为 stdout

2 代表标准错误输出(Standard Error,通常缩写为 stderr

select模型:通过三个集合(读集合、写集合、异常集合)来监视文件描述符。(apache 使用 ) 
Linux 上,单个进程能够监视的文件描述符数量存在最大限制,一般为 1024 (可通 FD_SETSIZE 修改,但通常不建议)。采取了内存拷贝方法来实现内核将 FD 消息通知给用户空间,综合开销很大。
poll 模型 :使用pollfd结构体数组来监视文件描述符。(apache 使用 ) 
没有最大文件描述符数量的限制(基于链表存储)。相较于 select 的边缘触发【即只通知一次】, poll 特点是“ 水平触发 ,如果报告了 fd 后,没有被处理,那么下次 poll 时会再次报告该 fd
epoll 模型 :使用 epoll专用的文件描述符和内核中的红黑树及就绪队列。(nginx 使用
没有最大并发连接的限制(能打开的 FD 的上限远大于 1024 )。

1.7 Nginx

1.7.1 二进制安装

Nginx 一般可以使用 apt / yum 来安装二进制包,如果需要使用特定的功能模块,也可以使用源码安
装,使用 yum / apt 安装的时候,只能安装操作系统发行版厂商己经提交到仓库中的版本,如果需要安装更新的版本或历史版本,可自行配置官方仓库,然后进行安装。

1.7.2 Nginx 源码编安装-Ubuntu

步骤剖析

1.编译环境准备

apt install build-essential gcc g ++ libc6 libc6-dev libpcre3 libpcre3-dev
libssl-dev libsystemd-dev zlib1g-dev
apt install libxml2 libxml2-dev libxslt1-dev php-gd libgd-dev geoip-database
libgeoip-dev
注意:第二条编译环境内容是 默认二进制环境开启功能所依赖的库环境
2.编译安装
1)创建运行用户
root @ubuntu24: ~ # useradd -r -s /usr/sbin/nologin nginx
2)下载最新版源码并解压
root @ubuntu24: ~ # wget https://nginx.org/download/nginx-1.27.5.tar.gz   (可以在nginx官网找)
注意:如果出现 “无法解析主机地址 nginx.org ’” ,重新尝试下载即可。
家目录下出现tar.gz的包
3)定制配置
root @ubuntu24: ~ # tar xf nginx-1.27.5.tar.gz
root @ubuntu24: ~ # cd nginx-1.27.5
root @ubuntu24:nginx-1 .27.5 # ./configure --prefix=/data/server/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)编译安装(make是编译,make install是安装)
root @ubuntu24:nginx-1 .22.1 # make && make install
注意:该过程,需要持续 1 分钟左右
3.确认效果
1)修改目录属主属组并查看
root @ubuntu24:nginx-1 .24.0 # chown -R nginx:nginx /data/server/nginx/
2)查看目录结构
root @ubuntu24:nginx-1 .24.0 # ls -l /data/server/nginx/
total 16
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15 : 35 conf # 配置文件目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15 : 35 html # 网站文件根目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15 : 35 logs # 日志文件目录
drwxr-xr-x 2 nginx nginx 4096 Jan 20 15 : 35 sbin # 二进制程序目录
3)创建软链接
root @ubuntu24:nginx-1 .24.0 # ln -sv /data/server/nginx/sbin/nginx /usr/sbin/nginx
'/usr/sbin/nginx' -> '/data/server/nginx/sbin/nginx'
4)查看版本
root @ubuntu24:nginx-1 .24.0 # nginx -v
nginx version: nginx/1.24.0 (Ubuntu)
4. 定制服务管理文件
创建 PID 目录
root @ubuntu24: ~ # mkdir /data/server/nginx/run
root @ubuntu24: ~ # chown -R nginx:nginx /data/server/nginx/run
修改配置文件,设置 pid 文件路径 (坑啊,尽量就别指定PID了,下面本人踩坑会说到,如果有人指定了路径没有错误,可以在评论区分享啊)
root@ubuntu24:~# cat /data/server/nginx/conf/nginx.conf
pid    /data/server/nginx/run/nginx.pid;
定制服务文件 - 注意:如果pid文件路径不一样,会导致nginx服务无法启动
5.创建nginx服务脚本
root @ubuntu24: ~ # cat /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=/data/server/nginx/run/nginx.pid     #对标的是主配置文件里的pid路径 ,要一模一样
ExecStart =/ data / server / nginx / sbin / nginx - c / data / server / nginx / conf / nginx.conf
ExecReload =/ bin / kill - s HUP $MAINPID
ExecStop =/ bin / kill - s TERM $MAINPID
LimitNOFILE = 100000
[Install]
WantedBy = multi-user.target
信号作用:
SIGHUP ( 1 ) : 挂起信号。当用户登出或终端关闭时,系统会向与该终端关联的进程发送 SIGHUP 信号。收到此信号的进程通常会终止,但一些守护进程可能会用它来重新加载配置文件。
SIGKILL ( 9 ) : 强制终止信号。用于立即结束进程,不能被捕获、忽略或阻塞。
SIGTERM ( 15 ) : 终止请求信号。用于请求进程优雅地终止运行。进程可以捕获此信号并进行清理工作。
6.重载配置
重载服务脚本
root @ubuntu24: ~ # systemctl daemon-reload
用服务启动
root @ubuntu24: ~ # systemctl start nginx

遇到的问题及解决方式

{1}我这里出现下面的报错,其原因有程序占用80端口停掉不需要的程序 
{2}还有另外的一些原因,被本人踩坑了
打开编辑 vim /data/server/nginx/conf/nginx.conf (这个目录/data/server/nginx是自己初始化定制的,可以根据自己的需求进行修改,如果找不到可以用tree命令进行查看)
出现这个页面添加进去PID目录: pid    /data/server/nginx/run/nginx.pid;
编辑nginx服务里面的pid位置: vim /usr/lib/systemd/system/nginx.service   
PIDFile=/data/server/nginx/run/nginx.pid 
再次加载重启得到下面的错误
查看状态
root @ubuntu24: ~ # systemctl status nginx.service
7.检查效果
root @ubuntu24: ~ # netstat -tnulp | grep nginx
tcp         0       0 0.0.0.0 : 80       0.0.0.0 :*      LISTEN       27985 / nginx : master
8.相关进程信息

1.7.3 Nginx 源码编安装-Rocky

1.编译
yum install gcc make gcc-c ++ glibc glibc-devel pcre pcre-devel openssl openssl
devel systemd-devel zlib-devel
yum install libxml2 libxml2-devel libxslt libxslt-devel php-gd gd-devel
2. 获取软件
mkdir / softs; cd / softs
wget https :// nginx.org / download / nginx-1 .23.0 .tar.gz
tar xf nginx-1 .23.0 .tar.gz
3. 创建运行用户
useradd - r - s / usr / sbin / nologin nginx
cd nginx-1 .23.0
查看帮助
. / configure -- help   (一定要在nginx-1.23.0目录下才能用这个命令)
4. 定制配置
. / configure -- prefix =/ data / server / 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

1.7.3.1 遇到的问题及解决办法

这一步遇到了一些问题  问题1:nginx 编译需要 C 编译器(如 gcc )将源代码编译成可执行文件
报错 “checking for C compiler... not found” 和 “./configure: error: C compiler cc is not found” ,意思是在执行./configure 脚本配置 nginx 编译环境时,系统未找到 C 编译器 。 nginx 编译需要 C 编译器(如 gcc )将源代码编译成可执行文件。若系统未安装 C 编译器,或编译器路径未正确配置到系统环境变量中,./configure 脚本就无法找到它,进而报错。
解决方法:
安装 C 编译器
基于 Debian/Ubuntu 系统:执行sudo apt - get update 更新软件源,然后sudo apt - get install build - essential ,该命令会安装 gcc 等一系列编译所需工具。 基于 RHEL/CentOS/Rocky Linux 系统:先确保系统已连接到可用软件源,执行sudo yum install gcc 安装 gcc 编译器。 基于 Arch Linux 系统:执行sudo pacman -S base - devel ,此命令会安装包括 gcc 在内的基础开发工具包。
配置编译器路径(极少情况下)
若已安装编译器但仍报错,可能是编译器路径未正确添加到系统环境变量PATH 中。需检查并添加路径(如 gcc 安装在/usr/local/bin ,可将该路径添加到PATH 变量 )。以 bash 为例,临时添加命令为export PATH=$PATH:/usr/local/bin ;若要永久添加,需编辑.bashrc 或/etc/profile 文件,添加上述路径后保存,再执行source 命令使配置生效。
问题2 :安装完成gcc软件后再次定制配置出现下面的报错
[root@rocky9-12 nginx-1.27.5]# yum -y install gd-devel             (终端输入这个命令)
gd-devel 是用于gd 图形库的开发库和头文件包 。gd 库可用于创建 PNG 和 JPEG 等格式图形 ,gd-devel 提供了开发时所需的文件,供开发者基于gd 库进行图形相关功能开发 ,比如一些需要图形处理功能的 Web 应用开发等场景可能会用到 。
后面再次编译和安装就正常了
5. 编译安装
make && make install
6. 修改文件属性
chown - R nginx : nginx / data / server / nginx /
7. 启动 nginx
/ data / server / nginx / sbin / nginx
8. 检查效果
/ data / server / nginx / sbin / nginx - V
9. 浏览器访问
curl http :// localhost /
10. 命令行处理
echo "export PATH=/data/server/nginx/sbin: $PATH " >> / etc / bashrc
source / etc / bashrc
下面的方式尝试没有成功,不知道为什么。创建的PID和设置的PID一样也不行。我不太推荐。
同样的步骤创建PID目录
修改配置文件,设置pid文件路径
创建 nginx 服务脚本(nginx.service)
11.重载配置
重载服务脚本
[root @rocky9 ~ ] # systemctl daemon-reload
用服务启动
[root @rocky9 ~ ] # systemctl start nginx
查看状态
[root @rocky9 ~ ] # systemctl status nginx.service
在启动nginx的时候又出现下面的问题:
黄色的表示没有system daemon-reload 加载守护进程 (比较好解决)
红色的可以用下面的方式解决:
1.  nginx 配置语法有问题
检查 Nginx 配置文件语法, nginx - t 一般情况下,都是因为 缺少配置的结尾符号导致的
2.  nginx 环境的配置文件权限问题
系统服务以特定用户身份运行,所以要确保 Nginx 可执行文件和配置文件对该用户有足够的权限。
chown - R nginx : nginx / data / server / nginx / run
chmod + x / data / server / nginx / sbin / nginx
3. selinux 的问题
SELinux Security-Enhanced Linux )可能会阻止系统服务正常运行,可以通过 sestatus 命令检
查确认。
SELinux 处于 enforcing 状态,你可以临时将其设置为 permissive 模式来进行测试:
setenforce 0  
可以使用以下命令永久禁用 SELinux ,并且重启系统使配置生效。
sed - i 's/SELINUX=enforcing/SELINUX=disabled/g' / etc / selinux / config
4.  防火墙相关问题
防火墙可能会阻止 Nginx 监听的端口。你可以使用以下命令开放 Nginx 默认的 80 443 端口:
firewall-cmd -- permanent -- add-service = http
firewall-cmd -- permanent -- add-service = https
firewall-cmd -- reload
或者直接禁用nginx主机防火墙的功能
systemctl disable --now firewall
我尝试了上面的方法都没有成功,因为在早期我开过nginx服务用 /data/server/nginx/sbin/ nginx启用了nginx服务。关端口什么,杀进程也有尝试。始终不行。后面用了 nginx -s stop重启好了。

1.7.4 Nginx命令解读

nginx version: nginx/1.24.0 (Ubuntu)
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
             [-e filename] [-c filename] [-g directives]
常用选项
 v         #显示版本信息
 t         #检查并测试配置文件
 
一般选项
    ?|-h   #显示帮助信息
    V         #显示版本信息和编译项
    T         #检查并测试配置文件,且输出配置文件内容
    q         #在配置文件测试期间禁止显示非错误消息
    s signal   #发送信号 stop|quit|reopen|reload
    p prefix   #指定运行目录,默认是 /usr/share/nginx/
    c filename #指定配置文件,默认是 /etc/nginx/nginx.conf
    g directive #启动时指定一些全局配置项,而不用修改配置文件,格式为 k v

信号说明
    stop #立即停止,没处理完的请求也会被立即断开,相当于信号 SIGTERM,SIGINT
    quit #优雅退出,不再接收新的请求,但己建立的连接不受影响,相当于信号 SIGQUIT
    reopen #重开一个新的日志文件,日志内容写新文件,相当于信号 SIGUSR1 
    reload #重新加载配置文件,重新生成worker 进程,不中断正在处理的请求
           #己建立的连接按旧配置处理,新连接用新配置处理   
           #同 systemctl reload nginx
    SIGUSR2  #平滑升级二进制文件,适用于版本升级 
    SIGWINCH #优雅的停止工作进程,适用于版本升级

1.7.5 配置定制及部分命令的使用

root @ubuntu24: ~ # grep -Ev '#|^$' /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid / run / nginx.pid;
error_log / var / log / nginx / error.log;
include / etc / nginx / modules-enabled /* .conf; # 查看扩展的配置项
events {
       worker_connections 768 ;                     # 每个 worker 可以维持 768 个连接
     
                                                                   # 默认开启两个 worker ,并发数为 768*2
}

...

1.nginx命令可以通过 -g的方式指定启动选项 
systemctl stop nginx 或 nginx -s stop  (必须得关闭当前nginx服务,不然不行)

nginx -g "worker_processes 3;"

得到下面的效果

# pstree -p | grep nginx          
|- nginx( 2998 ) -+- nginx( 2999 )
         
|             |- nginx( 3000 )
         
|             ` - nginx( 3001 )

结果显示: 之前一个的 worker ,就变成了一个 master 和 三个 worker
systemctl stop nginx 或 nginx -s stop  (必须得关闭当前nginx服务,不然不行)
nginx -g "daemon off;"   #界面阻塞
开一个终端访问
root @ubuntu24: ~ # curl localhost
结果显示: 可以正常访问。
2.向 Nginx 发送 stop 信号
1)启动Nginx                                  systemctl start nginx
2)在服务端创建一个 100 M 的文件   dd if=/dev/zero of=/var/www/html/test.img bs=1M count=100
3) 客户端限速下载,每秒下 1 M ,需要100M   wget --limit-rate=1024000 http://localhost/test.img
4)    发送 stop 信号                        nginx -s stop
5)    确认下载终端的效果             wget --limit-rate=1024000 http://localhost/test.img
3.向 Nginx 发送quit 信号
恢复 nginx 的默认配置
vim /etc/nginx/nginx.conf
worker_processes auto;   # 取消注释
重启 nginx 服务 systemctl restart nginx
1)准备下载环境    wget --limit-rate=1024000 http://localhost/test.img
2) 发送 quit 信号给nginx   nginx -s quit
3)检查效果  ps aux | grep nginx      还有一个 worker 进程

4)下载请求没有中断 wget --limit-rate=1024000 http://localhost/test.img 但无法建立连接curl 127.1 

下载请求完成后,遗留进程工作完毕后,彻底退出
ps aux | grep nginx

1.7.6 编译安装和apt安装的区别

主配置文件/etc/nginx/nginx.conf        默认的自配置文件/etc/nginx/sites-enabled/default

扩展配置文件/etc/nginx/conf.d/*.conf  (没有任何的文件,我们定制的时候可以在它的下面建立一个.conf的文件)

1.7.7 nginx 配置

1. 总体概况 图

2. nginx的配置文件 

查看配置文件
root @ubuntu24: ~ # ls -l /etc/nginx/
total 64
drwxr-xr-x 2 .. . conf.d                            # 子配置文件目录,在主配置文件中被包含,默认为空
- rw-r--r -- 1 .. . fastcgi.conf                      #FastCGI 配置文件,定义相关配置项,被引用
- rw-r--r -- 1 .. . fastcgi_params              #FastCGI 配置文件,定义相关配置项,被引用
- rw-r--r -- 1 .. . koi-utf                             # 用于转换 KOI8-R 编码的字符集到 UTF-8
- rw-r--r -- 1 .. . koi-win                           # 用于转换 KOI8-U 编码的字符集到 UTF-8
- rw-r--r -- 1 .. . mime.types                   # 包含文件扩展名和相应 MIME 类型的映射
drwxr-xr-x 2 .. . modules-available     # 模块配置文件目录
drwxr-xr-x 2 .. . modules-enabled      # 当前生效的模块配置文件目录,用软链接指向真正的文件
- rw-r--r -- 1 .. . nginx.conf                    # 主配置文件
- rw-r--r -- 1 .. . proxy_params             # 反向代理配置文件
- rw-r--r -- 1 .. . scgi_params                #SCGI 配置文件, SCGI FastCGI 类似,都是一种协议
drwxr-xr-x 2 .. . sites-available           # 所有域名配置文件
drwxr-xr-x 2 .. . sites-enabled            # 生效的域名配置文件,用软连接指向 site-available 中的文件
drwxr-xr-x 2 .. . snippets                    # 通用的配置片段目录,需要时被引用
- rw-r--r -- 1 .. . uwsgi_params            # 配置 Nginx uWSGI 模块的默认参数的文件
- rw-r--r -- 1 .. . win-utf                         # 编码转换映射转化文件
Nginx 配置文件格式说明
- 配置文件由指令与指令块构成
- 每条指令以 ; 分号结尾,指令与值之间以空格符号分隔
- 可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
- 指令块以 { } 大括号将多条指令组织在一起,且可以嵌套指令块
- include 语句允许组合多个配置文件以提升可维护性
- 使用 # 号添加注释,提高可读性
- 使用 $ 符号使用变量
- 变量分为 Nginx 内置变量和自定义变量,自定义变量用 set 指令定义
- 部分指令的参数支持正则表达式
参考资料:
   https :// nginx.org / en / docs / # 官方文档
   https :// nginx.org / en / docs / dirindex.html # 所有指令说明
   https :// nginx.org / en / docs / varindex.html # 所有变量查询索引

查看主配置文件内容

root@ubuntu24:~ # cat /etc/nginx/nginx.conf | grep -Ev "#|^$"
# --- 全局配置段 ---
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;
# --- 事件驱动相关的配置 ---
events {
      worker_connections 768 ;
}
# --- http/https 协议相关配置段 ---
http {
      sendfile on;
      tcp_nopush on;
      types_hash_max_size 2048 ;
      include /etc/nginx/mime.types;
      default_type application/octet-stream;
      ssl_prefer_server_ciphers on;
      access_log /var/log/nginx/access.log;
      gzip on;
      include /etc/nginx/conf.d/*.conf;
      include /etc/nginx/sites-enabled/*;
}

3. 全局配置

全局配置段常见的配置指令分类
- 正常运行必备的配置
- 优化性能相关的配置
- 用于调试及定位问题相关的配置
- 事件驱动相关的配置
# 全局配置常用配置项
user user [group]; # 指定 worker 进程运行时的用户和组,默认值为 nobody
nobody
worker_processes auto|N; # 指定启动的 worker 进程数量, N 表示具体数字, auto 表示根据 CPU 核心自由确定就开启几个进程
worker_cpu_affinity auto|cpumask; # worker 进程绑定到指定的 CPU 核心,提升性能,默认不绑
定,auto 表示自动绑定,nginx 1.9.10 版本开始支持
#cpumask 写法
# 有几颗 CPU 核就写几个数字,默认是 0 ,表示占位符,从右往
左数,
# 如果占位符值为 1 ,则表示绑定 worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; 上述写法表示4个工作进程分别绑定到 0,1, 2 3 4 个CPU核心上worker_processes 2; worker_cpu_affinity 0101 1010; 上述写法表示2个工作进程分别绑定到 0/2,1/3 CPU核心上
pid /path/file; #pid 文件路径,该文件中保存的是 master 进程号,服务启动时自动生成该文件
worker_priority N; #worker 进程优先级,默认值为 0, 此处设定的是 nice 值,取值为 -20 19
worker_rlimit_nofile N; # 所有 worker 进程可以打开的文件描述符数量之和,默认不
限制此值并不仅仅是指nginx 与客户端的连接数,包括与后端
服务的连接数比如一个客户端请求一个PHP资源, Nginx 要维持与客户端
连接, 也要维持后端FastCGI 连接
daemon on|off; # 默认值为 on, 表示以后台守护进程方式运行, off 表示前
台运行
master_process on|off; # 默认值为 on, 表示以 master-worker 模式运行, off
只有 master 进程,用于开发调试
include /path/file; # 文件包含 , 指定要包含的文件路径及规则,可以使用通配符
#evnets 配置项
events {
      worker_connections N; # 默认值 512 ,单个 worker 进程所支持的最大并发连接数,
     
# 总的并发数用此值乘以 worker 进程数
      multi_accept on|off; # 默认值 off on 表示 worker 进程一次可以接收多个新的
连接请求,
     
#off 表示 worker 进程,一次只能接收一个新连接,建议
设置为 on
      accept_mutex on|off; # 默认值 off ,表示 master 进程获得客户端请求后,会通
知所有的
     
# worker 进程,由当前状态最佳的 worker 进程处理请求,此过程也被称为 惊群,on 表示 master 进程轮流给worker进程分配要处理的连接,此处建议设置为 on
      use method; # 指定事件驱动模型 , 默认不设置此项, nginx 会根据当前系统自行选择可用值select|pool|kqueue|epoll|/dev/poll|eventport
}
https://nginx.org/en/docs/events.html # 事件驱动模型说明文档

4. 文件描述符 & nginx最大并发连接数

文件描述符:
是操作系统用来追踪打开的文件和其他资源(如网络连接)唯一的引用标识符。
Nginx 的文件描述符限制:
指的是 Nginx 工作进程能够同时打开的最大文件描述符数量。这个限制决定了 Nginx 能够处理的最大并发连接数。

5.http 配置

设置字符编码实践
定制访问首页
root @ubuntu24: ~ # echo ' 你好 ' > /var/www/html/nh.html
root @ubuntu24: ~ # echo '<meta charset="UTF-8" /> 你好 ' > /var/www/html/nh1.html

修改 nginx 的配置,增加字符集属性
修改配置文件
root @ubuntu24: ~ # cat /etc/nginx/nginx.conf
http {
a
a #
.. .
重启服务后测试
重启 nginx
root @ubuntu24: ~ # systemctl restart nginx
测试效果
root @ubuntu24: ~ # curl -s -I 127.1 | grep Content-Type
Content-Type : text / html; charset = utf8
5.隐藏属性信息
一般默认
root @ubuntu24: ~ # cat /etc/nginx/nginx.conf
http {
server_tokens off;   on的话是显示版本信息不安全
 on :显示完整的服务器版本信息,例如 nginx / 1.18.0
 off :不显示服务器版本信息,只显示 nginx
 build :只显示 Nginx 的编译版本信息,不包含具体的版本号,但会包含编译时的标识信息。

6.server实践

1 删除默认配置 root @ubuntu24: ~ # rm -f /etc/nginx/sites-enabled/default

定制应用页面

mkdir / data / server / nginx / web{ 1..3 } - p
echo "nginx web1" > / data / server / nginx / web1 / index.html
echo "nginx web2" > / data / server / nginx / web2 / index.html
echo "nginx web3" > / data / server / nginx / web3 / index.html
准备工作
ip a a 10.0.0.186 / 24 dev ens33
ip a a 10.0.0.187 / 24 dev ens33
ip a a 10.0.0.188 / 24 dev ens33

7.基于端口的站点实践 

注意:7 8 9 实践跟6.server实践里的内容有关联 必须先 定制应用页面 不然会404
定制配置文件
root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 80 ;
 root / data / server / nginx / web1;
}
server {
 listen 81 ;
 root / data / server / nginx / web2;
}
server {
 listen 82 ;
 root / data / server / nginx / web3;
}
eof
重启服务后检测效果
重启服务
root @ubuntu24: ~ # systemctl restart nginx
确认效果
root @ubuntu24: ~ # curl 10.0.0.13:80
nginx web1
root @ubuntu24: ~ # curl 10.0.0.13:81
nginx web2
root @ubuntu24: ~ # curl 10.0.0.13:82
nginx web3

8.基于ip的站点实践

基于 IP 地址实现多 server
定制配置文件
root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 10.0.0.186 ;
 root / data / server / nginx / web1;
}
server {
 listen 10.0.0.187 ;
 root / data / server / nginx / web2;
}
server {
 listen 10.0.0.188 ;
 root / data / server / nginx / web3;
}
eof
重启服务后检测效果
重启服务
root @ubuntu24: ~ # systemctl restart nginx
确认效果
root @ubuntu24: ~ # curl 10.0.0.186
nginx web1
root @ubuntu24: ~ # curl 10.0.0.187
nginx web2
root @ubuntu24: ~ # curl 10.0.0.188
nginx web3

9.基于域名的站点实践

基于域名实现多server (应用于端口不变,网站不同的情况)
定制配置文件
root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 80 default_server;    #在访问非www.a.com时 自动调到www.a.com里的内容
 server_name www.a.com;
 root / data / server / nginx / web1;
}
server {
 listen 80 ;
 server_name www.b.com;
 root / data / server / nginx / web2;
}
server {
 listen 80 ;
 server_name www.c.com;
 root / data / server / nginx / web3;
}
eof
重启服务
root @ubuntu24: ~ # systemctl restart nginx
确认效果
root @ubuntu24: ~ # curl 10.0.0.13 -H "host: www.a.com"
nginx web1
root @ubuntu24: ~ # curl 10.0.0.13 -H "host: www.b.com"
nginx web2
root @ubuntu24: ~ # curl 10.0.0.13 -H "host: www.c.com"
nginx web3
访问未知服务 -- default_server 的作用
root @ubuntu24: ~ # curl 10.0.0.13 -H "host: www.d.com"
nginx web1
root @ubuntu24: ~ # curl 10.0.0.13 -H "host: www.h.com"
nginx web1

1.7.8 Server & Location进阶

root alias :用于指定请求的资源路径。 root 指定的是根目录, Nginx 会将请求的 URL 附加到根目录
后面来找到资源;而 alias 则是对请求的 URL 进行替换,直接定位到资源路径。
root alias 所起的作用都是指定响应请求所用文件的路径,只是他们有些许的区别
root 表示 location 匹配内容的相对路径
alias 表示 一个绝对路径 , 而且必须以 "/" 结尾
细节解读
效果一:                                          效果二:
location / img / {                                 location / img / {
   alias / var / www / image / ;                        root / var / www / image;
}                                              }
效果一:访问 http :// localhost / img / nginx / var / www / image / 目录下的文件(不管location内容)
效果二:访问 http :// localhost / img / nginx / var / www / image / img / 目录下的文件 (拼接)
注意:
一般情况下,在 location / 中配置 root ,在 location / other 中配置 alias
配置的目录必须有 nginx 的访问权限,否则全部失效 , 不要设置为 X 用户的家目录。
Root 实践
创建相关文件
mkdir / data / server / nginx / web1 / dir { 1 , 2 }
echo "nginx web1 dir1" > / data / server / nginx / web1 / dir1 / index.html
echo "nginx web1 dir2" > / data / server / nginx / web1 / dir2 / index.html
echo "nginx web1 filea" > / data / server / nginx / web1 / afile
测试效果
root @ubuntu24: ~ # tree /data/server/nginx/web1
/ data / server / nginx / web1
├── afile
├── dir1
   └── index.html
├── dir2
   └── index.html
└── index.html
3 directories, 4 files
定制配置文件
root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 80 default_server;
 root / data / server / nginx / web1;
 location / dir1 / {
    root / data / server / nginx / web1;
 }
}
eof
重启服务
root @ubuntu24: ~ # systemctl restart nginx
测试
测试效果
root @ubuntu24: ~ # curl 10.0.0.13
nginx web1
root @ubuntu24: ~ # curl 10.0.0.13/dir1/
nginx web1 dir1
root @ubuntu24: ~ # curl 10.0.0.13/dir2/
nginx web1 dir2
root @ubuntu24: ~ # curl 10.0.0.13/afile
nginx web1 filea
结果显示:
root 模式,是 nginx 默认使用的模式, root 目录下指定的目录都可以直接拼接到域名后面
闹心的一天啊 我用nginx -t检测到的语法错误(原因及解决方式我放到了下面)
最后的成果 (开头不能有一点儿空格,不然就会报错)

1. location优先级   (待补)

1.7.9 文件下载服务器实践

创建文件
mv / data / server / nginx / web1 / index.html{, - bak}
dd if =/ dev / zero of =/ data / server / nginx / web1 / 10 M.img bs = 10 M count = 1
dd if =/ dev / zero of =/ data / server / nginx / web1 / 10 M.img bs = 20 M count = 1
cp / etc / fstab / data / server / nginx / web1 /
cp / var / log / auth.log / data / server / nginx / web1 / dir / logs /
echo "sanguoyanyi" > / data / server / nginx / web1 / 三国演义 .txt
定制配置文件
root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 80 default_server;
 location / download {
   alias / data / server / nginx / web1;
   charset utf8;
   autoindex on;
   autoindex_exact_size off; # 以友好格式显示文件大小
   autoindex_localtime on;   # 以服务器时区显示文件时间
   
# 设置下载文件的默认 MIME 类型(可选)
   default_type application / octet-stream;
 }
}
eof
重启服务
root @ubuntu24: ~ # systemctl restart nginx
效果如下:

1.7.10 Https实践

Nginx 中的 Https 功能需要 ngx_http_ssl_module 模块支持,使用 Yum / apt 安装的 Nginx
中己经包含了该模块的功能,如果使用的是自行通过源码编译安装的 Nginx ,需要在编译的时候指定相关编译项。
参考资料: https :// nginx.org / en / docs / http / ngx_http_ssl_module.html

分析:https=http+tls  tls通过CA来实践  1 ca机构或自建ca 2 服务器证书定制 -域名必须在证书里面限定好  3.nginx使用服务器证书

nginx默认把ssl加载过来了  --with-http_ssl_module 

1. 配置解析

主要的是:ssl on     ssl_certificate file(公钥)  ssl_certificate_key file(私钥)

ssl on|off; #是否启用SSL,1.15版本中被弃用,1.25.1版本中被删除
ssl_buffer_size size; #Nginx在读取和写入SSL/TLS握手数据时使用的缓冲区大小,无关数据
发送,
 #默认值 16k
 #作用域 http, server
ssl_certificate file; #当前虚拟主机的证书文件,通常是PEM格式,
 #该文件中有两部份,分别是虚拟主机的证书和CA机构的证书,
 #作用域 http, server
ssl_certificate_key file; #当前虚拟主机的私钥文件路径,作用域 http, server
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
 #当前支持的SSL协议版本,默认值 TLSv1 TLSv1.1 TLSv1.2 
TLSv1.3
 #作用域 http, server
ssl_session_cache off|none|[builtin[:size]] [shared:name:size];
 #配置SSL缓存,作用域 http, server
 #off 禁用SSL/TLS会话缓存
 #none 通知客户端可以重用会话,但并没有缓存相关数据,默认值
 #builtin[:size] 使用OpenSSL内建缓存,可指定大小,每个
worker 进程独享
 #[shared:name:size] 使用共享缓存,
 #每个worker进程共享该缓存中的数据,可指定name和大小
 
ssl_session_timeout time; #配置SSL/TLS会话缓存的超时时间,默认值 5m,作用域 http, 
server

ssl功能解读
使用SSL/TLS会话缓存有助于减少服务器的加密和解密负担,提高HTTPS连接的响应速度,启用缓存需要
ssl_session_cache,ssl_session_timeout 两个选项一起使用。
 SSL/TLS会话缓存存储的是SSL/TLS握手过程中生成的会话数据。在SSL/TLS握手过程中,服务器和客
户端会交换一系列数据,其中包括协商的密钥、加密算法、会话标识符等信息。这些信息用于确保安全通信,
并在建立连接后用于加密和解密通信的数据

2. 秘钥环境准备

root @ubuntu24: ~ # apt install easy-rsa -y      注:easy-rsa 是一个用于创建和管理公钥基础设施(PKI)的工具集,安装它之后,你会获得一系列用于简化生成和管理 SSL/TLS 证书及密钥过程的脚本。
root @ubuntu24: ~ # cd /usr/share/easy-rsa/
root @ubuntu24:easy-rsa #   注:初始化 PKI 目录
查看效果
root @ubuntu24:easy-rsa # tree pki/
pki /
├── inline
├── openssl-easyrsa.cnf
├── private
└── reqs
4 directories, 1 file

3. 实现自签证书

生成CA机构证书,不使用密码

root @ubuntu24:easy-rsa # ./easyrsa build-ca nopass
。。。。。。。。
Common Name (eg : your user, host, or server name) [Easy-RSA CA] : baidu.com   #
入  给ca用的 自己给自己用的 对nginx意义不大
。。。。。。。。

4.网站的签名请求

生成私钥和证书申请文件  给服务器用的是我真正想要用的
oot @ubuntu24:easy-rsa # ./easyrsa gen-req pjli.baidu.com nopass
.. .
Common Name (eg : your user, host, or server name) [pjli.baidu.com] : # 直接
Enter
。。。。。

5.签发证书

root @ubuntu24:easy-rsa # ./easyrsa sign-req server pjli.baidu.com
.. .
Type the word 'yes' to continue , or any other input to abort.
 Confirm request details : yes # 输入 yes
...

6. 合并证书

合并服务器证书,签发机构证书为一个文件,注意顺序
root @ubuntu24:easy-rsa # cat pki/issued/pjli.baidu.com.crt pki/ca.crt >
pki/pjli.baidu.com.pem   #服务器公钥和CA机构公钥信息合并在一起
给私钥加读权限
root @ubuntu24:easy-rsa # chmod +r pki/private/pjli.baidu.com.key
检查效果
root @ubuntu24:easy-rsa # tree pki
pki
├── ca.crt #CA 机构证书
├── certs_by_serial
   └── 577 CBD583FB044E99A35C88635BAFC94.pem
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── inline
├── issued
   └── pjli.baidu.com.crt # 虚拟主机服务器证书
├── openssl-easyrsa.cnf
├── private
   ├── ca.key #CA 机构私钥
   └── pjli.baidu.com.key # 虚拟主机服务器私钥
├── reqs
   └── pjli.baidu.com.req # 证书申请文件
├── revoked
   ├── certs_by_serial
   ├── private_by_serial
   └── reqs_by_serial
├── serial
├── serial.old
└── pjli.baidu.com.pem # 合并后的 pem 文件
10 directories, 14 files

定制nginxssl配置

root@ubuntu24:~# cat > /etc/nginx/conf.d/vhost.conf <<-eof

server {
 listen 80 default_server;
 server_name pjli.baidu.com;
 root / data / server / nginx / web1;
# return 301 https://$host$request_uri; # 301 重定向
 rewrite ^ (. * ) https :// \ $server_name \ $1 permanent; #rewrite 重定向,二选一
}      #访问的80端口请求统统交给https
server{
 listen 443 ssl;       #ssl功能打开
 server_name pjli.baidu.com;     #必须跟我证书申请用到的域名一样
 root / data / server / nginx / web1;
# 定制 ssl 的能力
 ssl_certificate / usr / share / easy-rsa / pki / pjli.baidu.com.pem;                           #证书文件,指定公钥 
 ssl_certificate_key / usr / share / easy-rsa / pki / private / pjli.baidu.com.key;         #私钥文件,指定私钥
 ssl_session_cache shared : sslcache : 20 m;
 ssl_session_timeout 10 m;
}
eof

https测试效果

本地 curl 测试效果
访问 http 则提示 301 跳转
root @ubuntu24:easy-rsa # curl 10.0.0.13 -I
访问 https 提示证书不安全
root @ubuntu24:easy-rsa # curl https://10.0.0.13 -I
curl : ( 60 ) SSL certificate problem : self-signed certificate in certificate chain
More details here : https :// curl.se / docs / sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
使用不安全方式测试
root @ubuntu24:easy-rsa # curl https://10.0.0.13 -k
nginx web1
浏览器测试效果
下载证书到 windows 主机
/ usr / share / easy-rsa / pki / ca.crt
查看证书信息
双击加载证书信息到 受信任的根证书颁发机构,然后,再次双击证书,确认信息
可以看到证书路径里面 , 证书的图标没有红 x
windows 主机配置 hosts 文件,路径是: C: \ Windows \ System32 \ drivers \ etc \ hosts ,内容如下
10.0.0.13 pjli.baidu.com
浏览器访问域名,查看效果

1.7.11 防盗链

盗链是指某站点未经允许引用其它站点上的资源。基于访问安全考虑, Nginx 支持通过 ngx_http_referer_module 模块,检查和过滤 Referer 字段的值,来达到防盗链的效果。

盗链演示实践

root @ubuntu24: ~ # ls /data/server/nginx/web1/static/
favicon.ico  picture.png
定制访问页面
root @ubuntu24: ~ # echo '<img src="http://10.0.0.13:81/static/picture.png"
width="40" height="40" />' >> /data/server/nginx/web2/index.html
root @ubuntu24: ~ # echo '<img src="http://10.0.0.13:81/static/picture.png"
width="40" height="40" />' >> /data/server/nginx/web3/index.html

定制配置文件

root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 80 default_server;
 root / data / server / nginx / web2;
}
server {
 listen 81 default_server;
 root / data / server / nginx / web1;
}
eof
重启服务   root @ubuntu24: ~ # systemctl restart nginx
访问测试:当访问者在浏览器中打开 10.0.0.13 / index.html 时,该页面会引用一个 http :// 10.0.0.13 : 81 站点的图片资源。而对于 http :// 10.0.0.13 : 81 站点而言,其资源就是被资链了。
利用 valid_referers 指令实现防盗链
配置文件
root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 80 default_server;
 root / data / server / nginx / web2;
}
server {
 listen 81 default_server;
 root / data / server / nginx / web1;
# 请求头中没有 referer 或 值不合法, server_name 中以 :82 .baidu. .bing. .so. 开头的域名
# $invalid_referer 变量为空,除此之外将 $invalid_referer 变量的值设为 1
 valid_referers none blocked server_names ~ : 82   ~\ .baidu \ . ~\ .bing \ . ~\ .so \ .;
# 如果 \$invalid_referer 值不为空,就返回 403
if ( $invalid_referer ){            
return 403 "Forbidden Access" ;
 }
}
server {
 listen 82 default_server;
 root / data / server / nginx / web3;
}
eof
检查日志
root @ubuntu24: ~ # tail -1 /var/log/nginx/access.log
10.0.0.1 - - [ 15 / Nov / 2024 : 21 : 15 : 48 + 0800 ] "GET /static/picture.png HTTP/1.1" 403
16 "http://10.0.0.13/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
curl 测试
浏览器再次测试 http :// 10.0.0.13 : 82 / 效果,因为它的 valid_referers 符合 : 82 的需求,所以,可
以访问

1.7.12 Rewrite

Nginx 中, rewrite 指令 用于重写 URI ,允许 Nginx 修改客户端请求的 URI ,基于此,可用该
指令实现 URL 重定向,修改请求参数,改变请求含义,改变 URL 结构等,该指令来自于 ngx_http_rewrite_module 模块。
例如我想访问www.a.com/a/b/c/d.txt 经过nginx重写 访问的是  www.a.com/b.txt
break; #中断当前相同作用域(location)中的其它 ngx_http_rewrite_module 模块的配置和
指令,
 #返回到上一作用域继续执行
 #该指令后的其它指令和配置还会执行,只中断 ngx_http_rewrite_module 指令,
 # 作用域 server, location, if


return code [text]; 
return code URL;
return URL; # 不写code ,默认值为302 
 # 直接向客户端返回状态码,字符串,或者URL,
 # 如果返回的字符串中包含空格,要加引号,如果返回URL,要写完整
 # 此指令后的其它指令或配置将不再执行,作用域 server, location, if

rewrite_log on|off; #是否记录 ngx_http_rewrite_module 模块产生的日志到 error_log 
中,
 #默认值 off, 如果开启,需要将 error_log 的级别设为 notice,
 # 作用域 http, server, location, if
 
set $variable value; # 自定义变量,变量名以$开头,变量值可以从其它变量中获取,也可以直接
指定
 # 作用域 server, location, if

1. break & return指令测试

root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 80 default_server;
 root / data / server / nginx / web1;
 location / break {
set \ $var1 ridiculous;
echo \ $var1 ;
break ;
# break 命令之后, ngx_http_rewrite_module 模块其他指令则不再生效,比如 set return
   
set \ $var2 1234 ;    
echo "\ $var1 -- \ $var2 " ;
return 200 "hello break" ;
 }
 location / nobreak{
set \ $var1  shide;
  set \ $var2 1234 ;   
echo "\ $var1 -- \ $var2 " ;
return 211 "hello nobreak\n" ;
 }
}
eof
测试效果和文本文件
1.1 扩展模块 - echo
echo 模块通常是由 OpenResty 提供的,你可以从 GitHub 上的 OpenResty 仓库(如
github.com / openresty / echo-nginx-module )下载最新版本的 echo 模块源代码。
1 下载模块
root @ubuntu24:softs # wget https://github.com/openresty/echo-nginx
module/archive/refs/tags/v0.63.tar.gz
解压文件
root @ubuntu24:softs # tar xf v0.63.tar.gz -C /usr/local/
2 编译安装
查看配置选项
root @ubuntu24:softs # cd nginx-1.24.0/
root @ubuntu24:nginx-1 .24.0 # nginx -V
nginx version : nginx / 1.24.0 (Ubuntu)
built with OpenSSL 3.0.13 30 Jan 2024
TLS SNI support enabled
configure arguments : -- with-cc-opt = '... --with-stream_geoip_module=dynamic
定制配置增加 echo 模块的功能属性 -- add-module =
root @ubuntu24:nginx-1 .24.0 # ./configure --with-cc-opt='-g -O2 -fno-omit-frame
pointer -mno-omit-leaf-frame-pointer -ffile-prefix-map=/build/nginx-DlMnQR/nginx-
1.24.0=. -flto=auto -ffat-lto-objects -fstack-protector-strong -fstack-clash
protection -Wformat -Werror=format-security -fcf-protection -fdebug-prefix
map=/build/nginx-DlMnQR/nginx-1.24.0=/usr/src/nginx-1.24.0-2ubuntu7.1 -fPIC -
Wdate-time -D_FORTIFY_SOURCE=3' --with-ld-opt='-Wl,-Bsymbolic-functions -
flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -fPIC' --
prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log
path=/var/log/nginx/access.log --error-log-path=stderr --lock
path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules
path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --
http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp
path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi
temp-path=/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit --with
http_ssl_module --with-http_stub_status_module --with-http_realip_module --with
http_auth_request_module --with-http_v2_module --with-http_dav_module --with
http_slice_module --with-threads --with-http_addition_module --with
http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with
http_mp4_module --with-http_random_index_module --with-http_secure_link_module --
with-http_sub_module --with-mail_ssl_module --with-stream_ssl_module --with
stream_ssl_preread_module --with-stream_realip_module --with
http_geoip_module=dynamic --with-http_image_filter_module=dynamic --with
http_perl_module=dynamic --with-http_xslt_module=dynamic --with-mail=dynamic --
with-stream=dynamic --with-stream_geoip_module=dynamic --add
module=/usr/local/echo-nginx-module-0.63
编译文件
root @ubuntu24:nginx-1 .24.0 # make
新旧版本 nginx 环境
root @ubuntu24:nginx-1 .24.0 # nginx -v
nginx version : nginx / 1.24.0 (Ubuntu)
root @ubuntu24:nginx-1 .24.0 # ./objs/nginx -v
nginx version : nginx / 1.24.0
新旧版本的 nginx 执行文件
root @ubuntu24:nginx-1 .24.0 # ls ./objs/nginx /usr/sbin/nginx -l
- rwxr-xr-x 1 root root 6997664 11 12 12 : 09 . / objs / nginx
- rwxr-xr-x 1 root root 1313752   9 10 21 : 27 / usr / sbin / nginx
3 测试效果
备份旧执行文件
root @ubuntu24:nginx-1 .24.0 # mv /usr/sbin/nginx /usr/sbin/nginx-1.24
应用新的 nginx
root @ubuntu24:nginx-1 .24.0 # chmod +x ./objs/nginx
root @ubuntu24:nginx-1 .24.0 # cp ./objs/nginx /usr/sbin/
root @ubuntu24:nginx-1 .24.0 # nginx -v
nginx version : nginx / 1.24.0
4 功能使用
定制配置文件
root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 80 ;
 location / echo {
   
echo "request_uri: \ $request_uri " ;
 }
}
eof
删除默认的 nginx 站点配置
root @ubuntu24:nginx-1 .24.0 # rm -rf /etc/nginx/sites-enabled/default
重启服务
root @ubuntu24: ~ # systemctl restart nginx
检测效果
root @ubuntu24:nginx-1 .24.0 # curl 10.0.0.13/echo
request_uri :   / echo
结果显示: 新增模块增加成功

2. if条件属性解读

root @ubuntu24: ~ # echo file-log > /data/server/nginx/web1/file.log
root @ubuntu24: ~ # echo file-txt > /data/server/nginx/web1/file.txt
定制配置文件
root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 80 default_server;
 root / data / server / nginx / web1;
 location / file {
   
if ( !- e \ $request_filename ){
     
return 200 "\ $request_filename 文件不存在 " ;
   }
 }
}
eof
注意: $request_filename == Root 路径 和 文件名的拼接
重启:root @ubuntu24: ~ # systemctl restart nginx
效果
root @ubuntu24: ~ # curl 10.0.0.13/file.txt
file-txt
root @ubuntu24: ~ # curl 10.0.0.13/file.html
/ data / server / nginx / web1 / file.html 文件不存在
root @ubuntu24: ~ # curl 10.0.0.13/file.log
file-log
root @ubuntu24: ~ # curl 10.0.0.13/file
/ data / server / nginx / web1 / file 文件不存在

3. set 配合 if实践

准备工作:
root @ubuntu24: ~ # dd if=/dev/zero of=/data/server/nginx/web1/noslow.img bs=10M
count=1
root @ubuntu24: ~ # dd if=/dev/zero of=/data/server/nginx/web1/slow.img bs=10M
count=1
root @ubuntu24: ~ # ls /data/server/nginx/web1/*w.img
/ data / server / nginx / web1 / noslow.img   / data / server / nginx / web1 / slow.img

定制配置文件

root@ubuntu24:~# cat > /etc/nginx/conf.d/vhost.conf <<-eof

server {
 listen 80 default_server;
 root / data / server / nginx / web1;
 location / noslow.img {
break ;                         break之后下面的就不执行了
set \ $slow 1 ;   
if ( \ $slow ) {  limit_rate 10 k;
   }
 }
 location / slow.img{    
set \ $slow 1 ;              设定了一个自定义的环境变量,如果slow有值,那就设定速率为10k
if ( \ $slow ) {
     limit_rate 10 k;
   }
 }
}
eof
界面显示下图
root @ubuntu24: ~ # systemctl restart nginx
测试不慢的文件效果
root @ubuntu24: ~ # wget 10.0.0.13/noslow.img
.. .
正在保存至 : noslow.img
noslow.img     100 % [ ===================> ]   10.00 M   -- . - KB / s     用时 0.02 s
2024 - 11 - 15 22 : 44 : 24 ( 664 MB / s) - 已保存 noslow.img [ 10485760 / 10485760 ])
测试慢的文件效果
root @ubuntu24: ~ # wget 10.0.0.13/slow.img
.. .
长度: 10485760 ( 10 M) [application / octet-stream]
正在保存至 : slow.img
slow.img         3 % [ >                  ]   380.00 K   11.0KB / s     剩余 15 m 19 s

4. 重定向

rewrite  例如我在访问A的时候访问的是B   网址不变,内容改成其他了
服务器重定向实践
准备
echo "11111" > / data / server / nginx / web1 / 1. html
echo "22222" > / data / server / nginx / web1 / 2. html
echo "33333" > / data / server / nginx / web1 / 3. html
echo "aaaaa" > / data / server / nginx / web1 / a.html
echo "bbbbb" > / data / server / nginx / web1 / b.html
echo "ccccc" > / data / server / nginx / web1 / c.html
root @ubuntu24: ~ # cat > /etc/nginx/conf.d/vhost.conf <<-eof
server {
 listen 80 default_server;
 root / data / server / nginx / web1;
 location / 1. html {
   rewrite / 1. html / 2. html; # 访问 1 跳转到 2
   rewrite / 2. html / 3. html; # 访问 2 跳转到 3
 }
 location / 2. html {
   rewrite / 2. html / a.html; # 访问 2 跳转到 a
 }
 location / 3. html {
   rewrite / 3. html / b.html; # 访问 3 跳转到 b
 }
 location / c.html {
   rewrite / c.html / 3. html; # 访问 c 跳转到 3
   rewrite / 3. html / 1. html; # 访问3 跳转到1
   rewrite / 1. html / c.html; # 访问 1 跳转到 c
 }
}
eof
重启服务
root @ubuntu24: ~ # systemctl restart nginx
测试效果
root @ubuntu24: ~ # curl 10.0.0.13/1.html   # 访问 1 跳转到 2, 访问 2 跳转到 3, 访问 3 跳转到 b
bbbbb
root @ubuntu24: ~ # curl 10.0.0.13/2.html   # 访问 2 跳转到 a
aaaaa
root @ubuntu24: ~ # curl 10.0.0.13/3.html   # 访问 3 跳转到 b
bbbbb
root @ubuntu24: ~ # curl 10.0.0.13/c.html # 无限循环,最终返回 500 服务器内部错误
< html >
< head >< title > 500 Internal Server Error </ title ></ head >
这里面展示的是 服务端 重定向,所以,不会出现 301 302 的效果
root @ubuntu24: ~ # curl 10.0.0.13/1.html -I
HTTP / 1.1 200 OK
实践与验证
未完待续 。。。。 字太多有点儿卡 我又重新再写下一部分了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值