Nginx再习

Nginx

一、Nginx 基础认知

1.1 什么是Nginx

Nginx是一款轻量级、高性能的HTTP/反向代理服务器,同时支持TCP/UDP四层负载、邮件代理等功能,核心解决C10K(万级并发) 问题,被淘宝、京东、新浪等一线互联网公司广泛使用,2019年被F5以6.7亿美元收购。

1.2 Nginx 核心优势

  • 高并发 :基于事件驱动+非阻塞I/O模型,单机可支撑10万级并发连接

  • 低内存:10000个keep-alive非活动连接仅需2.5M内存

  • 热部署:支持不停机更新配置、升级版本、切换日志

  • 模块化:核心模块+第三方模块可灵活扩展功能

  • 多场景:静态资源服务、反向代理、负载均衡、动静分离、防盗链等

1.3 Nginx 与 Apache 核心对比

特性 Apache Nginx
并发模型 多进程/多线程(阻塞) 事件驱动(非阻塞)
最大并发 约1024(prefork) 10万+
内存占用 高(每个请求一个进程) 极低
静态资源处理 一般 极致优化
配置复杂度 较复杂 简洁易懂
热部署 不支持 支持

二、Nginx 环境搭建(实验1:源码编译安装)

实验目的

掌握Nginx源码编译安装的核心步骤,自定义编译模块,完成基础环境配置。

实验步骤

步骤1:安装编译依赖
Bash 复制代码
# 安装基础编译工具和依赖库
dnf install gcc pcre-devel zlib-devel openssl-devel -y
# 创建Nginx运行用户(无登录权限)
useradd -s /sbin/nologin -M nginx
步骤2:下载并解压Nginx源码
Bash 复制代码
# 下载源码(官网地址:https://nginx.org/en/download.html)
wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 解压
tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
步骤3:配置编译参数(自定义模块)
Bash 复制代码
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \ # 支持HTTPS
--with-http_v2_module \ # 支持HTTP/2
--with-http_realip_module \ # 支持IP透传
--with-http_stub_status_module \ # 支持状态页
--with-http_gzip_static_module \ # 支持静态压缩
--with-pcre \ # 支持正则
--with-stream \ # 支持四层TCP/UDP代理
--with-stream_ssl_module # 支持四层SSL

核心说明--prefix指定安装目录,后续所有文件均在该目录下;--with-*开启对应模块,按需添加。

步骤4:编译并安装
Bash 复制代码
# 编译(-j 后接CPU核心数,加速编译)
make -j 4
# 安装
make install
步骤5:配置环境变量并验证
Bash 复制代码
# 配置环境变量,方便全局调用nginx指令
echo 'export PATH=$PATH:/usr/local/nginx/sbin' >> ~/.bash_profile
source ~/.bash_profile
# 验证版本和编译参数
nginx -V
步骤6:创建systemd服务(开机自启)
Bash 复制代码
# 编写服务文件
vim /lib/systemd/system/nginx.service

写入以下内容:

TOML 复制代码
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
Bash 复制代码
# 重载服务、启动并设置开机自启
systemctl daemon-reload
systemctl start nginx
systemctl enable nginx
# 验证运行状态
systemctl status nginx
步骤7:访问验证

