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/123456或zt/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):
Bashecho "Web1 - 172.25.254.101" > /var/www/html/index.html -
服务器2(172.25.254.102):
Bashecho "Web2 - 172.25.254.102" > /var/www/html/index.html
步骤2:修改Nginx配置,定义上游服务器组并配置负载均衡
Bash
vim /usr/local/nginx/conf.d/zt.conf
在server段外 、http段内 添加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.101和Web2 - 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 性能优化核心要点
-
进程优化 :
worker_processes设为CPU核心数,worker_cpu_affinity绑定核心。 -
连接优化 :
worker_connections调大至65535,worker_rlimit_nofile设为65535,系统ulimit -n设为65535。 -
网络优化 :开启
epoll、multi_accept on、accept_mutex on,关闭TCP_TIMEWAIT(系统层面)。 -
传输优化 :开启
sendfile on、tcp_nopush on、tcp_nodelay on,开启Gzip压缩。 -
连接复用 :调大
keepalive_timeout(65s)和keepalive_requests(500+)。 -
负载均衡 :根据业务选择调度算法,添加
max_fails=3 fail_timeout=30s(后端服务器故障检测),配置备份服务器。
八、Nginx 常见问题排错
-
配置文件报错 :执行
nginx -t,根据提示定位错误行,常见错误为缺少分号、括号不匹配、路径不存在。 -
访问403 Forbidden :检查站点目录的权限 (Nginx运行用户
nginx需有读权限),检查selinux/firewalld是否关闭。 -
访问502 Bad Gateway:后端服务器未启动/不可达,检查后端IP/端口是否正确,Nginx能否ping通后端服务器。
-
访问504 Gateway Timeout :Nginx连接后端服务器超时,添加
proxy_connect_timeout 6s; proxy_read_timeout 60s;。 -
高并发下报too many open files :调大
worker_rlimit_nofile和系统ulimit -n,重启Nginx。