当前位置: 首页 > news >正文

企业高性能web服务器

一、Nginx的概述

1、介绍

        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/

2、功能

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

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

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

        imap4/pop3协议的反向代理

Web 服务相关的功能

        虚拟主机(server)

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

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

        url rewirte

        路径别名

        基于IP及用户的访问控制

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

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

3、nginx进程结构

web请求处理机制

        多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求

        多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客 户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

主进程(master process)的功能:

        对外接口:接收外部的操作(信号)

        对内转发:根据外部的操作的不同,通过信号管理 Worker

        监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程

        读取Nginx 配置文件并验证其有效性和正确性

        建立、绑定和关闭socket连接

        按照配置生成、管理和结束工作进程 接受外界指令,比如重启、升级及退出服务器等指令

        不中断服务,实现平滑升级,重启服务并应用新的配置

        开启日志文件,获取文件描述符

        不中断服务,实现平滑升级,升级失败进行回滚处理

        编译和处理perl脚本

工作进程(worker process)的功能:

        所有 Worker 进程都是平等的

        实际处理:网络请求,由 Worker 进程处理

        Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争 CPU资源, 增加上下文切换的损耗

        接受处理客户的请求 将请求依次送入各个功能模块进行处理

        I/O调用,获取响应数据

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

        缓存数据,访问缓存索引,查询和调用缓存数据 发送请求结果,响应客户的请求

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

4、nginx的通信

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

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

二、Nginx的安装和升级

1、Nginx的安装

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

2、编译安装

