1.nginx安装

现将前置工作完成,关闭防火墙,yum配置阿里云镜像,安装常用软件包

配置好liunx镜像源,这是操作文档链接

nginx: Linux packages

先安装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访问

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