01--nginx基础

前言:

本文用来整理一下nginx的用法,应该是本人中间件专栏的第一篇文章,这里开始概念和实操将会同样重要,面试时基本概念的理解非常重要,深有体会,不会再让概念成为压死骆驼的稻草。

1、nginx简介

Nginx (engine x) 是一个高性能的HTTP(解决C10k的问题)和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

  • c10k:连接数10K级别,万级并发。
  • IMAP/POP3/SMTP服务器:邮件服务器,没见过实际应用,但是面试被人问到过

2、nginx web优势

nginx通过epoll实现了异步非阻塞的高并发io多路复用的事件处理模式

  • epoll:epoll是Linux内核提供的一种I/O事件通知机制,用于实现高效的事件驱动型I/O。它允许程序监视多个文件描述符上的事件,并在这些文件描述符中的任何一个或多个上发生事件时进行通知。epoll在处理大量连接时通常比传统的select和poll效率更高。

  • 异步:异步I/O指的是在进行I/O操作时,不需要等待数据准备好或完成,而是通过回调函数或其他方式在数据准备好后进行通知或处理。在这种模式下,程序可以继续执行其他任务而不必等待I/O操作完成。

  • 非阻塞:非阻塞I/O是指进行I/O操作时,如果数据尚未准备好,调用会立即返回而不会阻塞程序的执行。程序可以在等待数据准备好的同时执行其他任务,而不必一直等待数据的就绪。

  • 高并发:高并发指的是系统能够同时处理大量的并发请求或连接。在网络编程中,高并发通常指的是服务器能够同时处理大量的客户端连接请求。

  • 多路复用:多路复用是指通过一种机制同时监视多个I/O事件,以便在多个连接中选择那些已经就绪的进行处理。这种机制可以大大减少系统资源的开销,提高系统的性能和效率。

 3、nginx安装

系统环境IP
centos9最小化安装192.168.189.143

 这里采用的安装方式为nginx官网提供安装方式,大部分情况下可以直接使用yum安装

3.1、安装yum组件

[root@localhost ~]# yum install -y yum-utils

3.2、添加yum源

这里第一个地址为稳定版地址,默认开启,第二个为最新版默认关闭

[root@localhost ~]# vim /etc/yum.repos.d/nginx.repo
[root@localhost ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

如果想使用最新版运行下面的命令

sudo yum-config-manager --enable nginx-mainline

3.3、安装并启动nginx

[root@localhost ~]# yum install -y nginx
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@localhost ~]# nginx -v
nginx version: nginx/1.26.0

浏览器查看

 4、nginx配置文件

查看安装位置,这里可以看到文件安装位置

[root@localhost ~]# rpm -ql nginx

5、nginx编译参数

rpm安装效果,非源代码安装

[root@localhost ~]# nginx -V
nginx version: nginx/1.26.0
built by gcc 11.3.1 20221121 (Red Hat 11.3.1-4) (GCC) 
built with OpenSSL 3.0.7 1 Nov 2022 (running with OpenSSL 3.2.1 30 Jan 2024)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_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_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_v3_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

--prefix=/etc/nginx:安装路径

--sbin-path=/usr/sbin/nginx:程序文件

--modules-path=/usr/lib64/nginx/modules:模块路径

--conf-path=/etc/nginx/nginx.conf:主配置文件

--error-log-path=/var/log/nginx/error.log:错误日志

--http-log-path=/var/log/nginx/access.log:用户正常访问日志

--pid-path=/var/run/nginx.pid:程序id

--lock-path=/var/run/nginx.lock:锁路径,防止重复启用安装

--http-client-body-temp-path=/var/cache/nginx/client_temp:客户端访问缓存信息

--http-proxy-temp-path=/var/cache/nginx/proxy_temp:代理缓存

--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp

--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp

--http-scgi-temp-path=/var/cache/nginx/scgi_temp:cgi--命令网关接口与动态网站相关 

--with-compat:启用动态模块兼容性

--user=nginx --group=nginx:运行身份

--with-file-aio:实现异步非阻塞

--with-threads :多线程模块

--with-http_addition_module:追加模块,例如广告

--with-http_auth_request_module:认证模块,核查身份

--with-http_dav_module:支持网站上传下载,默认关闭

--with-http_flv_module:多媒体视频文件模块

--with-http_gunzip_module:压缩模块

--with-http_gzip_static_module:压缩模块

--with-http_mp4_module:多媒体视频文件模块

--with-http_random_index_module:nginx随机首页

--with-http_realip_module:获取真实ip

--with-http_secure_link_module:安全下载模块

--with-http_slice_module:nginx安全说明文档

--with-http_ssl_module:安全模块

--with-http_stub_status_module:访问状态

--with-http_sub_module:nginx替换网站相应内容