#安装必要工具
[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y#解压
[root@Nginx nginx]# tar zxf nginx-1.24.0.tar.gz#创建用户
[root@Nginx nginx]# cd nginx-1.24.0/
[root@Nginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx
[root@Nginx nginx-1.24.0]# ls
auto     CHANGES.ru configure html     Makefile objs   src
CHANGES conf       contrib   LICENSE man       README
[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#编译及安装
[root@Nginx nginx-1.24.0]# make && make install

2、平滑升级和回滚案例

下载高版本nginx

#解压
[root@webserver mnt]# tar zxf nginx-1.26.1#开始编译新版本
[root@webserver mnt]# ./configure --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module#编译不安装
[root@webserver mnt]# make

查看版本

 #查看两个版本
[root@webserver nginx-1.26.1]# ll  objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root  174 Jul 23 15:44   objs/nginx
-rwxr-xr-x 1 root root  187 Jul 26 16:28  /usr/local/nginx/sbin/nginx

将之前的旧版的nginx命令备份

[root@webserver nginx-1.26.1]# cd /usr/local/nginx/sbin/
[root@webserver sbin]# cp nginx nginx.old

将新版本的nginx命令复制过去

[root@webserver sbin]# \cp  -f /root/nginx/nginx-1.26.1/objs/nginx 
/usr/local/nginx/sbin

检查

进行平滑升级

[root@webserver nginx-1.26.1]# ps aux | grep nginx
root        2086  0.0  0.0   9868  1012 ?        Ss   19:40   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       2087 23.0  2.5  54968 45876 ?        S    19:40   0:00 nginx: worker process
root        2088  0.0  0.0   9868  1012 ?        Ss   19:40   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       2089 23.0  2.5  54968 45876 ?        S    19:40   0:00 nginx: worker process
root        2092  0.0  0.1 221664  2232 pts/0    S+   19:40   0:00 grep --color=auto nginx#USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。[root@webserver sbin]# kill -USR2 2086         #nginx worker ID

回收旧版本

[root@webserver sbin]# kill -WINCH 2086
[root@webserver nginx-1.26.1]# ps aux | grep nginx
root        2086  0.0  0.0   9868  1012 ?        Ss   19:40   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root        2088  0.0  0.0   9868  1012 ?        Ss   19:40   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       2089 23.0  2.5  54968 45876 ?        S    19:40   0:00 nginx: worker process
root        2092  0.0  0.1 221664  2232 pts/0    S+   19:40   0:00 grep --color=auto nginx

查看版本

回滚:重新拉起旧版本的worker

[root@webserver nginx-1.26.1]# cp nginx nginx.26
[root@webserver nginx-1.26.1]# ls
nginx  nginx.old  nginx.new
[root@webserver nginx-1.26.1]# mv nginx.old nginx
mv: overwrite 'nginx'? y[root@webserver nginx-1.26.1]# ps aux | grep nginx
root        2086  0.0  0.0   9868  1012 ?        Ss   19:40   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root        2088  0.0  0.0   9868  1012 ?        Ss   19:40   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx       2089 23.0  2.5  54968 45876 ?        S    19:40   0:00 nginx: worker process
root        2092  0.0  0.1 221664  2232 pts/0    S+   19:40   0:00 grep --color=auto nginx[root@Nginx sbin]# kill -HUP 2086

三、全局配置

主配置文件

[root@webserver conf]# vim nginx.conf
user  nginx;                                 #启动Nginx工作进程的用户和组
worker_processes  4;                         #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 0001 0010 0100 1000;     #第0号---第3号CPU
worker_rlimit_nofile 100000;error_log  logs/error.log;                   #错误日志
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;                  #pid文件保存路径events {                                     #设置单个工作进程的最大并发连接数worker_connections  100000;              use epoll;                               #使用epoll事件驱动,#Nginx支持众多的事件驱动,#比如:select、poll、epoll,只能设置在events模块中accept_mutex on;                   #on为同一时刻一个请求轮流由work进程处理,#而防止被同时唤醒所有worker#避免多个睡眠进程被唤醒的设置,默认为off#新请求会唤醒所有worker进程,此过程也称为"惊群"#因此nginx刚安装完以后要进行适当的优化。建议设置为onmulti_accept on;                    #on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接#此指令默认为off,#即默认为一个工作进程只能一次接受一个新的网络连接#打开后几个同接受多个。建议设置为on
}

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

[root@webserver ~]# ulimit -n 10000
[root@webserver ~]# ab -c 5000 -n 10000 http://10.0.0.8/

默认配置不支持高并发,会出现以下错误日志

[root@webserver ~]# tail /usr/local/nginx/logs/error.log
2020/09/24 21:19:33 [crit] 41006#0: *1105860 open() "/apps/nginx/html/50x.html" 
failed (24: Too many open files), client: 10.0.0.7, server: localhost, request: 
"GET / HTTP/1.0", host: "10.0.0.8"
2020/09/24 21:19:33 [crit] 41006#0: accept4() failed (24: Too many open files)
2020/09/24 21:19:33 [crit] 41006#0: *1114177 open() 
"/apps/nginx/html/index.html" failed (24: Too many open files), client: 10.0.0.7, 
server: localhost, request: "GET / HTTP/1.0", host: "10.0.0.8"

修改配置文件

[root@webserver ~]# vim /etc/security/limits.conf 
*                -       nofile          100000
*                -       nproc           100000
[root@webserver ~]# vim /apps/nginx/conf/nginx.conf
events {worker_connections  100000;use epoll;                              
}
[root@webserver ~]# systemctl restart nginx

测试:

识别PHP文件为test/html

#创建一个PHP文件
[root@Nginx ~]# vim /usr/local/nginx/html/index.php
<?phpphpinfo();
?>

访问:

改变默认发布格式 

[root@webserver nginx]# vim conf/nginx.confhttp {include       mime.types;default_type  text/html;#default_type  application/octet-stream;[root@webserver nginx]# nginx -s reload

 再次访问,会发现发布格式改变

建设基于域名的虚拟站点

创建nginx子配置文件,并将子配置文件的目录放入nginx主配置文件中

[root@webserver nginx]# mkdir conf.d
[root@webserver nginx]# vim conf/nginx.confnclude "/usr/local/nginx/conf.d/*.conf";        #在server下添加

配置子配置文件

[root@webserver nginx]# vim conf.d/vhosts.conf
server {listen  80;server_name    www.zcx.org;root    /web/html;index   index.html;
}

 添加本机域名解析

[root@webserver nginx]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.10   webserver.zcx.org www.zcx.org

访问:

root和alias

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

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

[root@webserver nginx]# vim conf.d/vhosts.conf
server {listen  80;server_name    www.zcx.org;root    /web/html;index   index.html;location /test {alias /mnt/test.html;}location /test1 {root /mnt;}
}[root@webserver nginx]# nginx -s reload

location 的详细使用

        在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配,而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri。uri是用户请求的字符串,即域名后面的web文件路径 然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。

语法规则:

location [ = | ~ | ~* | ^~ ] uri { ... }=                   #用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~                   #用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头#对uri的最左边部分做匹配检查,不区分字符大小写
~                    #用于标准uri前,表示包含正则表达式,并且区分大小写
~*                   #用于标准uri前,表示包含正则表达式,并且不区分大写
不带符号              #匹配起始于此uri的所有的uri
\                    #用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号#匹配优先级从高到低:
=, ^~, ~/~*, 不带符号

Nginx 账户认证功能

#非交互建立用户认证
[root@webserver ~]# htpasswd -cm /usr/local/nginx/conf/.htpasswd admin
New password:
Re-type new password:
Adding password for user admin
[root@webserver ~]# htpasswd -m /usr/local/nginx/conf/.htpasswd zcx
New password:
Re-type new password:
Adding password for user zcx

 查看

配置nginx配置文件

 [root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.confserver {listen 80;server_name www.zcx.org;index index.html;location /login {root /webdata/nginx/zcx.org/zcx;auth_basic  "login password";auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";}
}

此时访问login文件就会显示访问失败:

使用用户登录就能访问login的内容:

 

定义错误页面 :

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

在没有自定义错误页面时,访问页面发生错误:

进行自定义页面:

[root@webserver ~]# mkdir /web/errorpage -p
[root@webserver ~]# echo Sorry server > /web/errorpage/index.html
[root@webserver ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen  80;server_name www.zcx.org;root    /web/html;index   index.html;error_page 500 502 503 504 404 /errorpage/error.html;location /errorpage {root /web/;}
}
[root@webserver ~]# nginx -s reload

再次访问错误页面时:

自定义错误日志:

[root@webserver ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen  80;server_name www.zcx.org;root    /web/html;index   index.html;error_page 500 502 503 504 404 /errorpage/error.html;error_log /usr/local/nginx/logs/error.log;access_log /usr/local/nginx/logs/access.log;location /errorpage {root /web/;}
}
[root@webserver ~]# nginx -s reload

访问错误页面,生成错误日志 

检测文件是否存在

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

[root@webserver ~]# echo default > /web//errorpage/default.html
[root@webserver ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {listen  80;server_name www.zcx.org;root    /web/html;index   index.html;error_page 500 502 503 504 404 /errorpage/error.html;error_log /usr/local/nginx/logs/error.log;access_log /usr/local/nginx/logs/access.log;try_files $uri $uri.html $uri/index.html /errorpage/default.html;  #检测文件是否存在location /errorpage {root /web/;}
}
[root@webserver ~]# nginx -s reload

当访问的文件没有时,返回/errorpage/default.html

长连接配置

#进入nginx的主配置文件,设定长连接时间 
[root@webserver conf]# vim nginx.confkeepalive_timeout  65;            #长连接时长为65s,到达65s后断开连接keepalive_requests 3;             #长连接次数,3次后断开连接#重启nginx
[root@webserver conf]# nginx -s reload

测试

作为下载服务器配置

创建一个大小为100M的文件,模拟web服务中需要下载的文件

[root@webserver ~]# mkdir /web/download/
[root@webserver ~]# dd if=/dev/zero of=/web/doenload/zcx bs=1M count=100

配置nginx子配置文件

[root@webserver ~]# vim /usr/local/nginx/conf.d/vhosts.confserver {listen  80;server_name www.zcx.org;root    /web/html;index   index.html;location /download {root /web/;autoindex on;                     #自动文件索引功能,默为offautoindex_localtime on;           #显示本机时间而非GMT(格林威治)时间,默认offautoindex_exact_size off;         #计算文件确切大小(单位bytes)autoindex_format html;            #显示索引的页面文件风格,默认htmlset $limit_rate 1024k;            #限制响应客户端传输速率}
}[root@webserver ~]# nginx -s reload

四、Nginx 高级配置

Nginx 状态页

基于nginx 模块 ngx_http_stub_status_module 实现,

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

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

配置:

[root@webserver ~]# vim /usr/local/nginx/conf.d/vhosts.confserver {listen  80;server_name www.zcx.org;root    /web/html;index   index.html;location /status {stub_status;auth_basic "status page";auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";   #设定用户登录才能访问}
}[root@webserver ~]# nginx -s reload#确保文件下有用户
[root@webserver ~]# cat /usr/local/nginx/conf/.htpasswd
admin:$apr1$EeBxeo.x$uMpjhGn7RJZQLcO8bOyqT0

测试:

        Active connections:当前处于活动状态的客户端连接数。包括连接等待空闲连接数=reading+writing+waiting

        accepts:统计总值,Nginx自启动后已经接受的客户端请求连接的总数。

        handled:统计总值,Nginx自启动后已经处理完成的客户端请求连接总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接

        requests:统计总值,Nginx自启动后客户端发来的总的请求数

        Writing:当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量大

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

Nginx压缩功能

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

打开nginx主配置文件进行修改

[root@webserver ~]# vim /usr/local/nginx/conf/nginx.conf#启用gzip压缩,默认关闭gzip  on;
#压缩比由低到高从1到9,默认为1,值越高压缩后文件越小,但是消耗cpu比较高。基本设定为4或者5gzip_comp_level 4;
#禁用IE6 gzip功能,早期的IE6之前的版本不支持压缩gzip_disable "MSIE [1-6]\.";
#gzip压缩的最小文件,小于设置值的文件将不会压缩gzip_min_length 4k;
#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开gzip_vary on;
#预压缩,即直接从磁盘找到对应文件的gz后缀的式的压缩文件返回给用户,无需消耗服务器CPU#注意: 来自于ngx_http_gzip_static_module模块gzip_static on;[root@webserver ~]# nginx -s reload

创建两个文件,一个大于gzip压缩的最小文件的大小,一个小于gzip压缩的最小文件的大小

测试:

五、Nginx Rewrite 相关功能

        Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求

        此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库

        rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能

        比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为访问

        另外还可以在一定程度上提高网站的安全性。

ngx_http_rewrite_module 模块指令

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

location /test {index index.html;default_type text/html;if ( $http_user_agent = zcx ){echo "zcx";}if ( $http_user_agent = Qianzhihe ){echo "Qianzhihe";}
}=            #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!=           #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~            #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~           #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~*           #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~*          #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真  
-f 和 !-f    #判断请求的文件是否存在和是否不存在
-d 和 !-d    #判断请求的目录是否存在和是否不存在
-x 和 !-x    #判断文件是否可执行和是否不可执行
-e 和 !-e    #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)

注意: 如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。 nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false 。

set指令

        指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key 另外set定义格式为set $key value,value可以是text, variables和两者的组合。

break 指令:

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

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

return 指令:

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

rewrite 指令

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

#语法格式
rewrite regex replacement [flag];

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

        注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成 后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的 标志位用于控制此循环机制 如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301

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

        域名的临时的调整,后期可能会变,之前的域名或者URL可能还用、或者跳转的目的域名和URL还会跳 转,这种情况浏览器不会缓存跳转,临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存。

server {listen  80;server_name www.zcx.org;root    /web/html;
#    root    /data/php;index   index.html;error_page 500 502 503 504 404 /errorpage/error.html;error_log /usr/local/nginx/logs/zcx.org.err;access_log /usr/local/nginx/logs/zcx.org.access;location /test {#rewrite ^/test http://www.zcx.org permanent;       #永久重定向rewrite ^/test http://www.zcx.org redirect;         #临时重定向}
}

测试:

rewrite 案例: break 与 last:

布置web

[root@webserver]# mkdir  /data/web/html/{test1,test2,break,last}
[root@webserver]# echo test1 > /data/web/html/test1/index.html
[root@webserver]# echo test2 > /data/web/html/test2/index.html
[root@webserver]# echo last > /data/web/html/last/index.html
[root@webserver]# echo break > /data/web/html/break/index.html

主配置文件修改:

server {listen  80;server_name www.zcx.org;root    /web/html;
#    root    /data/php;index   index.html;#break的重定向location /break/ {rewrite ^/break/(.*) /test1/$1 break;    #读到break时将在此结束,后面所以步骤都停止rewrite ^/test1/(.*) /zcx/$1;            }#last的重定向location /last/ {rewrite ^/last/(.*) /test1/$1 last;      #将跳过语句块中last后面的操作,直接执行下一个语句块rewrite ^/test1/(.*) /zcx/$1;}location /test1/ {return 200 "test1 zcx";}location /test2/ {return 200 "test2 hhhhhh";}location /zcx/ {return 200 "zcx zzzzzzzz";}
}

未做重定向时:

重定向后:

Nginx 防盗链

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

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

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

<html><head><meta http-equiv=Content-Type content="text/html;charset=utf-8"><title>盗链</title></head><body><img src="http://www.zcx.org/images/guidao.png" ><h1 style="color:red">欢迎大家</h1><p><a href=http://www.zcx.org>狂点老李</a>出门见喜</p></body></html>

此时访问web站点盗链时:

配置10主机的防盗链:

server {listen  80;server_name www.zcx.org;root    /web/html;
#    root    /data/php;index   index.html;location / {valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;if ($invalid_referer){return 404;}}}

再次访问盗链时:

http://www.dtcms.com/a/316881.html

相关文章:

  • 【docker】UnionFS联合操作系统
  • 2025年渗透测试面试题总结-02(题目+回答)
  • 一种红外遥控RGB灯带控制器-最低价MCU
  • Redis类型之String
  • linux-单用户模式、营救模式
  • 高阶 RAG :技术体系串联与实际落地指南​
  • RHCA03--硬件监控及内核模块调优
  • 【Spring Cloud】-- RestTeplate实现远程调用
  • Java开发时出现的问题---并发与资源管理深层问题
  • 嵌入式开发学习———Linux环境下IO进程线程学习(四)
  • 《嵌入式数据结构笔记(三):数据结构基础与双向链表》
  • 应急响应排查思路
  • MLIR Bufferization
  • JWT 签名验证失败:Java 与 PHP 互操作问题解决方案
  • OpenHarmony 5.0 Settings中wifi删除密码立刻去输入密码连接,连接不上
  • 性能测试终极指南:从指标到实战
  • 自动驾驶中的传感器技术24——Camera(15)
  • Mybatis的应用及部分特性
  • 机器学习——集成学习(Ensemble Learning):随机森林(Random Forest),AdaBoost、Gradient Boosting,Stacking
  • 企业级Redis Cluster部署详解及演练
  • 森赛睿科技成为机器视觉产业联盟会员单位
  • 解决cv::dilate处理后的图像边缘像素出现异常值的问题
  • 结构化设计工具与技术详解
  • Spring 的优势
  • 内部排序算法总结(考研向)
  • 从递归到动态规划-解码方法Ⅱ
  • 软件测试面试如何避坑呢?
  • 8.5 各种攻击实验
  • 使用 BAML 模糊解析改进 LangChain 知识图谱提取:成功率从25%提升到99%
  • 无人机陀螺仪模块技术解析