一、Web 服务基础介绍
Web 服务是指在互联网上运行的应用程序,通过标准化的 HTTP 协议与客户端进行通信,提供动态或静态内容服务的系统。目前主流的 Web 服务器有 Apache 和 Nginx 等。
1.1 Apache
Apache 起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发,目前经历了 1.X 和 2.X 两大版本,可通过编译安装实现特定功能,其主要有以下几种工作模型:
- prefork 模型:预派生模式,有一个主控制进程,然后生成多个子进程,使用 select 模型,最大并发 1024。每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但比较稳定,可设置最大和最小进程数,适用于访问量不是很大的场景。
- worker 模型:多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程处理请求。当线程不够使用时会再启动一个新的子进程,在进程里再启动线程处理请求。相比 prefork,占用内存较少,可同时处理更多请求,但在使用 keepalive 的长连接方式时,可能会出现线程被长期占据的问题。
- event 模型:Apache 中最新的模式,2012 年发布的 apache 2.4.X 系列正式支持,属于事件驱动模型(epoll)。每个进程响应多个请求,解决了 keepalive 场景下长期被占用的线程的资源浪费问题,有一个专门的线程来管理 keepalive 类型的线程,当有真实请求过来时,将请求传递给服务线程,执行完毕后释放,增强了高并发场景下的请求处理能力,但没有线程安全控制。
1.2 Nginx
Nginx 是由俄罗斯工程师伊戈尔・赛索耶夫为俄罗斯著名搜索网站rambler.ru开发的,开发工作最早从 2002 年开始,第一次公开发布时间是 2004 年 10 月 4 日,版本号是 0.1.0。2019 年 3 月 11 日,F5 收购 NGINX 的所有已发行股票,总价值约为 6.7 亿美元。
Nginx 历经十几年的迭代更新,目前功能完善且运行稳定,版本分为开发版、稳定版和过期版。它以功能丰富著称,既可以作为 http 服务器,也可以作为反向代理服务器或者邮件服务器,能够快速响应静态网页的请求,支持 FastCGI、SSL、Virtual Host、URL Rewrite、Gzip、HTTP Basic Auth、http 或者 TCP 的负载均衡(1.9 版本以上且开启 stream 模块)等功能,并且支持第三方的功能扩展。天猫、淘宝、京东、小米、163、新浪等一线互联网公司都在用 Nginx 或者进行二次开发。
1.3影响用户体验的因素
影响用户体验的因素主要包括客户端和服务器两方面。客户端因素有客户端硬件配置、网络速率以及与服务端的距离;服务器因素有网络速率、硬件配置、架构设计、应用程序工作模式、并发数量、响应文件大小及数量、buffer cache、I/O 压力等。
1.4服务端 I/O 流程
I/O 在计算机中指 Input/Output,IOPS(Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。一次完整的 I/O 是用户空间的进程数据与内核空间的内核数据的报文的完整交换,由于内核空间与用户空间严格隔离,数据交换需经历从内核空间内存数据到用户空间进程内存的复制过程。服务器的 I/O 主要包括磁盘 I/O 和网络 I/O,网络 I/O 本质为对 socket 文件的读写。
1.4.1 磁盘 I/O
磁盘 I/O 是进程向内核发起系统调用,请求磁盘上的资源,内核通过相应驱动程序将目标文件加载到内核的内存空间,再复制给进程内存。机械磁盘的性能受寻道时间、旋转延迟和数据传输时间影响:
- 寻道时间:磁头移动到正确磁道的时间,一般在 3-15 毫秒。
- 旋转延迟:磁盘片旋转到数据所在扇区到磁头下面的时间,取决于转速,通常取旋转一周时间的 1/2。
- 数据传输时间:读取数据后传输的时间,主要取决于传输速率,目前磁盘接口传输速度可达 600MB/s,相对可忽略。
常见机械磁盘的平均寻道时间和延迟时间不同,每秒最大 IOPS 可通过相应公式计算,如 7200 转的磁盘 IOPS 计算方式为 1000 毫秒 /(9 毫秒的寻道时间 + 4.17 毫秒的平均旋转延迟时间)=75.9 IOPS。
1.4.2 网络 I/O
网络通信中,网络协议栈到用户空间进程的 IO 就是网络 IO。其处理过程包括获取请求数据(客户端与服务器建立连接发出请求,服务器接受请求)、构建响应(服务器在用户空间处理请求,构建响应)、返回数据(服务器将响应通过内核空间的网络 I/O 发还给客户端)。无论磁盘还是网络 I/O,每次 I/O 都要经历将数据从文件加载至内核内存空间(缓冲区)和将数据从内核缓冲区复制到用户空间进程内存两个阶段。
1.5 I/O 模型
1.5.1 I/O 模型相关概念
- 同步 / 异步:关注消息通信机制。同步指被调用者不提供事件处理结果通知,需调用者主动询问;异步指被调用者通过状态、通知或回调机制主动通知调用者运行状态。
- 阻塞 / 非阻塞:关注调用者等待结果返回前的状态。阻塞指 IO 操作需彻底完成后才返回到用户空间,调用者被挂起;非阻塞指 IO 操作被调用后立即返回状态值,调用者不会被挂起,可做其他事情。
1.5.2 网络 I/O 模型
包括阻塞型、非阻塞型、复用型、信号驱动型、异步五种:
- 阻塞型 I/O 模型:用户线程在内核进行 IO 操作时被阻塞,程序简单,但每个连接需独立进程 / 线程处理,并发请求量大时内存、线程切换开销大。
- 非阻塞型 I/O 模型:用户线程发起 IO 请求时立即返回,需不断发起 IO 请求直到数据到达,存在 “轮询” 机制,浪费 CPU,很少直接使用。
- 多路复用 I/O 型:一个线程可同时监控和处理多个文件描述符对应的 IO,通过 select、poll、epoll 等系统调用实现,允许单进程处理多个网络连接的 IO,但阻塞在 select 或 poll 调用上。
- 信号驱动式 I/O 模型:进程通过系统调用 sigaction 注册信号处理回调函数,内核在数据就绪时产生 SIGIO 信号,回调函数调用 recvfrom 获取数据,等待数据期间进程不阻塞,但大量 IO 操作时可能因信号队列溢出无法通知。
- 异步 I/O 模型:用户进程进行 aio_read 系统调用后直接返回,内核在数据准备好并复制到进程后通知用户进程,IO 两个阶段进程都非阻塞,能充分利用 DMA 特性,但操作系统实现复杂,Linux 下 AIO 不完善。
1.5.3 五种 IO 对比
前四种属于同步 I/O,因真正的 I/O 操作会阻塞进程 / 线程,只有异步 I/O 模型与 POSIX 定义的异步 I/O 相匹配。
1.5.4 I/O 的具体实现方式
Nginx 在不同操作系统及版本上实现不同事件驱动模型,主要有 select、poll、epoll、kqueue、Iocp、rtsig、/dev/poll、eventport 等。其中 select 在 linux 和 windows 平台基本支持,有最大并发限制 1024;poll 是 select 的升级版,无最大并发限制,windows 不支持;epoll 是高性能事件驱动库,效率高,支持大并发,I/O 效率不随描述符数目增加而线性下降。
二、Nginx 架构
2.1Nginx 概述
2.1.1 Nginx 介绍
Nginx(engine X)于 2002 年开发,分为社区版和商业版(nginx plus),2019 年 3 月 11 日被 F5 Networks 以 6.7 亿美元收购。它是免费、开源、高性能的 HTTP 和反向代理服务器、邮件代理服务器以及 TCP/UDP 代理服务器,能解决 C10K 问题(10K Connections),官网为http://nginx.org。
nginx 的二次发行版有 Tengine(由淘宝网发起,在 Nginx 基础上添加高级功能和特性)和 OpenResty(基于 Nginx 与 Lua 语言的高性能 Web 平台)。
2.1.2 Nginx 功能介绍
可作为静态 web 资源服务器,处理 html、图片、js、css、txt 等静态资源;支持 http/https 协议的反向代理;结合 FastCGI/uWSGI/SCGI 等协议反向代理动态资源请求;进行 tcp/udp 协议和 imap4/pop3 协议的反向代理。
2.1.3 基础特性
具有模块化设计,扩展性好;高可靠性;支持热部署,可不停机更新配置文件、升级版本、更换日志文件;低内存消耗,10000 个 keep-alive 连接模式下的非活动连接仅需 2.5M 内存;采用 event-driven、aio、mmap、sendfile 等技术。
2.1.4 Web 服务相关功能
支持虚拟主机(server)、keep-alive 和管道连接、访问日志(支持基于日志缓冲提高性能)、url rewirte、路径别名、基于 IP 及用户的访问控制、速率限制及并发数限制,可重新配置和在线升级而不中断客户的工作进程。
2.2 Nginx 架构和进程
2.2.1 架构概述
Nginx 采用多进程组织模型,由 Master 主进程和 Worker 工作进程组成,通过事件驱动、异步非阻塞等机制实现高效处理。
2.2.2 Nginx 进程结构
- 主进程(master process):对外接收外部操作(信号),对内根据操作通过信号管理 Worker,监控 Worker 进程运行状态,读取并验证 Nginx 配置文件有效性和正确性,建立、绑定和关闭 socket 连接,按照配置生成、管理和结束工作进程,接受外界指令(如重启、升级及退出服务器等),实现平滑升级和配置应用,开启日志文件,编译和处理 perl 脚本。
- 工作进程(worker process):所有 Worker 进程平等,实际处理网络请求,数量一般设置为核心数,以充分利用 CPU 资源,避免进程竞争和上下文切换损耗。接受处理客户请求,将请求送入各功能模块处理,进行 I/O 调用获取响应数据,与后端服务器通信接收处理结果,缓存数据,发送请求结果响应客户,接收主程序指令。
2.2.3 Nginx 进程间通信
主进程使用 fork () 函数生成工作进程,建立全局工作表存放工作进程信息,生成工作进程后将其加入表中,并建立单向管道传递指令等信息。主进程与外界通过信号通信,接收信号后通过管道向相关工作进程发送指令,工作进程捕获管道可读事件后读取解析并执行。worker 进程间通信通过主进程建立管道实现,也可通过共享内存通讯。
2.2.4 Nginx 启动和 HTTP 连接建立
Nginx 启动时,Master 进程加载配置文件,初始化监听的 socket,fork 出多个 Worker 进程。Worker 进程竞争新的连接,获胜方通过三次握手建立 Socket 连接并处理请求。与传统服务器相比,Nginx 一个线程可同时处理多连接,通过用户代码完成连接切换,减少 OS 进程切换。
2.2.5 HTTP 处理过程
包括初始化、读取解析请求、注册匹配虚拟主机、处理请求、获得响应、过滤数据和数据加工等阶段。
2.3 Nginx 模块介绍
nginx 有多种模块,核心模块是服务器正常运行必不可少的,提供错误日志记录、配置文件解析等核心功能;标准 HTTP 模块提供 HTTP 协议解析相关功能;可选 HTTP 模块扩展标准 HTTP 功能;邮件服务模块支持邮件服务;Stream 服务模块实现反向代理功能;第三方模块扩展服务器应用,完成自定义功能。nginx 高度模块化,1.9.11 版本支持动态装载和卸载模块。
三、实验
3.1nginx命令常用参数
-v #show version and exit---显示版本
-V #show version and configure options then exit---显示版本和编译参数
-t #test configuration and exit---检测配置文件是否异常
-q #suppress non-error messages during configuration testing---静默模式
-p #set prefix path---指定Nginx 目录
-c #set configuration file---配置文件路径
-g #set global directives out of configuration file---设置全局指令
3.2nginx 配置文件
#user nginx
worker_processes 6; #启动工作进程数数量
3.3高并发配置
配置前
配置后
具体配置
[root@webserver conf]# vim nginx.conf
worker_rlimit_nofile 100000;
pid logs/nginx.pid;
events {
worker_connections 100000;
}[root@webserver conf]# vim /etc/security/limits.conf
* - nofile 100000
* - nproc 100000
root - nofile 100000
3.4建设基于域名的虚拟站点
[root@webserver conf.d]# vim vhosts.conf
server {
listen 80;
server_name www.tang.org;
root /web/html;
index index.html;
}
[root@webserver conf.d]# vim /etc/hosts
172.168.232.121 webserver.tang.org www.tang.org[root@webserver conf.d]# nginx -s reload
3.5用户认证
[root@webserver conf.d]# vim vhosts.conf
server {
listen 80;
server_name www.tang.org;
root /web/html;
index index.html;location /login/ {
root /web/;
index index.html;
auth_basic "login password";
auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
}
}[root@webserver conf.d]# htpasswd -mb /usr/local/nginx/conf/.htpasswd tang tang
Adding password for user tang[root@webserver conf.d]# mkdir -p /web/login
[root@webserver conf.d]# echo login > /web/login/index.html
[root@webserver conf.d]# nginx -s reload
3.6自定义错误页面
[root@webserver conf.d]# echo "出错了" > /web/errorpage/error.html
[root@webserver conf.d]# vim vhosts.conf
error_page 500 502 503 504 404 403 /errorpage/error.html;
location /errorpage {
root /web/:
}
[root@webserver conf.d]# nginx -s reload
3.7自定义日志
[root@webserver conf.d]# vim vhosts.conf
error_log /usr/local/nginx/logs/tang.org.err;
access_log /usr/local/nginx/logs/tang.org.access;[root@webserver conf.d]# nginx -s reload
[root@webserver conf.d]# curl www.tang.org
[root@webserver conf.d]# curl www.tang.org/annn
3.8文件检测参数
[root@webserver conf.d]# vim vhosts.conf
try_files $uri $uri.html $uri/index.html /errorpage/default.html;
[root@webserver conf.d]# nginx -s reload
[root@webserver conf.d]# echo default > /web/errorpage/default.html
3.9长链接控制
[root@webserver conf.d]# vim /usr/local/nginx/conf/nginx.conf
keepalive_timeout 60;
keepalive_requests 3;
[root@webserver conf.d]# nginx -s reload
3.10部署下载服务器
[root@webserver ~]# vim /usr/local/nginx/conf/nginx.conf
location /download/ {
root /web/;
autoindex on;
}
[root@webserver ~]# mkdir /web/download
[root@webserver ~]# dd if=/dev/zero of=/web/download/tang bs=1M count=500
3.11状态页
[root@webserver ~]# vim /usr/local/nginx/conf/nginx.conf
location /status {
stub_status;
auth_basic "status page";
auth_basic_user_file "/usr/local/nginx/.htpasswd";
}
[root@webserver ~]# nginx -s reload
3.12压缩功能
[root@webserver nginx-1.26.1]# vim /usr/local/nginx/conf/nginx.conf
location /vars {
default_type text/html;
echo $uri;
echo $remote_addr;
echo $args;
echo $is_args;
echo $document_root;
echo $document_uri;
echo $host:
echo $remote_port;
}
3.13全站加密
[root@webserver nginx-1.26.1]# vim /usr/local/nginx/conf/nginx.conf
location / {
if ( $scheme = http ){
rewrite / https://$host;
}
}
3.14不存在页面重定向
[root@webserver nginx-1.26.1]# vim /usr/local/nginx/conf/nginx.conf
location / {
if ( !-e $request_filename ){
rewrite /(.*) http://$host/index.html;
}
}
[root@webserver nginx-1.26.1]# nginx -s reload
3.14防反向代理实现动静分离
[root@webserver nginx-1.26.1]# vim /usr/local/nginx/conf/nginx.conf
location / {
proxy_pass http://172.168.232.122;
}location ~ \.(php|jsp|js)$ {
proxy_pass http://172.168.232.123:80;
}
3.15七层负载均衡
upstream webserver {
server 172.168.232.122:80 weight=1 fail_timeout=15s max_fails=3;
server 172.168.232.123:80 weight=1 fail_timeout=15s max_fails=3;
}server {
listen 80;
server_name www.tang.org;location / {
proxy_pass http://webserver;
}
}
3.16四层代理
企业级WEB应用服务器TOMCAT
一 网页相关技术
1.1 网页通信协议和结构
程序通过多线程实现并行处理,可同时为多个用户提供服务。不同主机上的进程通过 Socket 进行网络通信,形成 Client/Server(C/S)编程模式,基于 TCP/UDP 协议,如 QQ、迅雷等应用均采用此模式。
1990 年,HTTP 协议与浏览器诞生,推动网页技术发展。浏览器发送请求后,WEB 服务器返回对应的 HTML 文件,经浏览器解析后呈现为网页。早期网页以静态内容为主,随后出现 JavaScript 实现动态交互,以及 ASP、PHP、JSP 等动态网页技术,形成 Browser/Server(B/S)编程模式。
1.2 前端核心技术
1.2.1 HTML
超文本标记语言,通过标签定义网页内容结构(如标题、图片、表格等),浏览器可解析这些标签并展示内容。其解决了纯文本无法格式化的问题,也是 HTTP 协议的重要应用场景。
1.2.2 CSS
层叠样式表,用于定义 HTML 内容的显示样式。早期 HTML 同时负责内容和样式定义,导致结构臃肿,CSS 由此产生。1996 年发布 CSS 1.0,1998 年推出 CSS 2.0,CSS 3 采用模块化升级。不同浏览器对 CSS 的支持存在差异,可能导致网页显示效果不一致。
1.2.3 JavaScript
简称 JS,是实现网页动态交互的脚本语言,与 HTML、CSS 并称为前端三大核心技术,被主流浏览器支持。1997 年确立 ECMAScript 标准,2008 年 Chrome 浏览器的 V8 引擎提升了其运行效率,2009 年 Node.js 的出现使 JS 可用于服务器端编程,成为前后端通用语言。
二 网页框架
2.1 网页资源访问方式
- 静态 WEB 服务器:存储并传输 HTML、CSS、JS 等静态文件。
- 图片服务器:专门存储图片资源,供客户端请求获取。
- 业务服务器:处理动态内容,需访问数据库后返回结果。
手机 APP 通常内置部分静态文件,减少下载需求,按需从图片服务器获取图片,从业务服务器获取动态数据。业务服务器多以集群形式部署。
2.2 后台应用架构模式
2.2.1 单体架构
将所有功能模块(如商品、订单、支付等)整合为一个工程,部署在单台服务器。负载不足时,通过复制应用实例并配置负载均衡实现扩展。Java 中通过 JSP、Servlet 实现,打包为 jar 或 war 部署。优点是开发、测试、部署简单;缺点是模块耦合度高,单个模块故障可能影响整体,维护和迭代难度大,适合简单应用。常用服务器有 tomcat、weblogic 等。
2.2.2 微服务
是面向服务架构(SOA)的子集,将应用按业务拆分为独立服务,每个服务专注于单一业务功能,可独立部署。服务间通过基于 HTTP 的 RESTful API 通信,团队按业务垂直分工。各服务可采用不同技术栈,支持独立扩展。
2.2.3 两种架构对比
- 单体架构:单进程部署,使用单一数据库,通过复制实例扩展。
- 微服务架构:分布式部署,可使用多个数据库,按需扩展服务实例。
微服务优点:服务内聚性高、开发效率高、松耦合、技术栈灵活、便于持续集成;缺点:增加开发、测试、运维复杂度,需处理分布式事务,适合大型复杂系统。常用框架有 Dubbo、Spring cloud。
三 Tomcat 功能说明
Tomcat 是开源轻量级 WEB 应用服务器,适用于中小型系统和并发量较低的场景。它支持处理 HTML 页面,同时是 Servlet 和 JSP 的容器。其起源于 SUN 公司的 Servlet 参考实现项目,1999 年移交 Apache 软件基金会,仅实现 Java EE 规范中与 Servlet、JSP 相关的部分。企业常用版本为 7.x 和 8.x,官网及相关文档可提供详细信息。
四 实验
4.1安装
[root@tomcat ~]# yum install java-1.8.0-openjdk.x86_64 -y
[root@tomcatA ~]# tar zxf apache-tomcat-9.0.107.tar.gz -C /usr/local/
[root@tomcatA local]# cd tomcat/ [root@tomcatA tomcat]# cd bin/
[root@tomcatA bin]# ./startup.sh
4.2生成tomcat的启动文件
[root@tomcat ~]# vim /usr/local/tomcat/conf/tomcat.conf
[root@tomcat ~]# vim /lib/systemd/system/tomcat.service
[root@tomcatB bin]# useradd -s /sbin/nologin -M tomcat
[root@tomcatB bin]# chown tomcat.tomcat /usr/local/tomcat/ -R
4.3集群部署及绘画绑定
[root@nginx ~]#dnf install nginx -y
[root@nginx conf.d]#vim vhosts.conf
server {
listen 80;
server_name www.timinglee.org;
location ~ \.jsp$ {
proxy_pass http://172.168.232.121:8080;
}
}
[root@tomcata ~]#systemctl restart tomcat.service
[root@tomcatb ~]#systemctl restart tomcat.service
4.4 tomcat负载均衡实现
[root@nginx ~]#vim /usr/local/nginx/conf.d/vhosts.conf
upstream tomcat {
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen 80;
server_name lee.timinglee.org;
root /webdataw/nginx/timinglee.org/lee;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
4.5memcached的使用
安装dnf install memcached -y
[root@tomcata ~]# vim /etc/sysconfig/memcached