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。

相关推荐
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode9 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220709 天前
如何搭建本地yum源(上)
运维
ping某11 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树8812 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql