目录

Nginx 概述

1 Nginx 介绍

2 Nginx 功能介绍

3 基础特性

4 Web 服务相关的功能

5 Nginx的进程结构

6 Nginx 模块介绍

Nginx的编译安装

1 编译器介绍和常用命令

2 Nginx安装的源码编译

Nginx的平滑升级和回滚

1 下载高版本的软件

2 对新版本软件进行源码编译并平滑升级

3 版本回退

Nginx的核心配置详解

1 配置文件说明

2 默认的nginx.conf配置文件格式说明

3 Nginx配置文件的管理及优化参数

4 Nginx下构建PC站点

  ​编辑

5 KeepAlived长链接优化

6 目录访问的用户认证

7 自定义错误页面

8 自定义错误日志

9 Nginx中建立下载服务器

10 Nginx的文件检测

Nginx高级配置

1 Nginx的状态页


Nginx 概述

1 Nginx 介绍

Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus )
Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器
Nginx官网:http://nginx.org

2 Nginx 功能介绍

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

3 基础特性

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

4 Web 服务相关的功能

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

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

6 Nginx 模块介绍

  • 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
  • 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
  • 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash
  • 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
  • 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
  • Stream服务模块: 实现反向代理功能,包括TCP协议代理
  • 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等

Nginx的编译安装

1 编译器介绍和常用命令

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

2 Nginx安装的源码编译

1.下载软件

官方源码包下载地址:

https://nginx.org/en/download.html
[root@Nginx ~]# wget https://nginx.org/download/nginx-1.28.2.tar.gz

2.解压

[root@Nginx ~]# tar zxf nginx-1.28.2.tar.gz
[root@Nginx ~]# cd nginx-1.28.2/
[root@Nginx nginx-1.28.2]# ls
auto     CHANGES.ru          conf       contrib          html     man        SECURITY.md
CHANGES  CODE_OF_CONDUCT.md  configure  CONTRIBUTING.md  LICENSE  README.md  src
[root@Nginx nginx-1.28.2]# ./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


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

3.检测环境(安装依赖性)

[root@Nginx ~]# dnf install gcc openssl-devel.x86_64 pcre2-devel.x86_64 zlib-devel -y
[root@Nginx nginx-1.28.2]# ./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.编译后完成nginx的安装

[root@Nginx nginx-1.28.1]# make
[root@Nginx nginx-1.28.1]# make install  

5.启动nginx
设定环境变量

[root@Nginx sbin]# vim  ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin

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

6.测试

[root@Nginx logs]# useradd  -s /sbin/nologin -M nginx
[root@Nginx logs]# nginx
[root@Nginx logs]# ps aux | grep nginx
root       44012  0.0  0.1  14688  2356 ?        Ss   17:01   0:00 nginx: master process nginx
nginx      44013  0.0  0.2  14888  3892 ?        S    17:01   0:00 nginx: worker process
root       44015  0.0  0.1   6636  2176 pts/0    S+   17:01   0:00 grep --color=auto nginx


#测试
[root@Nginx logs]# echo timinglee > /usr/local/nginx/html/index.html

[root@Nginx logs]# curl  192.168.131.100
timinglee

7.编写启动文件

[root@Nginx ~]# vim /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

[root@Nginx ~]# systemctl daemon-reload		#系统识别

8.验证

[root@Nginx ~]# systemctl status nginx.service
○ nginx.service - The NGINX HTTP and reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; preset: disabled)
     Active: inactive (dead)

[root@Nginx ~]# systemctl enable --now nginx
[root@Nginx ~]# ps aux | grep nginx
root        1839  0.0  0.1  14688  2356 ?        Ss   09:53   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       1840  0.0  0.2  14888  3828 ?        S    09:53   0:00 nginx: worker process

9.重启查看服务状态是否正常

[root@Nginx ~]# reboot
[root@Nginx ~]# systemctl status nginx.service

Nginx的平滑升级和回滚

1 下载高版本的软件

[root@Nginx ~]# wget https://nginx.org/download/nginx-1.29.4.tar.gz

2 对新版本软件进行源码编译并平滑升级

