本文主要是介绍Nginx概念、架构、配置与虚拟主机实战操作指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且...
Nginx 深度解析:概念、架构、配置与虚拟主机实战
一、Nginx 的概念
Nginx(发音 “engine x”)是由俄罗斯开发者 Igor Sysoev 设计的高性能 HTTP 服务器、反向代理服务器、负载均衡器和 IMAP/POP3/SMTP 代理服务器。其核心设计理念是 “事件驱动、异步非阻塞 I/O 模型”,旨在以极低的资源消耗支撑超高并发连接,同时提供丰富的扩展功能。
从本质上讲,Nginx 是一个 “请求分发与处理中枢”:
- 作为 Web 服务器:直接处理静态资源(html、css、js、图片等)的请求,无需依赖后端应用;
- 作为反向代理:接收客户端请求后,转发到后端业务服务器(Tomcat、Node.js 等),并将响应结果返回给客户端,隐藏后端服务细节;
- 作为负载均衡器:将海量客户端请求均匀分发到多台后端服务器,提升系统并发能力和可用性;
- 其他角色:支持 SSL 终结、URL 重写、缓存、限流等附加功能,适配复杂业务场景。
Nginx 广泛应用于互联网架构的 “接入层”,是目前全球使用最广泛的 Web 服务器之一(据 W3Techs 统计,全球 Top 1000 网站中约 60% 采用 Nginx)。
二、Nginx 的特点
Nginx 之所以成为行业主流,核心源于以下六大特点,且每个特点都与底层设计深度绑定:
- 高并发支持:基于事件驱动(epoll/kqueue)和异步非阻塞 I/O 模型,单台服务器可轻松支撑 10 万 + 并发连接(远高于 Apache 的进程 / 线程模型)。其核心逻辑是 “一个工作进程处理多个连接”,避免了进程 / 线程切换的巨大开销;
- 资源占用极低:空闲状态下内存占用仅几 MB,运行时 CPU 使用率远低于同类服务器。例如,4 核 8G 服务器部署 Nginx 后,仅占用 10-20MB 内存,可将大部分资源留给业务服务;
- 功能全面且灵活:集静态资源服务、反向代理、负载均衡、SSL 配置、URL 重写、缓存、限流等功能于一体,支持第三方模块扩展(如 Lua 脚本、图片处理模块);
- 稳定性极强:核心代码简洁(约 10 万行),故障率极低,支持 “热部署”(
nginx -s reload)—— 无需重启服务即可重载配置,保障业务不中断; - 跨平台兼容:可运行在 linux、Windows、FreeBSD、Solaris 等多种操作系统,主流 Linux 发行版(Centos、Ubuntu)默认提供安装源;
- 配置简单易维护:配置文件采用文本格式,结构清晰(块级层级),支持主配置 + 子配置拆分,便于批量管理和自动化部署。
三、Nginx 的进程结构(详细解析)
Nginx 启动后,会生成多进程架构,核心由 “主进程(Master Process)” 和 “工作进程(Worker Process)” 组成,部分场景会包含 “辅助进程”(缓存加载进程、日志轮转进程等)。这种架构设计是 Nginx 高并发、高稳定的核心保障,以下分进程详解:
3.1 进程结构总览
plaintext
# 启动 Nginx 后,通过 ps 命令查看进程(以 4 核服务器为例) ps -ef | grep nginx root 1234 1 0 10:00 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 1235 1234 0 10:00 ? 00:00:02 nginx: worker process nginx 1236 1234 0 10:00 ? 00:00:02 nginx: worker process nginx 1237 1234 0 10:00 ? 00:00:02 nginx: worker process nginx 1238 1234 0 10:00 ? 00:00:02 nginx: worker process
- 1 个主进程(root 用户运行,权限高,负责管理);
- 4 个工作进程(nginx 普通用户运行,权限低,负责处理请求);
- (可选)缓存加载进程(
cache loader process):启动时加载磁盘缓存到内存,完成后自动退出; - (可选)缓存管理进程(
cache manager process):定期清理过期缓存,维持缓存大小在配置阈值内。
3.2 主进程(Master Process)——“管理者”
核心作用:
- 读取并验证配置文件:启动时加载
nginx.conf,检查语法正确性;支持热重载(nginx -s reload),重新读取配置并生效,无需中断服务; - 创建并管理工作进程:根据
worker_processes配置(默认与 CPU 核心数一致),通过fork()系统调用创建工作进程;监控工作进程状态,若工作进程异常退出,立即自动创建新的工作进程,保障服务可用性; - 接收并处理信号:响应管理员发送的信号(如启动、停止、重载、日志切割),例如:
kill -HUP 主进程PID:重载配置;kill -TERM 主进程PID:优雅停止服务(处理完当前请求后退出);
- 管理辅助进程:按需启动缓存加载 / 管理进程、日志轮转进程等。
运行权限:
主进程必须以 root 用户运行,原因是:
- Nginx 需监听 80(HTTP)、443(HTTPS)等特权端口(Linux 中,非 root 用户无法绑定 1024 以下端口);
- 主进程需要创建 / 管理工作进程,且工作进程通常以低权限用户(如 nginx)运行,避免因工作进程被攻击导致系统权限泄露。
3.3 工作进程(Worker Process)——“执行者”
核心作用:
处理客户端的 HTTP 请求,是 Nginx 并发能力的核心载体,其工作流程如下:
- 竞争接收连接:所有工作进程通过 “共享监听套接字”(主进程创建监听端口后,工作进程继承该套接字),采用 “惊群效应优化”(Nginx 1.11+ 已解决)竞争接收客户端连接;
- 异步非阻塞处理请求:每个工作进程通过 epoll/kqueue 事件模型,同时处理成千上万个连接(由
worker_connections配置限制),无需为每个连接创建线程 / 进程,资源消耗极低; - 请求处理流程:
- 接收客户端请求数据;
- 解析 HTTP 协议(请求行、请求头、请求体);
- 匹配
server块(通过监听端口 +server_name); - 匹配
location块(通过请求路径); - 执行处理逻辑(返回静态资源、反向代理到后端服务、负载均衡分发等);
- 构建 HTTP 响应,发送给客户端;
- 无状态设计:工作进程之间完全独立,无共享内存,每个工作进程处理的请求互不影响,避免了进程间通信的开销,也提升了稳定性(单个工作进程故障不影响其他进程)。
关键配置与并发能力:
工作进程的并发能力由两个核心配置决定:
worker_processes:工作进程数,推荐设置为 CPU 核心数(如 4 核服务器设为 4),避免进程切换开销,充分利用多核 CPU;worker_connections:每个工作进程的最大连接数(默认 1024),表示单个工作进程可同时处理的客户端连接数。
最大并发连接数计算公式:最大并发数 = worker_processes × worker_connections ÷ 2(除以 2 是因为每个 HTTP 连接包含 “客户端→Nginx” 和 “Nginx→后端服务” 两个连接,若仅处理静态资源,可无需除以 2)
例如:worker_processes=4,worker_connections=1024,则最大并发连接数约为 2048。
运行权限:
工作进程以低权限用户(如 nginx)运行,由主进程在创建时通过 setuid()/setgid() 系统调用切换用户,目的是:
- 降低安全风险:若工作进程被恶意攻击,攻击者仅能获取 nginx 用户权限,无法操作系统核心资源;
- 限制文件访问:工作进程仅能访问 nginx 用户有权限的文件(如网站根目录、日志文件),避免误操作系统文件。
3.4 进程间通信机制
Nginx 进程间通信主要依赖以下方式:
- 共享内存:用于共享配置信息(如
upstream后端服务器状态、缓存元数据),避免每个进程重复加载配置,提升效率; - 信号:主进程通过信号(如
SIGCHLD)监控工作进程状态,工作进程异常退出时,主进程收到信号后创建新的工作进程; - 文件锁:用于日志写入、缓存操作等场景,避免多个工作进程同时写入同一文件导致数据错乱。
四、Nginx 的配置(详细解析 + 流量流程)
Nginx 的核心配置文件为 /usr/local/nginx/conf/nginx.conf(源码安装路径),采用块级层级结构,从外到内依次为:全局块 → I/O事件块 → HTTP块 → Server块 → Location块。
配置文件整体结构模板
nginx
# 一、全局配置(全局块)
worker_processes 4; # 工作进程数,与CPU核心数一致
error_log logs/error.log warn; # 错误日志路径+日志级别
pid logs/nginx.pid; # PID文件路径
worker_rlimit_nofile 65535; # 每个工作进程的最大文件描述符限制
# 二、I/O事件配置(events块)
events {
use epoll; # 使用epoll事件模型(Linux推荐)
worker_connections 10240; # 每个工作进程最大连接数
multi_accept on; # 允许工作进程一次性接收多个连接
a编程ccept_mutex on; # 开启连接接收互斥锁,解决惊群效应
}
# 三、HTTP配置(http块)
http {
include mime.types; # 引入MIME类型映射文件
default_type application/octet-stream; # 默认MIME类型(未知文件类型)
# 日志格式定义(main为格式名,可在server/location块引用)
log_format main 'javascript$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; # 访问日志路径+使用main格式
# 核心性能优化配置
sendfile on; # 启用高效文件传输模式(零拷贝)
tcp_nopush on; # 配合sendfile,减少TCP数据包数量
tcp_nodelay on; # 禁用TCP延迟,提升实时性(适用于短连接)
keepalive_timeout 65; # 长连接超时时间(秒)
keepalive_requests 100; # 每个长连接最多处理100个请求
# 开启gzip压缩
gzip on;
gzip_min_length 1k; # 小于1k的文件不压缩
gzip_types text/plain text/css application/json application/Javascript; # 压缩的文件类型
# 负载均衡集群配置(可选)
upstream backend_servers {
server 192.168.1.101:8080 weight=1; # 后端服务器1,权重1
server 192.168.1.102:8080 weight=2; # 后端服务器2,权重2(接收更多请求)
}
# 四、Web服务的监听配置(server块,虚拟主机核心)
server {
listen 80; # 监听80端口(HTTP默认端口)
listen 192.168.1.100:80; # 绑定特定IP+端口(多IP服务器时使用)
server_name www.test.com test.com; # 绑定域名(多个域名用空格分隔)
charset utf-8; # 网页字符编码
access_log logs/www.test.com.access.log main; # 该虚拟主机的访问日志
# 五、其他配置(location块,路径匹配核心)
# 匹配根路径(/)
location / {
root /usr/local/nginx/html; # 网站根目录(静态资源存放路径)
index index.html index.htm; # 默认首页文件(优先级:index.html > index.htm)
try_files $uri $uri/ /index.html; # 尝试访问文件→目录→跳转index.html(SPA应用常用)
}
# 匹配静态资源路径(图片、CSS、JS)
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
root /usr/local/nginx/static; # 静态资源独立存放目录
expires 7d; # 浏览器缓存7天,减少重复请求
add_header Cache-Control "public"; # 允许缓存
}
# 反向代理配置(匹配/api路径的请求)
location /api/ {
proxy_pass http://backend_servers; # 转发到负载均衡集群
proxy_set_header Host $host; # 传递客户端请求的Host头
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链IP
proxy_connect_timeout 60; # 代理连接超时时间
}
# 错误页面配置
error_page 404 /404.html; # 404错误跳转至404.html
error_page 500 502 503 504 /50x.html; # 5xx错误跳转至50x.html
location = /50x.html {
root html; # 错误页面存放目录
}
}
}4.1 全局配置(全局块)
核心指令解析
| 指令 | 作用 | 配置建议 |
|---|---|---|
worker_processes | 定义工作进程数,直接影响并发能力 | 设为 CPU 核心数(grep -c "processor" /proc/cpuinfo 查看),如 4 核设为 4 |
error_log | 定义错误日志的路径和日志级别(debug/info/notice/warn/error/crphpit) | 生产环境设为 warn 或 error,避免日志过大;路径建议放在 /var/log/nginx/ |
pid | 定义 Nginx 主进程 PID 文件的存放路径 | 默认在 logs/nginx.pid,无需修改,便于管理进程 |
worker_rlimit_nofile | 限制每个工作进程的最大文件描述符数(Linux 中,连接、文件都属于文件描述符) | 设为 65535(与系统最大文件描述符一致,需先修改系统配置:echo "* soft nofile 65535" >> /etc/security/limits.conf) |
worker_cpu_affinity | 绑定工作进程到指定 CPU 核心,避免进程切换开销 | 4 核服务器配置:worker_cpu_affinity 0001 0010 0100 1000(每个进程绑定一个核心) |
流量流程中的作用:
全局配置是 Nginx 启动时加载的 “基础配置”,对所有工作进程和服务全局生效,不直接参与请求的路由,但决定了 Nginx 的整体性能上限(如并发连接数、进程资源限制)。
4.2 I/O 事件配置(events 块)
核心指令解析
| 指令 | 作用 | 配置建议 |
|---|---|---|
use | 指定 I/O 事件模型(epoll/kqueue/poll/select) | Linux 系统优先选 epoll(高效处理海量并发连接);FreeBSD 选 kqueue;Windows 选 select |
worker_connections | 每个工作进程的最大连接数(包括客户端连接、后端代理连接) | 1G 内存服务器设为 10240,2G 设为 20480,需与 worker_processes 配合调整最大并发数 |
multi_accept | 允许工作进程一次性接收多个新连接(默认 off) | 开启(on),提升连接接收效率,尤其高并发场景 |
accept_mutex | 开启连接接收互斥锁(默认 on),解决 “惊群效应”(多个工作进程同时竞争一个连接,导致资源浪费) | 保持开启,避免惊群效应导致的性能损耗 |
worker_aio_requests | 每个工作进程的异步 I/O 请求数(适用于大文件传输) | 设为 1024,提升大文件(如视频、安装包)的传输效率 |
流量流程中的作用:
I/O 事件配置决定了工作进程 “如何接收和处理网络连接”,是 Nginx 高并发的核心保障。当客户端发起连接时,工作进程通过配置的事件模型(如 epoll)监听连接事件,高效接收并处理连接,避免阻塞。
4.3 HTTP 配置(http 块)
HTTP 块是 Nginx 处理 HTTP/HTTPS 请求的 “核心全局配置”,包含所有与 HTTP 协议相关的配置,且可嵌套多个 server 块(虚拟主机)。
核心指令解析
| 指令 | 作用 | 配置建议 |
|---|---|---|
include mime.types | 引入 MIME 类型映射文件(定义文件扩展名与 Content-Type 的对应关系,如 .html → text/html) | 必须配置,否则 Nginx 无法正确返回文件的 Content-Type 头,导致浏览器无法识别文件 |
default_type | 未匹配到 MIME 类型时的默认类python型 | 默认为 application/octet-stream(浏览器会下载文件),无需修改 |
log_format | 定义访问日志的格式(可自定义字段,如 IP、时间、请求路径、状态码) | 生产环境保留 main 格式,便于日志分析(如统计访问 IP、错误请求) |
access_log | 定义访问日志的路径和使用的格式 | 每个虚拟主机可单独配置,便于区分不同网站的日志 |
sendfile | 开启 “零拷贝” 文件传输模式(Nginx 直接将文件数据从磁盘写入网络套接字,无需经过用户态缓冲区) | 开启(on),大幅提升静态资源传输效率,减少 CPU 占用 |
tcp_nopush | 配合 sendfile 使用,将多个小数据包合并为一个数据包发送,减少 TCP 握手次数 | 开启(on),提升网络传输效率 |
tcp_nodelay | 禁用 TCP 延迟(Nagle 算法),立即发送小数据包,提升实时性 | 短连接(如 API 接口)开启(on),长连接(如文件下载)关闭(off) |
keepalive_timeout | 长连接(HTTP/1.1)的超时时间,客户端在超时前可复用连接发送多个请求 | 设为 60 秒,减少连接建立 / 关闭的开销,提升并发能力 |
gzip | 开启 gzip 压缩,减少文本类文件(HTML、CSS、JS、JSON)的传输体积 | 开启(on),配合 gzip_types 配置需要压缩的文件类型 |
upstream | 定义负载均衡集群(后端业务服务器组),用于反向代理时的请求分发 | 后端多服务器部署时配置,支持轮询、权重、IP 哈希等负载策略 |
流量流程中的作用:
客户端请求到达 Nginx 后,首先进入 HTTP 块进行 “全局预处理”:
- 解析 HTTP 协议,识别请求行(方法、路径、协议版本)、请求头;
- 应用 gzip 压缩配置(若请求头支持压缩);
- 记录访问日志(按
log_format格式); - 根据请求的 “监听端口” 和 “Host 头”,匹配对应的
server块,进入虚拟主机处理流程。
4.4 Web 服务的监听配置(server 块)
server 块是 “虚拟主机” 的核心配置,每个 server 块对应一个独立的 Web 服务(可理解为一个网站),通过 listen(监听端口)和 server_name(绑定域名 / IP)区分不同的虚拟主机。
核心指令解析
| 指令 | 作用 | 配置示例 |
|---|---|---|
listen | 定义虚拟主机的监听端口 / IP + 端口,支持多端口监听 | - 监听所有 IP 的 80 端口:listen 80;- 监听特定 IP 的 80 端口:listen 192.168.1.100:80;- 监听 HTTPS 端口:listen 443 ssl; |
server_name | 定义虚拟主机绑定的域名 / IP,支持精确匹配、泛域名匹配、正则匹配 | - 精确匹配:server_name www.test.com test.com;- 泛域名匹配:server_name *.test.com;(匹配所有子域名)- 正则匹配:server_name ~^www\.(.*)\.com$www.chinasem.cn;(匹配 www.xxx.com 格式域名) |
charset | 定义网页的字符编码(如 UTF-8、GBK) | 设为 utf-8,避免中文乱码 |
access_log | 定义该虚拟主机的独立访问日志 | 路径建议包含域名,如 logs/www.test.com.access.log,便于日志拆分和分析 |
流量路由逻辑(关键):
Nginx 如何通过 listen 和 server_name 匹配虚拟主机?
- 第一步:匹配
listen端口 —— 客户端请求的端口必须与server块的listen配置一致,否则直接拒绝; - 第二步:匹配
server_name—— 根据客户端请求头中的Host字段(如Host: www.test.com),按以下优先级匹配:- 精确匹配(如
www.test.com); - 左泛域名匹配(如
*.test.com); - 右泛域名匹配(如
www.*); - 正则匹配(如
~^www\..*\.com$); - 默认匹配(第一个
listen端口一致的server块,或server_name _;的块)。
- 精确匹配(如
流量流程中的作用:
经过 HTTP 块预处理后,请求根据 “端口 + Host” 匹配到对应的 server 块,进入该虚拟主机的专属处理流程,后续的 location 块匹配、请求处理都基于该 server 块的配置。
4.5 其他配置(location 块)
location 块是 server 块的子配置,用于 “按请求路径匹配处理逻辑”,是 Nginx 路由配置的核心。一个 server 块可包含多个 location 块,按匹配优先级执行。
核心指令解析
| 指令 | 作用 | 配置示例 | |
|---|---|---|---|
location 匹配规则 | 定义请求路径的匹配规则,支持多种匹配模式(见下文) | - 前缀匹配:location /api/ { ... }- 精确匹配:location = /index.html { ... }- 正则匹配:`location ~* .(jpg | png)$ { ... }` |
root | 定义静态资源的根目录,请求路径会拼接在 root 后,形成文件的绝对路径 | location /static/ { root /usr/local/nginx/; } → 访问 /static/img.jpg 时,实际路径为 /usr/local/nginx/static/img.jpg | |
alias | 定义路径别名,直接替换请求路径,与 root 不同(alias 不拼接路径) | location /static/ { alias /usr/local/nginx/static/; } → 效果同上,但更灵活(可自定义别名路径) | |
index | 定义默认首页文件,当请求路径为目录时,自动查找该文件 | index index.html index.htm index.php; | |
try_files | 按顺序尝试访问文件 / 目录,若前面的路径不存在,执行最后一个动作(如跳转、返回 404) | try_files $uri $uri/ /index.html; → 尝试访问文件→目录→跳转至 index.html(SPA 应用路由配置) | |
proxy_pass | 反向代理指令,将请求转发到后端服务(如 Tomcat、负载均衡集群) | proxy_pass http://backend_servers;(转发到 upstream 集群)或 proxy_pass http://127.0.0.1:8080;(转发到本地服务) | |
expires | 配置浏览器缓存时间,适用于静态资源(图片、CSS、JS) | expires 7d;(缓存 7 天),减少重复请求,提升访问速度 | |
error_page | 配置错误页面跳转,当请求返回指定状态码时,跳转至对应的页面或路径 | error_page 404 /404.html;(404 错误跳转至 404.html) |
location 匹配模式与优先级(关键)
| 匹配模式 | 语法 | 优先级 | 说明 | |
|---|---|---|---|---|
| 精确匹配 | location = /path { ... } | 1(最高) | 完全匹配请求路径,不包含子路径,例如 = /index.html 仅匹配 /index.html,不匹配 /index.html?a=1 | |
| 前缀匹配(^~) | location ^~ /path { ... } | 2 | 以 /path 开头的路径,匹配成功后不再检查其他模式 | |
| 正则匹配(~ 区分大小写,~* 不区分大小写) | `location ~* .(jpg | png)$ { ... }` | 3 | 按正则表达式匹配路径,优先级低于精确匹配和 ^~ 前缀匹配 |
| 普通前缀匹配 | location /path { ... } | 4(最低) | 以 /path 开头的路径,匹配成功后仍会检查更高优先级的模式 |
流量流程中的作用:
请求匹配到 server 块后,进入 location 块匹配流程:
- 按优先级顺序匹配所有
location块的规则; - 匹配成功后,执行该
location块的处理逻辑:- 若为静态资源请求(如图片、HTML):通过
root/alias找到文件,返回给客户端(开启 gzip 压缩、缓存等); - 若为动态请求(如
/api):通过proxy_pass转发到后端服务,接收后端响应后返回给客户端;
- 若为静态资源请求(如图片、HTML):通过
- 若未匹配到任何
location块,执行server块的默认逻辑(如返回 404)。
五、Nginx 虚拟主机
虚拟主机(Virtual Host)是指在一台服务器上通过 Nginx 配置,同时运行多个独立的 Web 服务(多个网站),共享服务器的 IP 和端口资源,通过 server_name、IP、端口区分不同服务。
5.1 访问状态统计配置
Nginx 提供 ngx_http_stub_status_module 模块,用于统计 Nginx 的连接状态(如活跃连接数、请求数),需在编译时启用(--with-http_stub_status_module)。
配置步骤:
- 编辑
nginx.conf的server块,添加location块:
nginx
server {
listen 80;
server_name www.test.com;
# 访问状态统计配置
location /nginx_status {
stub_status on; # 开启状态统计
allow 192.168.1.0/24; # 允许访问的IP网段(内网)
deny all; # 拒绝其他所有IP访问,保障安全
}
}- 验证配置并重载 Nginx:
nginx -t # 检查配置语法 nginx -s reload # 重载配置
- 访问测试:在允许的 IP 网段内,通过浏览器或 curl 访问
http://www.test.com/nginx_status,输出结果如下:
plaintext
Active connections: 2 # 当前活跃连接数(包含等待连接) server accepts handled requests 100 100 200 # 累计接收连接数、累计处理连接数、累计请求数 Reading: 0 Writing: 1 Waiting: 1 # 正在读取请求头的连接数、正在写入响应的连接数、等待请求的连接数(长连接)
5.2 基于授权的访问控制(HTTP 基本认证)
通过用户名 / 密码验证客户端身份,仅授权用户可访问网站,适用于后台管理系统、内部服务等场景。
配置步骤:
- 安装
htpasswd工具(用于生成密码文件):
yum install -y httpd-tools # CentOS/RHEL apt install -y apache2-utils # Ubuntu/Debian
- 生成密码文件(用户名:admin,密码:123456):
htpasswd -c /usr/local/nginx/conf/.htpasswd admin # 输入密码(123456),生成密码文件 .htpasswd(隐藏文件,避免泄露)
- 编辑 Nginx 配置,添加授权控制:
server {
listen 80;
server_name admin.test.com;
location / {
root /usr/local/nginx/admin; # 后台管理系统根目录
index index.html;
auth_basic "请输入用户名密码"; # 认证提示信息
auth_basic_user_file /usr/local/nginx/conf/.htpasswd; # 密码文件路径
}
}- 验证配置并重载 Nginx:
nginx -t && nginx -s reload
- 访问测试:访问
http://admin.test.com,浏览器会弹出登录框,输入正确的用户名(admin)和密码(123456)才能访问,错误则返回 401 Unauthorized。
5.3 基于客户端的访问控制(IP 黑白名单)
通过限制客户端的 IP 地址,允许或拒绝特定 IP / 网段访问,适用于防止恶意攻击、仅允许内网访问等场景。Nginx 支持两种配置方式:allow/deny 指令(简单)和 ngx_http_limit_req_module 模块(限流)。
5.3.1 allow/deny 指令(IP 黑白名单)
server {
listen 80;
server_name www.test.com;
location / {
root /usr/local/nginx/html;
index index.html;
# 允许的IP/网段(白名单)
allow 192.168.1.100; # 允许单个IP
allow 192.168.1.0/24; # 允许192.168.1.0网段
allow 127.0.0.1; # 允许本地访问
deny all; # 拒绝其他所有IP(必须放在最后,顺序影响结果)
}
# 仅拒绝特定IP(黑名单)
location /api/ {
deny 10.0.0.1; # 拒绝10.0.0.1访问
deny 172.16.0.0/16; # 拒绝172.16.0.0网段
allow all; # 允许其他所有IP
}
}- 规则:
allow和deny按配置顺序执行,匹配到第一个规则后立即生效; - 适用场景:简单的 IP 限制,如仅允许内网访问后台服务。
5.3.2 基于访问频率的控制(限流)
通过 ngx_http_limit_req_module 模块,限制单个客户端的访问频率(如每秒最多 10 个请求),防止恶意请求压垮服务器。
nginx
http {
# 定义限流规则:以客户端IP为key,缓存区大小10M,访问频率10r/s(每秒10个请求)
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
listen 80;
server_name www.test.com;
location / {
limit_req zone=one burst=5 nodelay; # 应用限流规则
# burst=5:允许突发5个请求(超过10r/s的部分,最多5个排队)
# nodelay:突发请求不排队,直接返回503(避免客户端等待)
root /usr/local/nginx/html;
index index.html;
}
}
}- 测试:通过
ab -n 100 -c 10 http://www.test.com/模拟高并发请求,超过频率限制的请求会返回 503 Service Temporarily Unavailable。
5.4 基于域名的 Nginx 虚拟主机
核心原理:服务器绑定多个域名(如 www.test1.com、www.test2.com),所有域名解析到同一服务器 IP;Nginx 通过 server_name 匹配客户端请求的 Host 头,分发到对应的虚拟主机。
配置步骤:
- 服务器绑定多个域名(需在 DNS 服务器配置解析,本地测试可修改
/etc/hosts):
# 本地测试:编辑 /etc/hosts,添加域名映射 echo "192.168.1.100 www.test1.com www.test2.com" >> /etc/hosts
- 准备两个网站的根目录和测试页面:
# 网站1:www.test1.com mkdir -p /usr/local/nginx/html/test1 echo "<h1>Test1 Website</h1>" > /usr/local/nginx/html/test1/index.html # 网站2:www.test2.com mkdir -p /usr/local/nginx/html/test2 echo "<h1>Test2 Website</h1>" > /usr/local/nginx/html/test2/index.html
- 编辑 Nginx 配置,添加两个
server块:
# 虚拟主机1:www.test1.com
server {
listen 80;
server_name www.test1.com;
location / {
root /usr/local/nginx/html/test1;
index index.html;
}
}
# 虚拟主机2:www.test2.com
server {
listen 80;
server_name www.test2.com;
location / {
root /usr/local/nginx/html/test2;
index index.html;
}
}- 验证配置并重载 Nginx:
nginx -t && nginx -s reload
- 访问测试:
- 访问
http://www.test1.com,显示Test1 Website; - 访问
http://www.test2.com,显示Test2 Website。
5.5 基于 IP 的 Nginx 虚拟主机
核心原理:服务器配置多个 IP 地址(如 192.168.1.100、192.168.1.101);Nginx 通过 listen 指令绑定不同的 IP,客户端访问不同的 IP 时,匹配到对应的虚拟主机。
配置步骤:
- 给服务器添加多个 IP(以 CentOS 7 为例):
# 临时添加IP(重启网络失效) ifconfig ens33:1 192.168.1.101 netmask 255.255.255.0 up # 永久添加IP:编辑网卡配置文件 cat > /etc/sysconfig/network-scripts/ifcfg-ens33:1 << EOF TYPE=Ethernet BOOTPROTO=static IPADDR=192.168.1.101 NETMASK=255.255.255.0 DEVICE=ens33:1 ONBOOT=yes EOF # 重启网络 systemctl restart network
- 准备两个网站的根目录(同 5.4 步骤 2);
- 编辑 Nginx 配置,
listen绑定不同 IP:
nginx
# 虚拟主机1:绑定192.168.1.100
server {
listen 192.168.1.100:80; # 绑定IP+端口
server_name 192.168.1.100;
location / {
root /usr/local/nginx/html/test1;
index index.html;
}
}
# 虚拟主机2:绑定192.168.1.101
server {
listen 192.168.1.101:80;
server_name 192.168.1.101;
location / {
root /usr/local/nginx/html/test2;
index index.html;
}
}- 验证配置并重载 Nginx;
- 访问测试:
- 访问
http://192.168.1.100,显示Test1 Website; - 访问
http://192.168.1.101,显示Test2 Website。
5.6 基于端口的 Nginx 虚拟主机
核心原理:Nginx 的不同 server 块监听不同的端口(如 80、8080、8888);客户端通过 “IP + 端口” 访问,Nginx 根据端口匹配对应的虚拟主机,是最简单的虚拟主机配置方式。
配置步骤:
- 准备两个网站的根目录(同 5.4 步骤 2);
- 编辑 Nginx 配置,
listen绑定不同端口:
nginx
# 虚拟主机1:监听80端口
server {
listen 80;
server_name 192.168.1.100;
location / {
root /usr/local/nginx/html/test1;
index index.html;
}
}
# 虚拟主机2:监听8080端口
server {
listen 8080;
server_name 192.168.1.100;
location / {
root /usr/local/nginx/html/test2;
index index.html;
}
}- 开放端口(若防火墙开启):
firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload
- 验证配置并重载 Nginx;
- 访问测试:
- 访问
http://192.168.1.100:80,显示Test1 Website; - 访问
http://192.168.1.100:8080,显示Test2 Website。
三种虚拟主机对比
| 类型 | 核心区分依据 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 基于域名 | server_name(域名) | 多网站共享同一 IP + 端口(如共享 80/443),互联网场景最常用 | 用户友好(无需记端口),节省 IP 资源 | 需配置 DNS 解析,本地测试需修改 hosts |
| 基于 IP | listen(绑定 IP) | 服务器有多个 IP,需区分不同 IP 对应的服务(如内网 / 外网服务分离) | 配置简单,无需依赖 DNS | 浪费 IP 资源,IP 数量有限 |
| 基于端口 | listen(端口) | 测试环境、内部服务(如后台管理系统),无需域名解析 | 配置最简单,无需额外资源 | 用户需记端口(如 8080),不适合互联网场 |
到此这篇关于Nginx概念、架构、配置与虚拟主机实战操作指南的文章就介绍到这了,更多相关nginx架构与虚拟主机内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于Nginx概念、架构、配置与虚拟主机实战操作指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!