1.web
1.1 Web 的基本概念
Web(World Wide Web,万维网)是运行在互联网之上的一个 超文本信息系统,它依赖于 HTTP/HTTPS 协议 实现浏览器与服务器之间的交互。
1.2 B/S 架构模型
Web 采用 B/S 架构(Browser/Server):
Browser(浏览器):用户的入口,发送请求、渲染页面。
Server(服务器):接收请求,返回所需资源或动态内容。
B/S 架构示意图
用户浏览器 ──> Web服务器(Nginx/Apache) │ └─> 应用服务器(PHP/Python/Java) │ └─> 数据库(MySQL/Redis)
1.3 Web 请求与响应过程 (重要)
一次完整的 Web 访问过程包括以下步骤:
输入 URL:用户在浏览器输入
http://www.example.com
。DNS 解析:浏览器将域名解析为 IP 地址。
建立连接:浏览器与 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.5 Web 的发展阶段
Web 1.0(只读):静态页面为主,用户只能浏览。
Web 2.0(交互式):用户可生成内容,AJAX(前端) 技术普及。
Web 3.0(智能化):语义网、区块链、去中心化概念兴起。
2.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 状态码概览
HTTP 状态码都是 三位数字,按首位分为五类:
类型 范围 含义
1xx 100-199 信息性状态码
2xx 200-299 请求成功
3xx 300-399 重定向
4xx 400-499 客户端错误
5xx 500-599 服务器错误
2.3.2 常用状态码详解
①2xx
状态码 含义
200 OK 请求成功
201 Created 创建成功
204 No Content 成功,但没有内容
②3xx
状态码 含义
301 Moved Permantly 永久换地址
302 Found 临时换地址
304 Not Modfied 内容未改
③4xx
状态码 含义
400 Bad Request 请求格式错误
401 Unauthorized 未认证
403 Forbidden 禁止访问
404 Not Found 找不到页面
④5xx
状态码 含义
500 Internal Server Error 服务器内部出错
502 Bad Gateway 网关错误
503 Service Unavaible 服务不可用
504 Gateway Timeout 网关超时
3.Nginx
3.1 Nginx 介绍
Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器。Nginx 是由 Igor Sysoev 为俄 罗斯访问点开量第二的 Rambler.ru 站发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻 名。2011 年 6 月 1 日,Nginx 1.0.4 发布。
Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器, 单台物理服务器可支持30 000~50 000个并发请求。并在一个 BSD-like 协议下发行。由俄罗斯的程序设计师 Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎 Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度 BWS、新浪、网易、腾讯、等
Nginx 是一个 高性能 Web 服务器,它可以做很多事情:
静态资源服务:可以直接把网页、图片、视频这些文件发给用户。
反向代理:用户访问你的服务器,Nginx 可以帮你把请求转发到后端真正处理请求的服务器。
负载均衡:当有很多后端服务器时,Nginx 可以智能分配流量,让每台服务器都不忙不过来。
高并发处理:用事件驱动的方式处理请求,能同时处理成千上万的用户请求,而不会占用太多资源。
优势:
轻量级,占用内存小
支持百万级并发访问
稳定可靠,开源且社区活跃
3.2 简述Nginx和Apache的差异
Nginx是一个甚于事件的Web服务器,Apache是一个基于流程的服务器;
Nginx避免子进程的概念,Apache是基于子进程的;
Nginx在内存消耗和连接方面更好,Apache在内存消耗和连接方面一般;
Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于CPU和内存等硬件;
Nginx支持热部署,Apache不支持热部署;
Nginx对于静态文件处理具有更高效率,Apache相对一般;
Nginx在反向代理场景具有明显优势,Apache相对一般。
3.3 Nginx 进程结构
web请求处理机制
多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。
多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
4、Nginx安装
1.关闭防火墙,将安装nginx所需软件包传到/opt目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
nginx-1.20.2.tar.gz
2.安装依赖包
#nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel
3.创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx
4.编译安装Nginx
cd /opt
tar zxvf nginx-1.20.2.tar.gz -C /opt/
cd nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \ #指定nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module
--with-http_ssl_module #启用 http_stub_status_module 模块以支持状态统计
操作
cd nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #让系统识别nginx的操作命令
==========================企业=======================================
./configure \
--prefix=/usr/local/nginx \ # 安装目录
--user=nginx \ # 运行用户(后续会创建)
--group=nginx \ # 运行用户组
--with-http_ssl_module \ # 启用 HTTPS 模块
--with-http_v2_module \ # 启用 HTTP/2 协议(提升性能)
--with-http_gzip_static_module \ # 启用静态 gzip 压缩
--with-http_stub_status_module \ # 启用状态监控模块
--with-pcre \ # 启用 PCRE 正则支持(rewrite 依赖)
--with-stream \ # 启用 TCP 代理模块(如反向代理数据库)
--with-stream_ssl_module \ # 启用 TCP 代理的 SSL 支持
--http-log-path=/var/log/nginx/access.log \ # 访问日志路径
--error-log-path=/var/log/nginx/error.log \ # 错误日志路径
--pid-path=/var/run/nginx/nginx.pid \ # PID 文件路径
--lock-path=/var/lock/nginx.lock # 锁文件路径
注意:
可根据需求增减模块(如 --without-xxx 禁用不需要的模块)
企业若需特殊模块(如第三方缓存模块),可通过 --add-module 引入
================================================================
5.检查、启动、重启、停止 nginx服务
nginx -t #检查配置文件是否配置正确
#启动
nginx
========扩展========================================================
#停止
cat /usr/local/nginx/logs/nginx.pid #先查看nginx的PID号
kill -3 <PID号>
kill -s QUIT <PID号>
killall -3 nginx
killall -s QUIT nginx
#重载
kill -1 <PID号>
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx
#日志分割,重新打开日志文件
kill -USR1 <PID号>
#平滑升级
kill -USR2 <PID号>
| 信号编号 | 信号名 | 含义 |
| -------- | ------ | ------------------------------------------------------------ |
| 0 | EXIT | 程序退出时收到该信息。 |
| 1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
| 2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
| 3 | QUIT | 退出。 |
| 9 | KILL | 杀死进程,即强制结束进程。 |
| 11 | SEGV | 段错误。 |
| 15 | TERM | 正常结束进程,是 kill 命令的默认信号 |
==================================================================
新版本升级:
tar -zxvf nginx-1.xx.xx.tar.gz 1.22.0
cd nginx-1.xx.xx
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old 备份
cp objs/nginx /usr/local/nginx/sbin/nginx
重启服务 并且
nginx -V #查看版本
make upgrade
#或者先 killall nginx ,再/usr/local/nginx/sbin/nginx
6.添加 Nginx 系统服务
方法一:
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20 // 这是固定格式,2345表示运行级别,之后为开机执行顺序和关机执行顺序
#description:Nginx Service Control Script //这也是必须的
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$COM
;;
stop)
kill -s QUIT $(cat $PID)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PID)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
chmod +x /etc/init.d/nginx
chkconfig --add nginx #添加为系统服务
systemctl stop nginx
systemctl start nginx
service nginx start|stop|restart|reload
系统服务 服务名称 启动模式
方法二:
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
---------------------------------------------------------
[Unit]:服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务
[Service]服务运行参数的设置
Type=forking是后台运行的形式,使用此启动类型应同时指定
PIDFile以便systemd能够跟踪服务的主进程。
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
[Install]服务安装的相关设置,可设置为多用户
---------------------------------------------------------
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
5Nginx 配置
认识Nginx服务的主配置文件 nginx.conf
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,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数 已超过 3 万个(4 096×8=32 768),当然具体还要看服务器硬件、网络带宽等物理条件的性 能表现。
5.3 HTTP 配置
使用“http { }”界定标记,包括访问日志、HTTP 端口、网页目录、默认字符集、连接保 持,以及后面要讲到的虚拟 Web 主机、PHP 解析等一系列设置,其中大部分配置语句都包 含在子界定标记“server { }”内
http { ##文件扩展名与文件类型映射表 include mime.types; ##默认文件类型 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压缩输出 #gzip on;
5.3 Web 服务的监听配置
##Web 服务的监听配置 server { ##监听地址及端口 listen 80; ##站点域名,可以有多个,用空格隔开 server_name www.kgc.com; ##网页的默认字符集 charset utf-8; ##根目录配置 location / { ##网站根目录的位置/usr/local/nginx/html root html; ##默认首页文件名 index index.html index.php; } ##内部错误的反馈页面 error_page 500 502 503 504 /50x.html; ##错误页面配置 location = /50x.html { root html; } } }
5.4 其他配置(扩展)
日志格式设定 $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_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。 ==================================================================================== location常见配置指令,root、alias、proxy_pass root(根路径配置):root /var/www/html 请求www.benet.com/test/1.html,会返回文件/var/www/html/test/1.html alias(别名配置):alias /var/www/html 请求www.benet.com/test/1.html,会返回文件/var/www/html/1.html proxy_pass(反向代理配置)
6、nginx 虚拟主机
6.1 访问状态统计配置
6.1.1 查看已安装的所有模块
先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块 cat /opt/nginx-1.20.2/auto/options | grep YES #可查看 nginx 已安装的所有模块
6.1.2 修改 nginx.conf 配置文件
修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置
cd /usr/local/nginx/conf cp nginx.conf nginx.conf.bak vim /usr/local/nginx/conf/nginx.conf ...... http { ...... server { listen 80; server_name www.benet.com; charset utf-8; location / { root html; index index.html index.php; } ##添加 stub_status 配置## location /status { #访问位置为/status stub_status on; #打开状态统计功能 access_log off; #关闭此位置的日志记录 } } }
6.1.3 重启服务,访问测试
systemctl restart nginx 浏览器访问 http://192.168.10.21/status Active connections :表示当前的活动连接数; server accepts handled requests :表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数、 已处理的请求数。 可 curl -s http://192.168.10.21/status 结合 awk与if 语句进行性能监控。
6.2 基于授权的访问控制
6.2.1 生成用户密码认证文件
yum install -y httpd-tools htpasswd -c /usr/local/nginx/passwd.db zhangsan 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 "secret"; #设置密码提示框文字信息 auth_basic_user_file /usr/local/nginx/passwd.db; } }
6.2.3 重启服务,访问测试
nginx -t systemctl restart nginx 浏览器访问 http://192.168.10.21
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.20; #允许访问的客户端 IP deny all; #拒绝其它IP客户端访问 } } systemctl restart nginx
6.4 基于域名的 Nginx 虚拟主机
6.4.1 为虚拟主机提供域名解析
echo "192.168.10.21 www.yjs.com www.benet.com" >> /etc/hosts
6.4.2 为虚拟主机准备网页文档
mkdir -p /var/www/html/benet mkdir -p /var/www/html/yjs echo "<h1>www.yjs.com</h1>" > /var/www/html/yjs/index.html echo "<h1>www.benet.com</h1>" > /var/www/html/benet/index.html
6.4.3 修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf ...... http { ...... server { listen 80; server_name www.yjs.com; #设置域名www.yjs.com charset utf-8; access_log logs/www.yjs.access.log; #设置日志名 location / { root /var/www/html/yjs; #设置www.yjs.com 的工作目录 index index.html index.php; } error_page 500 502 503 504 /50x.html; location = 50x.html{ root html; } } server { listen 80; server_name www.benet.com; #设置域名www.benet.com charset utf-8; access_log logs/www.benet.access.log; location / { root /var/www/html/benet; index index.html index.php; } error_page 500 502 503 504 /50x.html; location = 50x.html{ root html; } } }
4.重启服务,访问测试
systemctl restart nginx 浏览器访问 http://www.yjs.com http://www.benet.com
6.5 基于IP 的 Nginx 虚拟主机
6.5.1 配置server1
ifconfig ens33:0 192.168.10.40 netmask 255.255.255.0 vim /usr/local/nginx/conf/nginx.conf ...... http { ...... server { listen 192.168.10.21:80; #设置监听地址192.168.10.21 server_name www.YJS.com; charset utf-8; access_log logs/www.YJS.access.log; location / { root /var/www/html/kgc; index index.html index.php; } error_page 500 502 503 504 /50x.html; location = 50x.html{ root html; }1 }
6.5.2 配置server 2
server { listen 192.168.10.40:80; #设置监听地址192.168.10.40 server_name www.benet.com; charset utf-8; access_log logs/www.benet.access.log; location / { root /var/www/html/benet; index index.html index.php; } error_page 500 502 503 504 /50x.html; location = 50x.html{ root html; } } } systemctl restart nginx 浏览器访问 http://192.168.10.21 http://192.168.10.40
6.6 基于端口的 Nginx 虚拟主机
6.6.1 基于端口1
vim /usr/local/nginx/conf/nginx.conf ...... http { ...... server { listen 192.168.10.21:8080; #设置监听 8080 端口 server_name www.yjs.com; charset utf-8; access_log logs/www.yjs.access.log; location / { root /var/www/html/yjs; index index.html index.php; } error_page 500 502 503 504 /50x.html; location = 50x.html{ root html; } }
6.6.2 基于端口2
server { listen 192.168.10.21:8888; #设置监听 8888 端口 server_name www.benet.com; charset utf-8; access_log logs/www.benet.access.log; location / { root /var/www/html/benet; index index.html index.php; } error_page 500 502 503 504 /50x.html; location = 50x.html{ root html; } }
}
6.6.3 重启服务,测试访问
systemctl restart nginx 浏览器访问 http://192.168.10.21:8080 http://192.168.10.21:8888