linux运维基础-nginx
1.nginx安装
现将前置工作完成,关闭防火墙,yum配置阿里云镜像,安装常用软件包

配置好liunx镜像源,这是操作文档链接
先安装yum-utils,这个软件包

编辑linux配置文件
vim /etc/yum.repos.d/nginx.repo
内容就是
[nginx-stable]
name=nginx stable repo
baseurl=https://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=https://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
在列出linux可用镜像,后安装nginx组件
yum list nginx
yum install -y nginx
可用nginx -V查看nginx的一些配置文件地址,下面是
--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 进程文件
--user=nginx 用户
--group=nginx 用户组
--with-http_gunzip_module 启动压缩模块
--with-http_ssl_module 启动安全模块
2.nginx虚拟机配置
nginx作为服务的相关命令
systemctl start nginx #启动nginx服务
systemctl stop nginx #停止nginx服务
systemctl restart nginx #重启nginx服务
systemctl reload nginx #重新加载nginx配置文件
nginx命令相关的选项
nginx -h #查看帮助文档
nginx -s start|stop|reload|quit #发送指定信号
nginx -t #判断nginx配置文件是否正常,直接决定服务是否能正常启动
nginx -v #查看版本
nginx -e #配置错误日志

错误示范,这就说明配置文件第10有问题有个;出现

nginx配置文件
nginx配置结构

nginx两个主要的配置文件

查看主要配置文件/etc/nginx/nginx.conf,全局配置

配置工作进程的连接数

配置代理,缓存,日志定义等绝大多数的功能和第三方模块的配置

/etc/nginx/conf.d/default.con f配置文件

测试练习
自定义一个寻你主句(监听端口80,页面资源访问/opt/user,主机名设置为www.xiaobai.com)
1.创建一个同样的配置文件

2.在同样的那个配置文件处做操作

3.创建默认资源访问位置

在/opt/user目录下创建默认访问地址index.html
4.修改本地hosts文件访问页面资源地址C:\Windows\System32\drivers\etc

5.访问页面看输出是否正常

注意这里需要重启一下nginx服务才会生效
3.nginx日志配置分析
1.nginx访问日志
1.访问日志:记录每个请求的信息,包括客户端ip、请求时间、请求方法

其中access.log为访问日志
访问日志的生成格式,为一下形式,与日志文件上的内容一一对应


2.修改指定日志的生成形式
进入etc/nginx/conf.d目录,复制default.conf到一个新的user.conf文件
需要修改的配置文件

在主配置文件中修改配置文件在http中添加

这里的user是和上面对应的
3.在主机host文件添加绑定域名ip
![]()
4.监控日志文件访问域名
每次访问user.xiaobai.com都会生成指定格式的日志文件

2.nginx错误日志
Linux 系统(rsyslog)遵循 RFC5424 标准,共 8 个级别,数字越小,级别越高、故障越严重,所有服务(Nginx/MySQL/PHP)都兼容这套标准。
| 数字 | 级别名称 | 中文释义 | 核心含义(必看) | 典型场景 |
|---|---|---|---|---|
| 0 | emerg |
紧急 | 系统完全崩溃,无法使用,必须立刻处理 | 服务器宕机、内核崩溃 |
| 1 | alert |
警报 | 必须立即修复的严重故障 | 硬盘满、数据库无法连接 |
| 2 | crit |
严重 | 关键功能故障,影响核心服务 | Nginx 无法启动、端口被占用 |
| 3 | error |
错误 | 普通错误,服务可运行,但功能异常 | 404 报错、配置语法错误 |
| 4 | warn |
警告 | 潜在问题,不影响运行,建议修复 | 配置不规范、资源占用过高 |
| 5 | notice |
注意 | 正常运行中的重要提示信息 | 服务重启、配置加载成功 |
| 6 | info |
信息 | 普通运行日志,无异常 | 客户端连接、请求成功记录 |
| 7 | debug |
调试 | 最详细日志,仅开发 / 排错用 | 调试代码、排查复杂问题 |
nginx级别优先级
emerg > alert > crit > error > warn > notice > info > debug

因此关闭错误日志就是将error_log放入/dev/null中
3.修改404访问页面
1.自定义一个错误页面
2.修改user.conf配置文件

