web服务基础介绍
一、Web服务核心流程
客户端 Web服务器 应用处理 HTTP请求 (Request) 请求处理 生成响应 HTTP响应 (Response) 客户端 Web服务器 应用处理
二、互联网发展里程碑
关键事件时间轴:
1994-01-01 1996-01-01 1998-01-01 2000-01-01 2002-01-01 2004-01-01 2006-01-01 2008-01-01 第一根专线开通 中国黄页上线 阿里巴巴创立 淘宝网上线 支付宝创立 双十一启动 里程碑 中国互联网发展历程
三、Web服务器演进
Apache工作模式对比:
模式 | 并发处理方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
Prefork | 多进程(select) | 稳定可靠 | 高内存消耗 | 低并发场景 |
Worker | 多进程+多线程 | 内存占用少 | Keepalive资源浪费 | 中等并发 |
Event | 事件驱动(epoll) | 高并发性能 | 无线程安全控制 | 高并发长连接场景 |
Nginx核心优势:
nginx
# Nginx典型应用架构示例
http {
upstream app_servers {
server 10.0.0.101:8080 weight=5;
server 10.0.0.102:8080;
}
server {
listen 80;
server_name example.com;
# 静态资源直返
location ~* \.(jpg|css|js)$ {
root /data/static;
expires 30d;
}
# 动态请求代理
location /api {
proxy_pass http://app_servers;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
四、用户体验关键指标
性能影响研究数据:
- 8秒定律:页面加载>8秒 → 30%用户放弃
- 亚马逊:延迟100ms → 1%交易损失
- Google:延迟500ms → 20%流量下降
- 79%用户不会再次访问慢速网站
- 40%用户在3秒延迟后离开
性能影响因素矩阵:
用户体验 客户端因素 服务端因素 硬件配置 网络速率 地理距离 网络带宽 硬件性能 架构设计 并发处理
五、服务端I/O深度解析
磁盘I/O性能计算:
python
# 机械磁盘IOPS计算公式
def calculate_iops(rpm):
seek_time = 9 # 7200RPM寻址时间(ms)
rotational_latency = 60000 / rpm / 2 # 旋转延迟
total_latency = seek_time + rotational_latency
return 1000 / total_latency
print(f"7200RPM磁盘IOPS: {calculate_iops(7200):.1f}") # 75.9
print(f"15000RPM磁盘IOPS: {calculate_iops(15000):.1f}") # 166.6
网络I/O处理流程:
- 请求接收:TCP三次握手建立连接
- 数据处理 :
- 内核空间 → 用户空间数据拷贝
- 应用层请求处理
- 响应返回 :
- 用户空间 → 内核空间拷贝
- 内核 → 网卡传输
六、I/O模型演进
五种I/O模型对比:
I/O模型 阻塞I/O 非阻塞I/O 多路复用I/O 信号驱动I/O 异步I/O 进程挂起等待 轮询消耗CPU select/poll/epoll 内核信号通知 全程无阻塞
Epoll核心优势代码解析:
c
// Epoll高效实现原理
int epoll_create(int size); // 创建epoll实例
struct epoll_event {
uint32_t events; // EPOLLIN/EPOLLOUT等
epoll_data_t data; // 用户数据
};
// 注册监控事件
epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event);
// 等待事件就绪
int n = epoll_wait(epfd, events, MAX_EVENTS, timeout);
for (int i = 0; i < n; i++) {
process_event(events[i]); // 仅处理活跃连接
}
七、零拷贝技术
传统vs零拷贝对比:
传统方式 4次拷贝 2次CPU切换 零拷贝 2次拷贝 0次CPU切换
sendfile实现原理:
nginx
http {
sendfile on; # 启用零拷贝
tcp_nopush on; # 优化包传输
server {
location /largefile {
# 直接内核空间到网卡传输
sendfile_max_chunk 1m; # 分块传输
}
}
}
八、关键性能公式
-
并发连接计算:
最大并发 = worker_processes × worker_connections
-
文件描述符限制:
bash# 系统级限制检查 cat /proc/sys/fs/file-max # 进程级限制设置 worker_rlimit_nofile 65535;
-
Keepalive优化:
nginxhttp { keepalive_timeout 65 60; # 服务器超时65s,客户端60s keepalive_requests 1000; # 单连接最大请求数 }
二:Nginx架构和安装
2.1 Nginx概述
-
Nginx介绍
- Nginx(engine X)由俄罗斯开发者Igor Sysoev于2002年创建,分为社区版和商业版(Nginx Plus)。
- 2019年被F5 Networks以6.7亿美元收购。
- 核心功能:高性能HTTP/HTTPS反向代理服务器、邮件代理服务器、TCP/UDP代理服务器,解决C10K问题(单机10万并发连接)。
- 官网:http://nginx.org
-
二次发行版
- Tengine :淘宝基于Nginx开发的增强版,支持大流量场景(如淘宝、天猫)。
- OpenResty :集成Lua脚本的高性能Web平台(章亦春团队开发)。
-
功能介绍
- 静态资源服务器(HTML/图片/JS/CSS)。
- HTTP/HTTPS反向代理。
- 动态资源代理(FastCGI/uWSGI/SCGI)。
- TCP/UDP请求转发。
- IMAP4/POP3邮件代理。
-
基础特性
- 模块化设计,高扩展性。
- 高可靠性,支持热部署(不停机更新配置/版本)。
- 低内存消耗:1万keep-alive连接仅需2.5MB内存。
- 事件驱动模型(epoll)、异步I/O、零拷贝(sendfile)。
-
Web服务功能
- 虚拟主机(
server
块)。 - 支持keep-alive和管道连接复用。
- 访问日志定制、URL重写、路径别名。
- IP/用户访问控制、速率/并发限制。
- 虚拟主机(
2.2 Nginx架构和进程
-
进程结构
- Master进程 :
- 管理Worker进程,加载配置、绑定端口、平滑升级。
- 接收外部信号(如
reload
/stop
),监控Worker状态(异常时自动重启)。
- Worker进程 :
- 实际处理请求(平等、独立),数量建议等于CPU核心数。
- 功能:接收请求、I/O调用、缓存查询、响应结果。
Master进程 Worker 1 Worker 2 Worker N 处理HTTP请求 FastCGI调用 访问缓存
- Master进程 :
-
进程间通信
- Master与Worker:通过单向管道传递指令(如进程ID、文件描述符)。
- Worker之间:依赖Master中转信息,或通过共享内存 (如
upstream zone
)通信。
-
HTTP连接建立
- Master初始化监听Socket → fork多个Worker → Worker竞争接受新连接(避免惊群)。
- 与传统多进程/多线程模型对比:
- 传统:每连接独占线程,资源消耗大。
- Nginx:单线程处理多连接(事件驱动),高效复用资源。
-
HTTP处理流程
plaintext1. 接收请求 → 解析请求行/头 → 匹配Server块 2. URL重写 → IP访问控制 → 生成响应 3. 内容处理 → 日志记录 → 返回数据
2.3 Nginx模块介绍
- 核心模块 :进程管理、错误日志、配置文件解析(
ngx_core_module
)。 - 标准HTTP模块 :端口配置、编码设置、响应头控制(
ngx_http_core_module
)。 - 可选HTTP模块:SSL支持、压缩、GeoIP解析(需编译时启用)。
- 邮件模块 :POP3/IMAP/SMTP协议支持(
ngx_mail_module
)。 - Stream模块 :TCP/UDP反向代理(
ngx_stream_module
)。 - 第三方模块:JSON/Lua扩展(如OpenResty)。
模块分类图:
核心模块 → HTTP模块 → 邮件模块 → Stream模块 → 第三方模块
2.4 Nginx安装
-
版本选择
- Mainline:开发版(奇数版本,如1.19)。
- Stable:稳定版(偶数版本,如1.20)。
- Legacy:旧稳定版(如1.18)。
-
编译安装步骤
bash# 1. 安装依赖 dnf install gcc pcre-devel zlib-devel openssl-devel -y useradd -s /sbin/nologin -M nginx # 2. 解压并编译 tar zxf nginx-1.24.0.tar.gz cd nginx-1.24.0 ./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-stream \ # TCP/UDP代理 --with-pcre # 正则支持 # 3. 安装 make && make install
-
目录结构
conf/
:配置文件(核心:nginx.conf
)。html/
:默认Web资源(可更改路径)。logs/
:日志(访问日志/错误日志/PID文件)。sbin/
:可执行文件(nginx
命令)。
-
验证与命令
bash# 查看版本 /usr/local/nginx/sbin/nginx -v # 测试配置 nginx -t # 启停命令 nginx -s reload # 重载配置 nginx -s quit # 优雅停止
-
Systemd服务文件
ini[Unit] Description=The NGINX HTTP Server After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/bin/kill -s QUIT $MAINPID [Install] WantedBy=multi-user.target
bashsystemctl daemon-reload systemctl start nginx
2.5 平滑升级与回滚
-
升级流程
用户 Nginx Nginx Master 新Master 旧Worker 旧Master 发送USR2信号 重命名pid为nginx.pid.oldbin 启动新进程(旧Master子进程) 发送WINCH信号(平滑停止) 发送QUIT信号(关闭) 用户 Nginx Nginx Master 新Master 旧Worker 旧Master
-
操作示例
bash# 1. 备份旧二进制文件 cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old # 2. 编译新版本(仅make不install) cd nginx-1.26.1 ./configure [参数同旧版] make # 3. 替换二进制文件 cp -f objs/nginx /usr/local/nginx/sbin/ # 4. 触发升级 kill -USR2 旧Master_PID # 启动新Master kill -WINCH 旧Master_PID # 关闭旧Worker # 5. 验证后清理旧Master kill -QUIT 旧Master_PID
-
回滚步骤
bash# 1. 恢复旧二进制文件 mv /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx # 2. 重启旧Worker kill -HUP 旧Master_PID # 3. 关闭新Master kill -WINCH 新Master_PID kill -QUIT 新Master_PID
关键点:
- 升级时新旧进程并存,旧进程处理存量请求。
- 回滚需确保旧配置兼容性。
Nginx 核心配置详解
3.1 配置文件结构与说明
核心组成
- 主配置文件 :
nginx.conf
- 子配置文件 :通过
include conf.d/*.conf
加载 - MIME类型文件 :
mime.types
(定义文件扩展名与类型的映射) - 其他协议配置 :如
fastcgi_params
(FastCGI参数)
配置文件格式规则
- 指令以分号
;
结尾,指令与值间用空格分隔。 - 指令块用
{}
组织,可嵌套(如http
、server
、location
)。 - 使用
#
添加注释,$
引用变量。 - 支持正则表达式(如
location
匹配)。
主配置文件结构
nginx
# 全局配置段(main block)
user nginx nginx; # 运行用户和组
worker_processes auto; # 工作进程数(推荐 = CPU核心数)
error_log /var/log/nginx/error.log; # 错误日志路径
pid /run/nginx.pid; # PID文件路径
# 事件驱动配置(event block)
events {
worker_connections 1024; # 单个工作进程最大并发连接数
use epoll; # 事件驱动模型(Linux推荐epoll)
}
# HTTP协议配置(http block)
http {
include mime.types; # 导入MIME类型文件
default_type application/octet-stream; # 默认MIME类型
sendfile on; # 启用零拷贝传输
keepalive_timeout 65; # 长连接超时时间
# 虚拟主机配置(server block)
server {
listen 80; # 监听端口
server_name example.com; # 域名
root /var/www/html; # 网站根目录
# URL路径匹配(location block)
location / {
index index.html; # 默认首页
}
}
# 可扩展配置:mail、stream等
}
3.2 全局配置详解
关键指令
指令 | 作用 | 示例 |
---|---|---|
worker_processes |
工作进程数(推荐设为CPU核心数) | worker_processes 4; |
worker_cpu_affinity |
绑定进程到CPU核心(减少上下文切换) | worker_cpu_affinity 0001 0010; |
error_log |
错误日志路径和级别 | error_log logs/error.log warn; |
worker_rlimit_nofile |
进程最大打开文件数 | worker_rlimit_nofile 65535; |
events.use |
事件驱动模型(Linux用epoll ) |
use epoll; |
优化配置示例
nginx
user nginx nginx;
worker_processes auto;
worker_cpu_affinity auto;
error_log /var/log/nginx/error.log error;
pid /run/nginx.pid;
worker_rlimit_nofile 100000;
events {
worker_connections 65535;
use epoll;
multi_accept on; # 一次接受多个连接
}
3.3 HTTP块核心配置
基础指令
指令 | 作用 | 示例 |
---|---|---|
include |
导入其他配置文件 | include conf.d/*.conf; |
default_type |
默认MIME类型(未知文件类型) | default_type text/plain; |
sendfile |
启用零拷贝传输(提升静态文件性能) | sendfile on; |
keepalive_timeout |
长连接超时时间 | keepalive_timeout 30s; |
虚拟主机配置(Server Block)
nginx
server {
listen 80; # 监听端口
server_name www.example.com; # 域名(支持通配符)
root /data/web/html; # 网站根目录
access_log /var/log/nginx/access.log; # 访问日志路径
# 错误页面定制
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
3.4 Location块深度解析
匹配规则与优先级
符号 | 匹配规则 | 优先级 | 示例 |
---|---|---|---|
= |
精确匹配 | 最高 | location = /logo.png { ... } |
^~ |
前缀匹配(不检查正则) | 高 | location ^~ /static/ { ... } |
~ |
正则匹配(区分大小写) | 中 | location ~ \.php$ { ... } |
~* |
正则匹配(不区分大小写) | 中 | `location ~* .(jpg |
无符号 | 通用前缀匹配 | 低 | location / { ... } |
root vs alias
-
root
:路径 =root
+location
nginxlocation /images/ { root /data/web; # 文件路径:/data/web/images/logo.png }
-
alias
:路径 =alias
替换location
nginxlocation /static/ { alias /data/files/; # 访问/static/1.txt → /data/files/1.txt }
3.5 高级配置实战
1. 账户认证
nginx
location /admin {
auth_basic "Admin Area"; # 认证提示文字
auth_basic_user_file /etc/nginx/.htpasswd; # 密码文件路径
}
生成密码文件:
bash
htpasswd -c /etc/nginx/.htpasswd admin
2. 自定义错误页面
nginx
error_page 404 /404.html;
location = /404.html {
root /data/web/errors;
internal; # 禁止直接访问
}
3. 文件下载服务
nginx
location /download {
autoindex on; # 启用目录列表
autoindex_localtime on; # 显示服务器本地时间
limit_rate 1024k; # 限速 1MB/s
}
4. 长连接优化
nginx
http {
keepalive_timeout 30s; # 长连接超时
keepalive_requests 1000; # 单连接最大请求数
}
5. 防盗链配置
nginx
location ~* \.(jpg|png)$ {
valid_referers none blocked *.example.com;
if ($invalid_referer) {
return 403; # 非法引用返回403
}
}
3.6 配置调试技巧
-
语法检查 :
bashnginx -t
-
热重载配置 :
bashnginx -s reload
-
查看版本与编译参数 :
bashnginx -V
关键提示:
- 修改配置后务必用
nginx -t
测试语法。- 生产环境建议使用
include
拆分配置(如conf.d/*.conf
)。- 避免在
location
中使用if
进行复杂判断(影响性能)。
nginx的高级配置
4.1 Nginx 状态页
-
功能:监控服务器全局状态(非虚拟主机)。
-
依赖模块 :
ngx_http_stub_status_module
(编译时需添加--with-http_stub_status_module
)。 -
配置示例 :
nginxlocation /nginx_status { stub_status; # 启用状态页 auth_basic "Auth Login"; # 基础认证 auth_basic_user_file /usr/local/nginx/conf/.htpasswd; allow 192.168.0.0/16; # 访问控制 allow 127.0.0.1; deny all; }
-
输出指标解析 :
Active connections
:当前活动连接数(含Reading
+Writing
+Waiting
)。accepts
:Nginx 启动后接受的客户端请求总数。handled
:已处理的请求数(通常等于accepts
)。requests
:客户端发送的总请求数。Reading
:正在读取请求头的连接数(值高可能需优化性能)。Writing
:正在发送响应的连接数(反映并发压力)。Waiting
:空闲连接数(开启keep-alive
时有效)。
4.2 Nginx 压缩功能
-
功能:减少传输体积,提升加载速度(消耗 CPU 资源)。
-
依赖模块 :
ngx_http_gzip_module
(默认内置)。 -
关键配置指令 :
nginxgzip on; # 启用压缩 gzip_comp_level 4; # 压缩级别(1-9,建议4-5) gzip_min_length 1k; # 最小压缩文件大小 gzip_types text/css application/xml text/javascript; # 压缩文件类型 gzip_vary on; # 响应头添加 `Vary: Accept-Encoding`
-
适用场景:文本文件(HTML/CSS/JS/XML),图片视频类文件效果有限。
4.3 Nginx 版本隐藏
- 安全优化:避免暴露版本信息被利用。
- 修改方法 :
-
编辑 Nginx 源码文件
src/core/nginx.h
:c#define NGINX_VERSION "1.0" // 自定义版本号 #define NGINX_VER "HAHA/" NGINX_VERSION // 自定义服务器标识
-
重新编译安装 Nginx。
-
4.4 Nginx 变量使用
-
内置变量 :直接调用
$remote_addr
:客户端 IP$request_uri
:原始请求 URI(含参数)$scheme
:请求协议(HTTP/HTTPS)
-
自定义变量 :
nginxlocation /test { set $name "timinglee"; # 定义变量 echo $name; # 输出变量值 }
五、Nginx Rewrite 相关功能
5.1 ngx_http_rewrite_module 模块指令
-
if
指令-
作用:条件匹配,根据结果执行不同配置。
-
语法 :
nginxif (条件) { ... }
-
匹配规则 :
=
/!=
:字符串相等/不等~
/~*
:正则匹配(区分/不区分大小写)!-e
/!-f
:文件或目录不存在
-
示例 :
nginxlocation /test { if (!-e $request_filename) { return 404 "File not found"; } }
-
-
set
指令-
作用:定义变量。
-
示例 :
nginxset $name "timinglee"; echo $name; # 输出 "timinglee"
-
-
break
指令-
作用 :终止当前作用域内后续的
rewrite
指令。 -
示例 :
nginxlocation /break { set $name lee; break; # 后续 set 指令不执行 set $port 80; # 被跳过 }
-
-
return
指令-
作用:直接返回响应码或重定向。
-
示例 :
nginxlocation /return { return 301 https://$host$request_uri; # 永久重定向到 HTTPS }
-
5.2 rewrite 指令
-
语法 :
nginxrewrite regex replacement [flag];
-
常用 Flags :
Flag 作用 适用场景 last
重写后重新匹配 location 多次重写 break
终止当前重写,继续非 rewrite
指令单次重写 redirect
临时重定向(302) 测试环境 permanent
永久重定向(301) 生产环境域名变更
实战案例
-
HTTPS 自动跳转:
nginxserver { listen 80; if ($scheme = http) { rewrite ^ https://$host$request_uri permanent; } }
-
旧域名重定向:
nginxrewrite ^/old-url(.*)$ http://new.timinglee.org$1 permanent;
-
动静分离资源重写:
nginxlocation ~* \.(jpg|css)$ { rewrite ^/static/(.*) /resources/$1 break; # 重写静态资源路径 }
六、高级功能
6.1 防盗链配置
-
原理 :校验
Referer
头,阻止非授权站点资源盗用。 -
配置示例 :
nginxlocation ~* \.(jpg|png)$ { valid_referers none blocked *.timinglee.org; if ($invalid_referer) { return 403 "Access Forbidden"; } }
6.2 缓存加速
-
Proxy Cache 配置:
nginxproxy_cache_path /data/cache levels=1:2 keys_zone=mycache:10m max_size=10g; server { location / { proxy_cache mycache; proxy_cache_valid 200 302 10m; # 缓存200/302响应10分钟 proxy_pass http://backend; } }
-
效果对比:
- 未启用缓存:请求处理耗时 0.514s
- 启用 Memcached:耗时降至 0.452s
- 启用
srcache
+ Memcached:进一步降至 0.255s
七、Nginx 二次开发版本
7.1 OpenResty
-
核心价值:通过 Lua 脚本扩展 Nginx,实现动态逻辑(如 API 网关、自定义认证)。
-
安装步骤 :
bash./configure --prefix=/apps/openresty --with-http_ssl_module make && make install
-
基础示例 (Lua 输出):
nginxlocation /hello { content_by_lua_block { ngx.say("Hello, OpenResty!") } }