[root@Nginx ~]# tar zxf nginx-1.29.4.tar.gz
[root@Nginx ~]# cd nginx-1.29.4/src/core/
[root@Nginx core]# vim nginx.h
#define nginx_version      1029004
#define NGINX_VERSION      ""     #加密
#define NGINX_VER          "TIMINGLEE/" NGINX_VERSION


[root@Nginx core]# cd ../../
[root@Nginx nginx-1.29.4]# ./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

[root@Nginx nginx-1.29.4]# make
[root@Nginx nginx-1.29.4]# cd objs/
[root@Nginx objs]# ls
autoconf.err  nginx    ngx_auto_config.h   ngx_modules.c  src
Makefile      nginx.8  ngx_auto_headers.h  ngx_modules.o

[root@Nginx objs]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# ls
nginx

[root@Nginx sbin]# \cp -f /root/nginx-1.29.4/objs/nginx  /usr/local/nginx/sbin/nginx

[root@Nginx sbin]# ls /usr/local/nginx/logs/
access.log  error.log  nginx.pid

[root@Nginx sbin]# ps aux | grep nginx
root         901  0.0  0.0  14688  2232 ?        Ss   13:13   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx        902  0.0  0.1  14888  3768 ?        S    13:13   0:00 nginx: worker process
root        4811  0.0  0.0   6636  2176 pts/0    S+   14:10   0:00 grep --color=auto nginx

[root@Nginx sbin]# kill -USR2 902   #nginx master进程id

[root@Nginx sbin]# ls /usr/local/nginx/logs/
access.log  error.log  nginx.pid  nginx.pid.oldbin

显示测试结果并回收旧版本子进程

#测试效果
[root@Nginx sbin]# nginx -V
nginx version: TIMINGLEE/
built by gcc 11.5.0 20240719 (Red Hat 11.5.0-5) (GCC)
built with OpenSSL 3.2.2 4 Jun 2024
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

[root@Nginx sbin]# ps aux | grep nginx
root        1643  0.0  0.1  14688  2744 ?        Ss   09:55   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       1644  0.0  0.2  14888  3896 ?        S    09:55   0:00 nginx: worker process
root        4919  0.0  0.4  14716  7936 ?        S    10:24   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       4921  0.0  0.2  14916  4156 ?        S    10:24   0:00 nginx: worker process
root        4929  0.0  0.1   6636  2176 pts/0    S+   10:27   0:00 grep --color=auto nginx
[root@Nginx sbin]# kill -WINCH 1643
[root@Nginx sbin]# ps aux | grep nginx
root        1643  0.0  0.1  14688  2744 ?        Ss   09:55   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root        4919  0.0  0.4  14716  7936 ?        S    10:24   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       4921  0.0  0.2  14916  4156 ?        S    10:24   0:00 nginx: worker process
root        4932  0.0  0.1   6636  2176 pts/0    S+   10:28   0:00 grep --color=auto nginx

3 版本回退

[root@Nginx sbin]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# cp nginx nginx.new -p
[root@Nginx sbin]# \cp nginx.old  nginx -pf
[root@Nginx sbin]# ps aux | grep nginx
root        1643  0.0  0.1  14688  2744 ?        Ss   09:55   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root        4919  0.0  0.4  14716  7936 ?        S    10:24   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       4921  0.0  0.2  14916  4156 ?        S    10:24   0:00 nginx: worker process

[root@Nginx sbin]# kill -HUP 1643
[root@Nginx sbin]# ps aux | grep nginx
root        1643  0.0  0.1  14688  2744 ?        Ss   09:55   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root        4919  0.0  0.4  14716  7936 ?        S    10:24   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       4921  0.0  0.2  14916  4156 ?        S    10:24   0:00 nginx: worker process
nginx       4963  0.0  0.2  14888  3896 ?        S    10:32   0:00 nginx: worker process
root        4965  0.0  0.1   6636  2176 pts/0    S+   10:32   0:00 grep --color=auto nginx
[root@Nginx sbin]# nginx -V
nginx version: nginx/1.28.2
built by gcc 11.5.0 20240719 (Red Hat 11.5.0-5) (GCC)
built with OpenSSL 3.2.2 4 Jun 2024
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

