|
以下所使用的环境为:
虚拟化软件:VMware Workstation 17 Pro
麒麟系统版本:Kylin-Server-V10-SP3-2403-Release-20240426-x86_64
一、Nginx基础
1. 常见Web服务器介绍
1.1 Apache服务器
Apache是目前世界上最流行的Web服务器之一,支持跨平台应用,可以运行在几乎所有的Unix、Windows、Linux系统平台上,尤其对Linux的支持相当完美。
特点
开源免费,源码开放,有很多开发者参与设计和改进。 性能稳定,简单高速,可作代理服务器使用。 支持通过模块扩展功能,支持PHP、Perl、Python等多种脚本语言。 支持SSL/TLS加密和虚拟主机等功能。 社区支持强大。
1.2 IIS服务器
IIS是微软开发的Web服务器软件,主要用于在Windows操作系统上托管网站。
特点
提供图形界面的管理工具,称为Internet服务管理器,可用于监视配置和控制Internet服务。 与其他微软产品(如ASP.NET)集成良好。 支持SSL/TLS加密和虚拟主机等功能。
1.3 Tomcat服务器
Tomcat是一个用于Java应用程序的开源Web服务器,通常与Apache一起使用,是一个开放源代码、运行Servlet和JSP Web应用软件的基于Java的Web应用软件容器。
特点
技术先进,性能稳定,而且免费,深受Java爱好者欢迎。 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用。 是开发和调试JSP程序的首选
1.4 Lighttpd服务器
Lighttpd是一个开源的Web服务器软件,由德国人领导开发。其根本目的是提供一个专门针对高性能网站、安全、快速、兼容性好并且灵活的Web Server环境。
特点
具有非常低的内存开销和CPU占用率,效能好。 支持FastCGI、CGI、Auth、输出压缩、URL重写、Alias等重要功能。 模块丰富,可以灵活配置和扩展。 源代码开放,有活跃的开发者社区。
1.5 Kangle服务器
Kangle是一款跨平台、功能强大、安全稳定、易操作的高性能Web服务器和反向代理服务器软件。它支持多种动态开发语言,如ASP、NET、Java等。
特点
跨平台支持,可以在Linux、Windows、FreeBSD、OpenBSD等多种操作系统上运行。 实现虚拟主机独立进程、独立身份运行,用户之间安全隔离。 支持多种扩展接口,如ISAPI、FastCGI、CGI等,方便与其他Web服务器或应用程序集成。 具有强大的访问控制功能和智能防CC攻击能力。 内置内存/磁盘两级缓存,提高资源利用率和访问速度
1.6 IBM WebSphere服务器
IBM WebSphere是IBM公司开发的一套基于Java的应用服务器软件。它提供了一个可靠、安全、可扩展的平台,用于构建和运行企业级应用程序。
特点
支持多种编程语言,如Java、Java EE、Node.js等,方便开发人员使用自己熟悉的语言进行开发。 提供集群和负载均衡等功能,可以轻松扩展应用程序的容量和性能。 强大的安全功能,包括身份验证、授权、数据加密等,保护企业应用程序的安全性和机密性。 支持分布式事务处理,确保在分布式环境下的数据一致性和可靠性。 丰富的管理和监控工具,可以对应用程序进行实时监控、故障排查和性能优化。
2. Nginx与Apache的区别
静态文件处理能力:Nginx高于Apache
资源消耗:Nginx优于Apache,以为Nginx是异步非阻塞处理模型,只需要几个进程就能够处理大量在线请求,而Apache仍然是进程模型或线程模型,也就是采用大量线程来处理大量在线请求。
Nginx支持IO多路复用实现进程高并发,高效处理客户端请求 Apache支持的模块很多而且也比较稳定。而Nginx因为出现时间比较晚,比不上Apache Nginx自身就是一个反向代理服务器,支持七层负载均衡 Nginx处理动态页面比不上Apache,一般只用于处理静态页面和反向代理
3. Nginx介绍
Nginx是一个轻量级的web服务器,相比apache来说资源消耗更低。支持高并发的web服务和反向代理服务,支持基于IMAP/POP3/SMTP协议的邮件服务。同时也支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等模块功能。并且支持很多第三方的模块扩展。
Nginx主进程/工作进程
一个主进程master:负载加载和分析配置文件、管理工作进程、平滑升级 多个工作进程worker:处理并响应用户请求
Nginx模块结构
核心模块:HTTP模块、EVENT模块、MAIL模块 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块 第三方模块:HTTP Upstream Request Hash模块、Notice模块、HTTP Access Key模块
在线生成Nginx配置文件的网站- https://nginx.p2hp.com/config/?global.app.lang=zhCN
复制代码 Nginx的主要作用
提供静态页面展示和网页服务 通过虚拟主机技术,提供多个网站、多个域名的网页服务 提供反向代理服务 提供简单资源下载服务(FTP服务) 用户行为分析(日志功能)
4. master主进程原理
master是Nginx的主进程,负责管理Nginx的数据和常见worker工作进程。
在Nginx启动时,检查 nginx.conf 配置文件的语法 根据配置文件创建和监控 worker 进程的数量和状态 监听套接字,接收client 发起的请求,然后由 worker 抢夺链接,成功抢夺的worker处理和响应客户端请求 接收管理员发送的Nginx信号(如关闭nginx),然后将信号传递给worker进程 当管理员发送reload,重新读取配置文件,创建新的worker进程,结束旧worker进程
5. 安装Nginx
5.1 YUM源安装Nginx
[Step1]: 连接互联网,编辑本地仓库文件- vim /etc/yum.repos.d/nginx.repo
- # 在文件中输入以下内容[Nginx]name=nginx download
- baseurl=http://nginx.org/packages/centos/8/x86_64/
- enabled=1gpgcheck=0
复制代码 [Step2]: 使用yum安装nginx[Step3]: 查看nginx的安装文件
5.2 源码编译安装Nginx
[Step1]: 连接互联网,下载源码包- wget http://nginx.org/download/nginx-1.20.1.tar.gz
复制代码
[Step2]: 安装nginx的依赖包- yum install-y pcre-devel zlib-devel openssl-devel # 默认应该只有openssl-devel没有预装
复制代码 [Step3]: 解压nginx源码包- tar zxf nginx-1.20.1.tar.gz
- cd nginx-1.20.1/
复制代码 [Step4]: 执行configure,生成Makefile文件,将nginx安装到/opt/nginx目录下,该目录无需提前创建- ./configure --prefix=/opt/ngin
复制代码 [Step5]: 编译安装[Step6]: 查看nginx的安装目录,可以看到该目录下存在一个sbin目录,里面存放着nginx管理命令
[Step7]: 将nginx命令添加到环境变量中,在执行nginx命令时无需添加命令位置- echo"PATH=$PATH:/opt/nginx/sbin">> /etc/profile
- source /etc/profile
- # 还可以通过export实现echo"export PATH=$PATH:/opt/nginx/sbin">> /etc/profile
- source /etc/profile
复制代码 5.3 管理Nginx服务
编译安装的Nginx
命令 | 说明 | nginx -t | 验证nginx.conf配置文件语法 | nginx | 启动Nginx,如果当前存在一个运行的Nginx,会报错 | nginx -s quit | 关闭Nginx服务 | nginx -s stop | 停止Nginx服务 | nginx -s reload | 重新加载Nginx服务配置文件内容 | YUM源安装的Nginx
命令 | 说明 | systemctl start nginx.service | 启动Nginx服务 | systemctl stop nginx.service | 停止Nginx服务 | systemctl enable nginx.service | 将Nginx服务添加到开机自启 | systemctl disable nginx.service | 将Nginx服务移除开机自启 | systemctl reload nginx.service | 重新加载Nginx配置文件内容,不会重启Nginx服务 | 重复运行nginx服务时,会提示错误
当管理员发送reload信号时,master进程会重新读取nginx配置文件内容,然后创建新的worker进程,结束旧worker进程- ps-ef|grep nginx
- nginx -s reload
- ps-ef|grep nginx
复制代码
编译安装和YUM安装的Nginx在不启动的情况下,相互没有关联。但是如果使用nginx启动nginx服务,然后使用systemd停止nginx,会没有效果。【使用什么工具启动的Nginx,就使用什么工具去关闭】- nginx # 启动nginx
- systemct status nginx.service
- ps-ef|grep nginx
复制代码
通过添加-V选项可以看到Nginx服务的详细信息以及安装的所有模块
YUM安装Nginx时会在/usr/sbin/中添加1个nginx命令,而编译安装会在安装目录下的/bin目录下有一个nginx命令。当两个命令混用时,有可能会出现nginx.pid找不到的情况。
- ps-ef|grep nginx |grep master # 先查找到nginx的master进程对应的PIDecho12138> /opt/nginx/logs/nginx.pid # 将该PID写入到nginx.pid文件中即可
- nginx -s reload
复制代码
5.4 Nginx的主配置文件
编译安装的Nginx主配置文件路径YUM源安装的Nginx主配置文件路径Nginx主配置文件结构
**main block字段:**全局配置 **events字段:**事件驱动的相关配置 **http字段:**http/https协议相关的配置 **mail:**邮件协议的相关配置 **stream字段:**一般的TCP代理或负载均衡配置
正常运行必备的配置参数
**user name:**启动Nginx工作进程的用户 **pid xxx/xxx/xxx:**指定存储Nginx主进程的进程号的文件路径 **include xxx:**包含进来的其他配置文件片段 **load_module xxx:**指定要装载的动态模块
配置参数的注意事项
每条参数必须以分号结尾
- 支持使用配置变量
内建变量:由Nginx模块引入,可以直接使用 自定义变量:由用户set命令定义,例如:set name value; 引用变量:$name
性能优化相关配置参数
work_processes 1:work进程数量默认为1,根据服务器的CPU数量设定,最大不应该超过CPU数量的2倍 **work_cpu_affinity auto:**worker与CPU进行绑定,做Nginx服务器可以使用此配置,由其它重要程序运行,不建议使用 **worker_priority number:**指定woker进程的nice值,设定worker进程的优先级(-20 ~ 20) **worker_rlimit_nofile number:**worker进程所能够打开的文件数量上限
5.5 http字段深入解析
6. 基础Nginx服务搭建
节点设计
主机 | 网络信息 | 说明 | Kylin-1 | 192.168.110.1/24 | Web服务器 | [Step1]: 事先已经基于源码安装好Nginx,启动Nginx服务
[Step2]: 在安装Nginx的时候,默认会有一个测试页,访问该测试页
二、Nginx虚拟主机实验
1. 单个虚拟主机搭建
节点设计
主机 | 网络信息 | 说明 | Kylin-1 | 192.168.110.1/24 | Web服务器 | Kylin-2 | 192.168.110.2/24 | 测试客户端 | [Step1]: 新建网站素材目录和相关素材,分别创建索引文件、普通文件、未知文件和图片文件- mkdir-p /virtual/01
- echo"Welcome to visit Virtual01!"> /virtual/01/index.html
- echo"欢迎访问Virtual01!"> /virtual/01/README.txt
- echo"None"> /virtual/01/none
- wget-O /virtual/01/pic.jpg https://inews.gtimg.com/om_bt/O0e2a37GGF5CDfNgK8GU29rF_2eJlHLDsa17LABXns7V4AA/641
复制代码
[Step2]: 新建虚拟主机子配置文件- vim /opt/nginx/conf/virtual01.conf
- # 写入下列内容
- server {
- listen 80;# 定义监听端口
- server_name www.meaauf.com;# 定义域名
- charset utf-8;# 设置编码为 utf-8
- location / {
- root /virtual/01/;# 网站素材目录
- index index.html;# 网站索引文件名}}
复制代码 [Step3]: 编辑Nginx主配置文件- vim /opt/nginx/conf/nginx.conf
- # 在http字段内添加下列内容
- include virtual01.conf;
复制代码
[Step4]: 重新加载Nginx服务,调整防火墙策略- nginx -s reload
- firewall-cmd --add-service=http --permanent
- firewall-cmd --reload
复制代码 [Step5]: 编辑Kylin-2的hosts文件,添加域名解析- vim /etc/hosts
- # 追加下列内容192.168.110.1 meaauf.com www.meaauf.com
复制代码 [Step6]: 访问Kylin-1的网页内容
[Step7]: 访问Kylin-1的图片资源- http://www.meaauf.com/pic.jpg
复制代码
[Step8]: 访问Kylin-1的文本资源,因为Kylin-2没有安装中文包所以会显示乱码,此处采用终端访问- http://www.meaauf.com/README.txt
复制代码
[Step9]: 访问Kylin-1的未知文件,此时会询问我们是否下载该文件
[Step10]: 查看Nginx可识别的文件文件,可以通过mime.types文件查看,也可以添加内容以支持用户自定义文件类型
2. 基于IP地址划分虚拟主机
节点设计
主机 | 网络信息 | 说明 | Kylin-1 | 192.168.110.1/24
192.168.110.11/24 | Web服务器 | Kylin-2 | 192.168.110.2/24 | 测试客户端 | [Step1]: 为Nginx服务器临时添加一个IP地址,新建资源目录和索引文件- ip address add192.168.110.11/24 dev ens33
- mkdir /virtual/02
- echo"您正在访问192.168.110.1"> /virtual/01/index.html
- echo"您正在访问192.168.110.11"> /virtual/02/index.html
复制代码 [Step2]: 删除上述实验创建的虚拟主机配置文件,新建虚拟主机配置文件 virtual01.conf- rm-rf /opt/nginx/ virtual01.conf
- vim /opt/nginx/conf/virtual01.conf
- # 文件内容如下
- server {
- listen 80;
- server_name _;
- charset utf-8;
- location / {
- root /virtual/01/;
- index index.html;}}
复制代码 [Step3]: 新建虚拟主机配置文件 virtual02.conf- vim /opt/nginx/conf/virtual02.conf
- # 文件内容如下
- server {
- listen 192.168.110.11:80;
- server_name _;
- charset utf-8;
- location / {
- root /virtual/02/;
- index index.html;}}
复制代码 [Step4]: 编辑主配置文件,在配置文件中引入虚拟主机配置文件- vim /opt/nginx/conf/nginx.conf
- # 在http字段中添加下列内容
- include virtual02.conf;
复制代码
[Step5]: 检查配置文件语法,重新加载nignx配置
[Step6]: Kylin-2使用不同的IP地址测试访问Nginx
3. 基于端口号划分虚拟主机
节点设计
主机 | 网络信息 | 说明 | Kylin-1 | 192.168.110.1/24 | Web服务器 | Kylin-2 | 192.168.110.2/24 | 测试客户端 | [Step1]: 新建虚拟主机配置文件 virtual8182.conf- vim /opt/nginx/conf/virtual8182.conf
- # 文件内容如下
- server{
- listen 81;
- server_name _;
- charset utf-8;
- location / {
- root /virtual/81/;
- index index.html;}}
- server{
- listen 82;
- server_name _;
- charset utf-8;
- location / {
- root /virtual/8/;
- index index.html;}}
复制代码 [Step2]: 编辑Nginx主配置文件- vim /opt/nginx/conf/nginx.conf
- # 往http字段中引入虚拟主机配置文件
- include virtual8182.conf;
复制代码
[Step3]: 新建网站素材目录和索引文件- mkdir /virtual/{81,82}echo"访问的是192.168.110.1:81!"> /virtual/81/index.html
- echo"访问的是192.168.110.1:82!"> /virtual/82/index.html
复制代码 [Step4]: 重新加载Nginx,调整防火墙策略- nginx -s reload
- firewall-cmd --add-port=81/tcp --permanent
- firewall-cmd --add-port=82/tcp --permanent
- firewall-cmd --reload
复制代码 [Step5]: 客户端Kylin-2验证访问不同端口
4. 基于域名划分虚拟主机
节点设计
主机 | 网络信息 | 说明 | Kylin-1 | 192.168.110.1/24 | Web服务器 | Kylin-2 | 192.168.110.2/24 | 测试客户端 | [Step1]: 新建虚拟主机配置文件 virtualdomain.conf- vim /opt/nginx/conf/virtualdomain.conf
- # 文件内容如下
- server{
- listen 80;
- server_name kylin1.meaauf.com;
- charset utf-8;
- location / {
- root /virtual/kylin1/;
- index index.html;}}
- server{
- listen 80;
- server_name kylin2.meaauf.com;
- charset utf-8;
- location / {
- root /virtual/kylin2/;
- index index.html;}}
复制代码 [Step2]: 编辑Nginx主配置文件- vim /opt/nginx/conf/nginx.conf
- # 往http字段中引入虚拟主机配置文件
- include virtualdomain.conf;
复制代码
[Step3]: 新建网站素材目录和索引文件- mkdir /virtual/{kylin1,kylin2}]echo"您访问的是kylin1.meaauf.com!"> /virtual/kylin1/index.html
- echo"您访问的是kylin2.meaauf.com!"> /virtual/kylin2/index.html
复制代码 [Step4]: 重新加载Nginx[Step5]: 编辑客户端Kylin-2的hosts文件,添加域名解析- vim /etc/hosts
- # 追加文件内容192.168.110.1 meaauf.com www.meaauf.com kylin1.meaauf.com kylin2.meaauf.com
复制代码
[Step5]: 客户端Kylin-2验证访问不同域名
三、Nginx日志管理
1. Nginx日志书写格式
查看编译安装的Nginx日志书写格式- vim /opt/nginx/conf/nginx.conf
复制代码
日志格式解析- log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
- access_log logs/access.log main;
复制代码
日志参数解析
日志参数 | 说明 | $remote_addr | 记录访问网站的客户端IP地址 | $remote_user | 当Nginx配置了基本认证,此处才会记录认证的用户名,否则为空 | $time_local | 记录访问的时间和时区 | $request | 请求的完整行,包含请求方法(POST/GET)、请求的URL和HTTP协议版本 | $status | 响应的状态码 | $body_bytes_sent | 发送给客户端的字节数 | $http_referer | 引用页 | $http_user_agent | 用户代理的字符串 | $http_x_forwarded_fo | 通过HTTP代理或负载均衡器转发,会包含原始请求客户的IP地址 | 2. Nginx日志监控
节点设计
主机 | 网络信息 | 说明 | Kylin-1 | 192.168.110.1/24 | Web服务器 | Kylin-2 | 192.168.110.2/24 | 测试客户端 | [Step1]: 修改Nginx主配置文件,将日志信息相关配置语句取消注释。日志功能是默认开启的,与日志信息配置语句是否注释无关。- vim /opt/nginx/conf/nginx.con
- # 将下列行取消注释
- log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
- access_log logs/access.log main;
复制代码
[Step2]: 重新启动nginx服务[Step3]: 先清空nginx原有的日志信息,使用tail监控日志- echo> /opt/nginx/logs/access.log
- tail-f /opt/nginx/logs/access.log
复制代码 [Step4]: 使用Kylin-2访问Nginx
[Step5]: 查看监控的日志信息,当日志参数值为空,会使用“-”占位。
[Step6]: 关闭日志功能- vim /opt/nginx/conf/nginx.conf
- # 在http字段中添加下列语句
- access_log off;
复制代码
[Step7]: 检查Nginx配置文件语法,重新加载Nginx服务[Step8]: 清空日志内容,重新使用客户端访问Nginx。可以看到access.log日志文件为空。
在代理服务器、负载均衡服务器上可以不记录日志,减少磁盘I/O。- > /opt/nginx/logs/access.log
- ll /opt/nginx/logs/access.log
复制代码
3. 日志记录的许可范围
通过查看Nginx官网(Module ngx_http_log_module (nginx.org))提供的文档,可以看到- access_log xxx;# 书写范围允许在 http, server, location, if in location, limit_except
复制代码
- log_format name xxx;# 只允许书写在 http字段中
复制代码
不同的书写位置,具有不同的生效含义- http {
- log_format name xxx;
- access_log xxxx;# 全局生效
-
- server {
- access_log xxx;# 仅对当前虚拟主机生效}}
复制代码 4. 针对虚拟主机自定义日志
因为Nginx不允许 log_format 被放置在除http以外的块中,我们可以通过include的特性实现对虚拟主机的日志的自定义。
[Step1]: 先删除原有的所有虚拟主机配置文件与相关配置- rm-rf /opt/nginx/conf/virtual*
- rm-rf /virtual/
复制代码 [Step2]: 新建网站素材目录和索引文件- mkdir /{virtual01,virtual02}echo"virtual01"> /virtual01/index.html
- echo"virtual02"> /virtual02/index.html
复制代码 [Step3]: 新建虚拟主机,监听81端口- vim /opt/nginx/conf/virtual01.conf
- # 写入下列内容,log_format和server是平级的,等同于在http里面。日志格式名main1不能重复,需要全局唯一
- log_format main1 '$remote_addr - $remote_user [$time_local] "$request"';
- server {
- listen 81;
- server_name _;
- access_log logs/virtual01.log main1;
- location /{
- root /virtual01/;
- index index.html;}}
复制代码 [Step4]: 新建虚拟主机,监听82端口- vim /opt/nginx/conf/virtual02.conf
- # 写入下列内容
- log_format main2 '$remote_addr - $time_local';
- server {
- listen 82;
- server_name _;
- access_log logs/virtual02.log main2;
- location /{
- root /virtual02/;
- index index.html;}}
复制代码 [Step5]: 编辑Nginx主配置文件,在Server字段中引用虚拟主机配置文件,同时取消注释日志配置语句- vim /opt/nginx/conf/nginx.conf
- # 在http字段中添加下列内容
- include virtual01.conf;
- include virtual02.conf;
- log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
- access_log logs/access.log main;
复制代码
[Step6]: 检测nginx配置文件语法,重新加载nginx
[Step7]: 客户端Kylin-2分别访问Nginx的80、81和82端口- curl http://192.168.110.1
- curl http://192.168.110.1:81
- curl http://192.168.110.1:82
复制代码 [Step8]: 分别查看日志文件,Nginx的日志匹配会先匹配虚拟主机中,其次才是全局配置中- cat /opt/nginx/logs/virtual01.log
- cat /opt/nginx/logs/virtual02.log
- cat /opt/nginx/logs/access.log
复制代码
5. 错误日志管理
通过访问Nginx官网可以看到关于error_log 的相关说明- Syntax: error_log file[level];
- Default: error_log logs/error.log error;
- Context: main, http, mail, stream, server, location
复制代码 error_log 日志分别存在7个等级,不同等级所记录的信息内容不一样,其中debug记录最详细,alert记录最简略
debug:提供最详细的日志记录,包括处理的请求的每一步、模块加载、变量值 info:信息级别,记录一般的运行时信息 notice:通知级别,用于记录重要的正常操作信息 warn:警告级别,记录潜在的异常情况 error:错误级别,记录那些阻止正常请求处理的错误事件 crit:严重级别,记录非常严重的错误 alert:警报级别,用于表示需要立即采取行动的紧急情况
[Step1]: 编辑virtual01虚拟主机配置文件,添加错误日志记录,其中日志等级为 warn- vim /opt/nginx/conf/virtual01.conf
- # 写入下列内容
- error_log logs/virtual01-err.log warn;
复制代码
[Step2]: 检测nginx配置文件语法,重新加载nginx[Step3]: 使用客户端访问错误页面- curl http://192.168.110.1:81/kkk
复制代码
[Step4]: 查看错误日志和访客日志的内容,两个日志都会记录内容,但是错误日志所记录的内容更加详细- cat /opt/nginx/logs/virtual01.log
- cat /opt/nginx/logs/virtual01-err.log
复制代码
6. 错误日志优化
常规的错误代码
[Step1]: 编辑virtual01虚拟主机配置文件,添加错误日志重定向- error_page 404 error404.html;
- error_page 403 error403.html;
复制代码
[Step2]: 在/virtual01目录下新建404错误页面- echo'<img src="404.jpg">'> /virtual01/error404.html
- echo'<img src="403.jpg">"'> /virtual01/error403.html
复制代码 [Step3]: 检测nginx配置文件语法,重新加载nginx
[Step4]: 客户端Kylin-2访问Nginx的错误页面,可以看到被重定向到error404页面- http://192.168.110.1:81/kkkk
复制代码
[Step5]: 将/virtual01目录下的index.html属组和其它人的权限设置为0,然后访问页面,可以看到被重定向到error403错误页面- chmod600 /virtual01/index.html
- http://192.168.110.1:81
复制代码
7. 手动切割日志
手动切割日志的核心思想
将原先存在的 access.log 日志重命名 向 Nginx 发送 reopen 信号,重新生成日志
[Step1]: 利用for循环生成大量的日志信息- fornin{1..1000};docurl http://192.168.110.1;done
复制代码 [Step2]: 将原先存在的日志备份,也就是重命名。如果设置了定时任务,计算机会在准点后进行备份,备份时间就会变成最新的一天,可以通过 -d yesterday指定日期为前一天。- mv /opt/nginx/logs/access.log /opt/nginx/logs/access-$(date-d yesterday +%F).log
复制代码 [Step3]: 向nginx发送reopen信号,使其重新生成日志
8. logrotate日志切割工具
logrotate 是一个用于管理日志文件自动轮转、压缩、删除和邮寄的工具。logrotate主要配置文件在 /etc/logrotate.conf,可以通过在 /etc/logrotate.d/目录下单独的配置文件来管理特定的服务日志。
[Step1]: 编译安装的Nginx不会在/etc/logrotate.d/目录下创建文件,需要我们手动创建配置文件- cp /etc/logrotate.d/samba /etc/logrotate.d/nginx
- # 写入下列内容
- /opt/nginx/logs/*.log {
- daily # 日志轮转的频率是每天
- missingok # 如果日志文件不存在,忽略错误继续处理下一个文件
- rotate 52# 最多保留52个存档
- compress # 切割后压缩文件
- delaycompress # 延迟压缩直到下一次切割,也就是本次切割不会压缩,下一次切割时才会压缩
- notifempty # 如果日志文件为空,不会进行切割
- create 640 nginx adm # 切割后创建一个新的空日志文件,权限设置为640,
- sharedscripts # 标记脚本开始
- postrotate # 日志切割要执行的命令
- nginx -s reopen # 向Nginx发送reopne信号
- endscript # 标记sharedscripts脚本结束}
复制代码
[Step2]: 先清除日志中内容,利用for循环产生大量日志信息- > /opt/nginx/logs/access.log
- fornumin{1..10000};docurl http://192.168.110.1;done
复制代码 [Step3]: 手动执行 logrotate 命令切割日志,根据我们定义的选项【delaycompress】,日志的压缩会延迟到下一次的切割- logrotate-f /etc/logrotate.d/nginx
复制代码
[Step4]: 再次利用for循环产生大量日志信息,手动执行 logrotate 命令切割日志,可以看到第一次产生的日志已经被压缩- fornumin{1..10000};docurl http://192.168.110.1;donelogrotate-f /etc/logrotate.d/nginx
复制代码
[Step5]: 将日志切割任务写入cron定时任务中- crontab-e# 写入下列内容
- 00 00 * * * logrotate-f /etc/logrotate.d/nginx
复制代码 四、Nginx高级功能
1. 实现类似FTP的目录索引下载命令
[Step1]: 新建一个目录,将本地光盘挂载到该目录下- mkdir /mnt/cdrom
- mount /dev/cdrom /mnt/cdrom
复制代码 [Step2]: 新建虚拟主机配置文件- vim /opt/nginx/conf/ftp.conf
- # 文件内容如下
- server{
- listen 8080;
- location /{
- autoindex on;# 启用目录浏览功能
- autoindex_localtime on;# 使目录列表中的文件时间以服务器本地时间显示
- autoindex_exact_size off;# 显示文件的精确大小(字节)
- root /mnt/cdrom;# 数据目录}}
复制代码 [Step3]: 编辑Nginx主配置文件- vim /opt/nginx/conf/nginx.conf
- # 在http字段中引入虚拟主机配置文件
- include ftp.conf;
复制代码
[Step4]: 检测nginx配置文件语法,重新加载nginx,调整防火墙策略- nginx -t
- nginx -s reload
- firewall-cmd --add-port=8080/tcp --permanent
- firewall-cmd --reload
复制代码 [Step5]: 使用客户端浏览,同时该功能也可以为客户提供YUM仓库源
2. Nginx的链接数监控
如果监控Nginx链接数,需要查看当前的Nginx是否支持。
链接数监控模块需要使用 http_stub_status_module 模块,而我们编译安装的Nginx不支持该模块。需要重新编译安装。
[Step1]: 先删除源有的nginx命令[Step2]: 重新解压nginx源码包- tar-zxf nginx-1.18.0.tar.g
- cd nginx-1.18.0/
复制代码 [Step3]: 生成Makefile- ./configure --prefix=/opt/nginx --with-http_stub_status_module # 启用Nginx的HTTP stub status模块
复制代码
[Step4]: 编译安装[Step5]: 将Nginx安装目录下的nginx命令拷贝到/usr/sbin目录下- cp-a /opt/nginx/sbin/nginx /usr/sbin/
复制代码 [Step6]: 删除解压后的源码包,查看当前编译安装的Nginx支持模块,可以看到已经支持该模块- rm-rf nginx-1.18.0
- nginx -V
复制代码
[Step7]: 启动nginx[Step8]: 新建虚拟主机配置文件- vim /opt/nginx/conf/link.conf
- # 写入下列内容
- server {
- listen 8080;
- server_name _;
- stub_status on;# 开启链接数监控
- access_log off;# 关闭日志记录}
复制代码 [Step9]: 编辑Nginx主配置文件- vim /opt/nginx/conf/nginx.conf
- # 在http字段中引入虚拟主机配置文件
- include link.conf;
复制代码
[Step10]: 检测nginx配置文件语法,重新加载nginx[Step11]: 客户端访问,可以看到当前的链接数和http请求等参数
3. 基于IP地址的访问限制
Nginx分别提供了 allow和deny 字段来限制指定的IP地址访问。- https://nginx.org/en/docs/http/ngx_http_access_module.html
复制代码
allow和deny字段存在匹配顺序,根据书写顺序进行匹配。默认情况下,Nginx隐含allow语句,也就是默认允许所有网段主机访问。allow和deny字段是基于【$remote_addr】进行判断。
节点设计
主机 | 网络信息 | 说明 | Kylin-1 | 192.168.110.1/24
192.168.19.234 | Web服务器 | Kylin-2 | 192.168.110.2/24
192.168.19.149 | 测试客户端 | [Step1]: 新建虚拟主机配置文件- vim /opt/nginx/conf/control.conf
- # 写入下列内容
- server{
- listen 81;
- server_name _;
- location / {
- allow 192.168.110.0/24;
- root /www/control/;
- index index.html;}}
复制代码 [Step2]: 新建网站素材目录和索引文件- mkdir-p /www/control/
- echo"control test"> /www/control/index.html
复制代码 [Step3]: 编辑Nginx配置文件- vim /opt/nginx/conf/nginx.conf
- # 在http字段中添加include
- include control.conf;
复制代码 [Step4]: 重新加载nginx[Step5]: 客户端Kylin-1测试访问Nginx,可以看到即使设置了只允许192.168.110.0/24网段访问,但是192.168.19.234未受影响。- curl http://192.168.110.1:81
- curl http://192.168.19.234:81
复制代码
[Step6]: 修改虚拟主机配置文件,添加deny语句
[Step7]: 重新加载nginx[Step8]: 客户端Kylin-1重新测试访问,可以看到192.168.19.0/24已经被拒绝访问。
[Step9]: 可能会存在疑惑,Kylin-1和Kylin-2上都存在两个网段【192.168.110.0/24和192.168.19.9/24】,那么如何判断自己是使用哪个网段去访问对应的IP地址?
在这里插入图片描述- # 也可以通过查看Nginx日志cat /opt/nginx/logs/access.log
复制代码
4. 基于用户认证的访问限制
适用场景:内网环境中的的一些资料网站的保护。
[Step1]: 安装httpd-tools工具包- yum install-y httpd-tools
复制代码 [Step2]: 创建密码文件- mkdir /www/auth
- htpasswd -bc /www/auth/htpasswd kylin Kylin2024
复制代码**-b:**非交互式输入用户名和密码 **-c:**创建一个加密文件,此处的加密文件为 /www/auth/htpasswd **kylin Kylin2024:**分别为账号和密码
[Step3]: 新建虚拟主机配置文件- vim /opt/nginx/conf/auth.conf
- # 写入下列内容
- server {
- listen 82;
- server_name _;
- location /{
- root /www/auth/;
- index index.html;
- auth_basic "Please input your account password";# 弹出的提示信息
- auth_basic_user_file /www/auth/htpasswd;# 指定密码验证文件}}
复制代码 [Step5]: 新建网站素材文件和索引文件- echo"basic"> /www/auth/index.html
复制代码 [Step6]: 编辑Nginx主配置文件- vim /opt/nginx/conf/nginx.conf
- # 在http字段中添加下列内容
- include auth.conf;
复制代码
[Step7]: 验证Nginx配置文件语法,重新加载nginx,,调整防火墙策略- nginx -t
- nginx -s reload
- firewall-cmd --add-port=82/tcp --permanent
- firewall-cmd --reload
复制代码 [Step8]: 客户端验证访问
[Step9]: curl的方式访问- curl-u kylin:Kylin2024 http://192.168.110.1:82
复制代码
5. Nginx请求频率限制(限流)
ngx_http_limit_req_module用于限制每个定义键的请求处理率,特别是来自单个IP地址的请求的处理率。限制是使用“泄漏桶”方法实现的。
[Step1]: 新建虚拟主机配置文件- vim /opt/nginx/conf/limit.conf
- # 文件内容如下
- limit_req_zone $binary_remote_addrzone=one:10m rate=1r/s;# limit_req_zone:定义一个限制请求的区域,告诉Nginx如何跟踪请求频率并应用限制# $binary_remote_addr:代表客户端IP地址的二进制形式,使用二进制可以减少内存占用# zone=one:10m:定义区域one,并为其分配10m内存# rate=1r/s:限制请求速率为每秒1个请求
- server {
- listen 83;
- server_name _;
- access_log logs/limit.log;# 应用区域规则one,burst=3,允许超出限制后再解析3个请求,也就是请求速率超过1r/s也会额外处理3个请求
- limit_req zone=one burst=3 nodelay;
- location /{
- root /www/limit/;
- index index.html;}}
复制代码 [Step2]: 编辑Nginx主配置文件- vim /opt/nginx/conf/nginx.conf
- # 在http字段中添加下列内容
- include limit.conf;
复制代码
[Step3]: 新建素材目录和索引文件- mkdir /www/limit
- echo"limit limit"> /www/limit/index.html
复制代码 [Step4]: 验证配置文件语法,重新加载nginx,调整防火墙策略- nginx -t
- nginx -s reload
- firewalld-cmd --add-port=83/tcp --permemnt
- firewalld-cmd --relaod
复制代码
[Step5]: 监控日志,客户端正常访问Nginx- tail-f /opt/nginx/logs/limit.log
- foriin{1..10};docurl http://192.168.110.1:83;sleep1;done
复制代码
[Step6]: 清空日志,重新监控日志,客户端按照每秒2次的访问频率访问Nginx- > /opt/nginx/logs/limit.log
- tail-f /opt/nginx/logs/limit.log
复制代码
6. Nginx编译安装第三方模块
默认情况下,在编译安装Nginx时,不会安装一些其他的模块,除了我们自行启用的模块
[Step1]: 验证不存在该模块的情况下使用该模块:新建虚拟主机配置文件- vim /opt/nginx/conf/eecho.conf
- # 写入下列内容
- server {
- listen 81;
- server_name _;
- location /{echo"Using echo module.";echo$remote_addr;}}
复制代码 [Step2]: 验证不存在该模块的情况下使用该模块:编辑Nginx主配置文件- vim /opt/nginx/conf/nginx.conf
- # 在http字段中添加下列内容
- include eecho.conf;
复制代码
[Step3]: 验证不存在该模块的情况下使用该模块:验证配置文件语法,此时会echo为未知指令
[Step4]: 安装git工具,然后从GitHub上下载echo模块的源码- yum install-ygitgit clone https://github.com/openresty/echo-nginx-module.git
复制代码
[Step5]: 下载完成后,当前目录下会存在一个echo-nginx-module的目录
[Step6]: 准备一个Nginx源码包,解压后进行编译安装- tar zxf nginx-1.18.0.tar.gz
- cd nginx-1.18.0/
- # 添加echo的参数,别忘记启用原有的模块
- ./configure --prefix=/opt/nginx --add-module=/root/echo-nginx-module --with-http_stub_status_module
- make&&makeinstallcd# 切换会主目录rm-rf nginx-1.18.0 # 删除源码目录
复制代码 [Step6]: 重新查看nginx支持的模块
[Step7]: 将nginx命令拷贝到sbin目录下或将nginx命令目录添加到环境变量中- rm-rf /usr/sbin/nginx
- cp-a /opt/nginx/sbin/nginx /usr/sbin/
复制代码 [Step8]: 验证Nginx配置文件语法,重新加载Nginx配置文件[Step9]: 客户端访问Nginx- curl http://192.168.110.1:81
复制代码
[Step10]: 使用浏览器访问,默认Nginx不会解析该内容,会以附加形式下载
|
|