--with-http_v2_module:web2.0支持模块

--with-http_v3_module:web3.0支持模块

--with-mail:邮件客户端模块

--with-mail_ssl_module:加密邮件模块

--with-stream

--with-stream_realip_module

--with-stream_ssl_module

--with-stream_ssl_preread_module:4个代理模块,集群代理用

6、nginx基本配置

6.1、主配置文件

/etc/nginx/nginx.conf

[root@localhost ~]# cat /etc/nginx/nginx.conf user  nginx;    #运行nginx的帐号
worker_processes  auto;    #启动的worker进程数量,一般取cpu数量或者autoerror_log  /var/log/nginx/error.log notice;    #错误日志位置格式
pid        /var/run/nginx.pid;    #启动时产生,记录进程编号events {worker_connections  1024;    #nginx允许服务多少用户
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;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  /var/log/nginx/access.log  main;    #访问日志位置位置sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;    #运行时包含子配置文件
}

6.2、默认虚拟主机配置文件

/etc/nginx/conf.d/default.conf此文件有可能在某些版本中不存在,文件内容与主文件在同一文件中

注:一个服务器上多个网站也被称为多个虚拟主机

[root@localhost ~]# cat /etc/nginx/conf.d/default.conf 
server {listen       80;server_name  localhost;#access_log  /var/log/nginx/host.access.log  main;location / {root   /usr/share/nginx/html;index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##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;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}
}

6.3、尝试配置一个新的虚拟主机

[root@localhost ~]# vim /etc/nginx/conf.d/liumuquan.conf
[root@localhost ~]# cat /etc/nginx/conf.d/liumuquan.conf
server {
listen 80;
server_name liumuquan.com;
location / {
root /liumuquan;
index index.html;
}
}[root@localhost ~]# mkdir /liumuquan
[root@localhost ~]# echo "this is 15byte" > /liumuquan/index.html
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# systemctl restart nginx

在客户端配置域名解析后使用浏览器访问

7、nginx日志

7.1、日志配置

7.1.1、日志模块

日志模块的名称:ngx_http_log_module

官方文档地址:http://nginx.org/en/docs/http/ngx_http_log_module.html

7.1.2、相关指令

log_format 日志格式

access_log 访问日志

error_log 错误日志

open_log_file_cache 日志缓存

7.1.3、日志格式中允许的变量

access.log日志单条示例
192.168.189.145 - - [25/May/2024:15:53:05 +0800] "GET / HTTP/1.1" 200 15 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0" "-"

$remote_addr 远程地址:记录客户端IP

$remote_user 远程用户:记录客户端用户名 默认使用匿名,日志中使用“-”占位

[$time_local] 本地时间:服务器时间

$request 请求:记录请求的url和http协议

$status 状态:记录请求状态,三位数数字状态码

100-199:用于指定客户端对应操作

200-299:请求成功

300-399:重定向

400-499:客户端请求错误

500-599:服务器错误

$body_bytes_sent 发送给客户端的字节数,不包含http响应头大小,本文是15

$http_referer 引用:记录从哪个页面链接访问过来的

$http_user_agent 记录客户端浏览器的信息

$http_x_forwarded_for 代理IP

7.1.4、错误日志解析

错误日志单条示例
2024/05/25 17:25:01 [error] 2562#2562: *13 open() "/liumuquan/333.html" failed (2: No such file or directory), client: 192.168.189.145, server: liumuquan.com, request: "GET /333.html HTTP/1.1", host: "liumuquan.com"

依次如下:  

日期 时间 错误 错误编号:open这个url时 失败 (没有找到这个目录) 发起请求的客户端:IP 服务端:虚拟主机名 请求:请求方式 请求地址 请求类型  服务端主机

7.1.5、个性化404配置(补充)

1)修改配置文件

有的是在主配置文件,有的是子配置文件default.conf里面,找到404字样

    error_page  404              /404.html;location = /404.html{root /usr/share/nginx/html;}这四行是用来声明404页面位置,更改其中参数可以应用到不同的虚拟主机

 编辑设置的文件(有些版本这个文件自动生成,清除文件内容重新编辑即可)

[root@localhost html]# vim /usr/share/nginx/html/404.html
[root@localhost html]# cat /usr/share/nginx/html/404.html
sorry this page lost
<img src=404.jpg />找个图片作为404.jpg传到html文件夹

重启nginx使用浏览器查看访问效果

注意:

  • 这里不同版本nginx配置文件内容,位置各不相同;
  • 不同的虚拟主机/网站在设置个性化404界面时,需要配置各自网站的配置文件。

 7.1.6、日志位置

经过前面配置,服务器上拥有两个不同虚拟主机

默认虚拟主机liumuquan123.com
后加虚拟主机liumuquan.com

 此时两台主机共用一个位置记录日志,可以通过如下配置access_log行修改日志记录位置

