web服务基础介绍
一、Web服务核心流程
二、互联网发展里程碑
关键事件时间轴:
三、Web服务器演进
Apache工作模式对比:
模式 | 并发处理方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
Prefork | 多进程(select) | 稳定可靠 | 高内存消耗 | 低并发场景 |
Worker | 多进程+多线程 | 内存占用少 | Keepalive资源浪费 | 中等并发 |
Event | 事件驱动(epoll) | 高并发性能 | 无线程安全控制 | 高并发长连接场景 |
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性能计算:
# 机械磁盘IOPS计算公式
def calculate_iops(rpm):seek_time = 9 # 7200RPM寻址时间(ms)rotational_latency = 60000 / rpm / 2 # 旋转延迟total_latency = seek_time + rotational_latencyreturn 1000 / total_latencyprint(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模型对比:
Epoll核心优势代码解析:
// 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零拷贝对比:
sendfile实现原理:
http {sendfile on; # 启用零拷贝tcp_nopush on; # 优化包传输server {location /largefile {# 直接内核空间到网卡传输sendfile_max_chunk 1m; # 分块传输}}
}
八、关键性能公式
-
并发连接计算:
最大并发 = worker_processes × worker_connections
-
文件描述符限制:
# 系统级限制检查 cat /proc/sys/fs/file-max# 进程级限制设置 worker_rlimit_nofile 65535;
-
Keepalive优化:
http {keepalive_timeout 65 60; # 服务器超时65s,客户端60skeepalive_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开发的增强版,支持大流量场景(如淘宝、天猫)。
- 官网:http://tengine.taobao.org
- OpenResty:集成Lua脚本的高性能Web平台(章亦春团队开发)。
- 官网:http://openresty.org/cn
- Tengine:淘宝基于Nginx开发的增强版,支持大流量场景(如淘宝、天猫)。
-
功能介绍
- 静态资源服务器(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进程:
-
进程间通信
- Master与Worker:通过单向管道传递指令(如进程ID、文件描述符)。
- Worker之间:依赖Master中转信息,或通过共享内存(如
upstream zone
)通信。
-
HTTP连接建立
- Master初始化监听Socket → fork多个Worker → Worker竞争接受新连接(避免惊群)。
- 与传统多进程/多线程模型对比:
- 传统:每连接独占线程,资源消耗大。
- Nginx:单线程处理多连接(事件驱动),高效复用资源。
-
HTTP处理流程
1. 接收请求 → 解析请求行/头 → 匹配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)。
-
编译安装步骤
# 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
命令)。
-
验证与命令
# 查看版本 /usr/local/nginx/sbin/nginx -v# 测试配置 nginx -t# 启停命令 nginx -s reload # 重载配置 nginx -s quit # 优雅停止
-
Systemd服务文件
[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
systemctl daemon-reload systemctl start nginx
2.5 平滑升级与回滚
-
升级流程
-
操作示例
# 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
-
回滚步骤
# 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
匹配)。
主配置文件结构
# 全局配置段(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; |
优化配置示例
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)
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
location /images/ {root /data/web; # 文件路径:/data/web/images/logo.png }
alias
:路径 =alias
替换location
location /static/ {alias /data/files/; # 访问/static/1.txt → /data/files/1.txt }
3.5 高级配置实战
1. 账户认证
location /admin {auth_basic "Admin Area"; # 认证提示文字auth_basic_user_file /etc/nginx/.htpasswd; # 密码文件路径
}
生成密码文件:
htpasswd -c /etc/nginx/.htpasswd admin
2. 自定义错误页面
error_page 404 /404.html;
location = /404.html {root /data/web/errors;internal; # 禁止直接访问
}
3. 文件下载服务
location /download {autoindex on; # 启用目录列表autoindex_localtime on; # 显示服务器本地时间limit_rate 1024k; # 限速 1MB/s
}
4. 长连接优化
http {keepalive_timeout 30s; # 长连接超时keepalive_requests 1000; # 单连接最大请求数
}
5. 防盗链配置
location ~* \.(jpg|png)$ {valid_referers none blocked *.example.com;if ($invalid_referer) {return 403; # 非法引用返回403}
}
3.6 配置调试技巧
- 语法检查:
nginx -t
- 热重载配置:
nginx -s reload
- 查看版本与编译参数:
nginx -V
关键提示:
- 修改配置后务必用
nginx -t
测试语法。- 生产环境建议使用
include
拆分配置(如conf.d/*.conf
)。- 避免在
location
中使用if
进行复杂判断(影响性能)。
nginx的高级配置
4.1 Nginx 状态页
- 功能:监控服务器全局状态(非虚拟主机)。
- 依赖模块:
ngx_http_stub_status_module
(编译时需添加--with-http_stub_status_module
)。 - 配置示例:
location /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
(默认内置)。 - 关键配置指令:
gzip 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
:#define NGINX_VERSION "1.0" // 自定义版本号 #define NGINX_VER "HAHA/" NGINX_VERSION // 自定义服务器标识
- 重新编译安装 Nginx。
- 编辑 Nginx 源码文件
4.4 Nginx 变量使用
- 内置变量:直接调用
$remote_addr
:客户端 IP$request_uri
:原始请求 URI(含参数)$scheme
:请求协议(HTTP/HTTPS)
- 自定义变量:
location /test {set $name "timinglee"; # 定义变量echo $name; # 输出变量值 }
五、Nginx Rewrite 相关功能
5.1 ngx_http_rewrite_module 模块指令
-
if
指令- 作用:条件匹配,根据结果执行不同配置。
- 语法:
if (条件) { ... }
- 匹配规则:
=
/!=
:字符串相等/不等~
/~*
:正则匹配(区分/不区分大小写)!-e
/!-f
:文件或目录不存在
- 示例:
location /test {if (!-e $request_filename) {return 404 "File not found";} }
-
set
指令- 作用:定义变量。
- 示例:
set $name "timinglee"; echo $name; # 输出 "timinglee"
-
break
指令- 作用:终止当前作用域内后续的
rewrite
指令。 - 示例:
location /break {set $name lee;break; # 后续 set 指令不执行set $port 80; # 被跳过 }
- 作用:终止当前作用域内后续的
-
return
指令- 作用:直接返回响应码或重定向。
- 示例:
location /return {return 301 https://$host$request_uri; # 永久重定向到 HTTPS }
5.2 rewrite 指令
- 语法:
rewrite regex replacement [flag];
- 常用 Flags:
Flag 作用 适用场景 last
重写后重新匹配 location 多次重写 break
终止当前重写,继续非 rewrite
指令单次重写 redirect
临时重定向(302) 测试环境 permanent
永久重定向(301) 生产环境域名变更
实战案例
-
HTTPS 自动跳转:
server {listen 80;if ($scheme = http) {rewrite ^ https://$host$request_uri permanent; } }
-
旧域名重定向:
rewrite ^/old-url(.*)$ http://new.timinglee.org$1 permanent;
-
动静分离资源重写:
location ~* \.(jpg|css)$ {rewrite ^/static/(.*) /resources/$1 break; # 重写静态资源路径 }
六、高级功能
6.1 防盗链配置
- 原理:校验
Referer
头,阻止非授权站点资源盗用。 - 配置示例:
location ~* \.(jpg|png)$ {valid_referers none blocked *.timinglee.org;if ($invalid_referer) {return 403 "Access Forbidden";} }
6.2 缓存加速
-
Proxy Cache 配置:
proxy_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 网关、自定义认证)。
- 安装步骤:
./configure --prefix=/apps/openresty --with-http_ssl_module make && make install
- 基础示例(Lua 输出):
location /hello {content_by_lua_block {ngx.say("Hello, OpenResty!")} }