当前位置: 首页 > news >正文

nginx详解

目录

1、 Nginx 介绍

2 、Nginx 和 Apache 的差异

3、Nginx 进程结构

4、Nginx 安装

5、Nginx 配置

5.1 全局配置

5.2 I/O 事件配置

5.3 HTTP 配置

5.4 日志格式参数说明

6、Nginx 虚拟主机

6.1 访问状态统计配置

6.1.1 检查模块

6.1.2 配置 nginx.conf

6.1.3 访问测试

6.2 基于授权的访问控制

6.2.1 生成密码文件

6.2.2 配置认证

6.2.3 测试

6.3 基于客户端的访问控制

6.4 基于域名的虚拟主机

6.4.1 域名解析

6.4.2 准备网页

6.4.3 配置 nginx.conf

6.4.4 测试

6.5 基于 IP 的虚拟主机

6.5.1 配置多 IP

6.5.2 配置 nginx.conf

6.5.3 测试

6.6 基于端口的虚拟主机

6.6.1 配置 nginx.conf

6.6.2 测试

补充:location 指令详解

总结


1、 Nginx 介绍

Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器。由俄罗斯程序员 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 网站开发,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日,2011 年 6 月 1 日发布稳定版本 1.0.4。其源代码以类 BSD 许可证开源,因稳定性、丰富功能、低资源消耗而闻名。

Nginx 是轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器,单台物理服务器可支持 30,000~50,000 个并发请求。中国大陆知名用户包括百度 BWS、新浪、网易、腾讯等。

核心功能

  • 静态资源服务:直接分发网页、图片、视频等文件。
  • 反向代理:转发用户请求到后端处理服务器,隐藏后端架构。
  • 负载均衡:智能分配流量到多台后端服务器,避免单点过载。
  • 高并发处理:基于事件驱动模型,高效处理海量请求,资源占用低。

优势

  • 轻量级,内存占用少;
  • 支持百万级并发访问;
  • 稳定可靠,开源且社区活跃。

官网:nginx.org

2 、Nginx 和 Apache 的差异

特性NginxApache
处理模型事件驱动(epoll),单进程处理多连接多进程 / 多线程,每个连接对应一个进程 / 线程
进程模型避免子进程,主进程 + 工作进程(Worker)基于子进程,主进程派生多个子进程处理请求
资源消耗内存占用低,连接效率高内存占用高,连接数受硬件限制大
性能依赖性能和可伸缩性不依赖硬件依赖 CPU 和内存等硬件配置
热部署支持(nginx -s reload 平滑重启)不支持,需重启服务
静态资源处理效率高(零拷贝机制)效率一般
反向代理优势明显,支持复杂负载均衡策略功能较弱,配置复杂

3、Nginx 进程结构

Web 请求处理机制对比

  • 多进程方式:主进程为每个请求生成子进程,处理完成后销毁。优势是进程独立,故障隔离;缺点是资源消耗大,高并发下易耗尽资源。
  • 多线程方式:主进程派生线程处理请求,线程开销低于进程。但线程共享内存,主进程故障会导致所有线程崩溃(如 IIS 服务器)。

Nginx 进程模型

  • 主进程(Master Process):管理工作进程,负责读取配置、启动 / 重启 / 停止服务。
  • 工作进程(Worker Process):实际处理网络请求,所有 Worker 进程平等,数量通常设为 CPU 核心数(充分利用资源,减少上下文切换)。

Worker 进程功能

  • 接收并处理客户端请求;
  • 将请求分发到各功能模块处理;
  • 执行 I/O 调用,获取响应数据;
  • 与后端服务器通信,接收处理结果;
  • 缓存数据,查询并调用缓存;
  • 向客户端发送响应结果;
  • 接收主进程指令(重启、升级、退出等)。

Nginx 版本

  • Mainline version(主线版本):包含最新功能,适合开发测试;
  • Stable version(稳定版本):功能稳定,适合生产环境;
  • Legacy versions(旧版本):不再维护,仅用于兼容旧系统。

旧版本下载:mirrors.sohu.com/nginx/
中文参考:nginx.cn/doc/

4、Nginx 安装

脚本安装(以 CentOS 为例)

