Web服务与Nginx详解
文章目录
- 前言
- 一、Web 概念
- 1.1 Web 的基本概念
- 1.1.1 特点
- 1.2 B/S 架构模型
- 1.3 Web 请求与响应过程
- 1.4 静态资源与动态资源
- 1.5 Web 的发展阶段
- 1.6 实验:搭建最小 Web 服务
- 1.6.1 实验目标
- 1.6.2 实验步骤
- 1.7 小结
- 二、HTTP 与 HTTPS 协议
- 2.1 HTTP 与 HTTPS 的区别
- 2.2 HTTPS 握手流程
- 2.3 HTTP 状态码
- 2.3.1 HTTP 状态码概览
- 2.3.2 常用状态码详解
- 三、Nginx 概念
- 3.1 Nginx 介绍
- 3.1.1 主要功能
- 3.1.2 优势
- 3.1.3 官网与版本
- 3.2 Nginx 与 Apache 的差异
- 3.3 Nginx 进程结构
- 四、Nginx 安装
- 五、Nginx 配置
- 5.1 全局配置
- 5.2 I/O 事件配置
- 5.3 HTTP 配置
- 5.4 Web 服务监听配置
- 5.5 其他配置
- 5.5.1 日志格式
- 5.5.2 别名配置
- 六、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
- 6.5 基于 IP 的虚拟主机
- 6.5.1 配置多 IP
- 6.5.2 配置 Nginx
- 6.6 基于端口的虚拟主机
- 6.6.1 配置不同端口
- 总结
前言
在当今互联网时代,Web 服务已成为信息传递与交互的重要载体。无论是静态网页还是动态应用,背后都离不开稳定、高效的服务器支持。Nginx 作为一款高性能的 Web 服务器和反向代理工具,因其出色的并发处理能力和灵活的配置方式,被广泛应用于各类网站架构中。本文将从 Web 的基本概念出发,逐步介绍 HTTP/HTTPS 协议、Nginx 的核心特性及其安装与配置方法,帮助读者系统理解 Web 服务的工作原理与 Nginx 的实际应用。
一、Web 概念
1.1 Web 的基本概念
Web(World Wide Web,万维网)是运行在互联网之上的一个超文本信息系统,它依赖于 HTTP/HTTPS 协议 实现浏览器与服务器之间的交互。
1.1.1 特点
- 分布式:资源分布在世界各地的服务器上。
- 跨平台:只要有浏览器,就能访问资源。
- 无状态:每次 HTTP 请求都是独立的,服务器不会记住客户端状态(除非使用
Cookie
/Session
)。
Cookie
/Session
可以缓解服务器压力、加速二次访问网页的速度
1.2 B/S 架构模型
Web 采用 B/S 架构(Browser/Server):
- Browser(浏览器):用户的入口,发送请求、渲染页面。
- Server(服务器):接收请求,返回所需资源或动态内容。
图 1-1:B/S 架构示意图
用户浏览器 ──> Web服务器(Nginx/Apache) 静态 就会立马访问给客户端│└─> 应用服务器(PHP/Python/Java)│└─> 数据库(MySQL/Redis)
1.3 Web 请求与响应过程
一次完整的 Web 访问过程包括以下步骤:
- 输入 URL:用户在浏览器输入
http://www.example.com
。浏览器会判断输入的内容是否符合超文本连接协议,判断是否要进行下一步。
会将输入的URL解析为四部分
- 协议:
http://
- 域名:
www.example.com
- 端口:
:80
- 路径:
/index
- DNS 解析:浏览器将域名解析为 IP 地址。
DNS解析会逐层解析:
- 先解析主机(检查host文件)
- 然后解析网卡配置
- 再解析/etc/resolv.conf
- 建立连接:浏览器与 Web 服务器建立 TCP 连接(3 次握手)。
- 发送请求:浏览器发起 HTTP 请求(GET/POST)。
请求报文内包含:请求行、请求头、请求体 - 服务器处理:
- 解析请求报文
- Web 服务器处理静态资源请求
- 路由处理,动态请求转发到应用服务器(如 Tomcat、Django)
- 业务处理,应用服务器可能再查询数据库
- 返回响应:Web 服务器将结果打包成 HTTP 响应报文返回浏览器。
响应报文内包含、状态行、响应头、响应体 - 渲染页面:浏览器解析 HTML、加载 CSS/JS、渲染最终页面。
1.4 静态资源与动态资源
- 静态资源:不需要服务器额外处理,直接返回即可。
- HTML、CSS、图片、视频、JS 文件
- 优点:速度快,压力小
- 动态资源:需要服务器端代码计算生成,再返回客户端。
- PHP 脚本、Python Flask/Django、Java Servlet、Ruby
- 优点:个性化内容,支持交互
图 1-3 静态与动态资源对比图
静态资源:用户请求 → Web服务器直接返回
动态资源:用户请求 → Web服务器 → 应用服务器运行代码 → 返回结果
1.5 Web 的发展阶段
- Web 1.0(只读):静态页面为主,用户只能浏览。
- Web 2.0(交互式):用户可生成内容,AJAX(前端) 技术普及。
- Web 3.0(智能化):语义网、区块链、去中心化概念兴起。
1.6 实验:搭建最小 Web 服务
1.6.1 实验目标
体验一次最简单的 Web 请求与响应过程,并使用 Wireshark 抓包分析。
1.6.2 实验步骤
创建一个静态页面:
<!-- index.html -->
<html>
<head><title>My First Web</title></head>
<body>
<h1>Hello Web!</h1>
<p>This is my first web page.</p>
</body>
</html>
1.7 小结
- Web 是基于 B/S 架构 的信息交互方式。网页端与服务端。
- 核心是 请求-响应模型,通过 HTTP/HTTPS 协议传输数据。(数据流向要理解并能完整叙述。)
- Web 可提供 静态资源 和 动态资源。
二、HTTP 与 HTTPS 协议
2.1 HTTP 与 HTTPS 的区别
- HTTP:明文传输,不安全。
- HTTPS:在 HTTP 上加入 SSL/TLS 加密,防止中间人攻击。
2.2 HTTPS 握手流程
TLS 握手过程:客户端发起请求 → 服务端返回证书 → 双方协商加密算法 → 建立安全通道。
客户端 Hello → 服务端 Hello + 证书 → 客户端验证 → 加密通信
TLS 握手过程:
- 客户端 Hello:浏览器发起请求,告诉服务器自己支持哪些加密算法。
- 服务端 Hello + 证书:网站返回 SSL 证书(证明身份),选择一种加密算法。
- 客户端验证证书:浏览器检查证书是否可信(CA 颁发、没过期、域名匹配)。
- 协商密钥:双方生成一个临时密钥,用于对称加密后续通信。
- 加密通信开始:后续 HTTP 数据都通过加密通道传输。
2.3 HTTP 状态码
2.3.1 HTTP 状态码概览
类型 | 范围 | 含义 | 大白话理解 |
---|---|---|---|
1xx | 100–199 | 信息性状态码 | “我收到了请求,还在处理中” |
2xx | 200–299 | 成功 | “请求成功,服务器给你东西了” |
3xx | 300–399 | 重定向 | “你要的东西搬家了,去新地址找” |
4xx | 400–499 | 客户端错误 | “你请求有问题(URL错、权限不够)” |
5xx | 500–599 | 服务器错误 | “服务器出问题,暂时拿不到东西” |
2.3.2 常用状态码详解
-
2xx 成功
- 200 OK:请求成功
- 201 Created:创建成功
- 204 No Content:成功,但没有内容
-
3xx 重定向
- 301 Moved Permanently:永久搬家
- 302 Found:临时搬家
- 304 Not Modified:内容未改
-
4xx 客户端错误
- 400 Bad Request:请求格式错
- 401 Unauthorized:未认证
- 403 Forbidden:禁止访问
- 404 Not Found:找不到页面
-
5xx 服务器错误
- 500 Internal Server Error:服务器内部出错
- 502 Bad Gateway:网关错误
- 503 Service Unavailable:服务不可用
- 504 Gateway Timeout:网关超时
三、Nginx 概念
3.1 Nginx 介绍
- Nginx 简介
Nginx(“engine x”)是一款高性能的 HTTP 服务器和反向代理服务器,同时支持 IMAP/POP3 电子邮件代理功能。由俄罗斯程序员 Igor Sysoev 开发,最初用于服务俄罗斯第二大访问量的网站 Rambler.ru。
- 发展历程
Nginx 的首个公开版本 0.1.0 发布于 2004 年 10 月 4 日。2011 年 6 月 1 日发布了稳定版本 1.0.4。目前企业环境中多采用 1.20 版本。
- 技术特性
采用类 BSD 许可证开源发布,具有以下显著优势:- 出色的稳定性
- 丰富的功能集
- 详实的示例配置文件
- 极低的系统资源消耗
作为轻量级服务器解决方案,单台物理服务器可处理 30,000~50,000 个并发请求,在同类型产品中展现出卓越的并发处理能力。
-
应用场景
广泛应用于全球各大网站,中国大陆采用 Nginx 的知名企业包括:- 百度 BWS
- 新浪
- 网易
- 腾讯
-
架构优势
其内存占用少、并发能力强的特点使其成为高流量网站的首选解决方案,在同类网页服务器中表现尤为突出。
3.1.1 主要功能
- 静态资源服务:可以直接把网页、图片、视频这些文件发给用户。
- 反向代理:用户访问你的服务器,Nginx 可以帮你把请求转发到后端真正处理请求的服务器。
- 负载均衡:当有很多后端服务器时,Nginx 可以智能分配流量,让每台服务器都不忙不过来。
- 高并发处理:用事件驱动的方式处理请求,能同时处理成千上万的用户请求,而不会占用太多资源。
3.1.2 优势
- 轻量级,占用内存小
- 支持百万级并发访问
- 稳定可靠,开源且社区活跃
3.1.3 官网与版本
- 官网:http://nginx.org/
- 版本类型:Mainline(主线)、Stable(稳定)、Legacy(旧版)
3.2 Nginx 与 Apache 的差异
- Nginx 基于事件驱动,Apache 基于进程
- Nginx 更节省内存,支持更高并发
- Nginx 支持热部署,Apache 不支持
- Nginx 在静态文件和反向代理场景下更具优势
3.3 Nginx 进程结构
Nginx 采用多进程模型:
- 主进程:管理 worker 进程
- Worker 进程:实际处理请求,数量通常与 CPU 核心数相同
Worker 进程功能:
- 接受并处理客户请求
- I/O 调用,获取响应数据
- 与后端服务器通信
- 缓存数据
- 响应客户请求
四、Nginx 安装
可使用脚本快速安装 Nginx,方便复制粘贴执行。
五、Nginx 配置
vim /usr/local/nginx/conf/nginx.conf
#修改前一定要进行备份
5.1 全局配置
user nobody; #运行用户,若编译时未指定则默认为 nobody
worker_processes 4; #工作进程数量,可配置成服务器内核数 * 2,如果网站访问量不大,一般设为1就够用了
error_log logs/error.log; #错误日志文件的位置
pid logs/nginx.pid; #PID 文件的位置
5.2 I/O 事件配置
events {use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用
epoll模型以提高性能worker_connections 4096; #每个进程处理 4096 个连接
}
如提高每个进程的连接数还需执行ulimit -n 65535
命令临时修改本地每个进程可以同时打开的最大文件数。
在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
可使用ulimit -a
命令查看系统允许当前用户进程打开的文件数限制。修改/etc/security/limits.conf
可永久修改限制。
epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
若工作进程数为 8,每个进程处理 4096 个连接,则允许 Nginx 正常提供服务的连接数已超过 3 万个(4096×8=32768),当然具体还要看服务器硬件、网络带宽等物理条件的性能表现。
在配置工作进程数和工作进程处理数量时需要保证如下条件:
工作进程数(worker_processes) * 工作进程处理数量(worker_processes)> 系统内设置的每个进程允许同时打开的最大文件数(ulimit -n)
当仅改变了工作进程数、工作进程处理数量而未改变系统内设置的每个进程允许同时打开的最大文件数时,会导致设置不起作用。
5.3 HTTP 配置
http {#引入文件扩展名和文件映射表include mime.types;#为无法通过 MIME 类型映射识别的文件设置默认类型default_type application/octet-stream; #下面三行为配置日志格式,生产环境中多为非注释状态,通过获取用户信息传至后端做操作#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; ##此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用#tcp_nopush on;#设置连接保持时间,单位秒#keepalive_timeout 0;keepalive_timeout 65;#支持gzip压缩#gzip on;...
5.4 Web 服务监听配置
server {#设置监听端口listen 80;#设置匹配域名,可以有多个,空格隔开server_name localhost;#设置网页的默认字符集charset utf-8;#根目录配置location / {# root配置网站根目录位置#root目录在/usr/local/nginx/html下root html;#index指定默认首页名index index.html index.htm;}#内部错误反馈页面error_page 500 502 503 504 /50x.html;#错误页面配置location = /50x.html {root html;}}
5.5 其他配置
5.5.1 日志格式
- $remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
- $remote_user:用来记录客户端用户名称;
- $time_local: 用来记录访问时间与时区;
- $request: 用来记录请求的url与http协议;
- $status: 用来记录请求状态;成功是200,
- $body_bytes_sent :记录发送给客户端文件主体内容大小;
- $http_referer:用来记录从哪个页面链接访问过来的;
- $http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_addr
拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for
信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
5.5.2 别名配置
可以在配置文件中进行别名设置,不同于root
会在设置的路径后追加查询的路径,alias
会直接替换匹配到的内容,达成路径替换,并且alias
可以访问到不在nginxroot
路径下的文件夹
特性 | alias | root |
---|---|---|
功能 | 路径替换 | 路径追加 |
语法 | alias /path/to/dir/; | root /path/to/dir/; |
结尾斜线 | 强烈建议匹配和别名路径都加 / | 建议加 / |
正则匹配 | 必须使用捕获组(如 $1 ) | 不需要 |
适用场景 | 将请求映射到与 root 无关的完全不同的目录 | 请求路径与文件系统路径结构基本一致时 |
六、Nginx 虚拟主机
6.1 访问状态统计配置
6.1.1 查看已安装模块
当设置了软链接将nginx引入了$PATH中的路径时,可以直接使用nginx命令。nginx -v
用来确认--with-http_stub_status_module
模块已安装
也可以使用
cat /opt/nginx-1.20.2/auto/options | grep YES
查看 nginx 已安装的所有模块
/usr/local/nginx/sbin/nginx -V
6.1.2 修改 nginx.conf 配置文件
修改 nginx.conf
配置文件,指定访问位置并添加 stub_status
配置。
location /status {stub_status on;access_log off;
}
6.1.3 重载服务并测试
可以 curl -s http://192.168.10.21/status 结合 awk与if 语句进行性能监控。
systemctl reload nginx
curl http://192.168.10.123/status
#或浏览器访问 http://192.168.10.21/status
-
Active connections :表示当前的活动连接数
-
Accepts(接受连接数)
- 含义: 自Nginx启动以来,已经接受的客户端连接总数。
- 详细解释: 这个数字表示客户端与Nginx服务器成功建立 TCP 连接 的次数。每当一个客户端(如浏览器、移动应用等)尝试连接到Nginx服务器并且TCP握手成功,这个计数器就会增加1。
- 注意: 它只计算连接的数量,而不是请求的数量。一个连接上可以通过HTTP Keep-Alive特性发送多个请求。
-
Handled(处理连接数)
- 含义: 自Nginx启动以来,已经成功处理的操作连接总数。
- 详细解释: 这是最关键的指标。一个连接被“Accept”后,Nginx会继续处理它。绝大多数情况下,连接都会被成功处理。但如果Nginx在accept之后遇到错误(例如,客户端在发送任何请求之前就断开了连接,或者分配工作进程时出现问题),就可能出现 Accepts > Handled 的情况。
- 正常情况下: Accepts 和 Handled 的值应该是非常接近的。如果两者差距很大,通常表明网络不稳定或客户端行为异常(大量瞬间断开)。
-
Requests(请求数)
- 含义: 自Nginx启动以来,已经处理的客户端请求总数。
详细解释: 这是三个指标中最大的数字。它计算的是在所有这些已建立的连接(Handled)上,Nginx总共处理了多少个 HTTP 请求。 - 关键区别:
- Accepts 和 Handled 统计的是 连接(Connections)。
- Requests 统计的是 请求(Requests)。
- 含义: 自Nginx启动以来,已经处理的客户端请求总数。
由于HTTP Keep-Alive的作用,一个TCP连接可以发送多个HTTP请求。因此,Requests 的数量总是会远大于 Handled 的数量。例如,一个浏览器打开一个网页,它与服务器建立1个TCP连接(Accepts+1, Handled+1),然后通过这个连接请求了HTML、CSS、JS、图片等共20个资源(Requests+20)。
stub_status
这个配置曾常被用于统计网页访问数,现在版本的nginx中可以使用更详细、更直观的VST
进行访问次数的查询。
6.2 基于授权的访问控制
6.2.1 生成密码文件
yum install -y httpd-tools
htpasswd -c /usr/local/nginx/passwd.db lisi
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nginx/passwd.db
6.2.2 配置认证
vim /usr/local/nginx/conf/nginx.conf
......server {location / {...auth_basic "plase inser sercet";auth_basic_user_file /usr/local/nginx/passwd.db;}
6.2.3 重载服务并测试
nginx -t
systemctl reload nginx浏览器访问 http://192.168.10.123
输入网址后提示登录,输入刚刚配置的lisi用户名及密码后正常登录。
6.3 基于客户端的访问控制
访问控制规则如下:
- deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
- allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
- 规则从上往下执行,如匹配则停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
......server {location / {...#添加控制规则allow 192.168.10.120; #允许访问的客户端 IPdeny all; #拒绝其它IP客户端访问}}
6.4 基于域名的虚拟主机
6.4.1 域名解析
echo "192.168.10.21 www.acb.com www.look.com" >> /etc/hosts
6.4.2 准备网页文档
mkdir -p /usr/local/nginx/html/{abc,look}
echo "<h1>www.abc.com</h1>" > /usr/local/nginx/html/abc/index.html
echo "<h1>www.look.com</h1>" > /usr/local/nginx/html/look/index.html
6.4.3 配置 Nginx
server {listen 80;server_name www.look.com;charset utf-8;access_log logs/www.look.access.log;location / {root /usr/local/nginx/html/look;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}server {listen 80;server_name www.abc.com;charset utf-8;access_log logs/www.abc.access.log;location / {root /usr/local/nginx/html/abc;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}
6.5 基于 IP 的虚拟主机
6.5.1 配置多 IP
ifconfig ens36 192.168.10.40 netmask 255.255.255.0
6.5.2 配置 Nginx
server {listen 192.168.10.123:81;server_name www.look.com;charset utf-8;access_log logs/www.look.access.log;location / {root /usr/local/nginx/html/look;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}server {listen 192.168.10.140:81;server_name www.abc.com;charset utf-8;access_log logs/www.abc.access.log;location / {root /usr/local/nginx/html/abc;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}
6.6 基于端口的虚拟主机
6.6.1 配置不同端口
server {listen 8080;server_name www.look.com;charset utf-8;access_log logs/www.look.access.log;location / {root /usr/local/nginx/html/look;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}server {listen 8081;server_name www.abc.com;charset utf-8;access_log logs/www.abc.access.log;location / {root /usr/local/nginx/html/abc;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = 50x.html{root html;}}
总结
本文系统介绍了 Web 服务的基本概念、HTTP/HTTPS 协议、Nginx 的核心特性及其配置方法。通过理解 B/S 架构、请求响应流程、静态与动态资源的区别,以及 Nginx 的高并发处理机制,读者可以更好地构建和优化 Web 服务。Nginx 的灵活配置与高性能使其成为现代 Web 架构中不可或缺的重要组成部分。掌握其虚拟主机、访问控制、状态监控等高级功能,将有助于提升网站的安全性、可用性和可维护性。