#回收新版本进程
[root@Nginx sbin]# kill -WINCH 4919
[root@Nginx sbin]# ps aux | grep nginx
root        1643  0.0  0.1  14688  2744 ?        Ss   09:55   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root        4919  0.0  0.4  14716  7936 ?        S    10:24   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       4963  0.0  0.2  14888  3896 ?        S    10:32   0:00 nginx: worker process
root        4969  0.0  0.1   6636  2176 pts/0    S+   10:34   0:00 grep --color=auto nginx

Nginx的核心配置详解

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 {
...
}

2 默认的nginx.conf配置文件格式说明

#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID 路径,日志路径等。

user  nginx;
worker_processes  auto;                #启动工作进程数数


events {                                        #设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受 多个网络连接,使用哪种事件驱动模型。

                                                     #处理请求,每个工作进程可以同时支 持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。

    worker_connections  1024;      #设置单个nginx工作进程可以接受的最大并发,作为web服务 器的时候最大并发数为           #(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 / {                              


            root   html;                   #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使用绝对路径配置。

index  index.html index.htm;        #默认的页面文件名称
         }


         error_page   500 502 503 504  /50x.html;        #错误页面的文件名称
        location = /50x.html {             #location处理对应的不同错误码的页面定义到/50x.html,这个跟对应其server中定义的目录下
             root   html;                        #定义默认页面所在的目录
         }      

}                  

3 Nginx配置文件的管理及优化参数

[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
user  nginx;
worker_processes  auto;
worker_cpu_affinity 0001 0010 0100 1000;

events {
    worker_connections  1024;
    use epoll;
    accept_mutex on;
    multi_accept on;
}

http{
    sendfile        on;
    keepalive_timeout  65;
}

[root@Nginx ~]# ps axo pid,cmd,psr | grep nginx
    899 nginx: master process /usr/   2
    900 nginx: worker process         0
    901 nginx: worker process         3
    902 nginx: worker process         3
    903 nginx: worker process         3
   1795 grep --color=auto nginx       1

测试并发

[root@Nginx ~]# dnf install httpd-tools -y
[root@Nginx ~]# ab  -n 100000 -c5000 http://192.168.131.100/index.html
This is ApacheBench, Version 2.3 <$Revision: 1913912 $>
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)				#并发数量过多导致访问失败

#处理本地文件系统的并发文件数量
[root@Nginx ~]# vim /etc/security/limits.conf
*               -       nofile          100000
*               -       noproc          100000
root			-		nofile			100000

[root@Nginx ~]# sudo -u nginx ulimit -n
100000


4 Nginx下构建PC站点

注意:location中使用root指令和alias指令的意义不同
root     #给定的路径对应于location中的/uri左侧的/
alias     #给定的路径对应于location中的/uri的完整路径

1.location中的root

[root@Nginx conf]# cd /usr/local/nginx/conf/
[root@Nginx conf]# mkdir  conf.d		#建立子配置目录
[root@Nginx conf]# vim nginx.conf
82     include "/usr/local/nginx/conf/conf.d/*.conf";

[root@Nginx conf]# nginx -s reload
[root@Nginx conf]# cd conf.d/

[root@Nginx ~]# mkdir  -p /webdata/nginx/timinglee.org/lee/html
[root@Nginx ~]# echo lee.timinglee.org > /webdata/nginx/timinglee.org/lee/html/index.html

#创建虚拟主机网站配置
[root@Nginx conf.d]# vim vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }
}

root@Nginx conf.d]# systemctl restart nginx.service

#访问测试
[root@Nginx conf.d]# vim /etc/hosts		#在访问主机中设解析
192.168.131.100     Nginx www.timinglee.org lee.timinglee.org

[root@Nginx conf.d]# curl  www.timinglee.org
timinglee
[root@Nginx conf.d]# curl  lee.timinglee.org
lee.timinglee.org

#local示例需要访问lee.timinglee.org/lee/目录
[root@Nginx conf.d]# vim vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    location / {
        root /webdata/nginx/timinglee.org/lee/html;
    }
    location /lee {			#lee标识location中的root值+location 后面指定的值代表目录的路径
        root /webdata/nginx/timinglee.org/lee/html;
    }
    
}