[root@localhost ~]# vim /etc/nginx/conf.d/liumuquan.conf 
[root@localhost ~]# cat /etc/nginx/conf.d/liumuquan.conf 
server {access_log  /var/log/nginx/access_liumuquan.log  main;listen 80;
server_name liumuquan.com;
location / {
root /liumuquan;
index index.html;
}
}

 7.1.7、日志缓存

大量客户端访问到来时,对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭.占用了系统的内存,但是记录日志并不参与网站访问行为。可以通过如下配置open_log_file_cache行开启日志缓存。(此为官方手册的说法,实际生产中尽量别开,缓存很吃内存资源)

open_log_file_cache max=1000 inactive=20s min_uses=3 valid=1m ;解释:open_log_file_cache:指令名称,表示要配置日志文件缓存。max=1000:表示最大缓存的日志文件数。在这个例子中,最多会缓存 1000 个日志文件。inactive=20s:表示一个日志文件在多久没有被访问后会被认为是不活跃的,单位是秒。在这里,如果一个日志文件在 20 秒内没有被访问,就会被标记为不活跃。min_uses=3:表示一个日志文件至少被访问的次数,才会被缓存。在这个例子中,一个日志文件至少要被访问 3 次,才会被缓存。valid=1m:表示一个日志文件被缓存的有效时间,单位是分钟。在这里,一个日志文件被缓存后会在 1 分钟后失效,需要重新验证是否仍然需要缓存。

7.2、日志轮转切割

Nginx安装,会默认启动日志轮转

