nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。
nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。
第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
nginx是一个很牛的高性能Web和反向代理服务器,它具有很多非常优越的特性:
nginx由内核和模块组成。其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
nginx的模块从结构上分为核心模块、基础模块和第三方模块
用户根据自己的需要开发的模块都属于第三方模块。正是有了如此多模块的支撑,nginx的功能才会如此强大
nginx模块从功能上分为三类,分别是:
nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模块、第三方模块和补丁等
nginx基本模块:所谓基本模块,指的是nginx默认的功能模块,它们提供的指令,允许你使用定义nginx基本功能的变量,在编译时不能被禁用,包括:
具体的指令,请参考nginx的官方文档
nginx的模块直接被编译进nginx,因此属于静态编译方式。
启动nginx后,nginx的模块被自动加载,与Apache不一样,首先将模块编译为一个so文件,然后在配置文件中指定是否进行加载。
在解析配置文件时,nginx的每个模块都有可能去处理某个请求,但是同一个处理请求只能由一个模块来完成。
nginx的进程架构:
启动nginx时,会启动一个Master进程,这个进程不处理任何客户端的请求,主要用来产生worker线程,一个worker线程用来处理n个request。
安装主机:
主机名 | IP | 系统 | 任务 |
---|---|---|---|
localhost | 192.168.91.135 | centos8 | nginx |
//创建系统用户nginx
[root@localhost ~]# useradd -r -M -s /sbin/nologin nginx
//安装依赖包、包组和使用工具
[root@localhost ~]# yum -y install pcre-devel pcre gcc gcc-c++ openssl-devel zlib zlib-devel make vim wget openssl openssl-devel gd-devel
安装过程略....
[root@localhost ~]# yum -y groups mark install 'Development Tools'
Marked install: Development Tools
//创建日志存放目录
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx
//下载nginx
[root@localhost ~]# cd /usr/src/
[root@localhost src]# wget https://nginx.org/download/nginx-1.20.1.tar.gz
安装过程略....
//编译安装
[root@localhost src]# ls
debug kernels nginx-1.20.1.tar.gz
[root@localhost src]# tar xf nginx-1.20.1.tar.gz
[root@localhost src]# cd nginx-1.20.1
[root@localhost nginx-1.20.1]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log
[root@localhost nginx-1.20.1]# make && make install
安装过程略....
[root@localhost nginx-1.20.1]# cd
[root@localhost ~]#
// 配置环境变量
[root@localhost ~]# echo "export PATH=/usr/local/nginx/sbin:$PATH" > /etc/profile.d/nginx.sh
[root@localhost ~]# source /etc/profile.d/nginx.sh
// 编写nginx启动文件
[root@localhost ~]# cat > /usr/lib/systemd/system/nginx.service <
[Unit]
Description=Nginx server daemon
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecStop=/usr/local/nginx/sbin/nginx -s quit
ExecReload=/bin/kill -HUP \$MAINPID
[Install]
WantedBy=multi-user.target
EOF
// 效果验证
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable --now nginx.service
[root@localhost ~]# systemctl status nginx.service
● nginx.service - Nginx server daemon
Loaded: loaded (/usr/lib/systemd/system/nginx.service; e>
Active: active (running) since Mon 2021-10-25 14:28:08 C>
Process: 1071 ExecStart=/usr/local/nginx/sbin/nginx (code>
Main PID: 1085 (nginx)
Tasks: 2 (limit: 23485)
Memory: 7.7M
CGroup: /system.slice/nginx.service
├─1085 nginx: master process /usr/local/nginx/sb>
└─1086 nginx: worker process
Oct 25 14:28:08 centos2 systemd[1]: Starting Nginx server d>
Oct 25 14:28:08 centos2 systemd[1]: Started Nginx server da>
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
web页面查看
// 关闭防火墙和selinux
```shell
[root@localhost ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0
[root@localhost ~]# vim /etc/selinux/config
SELINUX=disabled
-t //检查配置文件语法
-v //输出nginx的版本
-c //指定配置文件的路径
-s //发送服务控制信号,可选值有{stop|quit|reopen|reload}
如:修改nginxd默认80端口为8080
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# vim nginx.conf
#gzip on;
server {
listen 8080;
server_name localhost;
#charset koi8-r;
// 检查语法
[root@localhost conf]# 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@localhost conf]# nginx -s stop;nginx
[root@localhost conf]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
主配置文件:/usr/local/nginx/conf/nginx.conf
nginx常见的配置文件及其作用
配置文件 | 作用 |
---|---|
nginx.conf | nginx的基本配置文件 |
mime.types | MIME类型关联的扩展文件 |
fastcgi.conf | 与fastcgi相关的配置 |
proxy.conf | 与proxy相关的配置 |
sites.conf | 配置nginx提供的网站,包括虚拟主机 |
nginx.conf的内容分为以下几段:
配置指令:要以分号结尾,语法格式如下:
derective value1 [value2 ...];
支持使用变量:
daemon {on|off}; //是否以守护进程方式运行nginx,调试时应设置为off
master_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off
error_log 位置 级别; //配置错误日志
error_log里的位置和级别能有以下可选项:
位置 | 含义 |
---|---|
file | 记录到某个文件中 |
stdree | 记录到标准错误中(不推荐) |
syslog:server=address[,parameter=value] | 记录到某台日志服务器中 |
memory:size | 记录到内存中(不推荐) |
日志级别 | 含义 |
---|---|
debug | 若要使用debug级别,需要在编译nginx时使用–with-debug选项 |
info | 一般信息 |
notice | 不影响正常功能,需要注意的消息 |
warn | 可能影响系统功能,需要提醒用户的重要事件 |
error | 错误信息(常用的) |
crit | 紧急,比较严重的 |
alert | 必须马上处理的 |
emerg | 会导致系统不可用的 |
user USERNAME [GROUPNAME]; //指定运行worker进程的用户和组
pid /path/to/pid_file; //指定nginx守护进程的pid文件
worker_rlimit_nofile number; //设置所有worker进程最大可以打开的文件数,默认为1024
worker_rlimit_core size; //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可
worker_processes n; //启动n个worker进程,这里的n为了避免上下文切换,通常设置为cpu总核心数-1或等于总核心数
worker_cpu_affinity cpumask ...; //将进程绑定到某cpu中,避免频繁刷新缓存
//cpumask:使用8位二进制表示cpu核心,如:
0000 0001 //第一颗cpu核心
0000 0010 //第二颗cpu核心
0000 0100 //第三颗cpu核心
0000 1000 //第四颗cpu核心
0001 0000 //第五颗cpu核心
0010 0000 //第六颗cpu核心
0100 0000 //第七颗cpu核心
1000 0000 //第八颗cpu核心
timer_resolution interval; //计时器解析度。降低此值,可减少gettimeofday()系统调用的次数
worker_priority number; //指明worker进程的nice值
accept_mutex {off|on}; // master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求
// 用法
Syntax: accept_mutex on | off;
Default: accept_mutex off;
Context: events
lock_file file; // accept_mutex用到的互斥锁锁文件路径
// 用法
Syntax: lock_file file;
Default: lock_file logs/nginx.lock;
Context: main
use [epoll | rtsig | select | poll]; // 指明使用的事件模型,建议让nginx自行选择
//用法
Syntax: use method;
Default: —
Context: events
worker_connections #; // 每个进程能够接受的最大连接数
// 用法
Syntax: worker_connections number;
Default: worker_connections 512;
Context: events
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 3 ;
worker_cpu_affinity 0001 0010 0100;
worker_priority -20;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 20480; // 最大连接数乘以进程数量除以2就是最大访问并发量3000
}
[root@localhost ~]# ab -n 30000 http://192.168.91.135/index.html
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.91.135 (be patient)
Completed 3000 requests
Completed 6000 requests
Completed 9000 requests
Completed 12000 requests
Completed 15000 requests
Completed 18000 requests
Completed 21000 requests
Completed 24000 requests
Completed 27000 requests
Completed 30000 requests
Finished 30000 requests // 同时处理30000个并发请求
keepalive_timeout number; //长连接的超时时长,默认为65s
keepalive_requests number; //在一个长连接上所能够允许请求的最大资源数
keepalive_disable [msie6|safari|none]; //为指定类型的UserAgent禁用长连接
tcp_nodelay on|off; //是否对长连接使用TCP_NODELAY选项,为了提升用户体验,通常设为on
client_header_timeout number; //读取http请求报文首部的超时时长
client_body_timeout number; //读取http请求报文body部分的超时时长
send_timeout number; //发送响应报文的超时时长
更改默认端口号以及进程数和指定特定配置文件
源(/usr/local/nginx/conf/)nginx.conf文件内容
[root@localhost conf]# head nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
// 使用80端口
server {
listen 80;
server_name localhost;
// 使用源文件运行进程数如下
[root@localhost conf]# ps -ef | grep nginx
root 257815 1 0 16:46 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 257816 257815 0 16:46 ? 00:00:00 nginx: worker process
root 258199 102060 0 16:46 pts/0 00:00:00 grep --color=auto nginx
// 将源文件以及mime.types文件copy一份到/opt目录中
[root@localhost conf]# cp nginx.conf /opt/
[root@localhost conf]# cp mime.types /opt/
[root@localhost conf]# cd /opt/
[root@localhost opt]# ls
mime.types nginx.conf
[root@localhost opt]# nginx -t -c /opt/nginx.conf
nginx: the configuration file /opt/nginx.conf syntax is ok
nginx: configuration file /opt/nginx.conf test is successful
// 修改 worker_rlimit_nofile number; 参数为4
#user nobody;
worker_processes 4;
server {
listen 8070;
server_name localhost;
使用nginx服务控制命令重启并指定配置文件路径
[root@localhost opt]# nginx -s stop;nginx -c /opt/nginx.conf
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:8070 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@localhost ~]# ps -ef | grep nginx
root 276931 1 0 16:56 ? 00:00:00 nginx: master process nginx -c /opt/nginx.conf
nginx 276932 276931 0 16:56 ? 00:00:00 nginx: worker process
nginx 276933 276931 0 16:56 ? 00:00:00 nginx: worker process
nginx 276934 276931 0 16:56 ? 00:00:00 nginx: worker process
nginx 276935 276931 0 16:56 ? 00:00:00 nginx: worker process
root 283466 276242 0 16:58 pts/2 00:00:00 grep --color=auto nginx
web页面访问
访问控制
注:用于location段,可以用主机地址表示,也可用网段表示,必须一起用
allow:设定允许那台或那些主机访问,多个参数间用空格隔开
deny:设定禁止那台或那些主机访问,多个参数间用空格隔开
环境说明:
主机名 | ip | 职责 |
---|---|---|
localhost | 192.168.91.135 | nginx |
localhost2 | 192.168.91.137 | client |
举个例子:
在localhost主机上修改nginx配置文件,将192.168.91.0网段静止访问
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.html index.htm;
allow 192.168.91.135/32;
deny 192.168.91.137/32;
}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:8070 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
在地址为192.168.91.137中访问
[root@localhost2 ~]# curl 192.168.91.135:8070
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
在地址为192.168.91.135中访问
[root@localhost ~]# curl 192.168.91.137:8070
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
把deny字段改为all,表示在拒绝所有主机访问
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.php index.html index.htm;
allow 192.168.91.135/32;
deny all;
}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:8070 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
auth_basic "欢迎信息";
auth_basic_user_file "/path/to/user_auth_file";
user_auth_file内容格式为:
username:password
这里的密码为加密后的密码串,建议用htpasswd来创建此文件:
htpasswd -c -m /path/to/.user_auth_file USERNAME
例子:
// 安装httpd-tools
[root@localhost ~]# yum -y install httpd-tools
// 查看am用户是否存在
[root@localhost ~]# id amu
id: 'amu': no such user
// 生成用户认证文件
[root@localhost ~]# htpasswd -c -m /usr/local/nginx/conf/.user-auth-file amu
New password:
Re-type new password:
Adding password for user amu
[root@localhost ~]# cat /usr/local/nginx/conf/.user-auth-file
amu:$apr1$m2FTBexv$F5LhtidYsYlmjNunMRVYN0
// 创建测试文件
[root@localhost ~]# mkdir -p /usr/local/nginx/html/amu
[root@localhost ~]# echo "Hello amu !!!" > /usr/local/nginx/html/am/index.html
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /amu {
root html;
index index.html;
auth_basic "Hello,amu!";
auth_basic_user_file "/user/local/nginx/conf/.user-auth-file";
// 检查语法
[root@localhost ~]# 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@localhost ~]# nginx -s reload
[root@localhost ~]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*
调试守护进程
是否以守护进程方式运行Nginx
守护进程(daemon)是脱离终端并且在后台运行的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示,这样一来,进程也不会被任何终端所产生的信息所打断。Nginx毫无疑问是一个需要以守护进程方式运行的服务,因此,默认都是以这种方式运行的。
不过Nginx还是提供了关闭守护进程的模式,之所以提供这种模式,是为了方便跟踪调试Nginx,毕竟用gdb调试进程时最烦琐的就是如何继续跟进fork出的子进程了。
// daemon {on|off}; 是否以守护进程方式运行nginx,调试时应设置为off
[root@master ~]# vim /usr/local/cong/nginx.conf
#user nobody;
worker_processes 4;
daemon off; // 添加这一条
[root@master conf]# nginx -s stop;nginx
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:8070 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LNMP:php要启用fpm模型 LNMP部署
配置示例如下:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; //定义反向代理
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
http{}段的配置参数
http{…}段是配置http相关,由ngx_http_core_module模块引入。nginx的HTTP配置主要包括四个区块
http { //协议级别
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzip on;
upstream { //负载均衡配置
...
}
server { //服务器级别,每个server类似于httpd中的一个<VirtualHost>
listen 80;
server_name localhost;
location / { //请求级别,类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系
root html;
index index.html index.htm;
}
}
}
http{}段配置指令
server {}:定义一个虚拟主机
server {
listen 80;
server_name www.idfsoft.com;
root "/vhosts/web";
}
listen:指定监听的地址和端口
listen address[:port];
listen port;
server_name NAME […]; 后面可跟多个主机,名称可使用正则表达式或通配符
当有多个server时,匹配顺序如下:
root path; 设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径
alias path; 用于location配置段,定义路径别名
index file; 默认主页面
index index.php index.html;
error_page code […] [=code] URI | @name 根据http响应状态码来指明特用的错误页面,例如 error_page 404 /404_customed.html
[=code]:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码,例如 error_page 404 =200 /404_customed.html
log_format 定义日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
//注意:此处可用变量为nginx各模块内建变量
错误页面配置
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
error_page 404 /404.html; // 取消注释
[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# vim 404.html
[root@localhost html]# vim 404.html
[root@localhost html]# cat 404.html
<html>
<head>
<title>ERROR</title>
<body>
<h1>ACCESS ERROR</h1>
</body>
</head>
</html>
location区段
通过指定模式来与客户端请求的URI相匹配
功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能
语法:location [ 修饰符 ] pattern {......}
常用修饰符说明:
修饰符 | 功能 |
---|---|
= | 精准匹配 |
~ | 正则表达式模式匹配,区分大小写 |
~* | 正则表达式模式匹配,不区分大小写 |
^~ | 前缀匹配,类似于无修饰符的行为,也是以指定模块开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式 |
@ | 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_files或error_page等 |
没有修饰符
表示必须以指定模式开始
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 8080;
server_name localhost;
location /test {
echo "This is test!";
}
[root@localhost ~]# nginx -s reload
如下内容就可正确匹配
[root@localhost2 ~]# curl http://192.168.91.135:8080/test
This is test!
[root@localhost2 ~]# curl http://192.168.91.135:8080/test?abc123=a1b2
This is test!
[root@localhost2 ~]# curl http://192.168.91.135:8080/test/
This is test!
如下内容则无法匹配
[root@localhost2 ~]# curl http://192.168.91.135:8080/test/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@localhost2 ~]# curl http://192.168.91.135:8080/test/test
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
正则表达式模式匹配(区分大小写)
~:表示指定的正则表达式要区分大小写
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 8080;
server_name localhost;
location = ~ ^/test {
echo "This is test";
[root@master conf]# nginx -s reload
如下内容就可正确匹配
[root@localhost2 ~]# curl http://192.168.91.135:8080/test
This is test
[root@localhost2 ~]# curl http://192.168.91.135:8080/test?abc123=a1b2
This is test
如下内容则无法匹配
[root@localhost2 ~]# curl http://192.168.91.135:8080/test/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@localhost2 ~]# curl http://192.168.91.135:8080/TEST/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@localhost2 ~]# curl http://192.168.91.135:8080/testing
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
正则表达式模式匹配(不区分大小写)
~*:表示指定的正则表达式不区分大小写
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 8080;
server_name localhost;
location = ~* ^/test {
echo "This is test";
[root@localhost ~]# nginx -s reload
如下内容就可正确匹配
[root@localhost2 ~]# curl http://192.168.91.135:8080/test
This is test
[root@localhost2 ~]# curl http://192.168.91.135:8080/test?abc123=a1b2
This is test
[root@localhost2 ~]# curl http://192.168.91.135:8080/TEST
This is test
如下内容则无法匹配
[root@localhost2 ~]# curl http://192.168.91.135:8080/test/
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@localhost2 ~]# curl http://192.168.91.135:8080/testing
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
~:类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,则停止搜索其他模式
优先级次序
( location = 路径 ) --> ( location ^~ 路径 ) --> ( location ~ 正则 ) --> ( location ~* 正则 ) --> ( location 路径 )
查找顺序和优先级:由高到底依次为
1.带有=的精确匹配优先
2.正则表达式按照他们在配置文件中定义的顺序
3.带有^~修饰符的,开头匹配
4.带有~或~*修饰符的,如果正则表达式与URI匹配
5.没有修饰符的精确匹配
例子:
root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
······
server {
listen 8080;
server_name localhost;
location /test {
echo "1";
}
# "="优先级最高所以先注释掉
#location = /test {
# echo "2";
#}
location ~ ^/test$ {
echo "3";
}
location ~* ^/testi$ {
echo "4";
}
······
[root@localhost ~]# nginx -s reload
优先级测试
[root@localhost2 ~]# curl http://192.168.91.135:8080/testing
1
[root@localhost2 ~]# curl http://192.168.91.135:8080/test
3
[root@localhost2 ~]# curl http://192.168.91.135:8080/TEST
4
[root@localhost2 ~]# curl http://192.168.91.135:8080/test?abc123=a1b2
3
[root@localhost2 ~]# curl http://192.168.91.135:8080/test/test
1
https配置
// 创建证书存放目录
[root@localhost ~]# mkdir -p /etc/nginx/ssl
[root@localhost ~]# cd /etc/nginx/ssl/
// 生成密钥
[root@localhost ssl]# openssl genrsa -out test.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
....................................................+++++
..+++++
e is 65537 (0x010001)
// 生成证书
[root@localhost ssl]# openssl req -new -key test.key -out test.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HuBei
Locality Name (eg, city) [Default City]:WuHan
Organization Name (eg, company) [Default Company Ltd]:ssss
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:am.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost ssl]# ls
test.csr test.key
[root@localhost ssl]# openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt
Signature ok
subject=C = CN, ST = HuBei, L = WuHan, O = ssss, CN = am.com
Getting Private key
[root@localhost ssl]# ls
test.crt test.csr test.key
修改nginx配置文件
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
······
//取消注释并修改域名和证书位置
# HTTPS server
#
server {
listen 443 ssl;
server_name www.gf.com;
ssl_certificate /etc/nginx/ssl/test.crt;
ssl_certificate_key /etc/nginx/ssl/test.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
[root@localhost ~]# nginx -s reload
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:443 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
平滑升级的步骤
获取之前的编译参数
下载新模块
重新编译软件,加上–add-module=新模块的解压路径
备份原程序并停止服务
把原程序用新程序覆盖
启动新程序
github官网
环境说明:
主机名 | ip | 职责 |
---|---|---|
localhost | 192.168.91.135 | nginx |
例子
nginx新增第三方模块echo-nginx-module
// 获取之前的编译参数
[root@localhost ~]# nginx -V
nginx version: nginx/1.20.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-3) (GCC)
built with OpenSSL 1.1.1k FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log
// 功能包下载
https://github.com/openresty/echo-nginx-module.git
[root@localhost ~]# cd /usr/src/
[root@localhost src]# ls
debug kernels nginx-1.20.1
echo-nginx-module-master.zip nginx-1.20.1.tar.gz
[root@localhost src]# yum -y install unzip
[root@localhost src]# unzip echo-nginx-module-master.zip
[root@localhost src]# ls
debug echo-nginx-module-master kernels master.zip nginx-1.20.1 nginx-1.20.1.tar.gz
// 重新编译软件
[root@localhost src]# cd nginx-1.20.1/
[root@localhost nginx-1.20.1]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--add-module=/usr/src/echo-nginx-module-master
// 执行make,不要执行make install,如果执行了make install则会把之前的nginx配置覆盖
[root@matser nginx-1.20.1]# make
// 备份原程序
[root@localhost nginx-1.20.1]# ls objs/
addon nginx ngx_auto_headers.h src
autoconf.err nginx.8 ngx_modules.c
Makefile ngx_auto_config.h ngx_modules.o
[root@localhost nginx-1.20.1]# ll objs/nginx /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root 6831200 Oct 28 10:44 objs/nginx
-rwxr-xr-x. 1 root root 6831200 Oct 28 10:59 /usr/local/nginx/sbin/nginx
// 备份原有的nginx主程序文件
[root@localhost nginx-1.20.1]# cp /usr/local/nginx/sbin/nginx /opt/
[root@localhost nginx-1.20.1]# ls /opt/
mime.types nginx nginx.conf
// 停止旧程序使用新程序启动使用旧配置文件
[root@localhost ~]# nginx -s stop;/usr/src/nginx-1.20.1/objs/nginx -c /usr/local/nginx/conf/nginx.conf
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
[root@localhost ~]# ps -ef | grep nginx
root 5082 1 0 10:35 ? 00:00:00 nginx: masts/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 5083 5082 0 10:35 ? 00:00:00 nginx: work
root 9428 1499 0 10:50 pts/0 00:00:00 grep --col
// 测试新功能是否有效
```shell
[root@localhost nginx-1.20.1]#
[root@localhost nginx-1.20.1]# cd /usr/local/nginx/html/
[root@localhost html]# mkdir test
[root@localhost html]# cd test/
[root@localhost test]# cat index.html
amu
[root@localhost test]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /test {
echo "amu";
}
// 检查语法
[root@localhost test]# cd
[root@localhost2 ~]# 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@localhost ~]# /usr/src/nginx-1.20.1/objs/nginx -s reload
[root@localhost ~]# curl http://192.168.91.135/test
amu
// 用新程序替换旧程序
[root@localhost ~]# cp /usr/src/nginx-1.20.1/objs/nginx /usr/local/nginx/sbin/
cp: overwrite '/usr/local/nginx/sbin/nginx'? y
[root@localhost ~]# /usr/src/nginx-1.20.1/objs/nginx -s stop;nginx
[root@localhost ~]# ps -ef | grep nginx
root 9456 1 0 10:59 ? 00:00:00 nginx: master process nginx
nginx 9457 9456 0 10:59 ? 00:00:00 nginx: worker process
root 9460 1499 0 10:59 pts/0 00:00:00 grep --color=auto nginx
[root@localhost ~]# ss -atnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
// 到这里升级就结束了
环境说明:
主机名 | ip | 职责 | 系统 |
---|---|---|---|
localhost2 | 192.168.91.137 | nginx | centos8 |
开启status:
[root@localhost2 ~]# vim /usr/local/nginx/conf/nginx.conf
location /status {
stub_status on;
allow 192.168.91.137;
}
[root@localhost2 ~]# nginx -s reload
状态页面信息详解:
状态码 | 表示的意义 |
---|---|
Active connections 2 | 当前所有处于打开状态的连接 |
accepts | 总共处理了多少个连接 |
handled | 成功创建多少握手 |
requests | 总共处理了多少个请求 |
Reading | nginx读取到客户端的Header信息数,表示正处于接收请求状态的连接数 |
Writing | nginx返回给客户端的Header信息数,表示请求已经接收完成,且正处于处理请求或发送响应的过程中的连接数 |
Waiting | 开启keep-alive的情况下,这个值等于active - (reading + writing),意思就是Nginx已处理完正在等候下一次请求指令的驻留连接 |
监控服务zabbix部署
环境说明:
主机名 | ip | 职责 | 系统 |
---|---|---|---|
master | 192.168.91.134 | zabbix_server | centos8 |
slave | 192.168.91.137 | zabbix_agent | centos8 |
在slave主机上安装zabbix_agentd
#slave
// 在nginx上安装zabbix_agentd
[root@slave ~]# cd /usr/src/
// 将之前下载好的包传到虚拟机开始解压
[root@slave src]# tar xf zabbix-5.4.4.tar.gz
// 安装编译工具和依赖包
[root@slave ~]# yum -y install pcre-devel gcc gcc-c++ make
// 创建系统账户
[root@slave ~]# useradd -r -M -s /sbin/nologin zabbix
// 编译安装zabbix_agent
[root@slave zabbix-5.4.4]# ./configure --enable-agent
[root@slave zabbix-5.4.4]# make install
//修改agent配置文件/usr/local/etc/zabbix_agentd.conf
[root@slave ~]# vim /usr/local/etc/zabbix_agentd.conf
UnsafeUserParameters=1 // 取消注释并修改值为1
Server=192.168.91.134
ServerActive=192.168.91.134 // 服务端IP
Hostname=slave
写监控脚本
#slave
// 关闭防火墙和SELINUX
[root@slave ~]# systemctl disable --now firewalld
[root@slave ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[root@slave ~]# setenforce 0
// 查看端口
[root@slave zabbix-5.4.4]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
// 创建脚本目录
[root@slave zabbix-5.4.4]# cd
[root@slave ~]# mkdir /scripts
[root@slave ~]# cd /scripts/
[root@slave scripts]# chown zabbix.zabbix /scripts/
[root@slave scripts]# ll / | grep scripts
drwxr-xr-x 2 zabbix zabbix 6 Oct 28 15:15 scripts
[root@slave scripts]# touch status.sh
[root@slave scripts]# chmod +x status.sh
[root@slave scripts]# vim status.sh
#!/bin/bash
case $1 in
"Reading")
curl -s http://192.168.91.137/status | awk 'NR==4 {print $2}';;
"Writing")
curl -s http://192.168.91.137/status | awk 'NR==4 {print $4}';;
"Waiting")
curl -s http://192.168.91.137/status | awk 'NR==4 {print $6}'
esac
// 修改/usr/local/etc/zabbix_agentd.conf配置文件
[root@slave scripts]# vim /usr/local/etc/zabbix_agentd.conf
UserParameter=check_status[*],/bin/bash /scripts/status.sh $1 // 取消注释添加内容
// 重启zabbix_agentd
[root@slave scripts]# pkill zabbix_agentd
[root@slave scripts]# zabbix_agentd
[root@slave scripts]# ss -atnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
// 在zabbix服务器上测试key键值是否有效
[root@master ~]# zabbix_get -s 192.168.91.137 -k check_status[Writing]
1
zabbix的web页面配置
添加主机
添加监控项
添加动作
rewrite
rewrite作用
语法:
rewrite regex replacement flag;
replacement可以是某个路径,也可以是某个URL
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
此处的$1用于引用(.*.jpg)匹配到的内容
意为将url开头为/imgs下所有的以.jpg结尾的文件路径全部转成 /images下所有.jpg结尾的文件
环境说明:
主机名 | ip | 职责 | 系统 |
---|---|---|---|
localhost2 | 192.168.91.137 | nginx | centos8 |
举例:
// 创建images文件夹
[root@localhost2 ~]# cd /usr/local/nginx/html/
[root@localhost2 html]# mkdir images
[root@localhost2 html]# ls
50x.html v2-dcb477ef8035f7222ce8788383ccf78e_r.jpg
images
index.html
[root@localhost2 html]# mv v2-dcb477ef8035f7222ce8788383ccf78e_r.jpg images/
[root@localhost2 html]# ls images/
v2-dcb477ef8035f7222ce8788383ccf78e_r.jpg
修改图片存放目录名字
// 将images文件夹名字修改为pkgs
[root@localhost2 html]# mv images/ pkgs/
[root@localhost2 html]# ls
50x.html index.html pkgs
[root@localhost2 html]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
location /imgs {
rewrite ^/images/(.*\.jpg)$ /pkgs/$1 break; // 添加这一段
}
// 重新加载
[root@localhost2 html]# nginx -s reload
html文件里夹没有images还是能访问到图片,由此可见rewrite配置成功
last和break组合使用示例
last 本条规则匹配完成后,继续向下匹配新location URI规则
break 本条规则匹配完成即终止,不再匹配后面的任何规则
举例:
[root@localhost2 ~]# vim /usr/local/nginx/conf/nginx.conf
#gzip on;
server {
listen 80;
server_name localhost;
location /imgs {
rewrite ^/images/(.*\.jpg)$ /pkgs/$1 last;
}
location /pkgs {
rewrite ^/pkgs/(.*\.jpg)$ http://images.baidu.com last;
[root@localhost2 ~]# nginx -s reload
web页面访问测试
将break放到前面
[root@localhost2 ~]# vim /usr/local/nginx/conf/nginx.conf
#gzip on;
server {
listen 80;
server_name localhost;
location /imgs {
rewrite ^/images/(.*\.jpg)$ /pkgs/$1 break;
}
location /pkgs {
rewrite ^/pkgs/(.*\.jpg)$ http://images.baidu.com last;
[root@localhost2 ~]# nginx -s reload
常见的flag
flag | 作用 |
---|---|
last | 基本上都用这个flag,表示当前的匹配结束,继续下一个匹配,最多匹配10个到20个,一旦此rewrite规则重写完成后,就不再被后面其它的rewrite规则进行处理,而是由UserAgent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程 |
break | 中止Rewrite,不再继续匹配,一旦此rewrite规则重写完成后,由UserAgent对新的URL重新发起请求,且不再会被当前location内的任何rewrite规则所检查 |
redirect | 以临时重定向的HTTP状态302返回新的URL |
permanent | 以永久重定向的HTTP状态301返回新的URL |
rewrite模块的作用是用来执行URL重定向。这个机制有利于去掉恶意访问的url,也有利于搜索引擎优(SEO)
nginx使用的语法源于Perl兼容正则表达式(PCRE)库,基本语法如下:
标识符 | 意义 |
---|---|
^ | 必须以^后的实体开头 |
$ | 必须以$前的实体结尾 |
. | 匹配任意字符 |
[] | 匹配指定字符集内的任意字符 |
[^] | 匹配任何不包括在指定字符集内的任意字符串 |
l | 匹配 |
() | 分组,组成一组用于匹配的实体,通常会有 |
捕获子表达式,可以捕获放在()之间的任何文本,比如:
^(hello|sir)$ //字符串为“hi sir”捕获的结果:$1=hi$2=sir
//这些被捕获的数据,在后面就可以当变量一样使用了
if 语法:
if (condition) {...}
应用场景:
常见的condition
举例:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
基于浏览器实现分离案例
if ($http_user_agent ~ Firefox) {
rewrite ^(.*)$ /firefox/$1 break;
}
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_user_agent ~ Chrome) {
rewrite ^(.*)$ /chrome/$1 break;
}
防盗链案例
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referers none blocked www.idfsoft.com;
if ($invalid_referer) {
rewrite ^/ http://www.idfsoft.com/403.html;
}
}