打开浏览器,访问服务器IP(如http://172.25.254.100),显示Nginx默认欢迎页。

实验小结

源码编译安装的核心是配置参数 ,需根据业务需求开启模块;nginx -t可检测配置文件语法,是后续所有操作的前提。

三、Nginx 核心配置详解

3.1 配置文件结构

Nginx的配置文件位于/usr/local/nginx/conf/nginx.conf,采用层级式指令块结构,核心分为4部分:

Nginx 复制代码
# 1. 全局配置段(main):对整个Nginx生效
user nginx nginx;
worker_processes 1; # 工作进程数,建议等于CPU核心数
error_log logs/error.log error;
pid logs/nginx.pid;

# 2. 事件驱动配置段:影响网络连接
events {
    use epoll; # 事件驱动模型,Linux推荐epoll
    worker_connections 1024; # 单个工作进程最大并发连接数
    accept_mutex on; # 解决惊群问题
    multi_accept on; # 单个进程同时接受多个连接
}

# 3. HTTP配置段:所有HTTP/HTTPS相关配置,可嵌套多个server
http {
    include mime.types; # 引入MIME类型配置
    default_type application/octet-stream;
    sendfile on; # 开启零拷贝,提升静态资源传输速度
    keepalive_timeout 65; # 长连接超时时间

    # 4. 虚拟主机配置段(server):一个server对应一个站点
    server {
        listen 80; # 监听端口
        server_name localhost; # 域名/IP

        # 5. 路径匹配配置段(location):匹配用户请求的URI
        location / {
            root html; # 站点根目录
            index index.html index.htm; # 默认首页
        }
    }
}

3.2 核心配置指令(重点)

(1)全局配置
  • worker_processes [数字|auto]:工作进程数,建议设为CPU核心数 (如worker_processes 4),充分利用CPU资源。

  • worker_cpu_affinity 0001 0010 0100 1000:进程绑定CPU核心,避免进程在核心间切换,提升性能。

  • worker_rlimit_nofile 65535:工作进程最大打开文件数,需与系统ulimit -n保持一致。

(2)事件配置
  • use epoll:Linux下最优事件驱动模型,替代select/poll,支持高并发。

  • worker_connections 65535:单个进程最大并发连接数,实际并发=worker_processes * worker_connections(反向代理时需除以2)。

(3)HTTP配置
  • sendfile on:开启零拷贝,跳过用户态数据拷贝,直接在内核态传输文件,大幅提升静态资源速度。

  • keepalive_timeout 65:长连接超时时间,减少TCP三次握手次数。

  • keepalive_requests 500:单次长连接最大请求数,默认100,建议调大。

  • gzip on:开启Gzip压缩,减少传输带宽(后续高级功能详细讲解)。

(4)Server配置
  • listen 80:监听端口,可指定IP(如172.25.254.100:80)。

  • server_name zt.brs.org www.zt.com:虚拟主机域名,支持多个域名、通配符(*.zt.com)、正则(~^www\d+.zt.com$)。

(5)Location配置

核心 :根据用户请求的URI进行匹配,执行对应配置,支持匹配修饰符 ,优先级从高到低为:= > ^~ > ~/~* > 不带符号

  • =:精确匹配,如location = /index.html,匹配http://域名/index.html

  • ^~:前缀匹配,优先于正则,如location ^~ /static/,匹配以/static/开头的URI。

  • ~:正则匹配,区分大小写,如~ .php$,匹配以.php结尾的URI。

  • ~*:正则匹配,不区分大小写,如~* .(jpg|png|gif)$,匹配图片后缀。

  • 不带符号:普通前缀匹配,如location /blog/,匹配以/blog/开头的URI。

root vs alias

  • root:站点根目录,实际路径=root + location ,如root /webdata; location /static,实际路径为/webdata/static

  • alias:路径别名,直接替换location路径 ,如alias /webdata/static; location /static,实际路径为/webdata/static(仅用于location)。

四、Nginx 基础功能实验

实验2:配置虚拟主机(基于域名)

实验目的

实现一个Nginx服务运行多个站点,通过不同域名访问不同内容。

实验环境
  • 已完成实验1的Nginx环境

  • 域名:zt.brs.org(本地hosts解析至服务器IP)

实验步骤
步骤1:创建站点根目录并写入测试文件
Bash 复制代码
# 创建站点目录
mkdir -p /webdata/nginx/zt.brs.org/html
# 写入测试首页
echo "Hello Nginx! This is zt.brs.org" > /webdata/nginx/zt.brs.org/html/index.html
步骤2:编写虚拟主机配置文件

Nginx推荐将虚拟主机配置单独放在conf.d目录,通过include引入,便于管理:

Bash 复制代码
# 创建conf.d目录
mkdir /usr/local/nginx/conf.d
# 编写虚拟主机配置
vim /usr/local/nginx/conf.d/zt.conf

写入以下内容:

Nginx 复制代码
server {
    listen 80;
    server_name zt.brs.org; # 配置域名

    # 访问日志和错误日志
    access_log /var/log/nginx/zt_access.log;
    error_log /var/log/nginx/zt_error.log;

    # 根路径匹配
    location / {
        root /webdata/nginx/zt.brs.org/html; # 站点根目录
        index index.html index.htm; # 默认首页
    }
}
步骤3:修改主配置文件,引入conf.d
Bash 复制代码
vim /usr/local/nginx/conf/nginx.conf

http段末尾添加:

Nginx 复制代码
include conf.d/*.conf; # 引入所有conf.d下的配置文件
步骤4:检测配置并重启Nginx
Bash 复制代码
# 检测配置语法(关键!任何配置修改后必先检测)
nginx -t
# 重启Nginx
systemctl reload nginx
步骤5:配置本地hosts解析(客户端)
  • Windows:修改C:\Windows\System32\drivers\etc\hosts,添加服务器IP zt.brs.org

  • Linux/Mac:修改/etc/hosts,添加服务器IP zt.brs.org

步骤6:访问验证

打开浏览器访问http://zt.brs.org,显示测试内容Hello Nginx! This is zt.brs.org

实验3:配置404自定义错误页

实验目的

当用户访问不存在的URI时,返回自定义404页面,提升用户体验。

实验前置

已完成实验2,基于zt.brs.org域名配置。

实验步骤
步骤1:创建错误页目录并写入404页面
Bash 复制代码
mkdir -p /webdata/nginx/zt.brs.org/errors
echo "<h1>404 Not Found - Custom Page</h1>" > /webdata/nginx/zt.brs.org/errors/404.html
步骤2:修改虚拟主机配置,添加错误页配置
Bash 复制代码
vim /usr/local/nginx/conf.d/zt.conf

server段中添加:

Nginx 复制代码
# 配置404错误页,跳转到/404.html
error_page 404 /404.html;
# 匹配404.html,指定其根目录
location = /404.html {
    root /webdata/nginx/zt.brs.org/errors;
}
步骤3:检测配置并重启Nginx
Bash 复制代码
nginx -t
systemctl reload nginx
步骤4:访问验证

访问http://zt.brs.org/xxx(xxx为不存在的路径),显示自定义404页面<h1>404 Not Found - Custom Page</h1>

实验4:配置HTTP基本认证(账户密码访问)

实验目的

对指定站点/路径添加账户密码验证,只有输入正确的账号密码才能访问,提升站点安全性。

实验前置

已完成实验2,基于zt.brs.org/login路径配置认证。

实验步骤
步骤1:安装htpasswd工具(生成密码文件)
Bash 复制代码
dnf install httpd-tools -y
步骤2:生成密码文件,创建认证用户
Bash 复制代码
# 生成密码文件(-c 表示创建,-m 表示MD5加密,-b 表示非交互输入密码)
htpasswd -cmb /usr/local/nginx/conf/.htpasswd admin 123456
# 添加第二个用户(去掉-c,避免覆盖)
htpasswd -mb /usr/local/nginx/conf/.htpasswd zt 654321
# 查看密码文件
cat /usr/local/nginx/conf/.htpasswd
步骤3:创建/login路径的测试文件
Bash 复制代码
mkdir -p /webdata/nginx/zt.brs.org/login
echo "Welcome to Login Page - Need Auth" > /webdata/nginx/zt.brs.org/login/index.html
步骤4:修改虚拟主机配置,添加认证
Bash 复制代码
vim /usr/local/nginx/conf.d/zt.conf

server段中添加:

Nginx 复制代码
# 对/login路径添加HTTP基本认证
location /login {
    root /webdata/nginx/zt.brs.org;
    index index.html;
    auth_basic "Please Input Username and Password"; # 认证提示语
    auth_basic_user_file "/usr/local/nginx/conf/.htpasswd"; # 密码文件路径
}
步骤5:检测配置并重启Nginx
Bash 复制代码
nginx -t
systemctl reload nginx
步骤6:访问验证

访问zt.brs.org/login,浏览器弹出账号密码输入框,输入admin/123456zt/654321即可访问,输入错误则提示401未授权。

五、Nginx 高级功能实验

实验5:配置Gzip压缩(提升传输速度)

实验目的

开启Nginx的Gzip压缩,对指定类型的文件(如html、css、js、图片)进行压缩,减少文件传输大小,提升访问速度。

实验原理

Gzip压缩通过牺牲少量CPU资源,将文件压缩后传输给客户端,客户端再解压,适合带宽有限的场景,Nginx通过ngx_http_gzip_module实现(源码编译已开启)。

实验步骤
步骤1:修改主配置文件,开启Gzip压缩
Bash 复制代码
vim /usr/local/nginx/conf/nginx.conf

http段中添加/修改以下Gzip配置:

Nginx 复制代码
gzip on; # 开启Gzip压缩
gzip_comp_level 5; # 压缩级别1-9,级别越高压缩比越大,CPU消耗越高,建议4-5
gzip_min_length 1k; # 最小压缩文件大小,小于1k不压缩
gzip_disable "MSIE [1-6]\."; # 禁用IE6及以下的压缩(不支持)
gzip_types text/plain text/html text/css application/javascript application/json image/png image/jpg; # 需要压缩的文件类型
gzip_vary on; # 在响应头添加Vary: Accept-Encoding,告知客户端开启了压缩
步骤2:检测配置并重启Nginx
Bash 复制代码
nginx -t
systemctl reload nginx
步骤3:验证压缩效果

使用curl命令检测响应头,查看是否包含Content-Encoding: gzip

Bash 复制代码
curl --head --compressed http://zt.brs.org/index.html

实验6:配置反向代理(单台后端服务器)

实验目的

实现Nginx作为反向代理服务器,将客户端请求转发至后端的Apache/Tomcat服务器处理,Nginx负责接收请求,后端服务器负责处理业务,实现服务解耦

实验环境
  • Nginx服务器:172.25.254.100(反向代理)

  • 后端Apache服务器:172.25.254.200(提供Web服务,已安装并启动)

实验步骤
步骤1:配置后端Apache服务器(测试用)

在Apache服务器上创建测试页面:

Bash 复制代码
echo "Hello Apache! This is Backend Server (172.25.254.200)" > /var/www/html/index.html
# 确保Apache已启动
systemctl start httpd
步骤2:修改Nginx虚拟主机配置,添加反向代理
Bash 复制代码
vim /usr/local/nginx/conf.d/zt.conf

修改location /段,添加proxy_pass(反向代理核心指令):

Nginx 复制代码
location / {
    # 反向代理至后端Apache服务器
    proxy_pass http://172.25.254.200;
    # 传递客户端真实IP给后端服务器
    proxy_set_header X-Forwarded-For $remote_addr;
    # 传递主机名给后端服务器
    proxy_set_header Host $host;
    # 传递请求协议给后端服务器
    proxy_set_header X-Forwarded-Proto $scheme;
}

核心指令

  • proxy_pass http://后端IP:将请求转发至后端服务器。

  • proxy_set_header:设置请求头,让后端服务器获取客户端真实信息(否则后端获取的是Nginx的IP)。

步骤3:检测配置并重启Nginx
Bash 复制代码
nginx -t
systemctl reload nginx
步骤4:访问验证

访问http://zt.brs.org,显示后端Apache的测试内容

实验7:配置负载均衡(多台后端服务器)

实验目的

基于反向代理实现HTTP负载均衡 ,将客户端请求分发至多台后端服务器,实现负载分担、高可用 ,Nginx通过ngx_http_upstream_module实现。

实验环境
  • Nginx服务器:172.25.254.100(负载均衡器)

  • 后端服务器1:172.25.254.101(Apache,测试内容:Web1 - 172.25.254.101

  • 后端服务器2:172.25.254.102(Apache,测试内容:Web2 - 172.25.254.102

实验步骤
步骤1:配置两台后端Apache服务器
  • 服务器1(172.25.254.101):

    Bash 复制代码
    echo "Web1 - 172.25.254.101" > /var/www/html/index.html
  • 服务器2(172.25.254.102):

    Bash 复制代码
    echo "Web2 - 172.25.254.102" > /var/www/html/index.html
步骤2:修改Nginx配置,定义上游服务器组并配置负载均衡
Bash 复制代码
vim /usr/local/nginx/conf.d/zt.conf

serverhttp 添加upstream(上游服务器组),并修改proxy_pass指向该组:

Nginx 复制代码
# 定义上游服务器组,名称为webserver
upstream webserver {
    server 172.25.254.101 weight=1; # 后端1,权重1
    server 172.25.254.102 weight=1; # 后端2,权重1
    # server 172.25.254.103 backup; # 备份服务器,主服务器不可用时启用
}

server {
    listen 80;
    server_name zt.brs.org;
    access_log /var/log/nginx/zt.brs.org;
    error_log /var/log/nginx/zt.brs.org;

    location / {
        proxy_pass http://webserver; # 转发至上游服务器组
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

负载均衡调度算法(默认轮询):

  • 轮询:默认,请求依次分发至各后端服务器。

  • weight :权重,权重越高,接收的请求越多,如weight=2的服务器接收的请求是weight=1的2倍。

  • ip_hash :基于客户端IP哈希,将同一客户端的请求始终分发至同一台后端服务器,实现会话保持

  • least_conn:最少连接,将请求分发至当前连接数最少的后端服务器,适合后端服务器性能不均的场景。

步骤3:检测配置并重启Nginx
Bash 复制代码
nginx -t
systemctl reload nginx
步骤4:访问验证

多次访问http://zt.brs.org,浏览器交替显示Web1 - 172.25.254.101Web2 - 172.25.254.102(轮询算法)。

六、Nginx 常用操作指令

6.1 核心指令(全局)

Bash 复制代码
nginx -v # 查看Nginx版本
nginx -V # 查看版本+编译参数(重点)
nginx -t # 检测配置文件语法(重点,任何修改后必执行)
nginx -s stop # 强制停止Nginx(不推荐)
nginx -s quit # 停止Nginx(处理完现有请求后停止,推荐)
nginx -s reload # 重启Nginx(加载新配置,不中断服务,推荐)
nginx -s reopen # 重新打开日志文件(日志切割时使用)

6.2 日志查看(排错重点)

Bash 复制代码
# 查看错误日志(核心排错日志)
tail -f /usr/local/nginx/logs/error.log
# 查看访问日志
tail -f /usr/local/nginx/logs/access.log
# 查看自定义站点日志
tail -f /var/log/nginx/zt_access.log

七、Nginx 性能优化核心要点

  1. 进程优化worker_processes设为CPU核心数,worker_cpu_affinity绑定核心。

  2. 连接优化worker_connections调大至65535,worker_rlimit_nofile设为65535,系统ulimit -n设为65535。

  3. 网络优化 :开启epollmulti_accept onaccept_mutex on,关闭TCP_TIMEWAIT(系统层面)。

  4. 传输优化 :开启sendfile ontcp_nopush ontcp_nodelay on,开启Gzip压缩。

  5. 连接复用 :调大keepalive_timeout(65s)和keepalive_requests(500+)。

  6. 负载均衡 :根据业务选择调度算法,添加max_fails=3 fail_timeout=30s(后端服务器故障检测),配置备份服务器。

八、Nginx 常见问题排错

  1. 配置文件报错 :执行nginx -t,根据提示定位错误行,常见错误为缺少分号、括号不匹配、路径不存在

  2. 访问403 Forbidden :检查站点目录的权限 (Nginx运行用户nginx需有读权限),检查selinux/firewalld是否关闭。

  3. 访问502 Bad Gateway:后端服务器未启动/不可达,检查后端IP/端口是否正确,Nginx能否ping通后端服务器。

  4. 访问504 Gateway Timeout :Nginx连接后端服务器超时,添加proxy_connect_timeout 6s; proxy_read_timeout 60s;

  5. 高并发下报too many open files :调大worker_rlimit_nofile和系统ulimit -n,重启Nginx。

相关推荐
敲代码的哈吉蜂2 小时前
服务端I/O流程、I/O模型、网络I/O模型
linux·服务器·nginx
晚风予卿云月2 小时前
【Linux】初步理解进程
linux·运维·服务器
Lsir10110_2 小时前
【Linux】生产者-消费者模型及条件变量
linux·运维·开发语言·c++
林姜泽樾2 小时前
linux入门第三章,pwd,ls的参数和选项
linux·运维·服务器
congzi19842 小时前
好生活集团系统架构设计文档
运维
何中应2 小时前
从零搭建Maven私服(Nexus)
java·运维·maven
暴力求解3 小时前
Linux---进程(八)程序地址空间(虚拟地址空间)
linux·运维·服务器
cyber_两只龙宝3 小时前
Tomcat--企业级web应用服务器详细介绍与整合Nginx配置流程
linux·运维·前端·nginx·云原生·tomcat·负载均衡
我是Superman丶3 小时前
Nginx反向代理流式输出延迟?一招解决SSE/WebSocket缓冲问题SpringBoot+SSE流式输出卡住?Nginx这个配置必须关!
运维·websocket·nginx