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
2 定制应用页面
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
目录下指定的目录都可以直接拼接到域名后面
分析:https=http+tls tls通过CA来实践 1 ca机构或自建ca 2 服务器证书定制 -域名必须在证书里面限定好 3.nginx使用服务器证书
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
7 定制nginx的ssl配置
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
8 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
实践与验证
未完待续 。。。。 字太多有点儿卡 我又重新再写下一部分了