您的位置:首页 > 游戏 > 手游 > 01--nginx基础

01--nginx基础

2024/12/25 22:01:38 来源:https://blog.csdn.net/qq_43387908/article/details/139176469  浏览:    关键词: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千余字,用于后续工作查找个人复习之用

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com