# 安装依赖
yum install -y gcc gcc-c++ make pcre-devel zlib-devel openssl-devel# 下载稳定版源码包
wget http://nginx.org/download/nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz
cd nginx-1.20.2# 配置编译参数(启用常用模块)
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module# 编译安装
make && make install# 启动服务
/usr/local/nginx/sbin/nginx# 设置系统服务(可选)
cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=nginx service
After=network.target[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload
systemctl enable --now nginx

5、Nginx 配置

主配置文件:/usr/local/nginx/conf/nginx.conf,结构分为全局配置I/O 事件配置HTTP 配置三部分。

5.1 全局配置
#user nobody;  # 运行用户,默认 nobody
worker_processes 4;  # 工作进程数,建议设为 CPU 核心数
#error_log logs/error.log;  # 错误日志路径(级别:debug/info/warn/error/crit)
#pid logs/nginx.pid;  # PID 文件路径
5.2 I/O 事件配置
events {use epoll;  # 启用 epoll 模型(Linux 2.6+ 推荐,高效处理高并发)worker_connections 4096;  # 每个 Worker 进程最大连接数
}
  • 系统限制调整
    高并发下需修改系统文件描述符限制(每个连接对应一个文件句柄):
    ulimit -n 65535  # 临时生效
    # 永久生效:编辑 /etc/security/limits.conf,添加
    * soft nofile 65535
    * hard nofile 65535
    
  • 并发能力计算:理论最大并发连接数 = worker_processes × worker_connections(如 8×4096=32768),实际受硬件和带宽限制。
5.3 HTTP 配置

包含 HTTP 协议相关配置,核心是 server { } 块(定义虚拟主机)。

http {include mime.types;  # 加载 MIME 类型映射表(文件扩展名与类型对应)default_type application/octet-stream;  # 默认 MIME 类型(未匹配时下载文件)# 日志格式定义log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log logs/access.log main;  # 访问日志路径及格式sendfile on;  # 启用零拷贝(直接内核空间传输文件,提升效率)# tcp_nopush on;  # 与 sendfile 配合,缓存数据包后发送keepalive_timeout 65;  # 长连接超时时间(秒)# gzip on;  # 启用 gzip 压缩# Web 服务监听配置(虚拟主机)server {listen 80;  # 监听端口server_name www.kgc.com;  # 绑定域名(多个用空格分隔)charset utf-8;  # 默认字符集# 根目录配置location / {root html;  # 网站根目录(/usr/local/nginx/html)index index.html index.php;  # 默认首页}# 错误页面配置error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}
5.4 日志格式参数说明
参数说明
$remote_addr客户端 IP 地址
$http_x_forwarded_for反向代理场景下的客户端真实 IP(需配置传递)
$remote_user客户端用户名(认证时生效)
$time_local访问时间与时区
$request请求方法、URL、协议(如 GET /index.html HTTP/1.1)
$status响应状态码(如 200 成功、404 未找到)
$body_bytes_sent发送给客户端的文件大小(字节)
$http_refererReferer 来源页面(防盗链常用)
$http_user_agent客户端浏览器信息

6、Nginx 虚拟主机

虚拟主机是指在单台服务器上通过配置实现多个网站(独立域名 / IP / 端口)。

6.1 访问状态统计配置

通过 stub_status 模块监控 Nginx 连接状态。

6.1.1 检查模块
/usr/local/nginx/sbin/nginx -V  # 查看编译参数,确认包含 --with-http_stub_status_module
cat /opt/nginx-1.20.2/auto/options | grep YES  # 查看已安装模块
6.1.2 配置 nginx.conf
http {server {...location /status {  # 访问路径stub_status on;  # 启用状态统计access_log off;  # 关闭此路径日志}}
}
6.1.3 访问测试
systemctl restart nginx
# 浏览器访问 http://192.168.100.47/status
  • 输出说明:
    • Active connections:当前活跃连接数;
    • server accepts handled requests:依次为总连接数、成功握手数、总请求数;
    • Reading/Writing/Waiting:读取请求头数、写入响应数、等待请求数(长连接)。
6.2 基于授权的访问控制

通过用户名密码限制访问。

6.2.1 生成密码文件
yum install -y httpd-tools  # 安装 htpasswd 工具
htpasswd -c /usr/local/nginx/passwd.db zhangsan  # 创建用户 zhangsan
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nginx/passwd.db  # 限制权限
6.2.2 配置认证
server {location / {...auth_basic "请输入密码";  # 提示信息auth_basic_user_file /usr/local/nginx/passwd.db;  # 密码文件路径}
}
6.2.3 测试

重启 Nginx 后访问,需输入用户名密码。

6.3 基于客户端的访问控制

通过 IP 限制访问。

server {location / {...allow 192.168.100.20;  # 允许指定 IPdeny all;  # 拒绝其他所有 IP(规则从上到下匹配)}
}
6.4 基于域名的虚拟主机

通过不同域名区分网站(共用同一 IP 和端口)。

6.4.1 域名解析
echo "192.168.10.21 www.yjs.com www.benet.com" >> /etc/hosts
6.4.2 准备网页
mkdir -p /var/www/html/{yjs,benet}
echo "<h1>www.yjs.com</h1>" > /var/www/html/yjs/index.html
echo "<h1>www.benet.com</h1>" > /var/www/html/benet/index.html
6.4.3 配置 nginx.conf
http {server {listen 80;server_name www.yjs.com;charset utf-8;access_log logs/www.yjs.access.log;location / {root /var/www/html/yjs;index index.html;}}server {listen 80;server_name www.benet.com;charset utf-8;access_log logs/www.benet.access.log;location / {root /var/www/html/benet;index index.html;}}
}
6.4.4 测试

重启 Nginx 后,分别访问 http://www.yjs.com 和 http://www.benet.com

6.5 基于 IP 的虚拟主机

通过不同 IP 区分网站(共用端口)。

6.5.1 配置多 IP
ifconfig ens33:0 192.168.100.40 netmask 255.255.255.0  # 新增虚拟 IP
6.5.2 配置 nginx.conf
http {server {listen 192.168.100.47:80;  # 绑定第一个 IPserver_name www.yjs.com;location / {root /home/zcz/aa/yjs;index index.html;}}server {listen 192.168.100.40:80;  # 绑定第二个 IPserver_name www.benet.com;location / {root /home/zcz/aa/benet;index index.html;}}
}
6.5.3 测试

访问 http://192.168.100.47 和 http://192.168.100.40

6.6 基于端口的虚拟主机

通过不同端口区分网站(共用 IP)。

6.6.1 配置 nginx.conf
http {server {listen 192.168.100.47:8080;  # 端口 8080server_name www.yjs.com;location / {root /home/zcz/aa/yjs;index index.html;}}server {listen 192.168.100.47:8888;  # 端口 8888server_name www.benet.com;location / {root /home/zcz/aa/benet;index index.html;}}
}
6.6.2 测试

访问 http://192.168.10.47:8080 和 http://192.168.10.47:8888

补充:location 指令详解

指令说明示例
root根路径配置,请求路径会拼接在 root 后root /var/www/html,请求 /test/1.html 对应 /var/www/html/test/1.html
alias别名配置,请求路径会替换为 alias 路径alias /var/www/html,请求 /test/1.html 对应 /var/www/html/1.html
proxy_pass反向代理,转发请求到后端服务器proxy_pass http://192.168.1.100:8080

总结

通过以上内容,可全面掌握 Nginx 的核心概念、配置方法及常见应用场景,包括虚拟主机、访问控制、状态监控等实战技能。


文章转载自:

http://NFbIfDAo.nnmnz.cn
http://SAMyXr33.nnmnz.cn
http://Hu0XJtEW.nnmnz.cn
http://83LHbg0x.nnmnz.cn
http://bODm5Ohn.nnmnz.cn
http://Y08Acros.nnmnz.cn
http://OX8rfDTX.nnmnz.cn
http://rUTXNX0R.nnmnz.cn
http://UqGMnXBH.nnmnz.cn
http://n6A4dDoS.nnmnz.cn
http://7Ukipg8N.nnmnz.cn
http://Owigy1OA.nnmnz.cn
http://IaXjX4T0.nnmnz.cn
http://L6p4OXZu.nnmnz.cn
http://LnZnYg4G.nnmnz.cn
http://LOfGxXst.nnmnz.cn
http://479HEIOz.nnmnz.cn
http://GdZBbMig.nnmnz.cn
http://qoCMFhf3.nnmnz.cn
http://6mU9GhY8.nnmnz.cn
http://SiwHC8jI.nnmnz.cn
http://vqdfPWiI.nnmnz.cn
http://zosuIes8.nnmnz.cn
http://WOSEo3h6.nnmnz.cn
http://FtQBwmSR.nnmnz.cn
http://wz9mIEm6.nnmnz.cn
http://4cwyCQnt.nnmnz.cn
http://D4K2Oo5A.nnmnz.cn
http://OnJY3w4g.nnmnz.cn
http://rZbskXkQ.nnmnz.cn
http://www.dtcms.com/a/372211.html

相关文章:

  • 硬件开发1-51单片机4-DS18B20
  • 【LLIE专题】LYT-Net:一种轻量级 YUV Transformer 低光图像增强网络
  • 数据库造神计划第二天---数据库基础操作
  • TypeORM 入门教程之 `@OneToOne` 关系详解
  • 嵌入式解谜日志之数据结构—基本概念
  • make_shared的使用
  • 《九江棒球》未来十年棒垒球发展规划·棒球1号位
  • agentscope1.0安装与测试
  • Shell 脚本自动安装 Nginx
  • 《探索C++11:现代语法的内存管理优化“性能指针”(下篇)》
  • Basic Pentesting: 1靶场渗透
  • NAS自建笔记服务leanote2
  • 对比Java学习Go——程序结构与变量
  • 【JavaWeb】一个简单的Web浏览服务程序
  • [C/C++学习] 7.“旋转蛇“视觉图形生成
  • webhook(Web 钩子)是什么?
  • 《2025年AI产业发展十大趋势报告》四十三
  • java面试小册(1)
  • NW506NW507美光固态闪存NW525NW539
  • [Maven 基础课程]再看下第一个 Maven 项目
  • Keil快捷键代码补全
  • 2024理想算法岗笔试笔记
  • Java面试-线程安全篇
  • 线程池深度解析:ThreadPoolExecutor底层实现与CompletableFuture异步编程实战
  • 计算机网络学习(七、网络安全)
  • 蓝奏云官方版不好用?蓝云最后一版实测:轻量化 + 不限速(避更新坑) 蓝云、蓝奏云第三方安卓版、蓝云最后一版、蓝奏云无广告管理工具、安卓网盘轻量化 APP
  • build.gradle里面dependencies compile和api的区别
  • C++20格式化字符串:std::format的使用与实践
  • UART 使用教程
  • cuda中线程id的计算方式(简单)