[root@localhost ~]# cat /etc/logrotate.d/nginx 
/var/log/nginx/*.log {dailymissingokrotate 52compressdelaycompressnotifemptycreate 640 nginx admsharedscriptspostrotateif [ -f /var/run/nginx.pid ]; thenkill -USR1 `cat /var/run/nginx.pid`fiendscript
}

daily:按天轮转
missingok:找不到的文件可以跳过
rotate 52:保留52份日志
compress:轮转后对老文件做压缩处理
delaycompress:延迟压缩,在下一次轮转时才压缩日志文件
notifempty:空白文件不参与轮转
create 640 nginx adm:创建新的日志文件并设置权限为 640,属主为 nginx,属组为adm

sharedscripts:在所有日志文件都被轮转后执行一次下方的脚本

        postrotateif [ -f /var/run/nginx.pid ]; thenkill -USR1 `cat /var/run/nginx.pid`fiendscript

在轮转后执行的脚本,这里的脚本是判断 Nginx 进程是否在运行,如果在运行则发送 USR1 信号给 Nginx 进程,触发重新打开日志文件。

这个脚本各个版本写法也是不同的,不过实现的效果都大致相同

postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript

7.3、日志分析

7.3.1、常用字段

默认日志格式的常用字段,在使用分割后的代替字段

$remote_addr        

$1
$time_local       $4
$request       $7
$status       $9
$body_bytes_sent        $10

7.3.2、案例分析

 1)统计2023年9月5日

grep '05/Sep/2023' xxxxx.log |wc -l

统计8:00-9:00的部分

grep '05/Sep/2023:08' xxxxx.log  |wc -l
awk '$4>="[05/Sep/2023:08:00:00" && $4<="[05/Sep/2023:09:00:00" {print $0}'  xxxxx.log | wc -l这里awk以空格作为分割所以[05/Sep/2023:08:00:00此处为一个整体,故[不可省略

2)统计2023年9月5日一天内访问最多的IP(面试最喜欢问的)

grep '05/Sep/2023' xxxxx.log | awk '{ ips[$1]++ } END{for(i in ips){print i,ips[i]} } '| sort -k2 -rn | head -n10grep '05/Sep/2023' xxxxx.log:首先使用 grep 命令从 xxxxx.log 文件中筛选出包含日期 "05/Sep/2017" 的行。awk '{ ips[$1]++ } END{for(i in ips){print i,ips[i]} }':
将上一步的输出作为 awk 命令的输入。
在 awk 中,{ ips[$1]++ } 会以第一个字段(IP地址)作为键值,统计每个IP地址出现的次数;
注意:此处时shell编程的数组概念,是整个命令核心
END{for(i in ips){print i,ips[i]}} 在处理完所有行之后,会遍历IP地址及其出现次数并输出。sort -k2 -rn:接着将 awk 的输出结果作为输入,使用 sort 命令按照第二列(即出现次数)进行逆序排序。head -n10:最后使用 head 命令只输出排序后的前10行,即出现频率最高的前10个IP地址及其出现次数。

3)统计2023年9月5日访问大于100次的ip

grep '05/Sep/2023' xxxxx.log | awk '{ ips[$1]++ } END{for(i in ips){ if(ips[i]>100)  {print i,ips[i]}} } '

这种情况下打印出来的数据未按照数字大小排列

4)统计2023年9月5日访问最多的10个页面

grep '05/Sep/2023' xxxxx.log |awk '{urls[$7]++} END{for(i in urls){print urls[i],i}}' |sort -k1 -rn |head -n10

根据第二个示例修改,只更改了统计字段改为了第七个字段(页面)

5)统计2023年9月5日每个页面访问内容占据的大小/流量

grep '05/Sep/2023' xxxxx.log | awk '{ urls[$7]++; size[$7]+=$10} END{for(i in urls){print urls[i],size[i],i}}'| sort -k1 -rn | head -n10urls[$7]++ $7是请求 ++是加一,这里索引为url,数组值为++,用来统计次数
size[$7]+=$10 $7是请求 $10是页面大小 这里索引为url,数组值为页面大小累加,统计页面总流量urls[i]被访问次数,size[i]总大小,i为页面

6)统计2023年9月5日 每个IP访问状态码数量($status--$9)

grep '05/Sep/2023' xxxxx.log | awk '{ ip_code[$1" "$9]++} END{ for(i in ip_code){print i,ip_code[i]} }' | sort -k1 -rn | head -n10ip_code[$1" "$9]++ ip与状态码组合索引

7)统计2023年9月5日 每个IP访问状态码为404及出现次数

grep '05/Sep/2023' xxxxx.log | awk '$9=="404"{ccc[$1" "$9]++} END{for(i in ccc){print i,ccc[i]}}'  | sort -k3 -rn
grep '05/Sep/2023' xxxxx.log | awk '{if($9=="404"){ip_code[$1" "$9]++}} END{for(i in ip_code){print i,ip_code[i]}}'

8)统计前一分的浏览量

date=$(date -d '-1 minute' +%Y:%H:%M);  
awk -v date=$date '$0 ~ 
date{i++}END{print i}' 
/var/log/nginx/access.logdate=$(date -d '-1 minute' +%Y:%H:%M);
这行命令使用 date 命令生成当前时间的前一分钟的日期和时间,并将结果保存在变量 date 中。使用 awk 命令打开名为 access.log 的日志文件,然后遍历每一行。对于匹配变量 date 的行,计数器 i 会递增;最后,在处理完所有行之后,将计数器 i 的值输出。如果不是活跃状态网站,这个命令输出结果很有可能为空行

9)统计2023年9月5日 8:30-9:00,每个IP,出现404状态码的数量

awk '$4>="[05/Sep/2023:08:30:00" && $4<="[05/Sep/2023:09:00:00" {if($9=="404"){ip_code[$1" "$9]++}} END{for(i in ip_code){print i,ip_code[i]}}' xxxxx.log 

 10)统计2023年9月5日 各种状态码数量

grep '05/Sep/2023' xxxxx.log  | awk '{code[$9]++} END{for(i in code){print i,code[i]}}'

比较直观的百分比写法

grep '05/Sep/2023' xxxxx.log | awk '{code[$9]++;total++} END{for(i in code){printf i" ";printf code[i]"\t";printf "%.2f",code[i]/total*100;print "%"}}'awk已经遍历所有行,记录下总行数total
printf:是一个用于格式化输出的函数。
"%.2f":表示格式化输出为浮点数,并且保留两位小数。
code[i]/total*100:这是要进行格式化输出的浮点数,表示某个状态码出现的次数占总行数的百分比。

这里案例重点是第二个,所有的都是围绕第二个进行扩展

8、nginx的web模块

8.1、连接状态模块

名称:http_stub_statu_module

作用:展示用户和nginx链接数量信息。

查询模块是否安装:

[root@localhost ~]# nginx -V 2>&1 | grep stub_status

在liumuquan.com中启动该模块

[root@localhost conf.d]# vim liumuquan.conf 
[root@localhost conf.d]# cat liumuquan.conf 
server {
location /nginx_status{
stub_status;
allow all;
}
access_log  /var/log/nginx/access_liumuquan.log  main;
listen 80;
server_name liumuquan.com;
location / {
root /liumuquan;
index index.html;
}
}以下部分
location /nginx_status{
stub_status;
allow all;    #权限设置
为http_stub_statu_module模块启动配置

效果如下图:

效果图参数详解

Active connections: 1 当前活跃连接数:1
server accepts handled requests后三个单词为下方三个数字的标题
 10 10 45 

10        总连接数connection(TCP)

10        成功的连接数connection (TCP)

45        总共处理的请求数requests(HTTP)

Reading: 0 Writing: 1 Waiting: 0

Reading: 0:当前正在读取的连接数。

Writing: 1:当前正在写入的连接数。

Waiting: 0:当前等待的连接数。

注:

  • connection 连接数,tcp连接
  • request http请求,GET/POST/DELETE/UPLOAD
  • 可以通过关闭长连接(keepalived)或缩短长连接时间的方式更好的观察该模块效果
  • curl访问方式不涉及长连接问题

8.2、随机主页模块

名称:random_index_module

作用:将主页设置成随机页面,是一种微更新机制

启动随机主页模块

[root@localhost ~]# mkdir /app
[root@localhost ~]# touch /app/{1.html,2.html,3.html,.4.html}
[root@localhost ~]# echo 11111111111 > /app/1.html 
[root@localhost ~]# echo 22222222222 > /app/2.html 
[root@localhost ~]# echo 33333333333 > /app/3.html 
[root@localhost ~]# echo 44444444444 > /app/.4.html#以上为准备随机主页内容[root@localhost ~]# vim /etc/nginx/conf.d/liumuquan.conf 
[root@localhost ~]# cat /etc/nginx/conf.d/liumuquan.conf 
server {
location /nginx_status{
stub_status;
allow all;
}
access_log  /var/log/nginx/access_liumuquan.log  main;
listen 80;
server_name liumuquan.com;
location / {
#root /liumuquan;    #把原有两行注释掉
#index index.html;
root /app;            #改为随机主页
random_index on;     #随机主页开启,实验完成后记得恢复
}
}[root@localhost ~]# systemctl restart nginx

使用客户端远程访问效果如下:

默认不显示目录内的隐藏文件

8.3、替换模块

名称:sub_module

作用:网页内容替换。模板生成网站部分代码出错,文件数量巨大,暂时无法全部重写。可以使用此模块暂时实现纠错,也可实现服务器端文字过滤。

效果演示:

替换前:

 替换方法:

[root@localhost ~]# vim /etc/nginx/conf.d/liumuquan.conf 
[root@localhost ~]# cat /etc/nginx/conf.d/liumuquan.conf 
server {
location /nginx_status{
stub_status;
allow all;
}
access_log  /var/log/nginx/access_liumuquan.log  main;
listen 80;
server_name liumuquan.com;
location / {sub_filter 15 '19961106';    #添加这两行,将网页内15替换为19961106
sub_filter_once off;        #off是全部替换,on是单次替换root /liumuquan;
index index.html;
#root /app;
#random_index on;
}
}[root@localhost ~]# systemctl restart nginx

替换效果:

替换不对原网页内容造成影响,只是修改了显示内容

8.4、文件读取模块

名称:ngx_http_core_module

作用:ngx_http_core_module是Nginx HTTP服务器的核心模块之一,它负责处理HTTP请求的核心功能,默认开启。

8.4.1、sendfile

语法: sendfile on | off;

默认状态: sendfile on;

配置位置: http, server, location, if in location

off状态网络传输过程:硬盘-内核-user:nginx-内核-协议栈

on状态网络传输过程:硬盘-内核-协议栈

sendfile减少切换次数而且还能减少拷贝次数。

8.4.2、tcp_nopush

语法: tcp_nopush on | off;

默认状态: tcp_nopush off;

配置位置: http, server, location

off状态网络传输效率:每产生一次操作就会发送一个包,每个包40字节的包头,类似邮寄一个曲别针。

on状态网络传输效率:当包累计到一定大小后再发送。

8.4.3、tcp_nodelay

语法: tcp_nodelay on | off;

默认状态: tcp_nodelay on;

配置位置: http, server, location

作用:tcp_nodelay会将ack立刻发出去,避免因tcp机制造成重传。

8.5、文件压缩模块

名称:ngx_http_gzip_module

作用:启动该模块,使文件传输前进行压缩,提升传输效率。

未启用压缩模块网络传输大小:

启用压缩模块:

[root@localhost liumuquan]# cat /etc/nginx/nginx.conf user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;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  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;gzip  on;gzip_http_version 1.1;gzip_comp_level 9;gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_static on;include /etc/nginx/conf.d/*.conf;
}添加部分与添加位置gzip  on;gzip_http_version 1.1;gzip_comp_level 9;       #0-9数字越大压缩越强gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_static on;

启用压缩模块网络传输大小:

压缩包和图片类对象本身已经自带压缩功能。所以压缩比例较小低。 文本类对象在压缩试验中,压缩比例更明显。

8.6、页面缓存模块

名称:ngx_http_headers_module

作用:expires起到控制页面缓存的作用,合理的配置可以减少很多服务器的请求要配置

语法: expires [modified] time; expires epoch | max(10年) | off;

默认状态: expires off;

配置位置: http, server, location, if in location

需要关闭浏览器缓存功能

 页面缓存模块开启方法:

[root@localhost liumuquan]# vim /etc/nginx/conf.d/liumuquan.conf 
[root@localhost liumuquan]# cat /etc/nginx/conf.d/liumuquan.conf 
server {
location /nginx_status{
stub_status;
allow all;
}
access_log  /var/log/nginx/access_liumuquan.log  main;
listen 80;
server_name liumuquan.com;
location / {#sub_filter 15 '19961106';
#sub_filter_once off;root /liumuquan;
index index.html;expires 24h;                #添加此行,设置缓存时间为24小时#root /app;
#random_index on;
}
}[root@localhost liumuquan]# systemctl restart nginx

此时多次访问后查看消息头

有一个缓存控制86400秒(24h)字样代表开启成功

 8.6、防盗链模块

名称:ngx_http_referer_module

作用:盗链会影响站点的正常访问。 通过http_referer模块可以控制这一点。阻止盗链现象

演示:

1)搭建a.com

[root@localhost ~]# vim /etc/nginx/conf.d/a.conf 
[root@localhost ~]# cat /etc/nginx/conf.d/a.conf 
server {
location /nginx_status{
stub_status;
allow all;
}
access_log  /var/log/nginx/acom.log  main;
listen 80;
server_name a.com;
location / {
root /a;
index index.html;
}
}[root@localhost ~]# mkdir /a
[root@localhost ~]# vim /a/index.html
[root@localhost ~]# cat /a/index.html
<img src='1.jpg' />
[root@localhost ~]# ls /a
1.jpg  index.html
[root@localhost ~]# systemctl restart nginx

访问效果

2)使用盗链的方式的搭建b.com

[root@localhost ~]# vim /etc/nginx/conf.d/b.conf
[root@localhost ~]# cat /etc/nginx/conf.d/b.conf
server {
location /nginx_status{
stub_status;
allow all;
}
access_log  /var/log/nginx/bcom.log  main;
listen 80;
server_name b.com;
location / {
root /b;
index index.html;
}
}[root@localhost ~]# mkdir /b
[root@localhost ~]# vim /b/index.html
[root@localhost ~]# cat /b/index.html
<img src='http://a.com/1.jpg' />[root@localhost ~]# ls /b
index.html
#网站里并没有对应图片[root@localhost ~]# systemctl restart nginx

访问b.com

3)查看日志

查看a.com的日志

 查看b.com的日志

 4)启动防盗链模块

[root@localhost ~]# vim /etc/nginx/conf.d/a.conf 
[root@localhost ~]# cat /etc/nginx/conf.d/a.conf 
server {
location /nginx_status{
stub_status;
allow all;
}
access_log  /var/log/nginx/acom.log  main;
listen 80;
server_name a.com;
location / {
root /a;
index index.html;valid_referers none blocked *.a.com;
if ($invalid_referer) {
return 403;
}
}
}
[root@localhost ~]# systemctl restart nginx###########################################################################################
valid_referers none blocked *.a.com;
if ($invalid_referer) {
return 403;
}此处为防盗链配置

再次访问b.com

 如果希望放行某些盗链(友链)配置如下

[root@localhost ~]# vim /etc/nginx/conf.d/a.conf 
[root@localhost ~]# cat /etc/nginx/conf.d/a.conf 
server {
location /nginx_status{
stub_status;
allow all;
}
access_log  /var/log/nginx/acom.log  main;
listen 80;
server_name a.com;
location / {
root /a;
index index.html;valid_referers none blocked *.a.com
server_name  192.168.189.*  ~\.google\. ~\.baidu\. b.com;     #此行增加白名单
if ($invalid_referer) {
return 403;
}
}
}

再次访问b.com

9、Nginx 访问限制

1)名称:ngx_http_limit_req_module

作用:限制单位时间内来自特定IP的http请求次数

演示:

使用httpd-tools程序快速访问liumuqaun.com

[root@localhost ~]# yum install -y httpd-tools
[root@localhost ~]# ab -n 100 -c 10 http://liumuquan.com/

未限制情况下的访问如下

 配置ngx_http_limit_req_module模块

[root@localhost ~]# vim /etc/nginx/nginx.conf 
[root@localhost ~]# cat /etc/nginx/nginx.conf user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; #在此处进行总定义
[root@localhost ~]# vim /etc/nginx/conf.d/liumuquan.conf 
[root@localhost ~]# cat /etc/nginx/conf.d/liumuquan.conf 
server {
limit_req zone=req_zone;#在需要进行访问限制的网站进行引用

重启nginx测试

 此时查看错误日志

[root@localhost ~]# tail -f /var/log/nginx/error.log
2024/05/28 20:33:35 [error] 2014#2014: *91 limiting requests, excess: 0.983 by zone "req_zone", client: 192.168.189.145, server: liumuquan.com, request: "GET / HTTP/1.0", host: "liumuquan.com"

2)名称:ngx_http_limit_conn_module

作用:用于限制并发连接数,即限制同时针对服务器的连接数。这个模块适用于控制连接数,当连接数超过设定的阈值时,可以拒绝新的连接或者延迟处理。

过程同上,但效果不好复现

10、 Nginx 访问控制

10.1、基于IP访问控制

名称:ngx_http_access_module

作用:配置允许或禁止访问的 ip 地址或网段

配置位置: http, server, location, limit_except

配置过程及效果演示:

[root@localhost ~]# vim /etc/nginx/conf.d/liumuquan.conf 
[root@localhost ~]# cat /etc/nginx/conf.d/liumuquan.conf 
server {
allow 192.168.189.145;   
deny all;                   #不允许任何访问,除了145location /nginx_status{

 效果如下

 更改配置文件

[root@localhost ~]# cat /etc/nginx/conf.d/liumuquan.conf 
server {deny 192.168.189.145;    #拒绝145访问
allow all;                #允许其他所有location /nginx_status{

效果如下

10.2、基于用户名密码访问控制

名称:ngx_http_auth_basic_module

作用:对访问Nginx服务器上的资源进行简单的用户名和密码认证,从而限制只有经过认证的用户才能访问受保护的资源。

配置方式:

1)直接将用户名密码写入配置文件(尽量不使用)

2)将用户名密码写入加密文件中,然后由nginx调用

第二种配置方式演示:

[root@localhost ~]# yum install -y httpd-tools[root@localhost ~]# htpasswd -cm /etc/nginx/conf.d/passwd user10
New password: 
Re-type new password: 
Adding password for user user10
[root@localhost ~]# htpasswd -m /etc/nginx/conf.d/passwd user20
New password: 
Re-type new password: 
Adding password for user user20
[root@localhost ~]# cat /etc/nginx/conf.d/passwd
user10:$apr1$PvBWfWR5$jWAyq/19gSZFSAV7jrrEr1
user20:$apr1$smvNRukH$QdLTautMU8QQfgIXfQRJ41[root@localhost ~]# cat /etc/nginx/conf.d/liumuquan.conf 
server {auth_basic "THIS IS A TEST FROM LIUMUQUAN";
auth_basic_user_file /etc/nginx/conf.d/passwd;    #认证文件路径location /nginx_status{

重启访问该网站

NGINX基础部分至此结束 ,共计2万1千余字,用于后续工作查找个人复习之用

这一章完全学懂对于网络协议也是要有一定理解

也是对自己这几年将概念知识忘光的一个反思吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3、css3 手写nav导航条(互相学习)

效果例图&#xff1a; 1、首先呈现的是html代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

ARM32开发——库与包

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 嵌入式软件通用架构库SPL库HAL库MSP 嵌入式软件通用架构 库 标准外设库&#xff08;Standard Peripheral Library&#xff09;和H…

Python魔法之旅-魔法方法(03)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

【Linux】初识信号及信号的产生

初始信号 初始信号什么是信号站在应用角度的信号查看Linux系统定义的信号列表 信号的常见处理方式信号的产生通过终端按键产生信号什么是core dump?如何开启core dump?core dump有什么用&#xff1f;为什么默认关闭core dump&#xff1f;设置了core文件大小但是没有产生core文…

【SQL学习进阶】从入门到高级应用(八)

文章目录 ✨连接查询✨什么是连接查询✨连接查询的分类✨笛卡尔积现象✨内连接✨什么叫内连接✨内连接之等值连接✨内连接之非等值连接✨内连接之自连接 ✨外连接✨什么叫外连接✨外连接之左外连接&#xff08;左连接&#xff09;✨外连接之右外连接&#xff08;右连接&#xf…

ubuntu 18.04 ros1学习

总结了一下&#xff0c;学习内容主要有&#xff1a; 1.ubuntu的基础命令 pwd: 获得当前路径 cd: 进入或者退出一个目录 ls:列举该文件夹下的所有文件名称 mv 移动一个文件到另一个目录中 cp 拷贝一个文件到另一个目录中 rm -r 删除文件 gedit sudo 给予管理员权限 sudo apt-…

php反序列化学习(2)

1、魔术方法触发规则&#xff1a; 魔术方法触发的前提是&#xff1a;魔法方法所在类&#xff08;或对象&#xff09;被调用 分析代码&#xff0c;_wakeup()的触发条件是进行反序列化&#xff0c;_tostrinng()触发的条件是把对象当成字符串调用&#xff0c;但是魔术方法触发的前…

安全测试用例及解析(Word原件,直接套用检测)

5 信息安全性测试用例 5.1 安全功能测试 5.1.1 标识和鉴别 5.1.2 访问控制 5.1.3 安全审计 5.1.4 数据完整性 5.1.5 数据保密性 5.1.6 软件容错 5.1.7 会话管理 5.1.8 安全漏洞 5.1.9 外部接口 5.1.10 抗抵赖 5.1.11 资源控制 5.2 应用安全漏洞扫描 5.2.1 应用安全漏洞扫描 5.3…

方差和标准差的区别

标准差和方差都是用来衡量随机变量的离散程度的统计量&#xff0c;它们之间有以下区别&#xff1a; 方差&#xff08;Variance&#xff09;&#xff1a; 方差是衡量随机变量离其均值的离散程度的度量。它是各个数据与其平均值之差的平方和的平均值。方差的公式为&#xff1a;…

鹤城杯 2021 流量分析

看分组也知道考http流量 是布尔盲注 过滤器筛选http流量 将流量包过滤分离 http tshark -r timu.pcapng -Y "http" -T json > 1.json这个时候取 http.request.uri 进一步分离 http.request.uri字段是我们需要的数据 tshark -r timu.pcapng -Y "http&quo…

【全开源】Java情侣飞行棋系统微信小程序+H5+APP源码+微信公众号

​让爱情与游戏并行 一、引言&#xff1a;飞行棋与情侣时光的交融 在快节奏的现代生活中&#xff0c;情侣们常常寻找一种既能增进感情又能共同娱乐的方式。飞行棋&#xff0c;这款经典的家庭游戏&#xff0c;因其简单易上手、策略性强而深受大众喜爱。而现在&#xff0c;我们…

使用compile_commands.json配置includePath环境,解决vscode中引入头文件处有波浪线的问题

通过编译时生成的 compile_commands.json 文件自动完成对 vscode 中头文件路径的配置&#xff0c;实现 vscode 中的代码的自动跳转。完成头文件路径配置后&#xff0c;可以避免代码头部导入头文件部分出现波浪线&#xff0c;警告说无法正确找到头文件。 步骤 需要在 vscode 中…

木馒头头戴式蓝牙耳机

这里写目录标题 木馒头二代头戴式蓝牙耳机清除连接记忆 木馒头二代头戴式蓝牙耳机清除连接记忆 在配对模式下&#xff0c;同时按住播放和暂停按钮4秒&#xff0c;LED闪烁紫色3次&#xff0c;即为清除成功。

电子烟开发【恒压、恒有效算法】

恒压算法 pwm是通过软件模拟的 pwm满值运行是250全占空比 #define D_TARGET_AVERAGE_VOLTAGE 3500 //R_ADC1_Vout &#xff1a;发热丝两端AD值 //R_ADC_FVR &#xff1a;电池电压AD值 //FVR_VOLTAGE &#xff1a;电池AD参考电压 满电值AD //R_Smk1Duty &#xff1a;最后…

深入分析 Android Service (一)

文章目录 深入分析 Android Service (一)1. Android Service 设计说明1.1. Service 的类型1.2. Service 的生命周期1.3. 创建和启动 Service1.4. 绑定 Service1.5. ServiceConnection1.6. 前台 Service1.7. IntentService示例&#xff1a;创建和使用 IntentService 2. Service …

CentOS7部署Yearning并配置MySQL数据库远程访问详细流程——“cpolar内网穿透”

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 本文主要介绍在 Linux 系统简单部署 Yearning 并结合 cpolar 内网穿透工具实现远程访问&#xff0c;破除…

Git基本使用教程(学习记录)

参考文章链接&#xff1a; Git教程&#xff08;超详细&#xff0c;一文秒懂&#xff09; RUNOOB Git教程 Git学习记录 1Git概述 1.1版本控制软件功能 版本管理&#xff1a;更新或回退到历史上任何版本&#xff0c;数据备份共享代码&#xff1a;团队间共享代码&#xff0c;…

【vscode篇】1-VScode设置语言为中文,2-解决中文注释乱码问题。

设置语言为中文 在前端开发中&#xff0c;Visual Studio Code(简称vscode)是一个非常好用的工具&#xff0c;但第一次打开vscode会发现界面为英文&#xff0c;这对很多开发者来说会很不友好&#xff08;比如我&#xff09;&#xff0c;把界面设置成中文只需要安装一个插件即可&…

ONLYOFFICE 协作空间与 WordPress 如何集成

转载自作者&#xff1a;VincentYoung&#xff0c;略有改动 阅读本文&#xff0c;了解如何将 ONLYOFFICE 协作空间与 WordPress 进行集成。 ONLYOFFICE 协作空间是其去年新推出的产品&#xff0c;用创建虚拟办公室房间的方式&#xff0c;来组织公司内部团队成员的在线协作办公&…

Charles-ios无法抓包原因之一证书

VPN证书安装完成后依然无法抓包存在无网络问题 VPN安装证书后直接抓包这时候抓包接口返回无网络&#xff0c;原因是IOS通用-关于本机-证书信任设计未开启信任