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数量或者auto

error_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 {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

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

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

        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript

在轮转后执行的脚本,这里的脚本是判断 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 -n10



grep '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 -n10

urls[$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 -n10

ip_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.log

date=$(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;                   #不允许任何访问,除了145

location /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千余字,用于后续工作查找个人复习之用

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue连接mqtt实现收发消息组件超级详细

基本概念&#xff1a; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;专为低带宽、高延迟或不稳定的网络环境设计。以下是MQTT实现收发消息的基本原理&#xff1a; 客户端-服务器模型&#xff1a…

【数据结构】-- 栈

栈 引入&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的元素遵循先进后出的原则&#xff0c;先入栈的元素总是先后出栈。 压栈&#xff1a;栈的插入操作叫…

HCIP-Datacom-ARST自选题库__OSPF多选【62道题】

1.如图所示&#xff0c;路由器所有的接口开启OSPF&#xff0c;图中标识的IP地址为设备的LoopbackO接口的IP地址&#xff0c;R1、R2、R3的LoopbackO通告在区域1&#xff0c;R4的Loopback0通告在区域0&#xff0c;R5的LoopbackO通告在区域2&#xff0c;下列哪些IP地址之间可以相互…

Docker CIG使用

Docker CIG是什么 CIG为&#xff1a;CAdvisor监控收集、InfluxDB存储数据、Granfana图表展示 这个组合是一个常见的监控 Docker 容器的解决方案,它包括以下三个组件: cAdvisor (Container Advisor): cAdvisor 是一个开源的容器资源监控和性能分析工具。它能够收集有关正在运行的…

【Linux系统】进程间通信

本篇博客整理了进程间通信的方式管道、 system V IPC的原理&#xff0c;结合大量的系统调用接口&#xff0c;和代码示例&#xff0c;旨在让读者透过进程间通信去体会操作系统的设计思想和管理手段。 目录 一、进程间通信 二、管道 1.匿名管道 1.1-通信原理 1.2-系统调用 …

【VTKExamples::Utilities】第十五期 ShepardMethod

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ShepardMethod,并解析接口vtkShepardMethod,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

HTML+CSS 圆形菜单

效果演示 实现了一个圆形菜单的效果,点击菜单按钮后,菜单项会从菜单按钮中心点向外展开,并且菜单项上有文字链接。可以将这段代码的效果称为“圆形菜单展开效果”。 Code <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8…

实战15:bert 命名实体识别、地址解析、人名电话地址抽取系统-完整代码数据

直接看项目视频演示: bert 命名实体识别、关系抽取、人物抽取、地址解析、人名电话地址提取系统-完整代码数据_哔哩哔哩_bilibili 项目演示: 代码: import re from transformers import BertTokenizer, BertForTokenClassification, pipeline import os import torch im…

(IDEA修改Java版本)java: 警告: 源发行版 X 需要目标发行版 X

搜索关键词&#xff1a;一致、发行 错误信息 其他错误&#xff1a; java: 错误: 不支持发行版本 6 java: -source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) 思路 有两个地方要检查&#xff0c;JDK版本保持一致即可。 比如统一用JDK8或…

[排序算法]4. 图解堆排序及其代码实现

先来看看什么是堆? 堆是一种图的树形结构&#xff0c;被用于实现“优先队列”&#xff08;priority queues&#xff09; 注:优先队列是一种数据结构&#xff0c;可以自由添加数据&#xff0c;但取出数据时要从最小值开始按顺序取出。 在堆的树形结构中&#xff0c…

linux安装mysql后,配置mysql,并连接navicat软件

Xshell连接登陆服务器 输入全局命令 mysql -u root -p 回车后&#xff0c;输入密码&#xff0c;不显示输入的密码 注意mysql服务状态&#xff0c;是否运行等 修改配置文件my.cnf&#xff0c;这里没找到就找my.ini&#xff0c;指定有一个是对的 find / -name my.cnf 接下…

书籍学习|基于SprinBoot+vue的书籍学习平台(源码+数据库+文档)

书籍学习平台 目录 基于SprinBootvue的书籍学习平台 一、前言 二、系统设计 三、系统功能设计 1平台功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 5.2.3作者功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …

mysql数据导入navicat中,报错提示1067

MySQL导入问题&#xff1a; 报错1067 - Invalid default value for 字段名 由于数据库版本升级&#xff0c;老数据库的数据文件导出以后&#xff0c;在新版本的数据库上执行会报错 这种问题多是由于默认值不兼容引起的&#xff0c;我们可以通过修改sql_mode来解决这个问题 由…

Steamdeck使用Windows系统游玩雪地奔驰时闪退问题解决方法

我非常喜欢雪地奔驰这款游戏&#xff0c;买sd的一部分也是为了它。可在我打开这个游戏时&#xff0c;游戏发生闪退问题。查阅了网络各个途径&#xff0c;基本没有解决方法。因此我自己分析终于解决该问题。以下是我解决问题的思路&#xff0c;仅供记录参考&#xff1a; 游戏在崩…

关于TeamSpeak3-网易音乐机器人的基础使用方法(胎教级教程)

本文转自博主的个人博客&#xff1a;https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接&#xff1a;点我访问 序言&#xff1a;在自己的ts服务器上安装了网易音乐机器人&#xff0c;写这篇文章旨在教群友/网友如何使用机器人!&#x1f60b;&#x1f44d; 一、TS3Audi…

FM1800隧道广播插播控制器

隧道广播插播控制器是一款群载波&应急广播插播控制器采用SDR软件无线电技术&#xff0c;产生独立的插播信号与“群载波”信号&#xff0c;本设备可通过软件无线电技术将音频信号调制成调频载波或“群载波”信号&#xff0c;分别送入插播主机&#xff0c;实现隧道广播远端机…

服务器上创建搭建gitlab

一、下载与安装 在主目录操作~ 1.使用wget下载 wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-14.0.1-ce.0.el7.x86_64.rpm 可以在开源软件镜像站选择合适的版本&#xff0c;版本不同页面菜单会稍有差异&#xff0c;此次选…

[自动驾驶技术]-5 Tesla自动驾驶方案之算法(AI Day 2021)

有朋友问我&#xff0c;如何有效学习一个新技术。笔者这么多年的经验是&#xff1a;1&#xff09;了解国内外产业应用和标准法规现状&#xff0c;先建立宏观知识图谱及技术系统框架&#xff1b;2&#xff09;根据系统框架逐块进行深入研究&#xff08;横向、纵向&#xff09;&a…

聚观早报 | 小米14 Civi官宣;小度推出学习机Z30

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月29日消息 小米14 Civi官宣 小度推出学习机Z30 vivo S19电池细节 360软件管家全面升级 荣耀200 Pro影像细节 …

c++11特性(详细)

文章目录 前言一、C11介绍二、列表初始化1.{}初始化2.initializer_list 三、auto与decltype四、STL中变化五、右值引用六.C中关于类的新功能七.可变参数模板八.lambda表达式总结 前言 在本篇文章&#xff0c;我们将会详细介绍一下C11新增的一些特性&#xff0c;其中最重要的是…