前言:
本文用来整理一下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 |
|
注:
- 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千余字,用于后续工作查找个人复习之用
这一章完全学懂对于网络协议也是要有一定理解
也是对自己这几年将概念知识忘光的一个反思吧