[root@Nginx conf.d]# systemctl restart nginx.service
[root@Nginx conf.d]# mkdir  -p /webdata/nginx/timinglee.org/lee/html/lee
[root@Nginx conf.d]# echo lee > /webdata/nginx/timinglee.org/lee/html/lee/index.html
[root@Nginx conf.d]# curl  lee.timinglee.org/lee/
lee


2.location中的alias

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

[root@Nginx conf.d]# vim vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;

    location /passwd {				#表示文件		
        alias /etc/passwd;
    }


    location /passwd/ {				#表示目录
        alias /mnt/;
    }

}

[root@Nginx conf.d]# nginx -s reload
[root@Nginx conf.d]# echo passwd > /mnt/index.html

#测试
[root@Nginx conf.d]# curl  lee.timinglee.org/passwd/
passwd
[root@Nginx conf.d]# curl  lee.timinglee.org/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

  

5 KeepAlived长链接优化

1.设定长链接时间

​
[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout   120 100;		#开启长连接后,返回客户端的会话保持时间为120s,单次长连接累计请求达到指定次数请求或120秒就会被断开,第二个数字100为发送给客户端应答报文头部中显示的超时时间设置为120s:如不设置客户端将不显示超时
时间。
[root@Nginx ~]# nginx -s reload

#命令测试
[root@Nginx ~]# dnf install telnet -y
[root@Nginx ~]# telnet lee.timinglee.org 80
Trying 192.168.131.100...
Connected to lee.timinglee.org.
Escape character is '^]'.
^CConnection closed by foreign host.
[root@Nginx ~]# vim /etc/hosts
[root@Nginx ~]# telnet www.timinglee.org 80
Trying 192.168.131.100...
Connected to www.timinglee.org.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.timinglee.org

HTTP/1.1 200 OK
Server: nginx/1.28.2
Date: Mon, 09 Feb 2026 08:12:43 GMT
Content-Type: text/html
Content-Length: 10
Last-Modified: Fri, 06 Feb 2026 11:52:01 GMT
Connection: keep-alive
ETag: "6985d5e1-a"
Accept-Ranges: bytes

timinglee		#显示的页面出现后根据设定的长链接时间会等待,超过时间后会自动退出
Connection closed by foreign host.

​

2.设定长链接次数

[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
keepalive_requests 3;
[root@Nginx ~]# nginx -s reload

#测试
[root@Nginx ~]# telnet  www.timinglee.org 80
Trying 172.25.254.100...
Connected to www.timinglee.org.
Escape character is '^]'.
GET / HTTP/1.1
Host: www.timinglee.org

HTTP/1.1 200 OK					#第一次
Server: nginx/1.28.1
Date: Sat, 31 Jan 2026 08:32:14 GMT
Content-Type: text/html
Content-Length: 10
Last-Modified: Thu, 29 Jan 2026 09:02:15 GMT
Connection: keep-alive
Keep-Alive: timeout=100
ETag: "697b2217-a"
Accept-Ranges: bytes

timinglee
GET / HTTP/1.1
Host: www.timinglee.org

HTTP/1.1 200 OK				#第二次
Server: nginx/1.28.1
Date: Sat, 31 Jan 2026 08:32:24 GMT
Content-Type: text/html
Content-Length: 10
Last-Modified: Thu, 29 Jan 2026 09:02:15 GMT
Connection: keep-alive
Keep-Alive: timeout=100
ETag: "697b2217-a"
Accept-Ranges: bytes

timinglee
GET / HTTP/1.1
Host: www.timinglee.org

HTTP/1.1 200 OK			#第三次
Server: nginx/1.28.1
Date: Sat, 31 Jan 2026 08:32:35 GMT
Content-Type: text/html
Content-Length: 10
Last-Modified: Thu, 29 Jan 2026 09:02:15 GMT
Connection: close
ETag: "697b2217-a"
Accept-Ranges: bytes

timinglee
Connection closed by foreign host.

6 目录访问的用户认证

[root@Nginx ~]# htpasswd  -cmb /usr/local/nginx/conf/.htpasswd admin  lee
Adding password for user admin

[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    location /admin {
        root /usr/local/nginx/html;
        auth_basic "login passwd";
        auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";
    }
}

[root@Nginx ~]# systemctl restart nginx.service

#测试:
root@Nginx ~]# curl  lee.timinglee.org/admin/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.28.2</center>
</body>
</html>


[root@Nginx ~]# curl  -uadmin:lee http://lee.timinglee.org/admin/
admin

7 自定义错误页面

[root@Nginx ~]# mkdir  /usr/local/nginx/errorpage
[root@Nginx ~]# echo "MISS!!" > /usr/local/nginx/errorpage/errormessage
[root@Nginx ~]# cat /usr/local/nginx/errorpage/errormessage
MISS!!


[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    error_page 404 405 502 503 /error;
    location /lee {
        root /usr/local/nginx/html;
    }

    location /error {
        alias /usr/local/nginx/errorpage/errormessage;
    }
}

[root@Nginx ~]# systemctl restart nginx.service
[root@Nginx ~]# curl  lee.timinglee.org/lee/
MISS!!

8 自定义错误日志

[root@Nginx ~]# mkdir -p /usr/local/nginx/logs/timinglee.org/
[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    error_page 404 405 503 502 /error;
    error_log logs/timinglee.org/lee.error error;
    location /lee {
        root /usr/local/nginx/html;
    }

    location /error {
        alias /usr/local/nginx/errorpage/errormessage;
    }
}

#重启nginx并访问不存在的页面进行测试并验证是在指定目录生成新的日志文件
[root@Nginx ~]# systemctl restart nginx.service
[root@Nginx ~]# curl lee.timinglee.org/lee/
MISS!!
[root@Nginx ~]# cd /usr/local/nginx/logs/timinglee.org/
[root@Nginx timinglee.org]# cat lee.error
2026/02/09 19:19:49 [error] 2676#0: *1 "/usr/local/nginx/html/lee/index.html" is not found (2: No such file or directory), client: 192.168.131.100, server: lee.timinglee.org, request: "GET /lee/ HTTP/1.1", host: "lee.timinglee.org"

9 Nginx中建立下载服务器

在win11中使用浏览器访问需要修改本机下的Windows/System32/drivers/etc/hosts
添加如下解析:192.168.131.100    www.timinglee.org    lee.timinglee.org

[root@Nginx ~]# mkdir -p /usr/local/nginx/download
[root@Nginx ~]# cp /etc/passwd /usr/local/nginx/download/
[root@Nginx ~]# dd if=/dev/zero of=/usr/local/nginx/download/bigfile bs=1M count=100
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB,100 MiB)已复制,0.629711 s,167 MB/s
[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    error_page 404 405 503 502 /error;
    error_log logs/timinglee.org/lee.error error;
    location /lee {
        root /usr/local/nginx/html;
    }

    location /error {
        alias /usr/local/nginx/errorpage/errormessage;
    }

    location /download {
        root /usr/local/nginx;
    }
}