将这部分修改成
error_page 404 /404.html;
location = /404.html{
root /opt/user;
}
且将注释去掉
在/opt/user中自定义404.html文件,可以自定义一个比较好看的前端页面,他会精准匹配404.html文件

这里就随便写123了,访问不存在的页面返回404.html

4.日志轮转,压缩,删除
logrotate可以根据需求配置为每天、每周、每月执行一次压缩和删除操作
nginx支持日志轮转功能,这意味它可以在达到一定问阿金大小或时间限制时自动创建新文件,防止文件过大占用磁盘空间
# 检查logrotate是否安装
rpm -qa | grep /etc/logrotate
#查看其配置文件
cat /etc/logrotate.d/nginx
# 要轮转的日志路径(支持多个路径,空格分隔)
/var/log/nginx/access.log
/var/log/nginx/error.log {
daily # 每天轮转一次
rotate 7 # 保留最近 7 份旧日志(即 7 天)
compress # 轮转后压缩旧日志(.gz 格式)
delaycompress # 延迟压缩:本次轮转的日志下次才压缩(避免 Nginx 还在写)
missingok # 忽略日志不存在的错误
notifempty # 日志为空时不轮转
create 0644 nginx nginx # 轮转后创建新日志,权限 0644,所有者 nginx 用户和组
sharedscripts # 所有日志轮转完只执行一次下面的脚本
postrotate # 轮转后执行的脚本:reload Nginx,让它写新日志
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid` # 发送 USR1 信号给 Nginx,平滑 reload
fi
endscript
}
我们手动轮转一次查看一下效果

这是access.log开始配置的日志文件,我们手动轮转
logrotate -f /etc/logrotate.d/nginx

轮转成功,正常情况下默认日志轮转会有时间戳,下面这种形式

我们查看轮转过后的access.log,为空

且日志文件都备份到了

5.日志分析
日志分析
提取日志中访问量前十的ip
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
其中每个字段的作用
命令段 核心作用 关键说明
awk '{print $1}' 日志路径 提取每行日志的第 1 个字段(客户端 IP) 日志格式修改后,更换字段序号即可
sort 对提取的 IP 进行排序 必须先排序,uniq才能正确去重统计
uniq -c 去重并统计每行(IP)的出现次数 输出格式:次数 IP
sort -nr 按统计次数数字降序排序 -n 按数字排序(避免字符串排序的 100<99 问题);-r 倒序(从大到小)
head -10 取前 10 条结果(访问量最高的 10 个 IP) 改数字可调整 TOP 数量,比如head -20取前 20
其中常用参数
uniq: 删除文本文件中相邻的重复的行并写到标准输出
-c : 在每行前加上表示相应行目出现次数的前缀编号
-d : 只显示重复的行
-i : 略大小写差异
-u : 只显示出现一次的行
sort: 以行为单位对文件进行排序
-b : 忽略前导的空格
-d : 只考虑空格,字母,数字
-f : 忽略字母的大小写
-M : 排序月份, (未知词)<"JAN"< ... <"DEC"
-n : 根据字符串的数值进行排序
-r : 逆向排序
-u : 对相同的行只输出一行
+n : n为数字,对指定的列进行排序,+0 表示第1列, 以空格或制表符作为列的间隔符
6.日志优化
1.不同项目使用不同的配置文件
在日志中一般不同的虚拟主机生成的入职放入不同的日志文件中
![]()
这是之前创建的2个conf文件,他们两个存放日志的位置都是相同的都是access.log这样会对性能、分析、隔离等操作造成很大影响,因此需要分割

将其中的文件名修改产生新的日志,且在不同的文件里面
我们将后面的access.log修盖为user.access.log,实时监控一下日志

修改生效
2.开启日志缓存
大量访问来到时候对每一条日志都是打开日志写入文件,最后关闭,会大量占用系统IO,可以使用open_log_file_cache来配置缓存处理这种情况
open_log_file_cache 必须配置在 http 块
| 参数 | 含义 | 推荐值 | 关键说明 |
|---|---|---|---|
max=N |
缓存的最大文件句柄数量 | 1024/2048 |
超过这个数量会用 LRU(最近最少使用)算法淘汰旧句柄,根据你的虚拟主机数量调整(一般是站点数的 2-3 倍) |
inactive=时间 |
句柄的空闲超时时间 | 60s |
如果一个句柄在这个时间内没被使用,就会被自动清理出缓存 |
min_uses=N |
在 inactive 时间内,句柄至少被使用多少次才会被保留在缓存 |
3 |
避免缓存偶尔用一次的冷门日志文件,浪费缓存空间 |
valid=时间 |
多久检查一次日志文件是否还存在(路径 / 权限是否变化) | 60s |
防止日志文件被删除 / 移动后,Nginx 还握着旧句柄写不进去 |
off |
关闭日志缓存 | - | 用于临时关闭缓存做测试 |
open_log_file_cache max=1024 inactive=60s min_uses=3 valid=60s;
复制直接使用就可以

4.nginxWeb模块
1.连接状态
目的观察用户nginx服务器的连接数量
状态模块:stub_status_module
启用状态模块

访问页面

每个参数的作用
2.文件读取
当访问量大的时候可以开启tcp_nopush模块和tcp_nodelay模块

http {
# ... 你的其他配置 ...
# 1. 开启 sendfile:直接在内核空间传输文件,不经过用户空间,大幅减少 IO 拷贝
sendfile on;
# 2. 开启 tcp_nopush:配合 sendfile 使用,等数据包攒到一定大小(MSS)再发送,减少网络包数量
tcp_nopush on;
# 3. 开启 tcp_nodelay:配合 keepalive 使用,小数据包立即发送,降低延迟(和 tcp_nopush 不冲突,适用场景不同)
tcp_nodelay on;
keepalive_timeout 65;
}
在开启tcp_nopush的时候最好也将tcp_nodelay开启,减少小数据包的延迟
也就是nginx.conf中的

3.文件压缩
在文件传输过程中进行压缩,提升传输效率,在nginx.conf中配置

http {
# ... 你的其他配置 ...
# 1. 开启 Gzip 压缩
gzip on;
# 2. 压缩级别(1-9):1 最快压缩率低,9 最慢压缩率高,推荐 6(平衡)
gzip_comp_level 6;
# 3. 最小压缩文件大小(小于 1k 的文件压缩反而变大)
gzip_min_length 1k;
# 4. 压缩的文件类型(必须包含 text/html,其他按需加)
gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss applicati on/xml;
# 5. 给响应头加 Vary: Accept-Encoding,告诉代理服务器区分压缩和非压缩版本
gzip_vary on;
# 6. 禁用 IE6 及以下的压缩(IE6 对 Gzip 支持有 bug,现在基本可以忽略)
# gzip_disable "MSIE [1-6]\.";
}
将资源页面放在/user/share/nginx目录下,不同的虚拟目录路劲不同,我们自己随便找一个js文件上传访问看资源压缩情况


说明资源压缩成功,注意这里图片或视频不用压缩,压缩基本没用还会占用资源
4.页面缓存
通过 expires 指令给静态资源设置缓存时间,用户第二次访问时直接从本地读取,不请求服务器。
减少服务器资源占用
server {
# ... 你的虚拟主机配置 ...
# 场景1:图片、视频、字体等长期不变的资源,缓存 30 天
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot|mp4|webm)$ {
expires 30d;
add_header Cache-Control "public, immutable"; # immutable 告诉浏览器缓存期间不要重新验证
}
# 场景2:HTML、XML 等可能更新的资源,缓存 1 小时
location ~* \.(html|htm|xml)$ {
expires 1h;
add_header Cache-Control "public, must-revalidate"; # 缓存到期后必须回服务器验证
}
# 场景3:PHP 等动态内容,不缓存
location ~ \.php$ {
expires -1; # 立即过期
add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
# ... 你的 PHP 处理配置 ...
}
}
访问之后会在用户本地有资源,且响应头中有一个字段

5.防盗链
通过 valid_referers 模块验证请求的来源(Referer),只允许自己的域名访问图片、视频等静态资源,防止别人盗用你的带宽
server {
# ... 你的虚拟主机配置 ...
location ~* \.(jpg|jpeg|png|gif|ico|svg|mp4|webm)$ {
# 1. 允许的 Referer 来源
# none:允许没有 Referer 的请求(比如直接在浏览器输入地址)
# blocked:允许 Referer 被防火墙/代理修改的请求
# server_names:允许自己的域名(包括 server_name 里的所有域名)
valid_referers none blocked server_names *.your-domain.com;
# 2. 如果 Referer 不匹配,返回 403 禁止访问,或者返回一张防盗链图片
if ($invalid_referer) {
return 403;
# 或者重定向到防盗链图片:return 302 https://your-domain.com/anti-theft.jpg;
}
# 配合浏览器缓存
expires 30d;
}
}
6.location
Location 是 Nginx 处理请求的路由规则,决定不同的请求走哪个配置
| 类型 | 语法 | 匹配规则 | 优先级 |
|---|---|---|---|
| 精确匹配 | location = /path |
完全匹配路径,一点不差 | 1(最高) |
| 前缀匹配(优先) | location ^~ /path |
匹配前缀,匹配后不再检查正则 | 2 |
| 正则匹配(区分大小写) | location ~ /path |
正则匹配,区分大小写 | 3 |
| 正则匹配(不区分大小写) | location ~* /path |
正则匹配,不区分大小写 | 3 |
| 普通前缀匹配 | location /path |
匹配前缀,优先级最低 | 4(最低) |
| 通用匹配 | location / |
匹配所有请求,兜底 | 4 |
优先级速记
精确匹配 = > 前缀优先 ^~ > 正则匹配 ~ / ~*(按配置顺序,先匹配到先生效) > 普通前缀匹配 /path > 通用匹配
5.访问控制
当某一段时间内流量异常,且负载过大,有恶意攻击的访问,会带来服务器的压力,因此采取并发限制,限制并发数和连接请求数
1.限制并发连接数
防止cc攻击,一秒最多10个请求
1.在http块中定义限流规则
http {
# 定义限流规则:
# limit_req_zone 限流键 zone=规则名:内存大小 rate=限速频率
# $binary_remote_addr:按客户端IP限流(二进制存储,更省内存)
# rate=10r/s:每秒最多10个请求
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
# 定义并发限制规则:按IP限制,规则名conn_limit,10M内存
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
# ... 你的其他全局配置
}

2.在server或者location块中限流
server {
# 全局对整个站点启用限流
# burst=20:允许超过限速的突发请求最多20个,nodelay:突发请求不排队,立即处理
limit_req zone=req_limit burst=20 nodelay;
# ... 你的其他配置
# 也可以单独对接口限流,优先级更高
location ^~ /api/ {
limit_req zone=req_limit burst=5 nodelay;
}
}
我们在之前创建的user.xiaobai.com的主机里面添加访问策略

2.访问控制
location /admin {
# 1. 允许 内网IP / 信任IP
allow 127.0.0.1;
allow 192.168.0.0/16; # 局域网最常用
allow 10.0.0.0/8;
allow 172.16.0.0/12;
# 2. 其他IP全部拒绝(但下面会被 satisfy any 覆盖)
deny all;
# 3. 开启 Basic Auth 密码认证
auth_basic "Login Required";
auth_basic_user_file /etc/nginx/.htpasswd;
# ====================== 核心 ======================
# 满足任意一个即可:IP允许 或 密码正确
satisfy any;
#satisfy all; #满足所有条件才运行
}
上述的整体有两个模块分别为基于IP的访问控制模块,以及基于用户信任登录模块
1.基于IP的访问控制模块
模块限制访问某些客户端地址,访问也能通过密码请求结果或JWT来限制满足控制地址
其中的 allow允许访问的ip的地址,deny不允许的ip访问地址
2.基于用户信任登录模块
1.创建Basic Auth密码文件
yum install -y httpd-tools
2.生成账号密码
htpasswd -c /etc/nginx/.htpasswd admin
3.给文件赋权
chmod 644 /etc/nginx/.htpasswd
chown nginx:nginx /etc/nginx/.htpasswd
练习
在user.conf模块添加限流访问控制模块
我自己在user.conf里添加一个访问控制模块admin,且在其中添加身份验证,加访问速度限制
1.先创建访问模块
在我之前创建的user.conf中添加

然后再在其中添加限制模块,添加访问限制模块,限制最多超过http配置文件并发连接数为3,处理每秒请求数超过配置数三个

添加用户信任登录模块

创建Basic Auth文件
1.安装工具
yum install -y httpd-tools
2.生成账号密码
htpasswd -c /etc/nginx/.htpasswd admin
3.赋权
chmod 644 /etc/nginx/.htpasswd
chown nginx:nginx /etc/nginx/.htpasswd
这里安装执行命令设置密码后

重启nginx访问

更多推荐




所有评论(0)