[root@Nginx ~]# nginx -s reload

1.启用列表功能

[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    error_page 404 405 503 502 /error;
    error_log logs/timinglee.org/lee.error error;
    location /lee {
        root /usr/local/nginx/html;
    }

    location /error {
        alias /usr/local/nginx/errorpage/errormessage;
    }

    location /download {
        root /usr/local/nginx;
        autoindex on;           #自动文件索引功能,默认为off
    }
}

[root@Nginx ~]# nginx -s reload

2.下载控速

[root@Nginx ~]# wget http://lee.timinglee.org/download/bigfile
--2026-02-10 15:46:11--  http://lee.timinglee.org/download/bigfile
正在解析主机 lee.timinglee.org (lee.timinglee.org)... 192.168.131.100
正在连接 lee.timinglee.org (lee.timinglee.org)|192.168.131.100|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:104857600 (100M) [application/octet-stream]
正在保存至: “bigfile”

bigfile               100%[======================>] 100.00M  97.3MB/s  用时 1.0s

2026-02-10 15:46:12 (97.3 MB/s) - 已保存 “bigfile” [104857600/104857600])

[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    error_page 404 405 503 502 /error;
    error_log logs/timinglee.org/lee.error error;
    location /lee {
        root /usr/local/nginx/html;
    }

    location /error {
        alias /usr/local/nginx/errorpage/errormessage;
    }

    location /download {
        root /usr/local/nginx;
        autoindex on;
        limit_rate 1024k;        #限速,默认不限速
    }
}

[root@Nginx ~]# nginx -s reload
[root@Nginx ~]# wget http://lee.timinglee.org/download/bigfile
--2026-02-10 15:49:18--  http://lee.timinglee.org/download/bigfile
正在解析主机 lee.timinglee.org (lee.timinglee.org)... 192.168.131.100
正在连接 lee.timinglee.org (lee.timinglee.org)|192.168.131.100|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:104857600 (100M) [application/octet-stream]
正在保存至: “bigfile”

bigfile                13%[=>                     ]  13.00M  1.00MB/s  剩余 87s   

3.显示文件大小优化


[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    error_page 404 405 503 502 /error;
    error_log logs/timinglee.org/lee.error error;
    location /lee {
        root /usr/local/nginx/html;
    }

    location /error {
        alias /usr/local/nginx/errorpage/errormessage;
    }

    location /download {
        root /usr/local/nginx;
        autoindex on;
        limit_rate 1024k;        
        autoindex_exact_size off;    #计算文件确切大小(单位bytes),off 显示大概大小(单位
K、M),默认on

    }
}

[root@Nginx ~]# nginx -s reload
[root@Nginx ~]# curl lee.timinglee.org/download/
<html>
<head><title>Index of /download/</title></head>
<body>
<h1>Index of /download/</h1><hr><pre><a href="../">../</a>
<a href="bigfile">bigfile</a>                                            10-Feb-2026 07:35    100M
<a href="passwd">passwd</a>                                             10-Feb-2026 07:34    1347
</pre><hr></body>
</html>

4.时间显示调整

[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    error_page 404 405 503 502 /error;
    error_log logs/timinglee.org/lee.error error;
    location /lee {
        root /usr/local/nginx/html;
    }

    location /error {
        alias /usr/local/nginx/errorpage/errormessage;
    }

    location /download {
        root /usr/local/nginx;
        autoindex on;
        limit_rate 1024k;
        autoindex_exact_size off;
        autoindex_localtime on;        #显示本机时间而非GMT(格林威治)时间,默认off
    }
}

[root@Nginx ~]# nginx -s reload

5.设定页面风格

[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    error_page 404 405 503 502 /error;
    error_log logs/timinglee.org/lee.error error;
    location /lee {
        root /usr/local/nginx/html;
    }

    location /error {
        alias /usr/local/nginx/errorpage/errormessage;
    }

    location /download {
        root /usr/local/nginx;
        autoindex on;                  #自动文件索引功能,默认为off
        limit_rate 1024k;              #限速,默认不限速
        autoindex_exact_size off;  #计算文件确切大小(单位bytes),显示大概大小(单位K、M),默认on
        autoindex_localtime on;        #显示本机时间而非GMT(格林威治)时间,默认off
        autoindex_format jsonp;        #显示索引的页面文件风格(html,xml,json,jsonp),默认html
    }
}

[root@Nginx ~]# nginx -s reload

10 Nginx的文件检测

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

[root@Nginx ~]# echo index.html is not exist > /usr/local/nginx/errorpage/default.html
[root@Nginx ~]# cat /usr/local/nginx/errorpage/default.html
index.html is not exist
[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    error_page 404 405 503 502 /error;
    error_log logs/timinglee.org/lee.error error;
    root /usr/local/nginx/errorpage;
    try_files $uri $uri.html $uri/index.html /default.html;
}

[root@Nginx ~]# nginx -s reload

Nginx高级配置

1 Nginx的状态页

  • 基于nginx 模块 ngx_http_stub_status_module 实现,
  • 在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module
  • 否则配置完成之后监测会是提示法错误
  • 注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态
[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;

    location /nginx_status{
        stub_status;
        auth_basic "auth login";
        auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
        allow 192.168.131.0/24;
        deny all;
    }
}

[root@Nginx ~]# nginx -s reload

Active connections: # 当前处于活动状态的客户端连接数
                                # 包括连接等待空闲连接数 =reading+writing+waiting
accepts:                 # 统计总值, Nginx 自启动后已经接受的客户端请求连接的总数。
handled:                   # 统计总值, Nginx 自启动后已经处理完成的客户端请求连接总数
                                # 通常等于 accepts ,除非有因 worker_connections限制等被拒绝的连接
requests:                  # 统计总值, Nginx 自启动后客户端发来的总的请求数
Reading:                  # 当前状态,正在读取客户端请求报文首部的连接的连接数
                                # 数值越大 , 说明排队现象严重 , 性能不足
Writing: # 当前状态,正在向客户端发送响应报文过程中的连接数 , 数值越大,明访问量很大
Waiting: #当前状态,正在等待客户端发出请求的空闲连接开启 keep-alive 的情况下,这个值等于active-(reading+writing)

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;
[root@Nginx ~]# mkdir  /usr/local/nginx/timinglee.org/lee/html -p
[root@Nginx ~]# echo  hello lee > /usr/local/nginx/timinglee.org/lee/html/index.html
                                                               #小于1k的文件测试是否会压缩
[root@Nginx html]# cp /usr/local/nginx/logs/access.log /usr/local/nginx/timinglee.org/lee/html/bigfile.txt

[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
    gzip  on;
    gzip_comp_level 4;
    gzip_disable "MSIE [1-6]\.";
    gzip_min_length 1024k;
    gzip_buffers 32 1024k
    gzip_types text/plain application/javascript application/x-javascript text/css  application/xml text/javascript application/x-httpd-php image/gif image/png;
    gzip_vary on;
    gzip_static on;

[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    root /usr/local/nginx/timinglee.org/lee/html;
    location /nginx_status{
        stub_status;
        auth_basic "auth login";
        auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
        allow 192.168.131.0/24;
        deny all;
    }
}

[root@Nginx ~]# nginx -s reload

测试

3 Nginx的版本隐藏

用户在访问nginx的时候,我们可以从报文中获得nginx的版本,相对于裸漏版本号的nginx,我们把其隐藏起来更安全
[root@Nginx nginx-1.26.1]# vim src/core/nginx.h

#define nginx_version      1026001
#define NGINX_VERSION      "1.0"
#define NGINX_VER          "HAHA/" NGINX_VERSION

4 Nginx变量使用

  • nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用
  • 变量可以分为内置变量和自定义变量
  • 内置变量是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值。

1.内置变量

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

升级Nginx支持echo

[root@Nginx ~]# systemctl stop nginx.service
[root@Nginx ~]# ps aux | grep nginx
root        2174  0.0  0.0   6636  2176 pts/0    S+   15:08   0:00 grep --color=auto nginx

[root@Nginx ~]# tar zxf echo-nginx-module-0.64.tar.gz
[root@Nginx ~]# cd nginx-1.28.2/

[root@Nginx nginx-1.28.2]# make clean

[root@Nginx nginx-1.28.2]# ./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  --add-module=/root/echo-nginx-module-0.64

[root@Nginx nginx-1.28.2]# make
[root@Nginx nginx-1.28.2]# rm -rf /usr/local/nginx/sbin/nginx
[root@Nginx nginx-1.28.2]# cp objs/nginx /usr/local/nginx/sbin/ -p

[root@Nginx nginx-1.28.2]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    root /usr/local/nginx/timinglee.org/lee/html;
    location /vars {
        default_type text/html;
        echo $remote_addr;
    }
}

[root@Nginx nginx-1.28.2]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@Nginx nginx-1.28.2]# systemctl start nginx.service

理解内建变量

[root@Nginx nginx-1.28.2]# vim /usr/local/nginx/conf/conf.d/vhosts.conf    
    listen 80;
    server_name lee.timinglee.org;
    root /usr/local/nginx/timinglee.org/lee/html;
    location /vars {
        default_type text/html;
        echo $remote_addr;

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

        echo $args;

#变量中存放了URL中的所有参数
#例如:https://search.jd.com/Search?keyword=手机&enc=utf-8
#返回结果为: keyword=手机&enc=utf-8


        echo $is_args;

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


        echo $document_root;

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


        echo $document_uri;

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

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

#返回结果为:/var

        echo $host;

#存放了请求的host名称

        echo $remote_port;

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

        echo $remote_user;

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

        echo $request_method;

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

        echo $request_filename;

#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,
#如:webdata/nginx/timinglee.org/lee/var/index.html

        echo $request_uri;

#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,
#例如:/main/index.do?id=20190221&partner=search 

        echo $scheme;

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

        echo $server_protocol;

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

        echo $server_addr;

#保存了服务器的IP地址

        echo $server_name;

#虚拟主机的主机名

        echo $server_port;

#虚拟主机的端口号
 

        echo $http_user_agent;

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

        echo $cookie;

#客户端的所有cookie信息
 

        echo $cookie_<name>
#name为任意请求报文首部字部cookie的key名

        echo $http_<name>
#name为任意请求报文首部字段,表示记录请求报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线

示例:echo $http_user_agent;     echo $http_host;

        echo $sent_http_<name>
#name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有问题

        echo $sent_http_server;
$arg_<name>
#此变量存放了URL中的指定参数,name为请求url中指定的参数

echo $arg_id;

测试

[root@Nginx nginx-1.28.2]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
        echo $remote_addr;
        echo $args;
        echo $is_args;
        echo $document_root;
        echo $document_uri;
        echo $host;
        echo $remote_port;
        echo $remote_user;
        echo $request_method;
        echo $request_filename;
        echo $request_uri;
        echo $scheme;
        echo $server_protocol;
        echo $server_addr;
        echo $server_name;
        echo $server_port;
        echo $http_user_agent;
        echo $cookie_key2;
        echo $http_user_agent;
        echo $sent_http_content_type;
    }
}

2.自定义变量

假如需要自定义变量名称和值,使用指令set $variable value;
语法格式:
Syntax: set $variable value;
Default: —
Context: server, location, if

[root@Nginx nginx-1.28.2]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    root /usr/local/nginx/timinglee.org/lee/html;
    location /vars {
        default_type text/html;
        set $test lee;                #手动设定变量值
        echo $test;
        set $web_port $server_port;   #变量传递
        echo $web_port;
    }
}

测试

Nginx Rewrite 相关功能

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

1 ngx_http_rewrite_module模块指令

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

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

[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    root /usr/local/nginx/timinglee.org/lee/html;
    location / {
        if ( $http_user_agent ~* firefox ) {
            return 200 "test if messages";
        }
    }
}


[root@Nginx ~]# nginx -s reload
[root@Nginx ~]# curl  lee.timinglee.org
lee page
[root@Nginx ~]# curl  -A "firefox" lee.timinglee.org
test if messages

2.set指令

  • 指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key
  • 另外set定义格式为set $key value,value可以是text, variables和两者的组合
[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    root /usr/local/nginx/timinglee.org/lee/html;
    location / {
        set $testname timinglee;
        echo $testname;
    }
}

[root@Nginx ~]# nginx -s reload
[root@Nginx ~]# curl lee.timinglee.org
timinglee

3.break指令

  • 用于中断当前相同作用域(location)中的其它Nginx配置
  • 与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效
  • 位于后面的ngx_http_rewrite_module 模块中指令就不再执行
  • Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置
  • 该指令可以在server块和locationif块中使用

注意:如果break指令在location块中后续指令还会继续执行,只是不执行ngx_http_rewrite_module 模块的指令,其它指令还会执行

[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    root /usr/local/nginx/timinglee.org/lee/html;
    location / {
        set $test1 lee1;
        set $test2 lee2;
        if ($http_user_agent = firefox){
            break;
        }
        set $test3 lee3;
        echo $test1 $test2 $test3;
    }
}

[root@Nginx ~]# nginx -s reload
[root@Nginx ~]# curl lee.timinglee.org
lee1 lee2 lee3
[root@Nginx ~]# curl -A "firefox" lee.timinglee.org
lee1 lee2

4.return指令

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

语法格式:

return code;         #返回给客户端指定的HTTP状态码

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

[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/vhosts.conf
server {
    listen 80;
    server_name lee.timinglee.org;
    root /usr/local/nginx/timinglee.org/lee/html;
    location / {
        return 200 "hello world";
    }
}


[root@Nginx ~]# nginx -s reload
[root@Nginx ~]# curl lee.timinglee.org
hello world

2 rewrite 指令

待完善

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