本章节目标
说出详细http原理(请求与响应)
部署nginx
部署站点
ngx处理用户的请求处理-v1
目录
ToggleWEB集群-HTTP协议
默认端口是80
HTTP超文本传输协议: 数据请求与响应.
传输:网站的数据如何传递给用户.(超文本:文本,图片,视频….)
用户打开网站后:网站如何传递数据给用户.(通过请求和响应)
案例01: 通过curl或wget访问网站并显示详细过程,能够找出哪部分是请求和响应
curl -v
域名或者wget -debug
查看,wget更加详细,显示了三次握手和DNS解析
curl -I 只显示头部信息
[root@m01 ~]# curl -I linuxjk.cn HTTP/1.1 301 Moved Permanently Server: nginx/1.25.3 Date: Wed, 20 Aug 2025 13:50:00 GMT Content-Type: text/html Content-Length: 169 Connection: keep-alive Location: https://linuxjk.cn/
2. HTTP协议版本之间的区别
http1.1加入了keepalive(长连接功能,比如无操作60秒内保持tcp连接),http2.0增加了并发的功能,默认基于https;http3.0基于udp
目前大部分企业还在使用http1.1, 一部分使用http2.0,目前http3.0( QUIC ) 流媒体直播在使用.
2.3 HTTP协议详解⭐⭐⭐⭐⭐
HTTP请求报文:客户端发送至服务端,request:打开网站,访问网站.
HTTP响应报文:服务端发送至客户端response:网站显示出,返回给你想要的内容.
1) HTTP请求
b) 请求报文起始行⭐⭐⭐⭐⭐
请求方法: 用于指定客户端如何访问服务端(下载,上传,查看服务端信息)
资源的位置(URI–统一资源标识符): 这个资源在网站根目录的哪个地方,叫什么名字.
URI和URL区别:
这里面写的/lidao.mp4,斜线并非是Linux系统的根目录.这个/叫网站的站点根目录.(html文件夹)
案例02: 测试www.baidu.com是否可以通过http访问
curl -I www.baidu.com #只查看头部信息
发出HEAD请求方法,查看服务端信息,服务端是否可以访问.
c) 请求头⭐⭐⭐⭐⭐
字段(一些关键词) 对应的 含义
User-Agent: UA头客户端代理(用什么工具访问网站),浏览器.
Host: Host头表示访问的目标网站:域名或ip
d) 其他
空行: 分割请求头与请求报文主体
请求报文主体(body): 一般上传的时候才有
e) 浏览器调试查看
浏览器的调试功能:DevTools
F12或Fn+F12查看”网络(network)”部分即可.
f) 小结:
核心内容:请求起始行请求方法;请求URI(资源位置)
请求头中的UA,HOST
http请求报文内容: 用户目标(URI),上传/下载(行为),资源位置/名字,自报家门(UA)
2) HTTP响应
状态码与对应代表的服务端信息(正常/报错/其他的状态)
b) 响应报文起始行
协议与版本 HTTP/1.1
状态码: 数字3位,用于描述服务端是否能找到或处理用户的请求.(类似于命令行的错误提示) 200 ok. 404错误
c) 响应头
字段含义:
d) 其他
空行
响应报文主体: 服务端返回给客户端的数据.
3) http请求与响应详细流程
4) http协议状态码⭐⭐⭐⭐⭐
在命令行中使用curl -v测试时,默认不会跟随跳转,电脑浏览器默认跳转,加上 -L 参数就可以跳转到服务器设置好的页面
eg: curl -v linuxjk.cn提示重定向301,请访问https://linuxjk.cn;加上-L后会直接访问https://linuxjk.cn的页面
更多状态码
2.4 HTTP协议小结
HTTP: 用户的请求与响应被后格式与定义
HTTP请求报文组成:
请求起始行 GET / (uri) HTTP/1.1 请求头(head): User-Agent: 客户端代理(浏览器) Host: 域名 空行 请求豹纹主体(body): POST
HTTP响应报文
响应报文的起始行: HTTP/1.1 状态码 响应头:Server(web服务器) 空行 响应豹纹的主体(body): 文件内容
3. WEB集群–衡量系统访问量指标
衡量网站访问量大小.
3.1 概述 ⭐
由于国内使用共享nat上网方式,所以一个区域内大家用的都是相同的公网ip
3.2 统计:各种方式
IP,PV,UV 三剑客进行过滤,第三方统计插件 (百度统计,…..网站页面加入代码),ELK(日志收集与分析) DAU,MAU 第3方工具,数据库统计用户登录情况.
统计并发: ss -ant |grep -i estab
统计ip: awk '{print $1}' /var/log/nginx/access.log |sort |uniq |wc -l
统计PV: wc -l /var/log/nginx/access.log
统计UV(思路:结合ip,结合客户端UA+其他标记) 通过第3方插件统计.
piwiki(matomo)自己搭建的统计工具.https://demo.matomo.cloud/index.ph
4.WEB集群-Nginx
4.1 WEB服务
WEB服务:网站服务,部署并启动了这个服务,你就可以搭建一个网站.
WEB中间件: 等同于WEB服务
中间件:范围更加广泛,指的负载均衡之后的服务.
数据库中间件:数据库缓存,消息对列
4.2 常见网站服务(web中间件)
4.3 部署与使用
记录常用服务的版本: 1.16.x 1.18.x
选用稳定版本,上一个稳定版本.
1) 配置yum源
麒麟kylin-sp2不用配置,直接yum安装即可
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/ $basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
2) 检查安装
rpm -qa |grep nginx
nginx-1.24.0-1.el7.ngx.x86_64
不管哪种安装方式主要的就是/usr/sbin/nginx命令和配置文件/etc/nginx/conf.d/*.conf或者/etc/nginx/nginx.conf
想使用一个服务器部署多个站点需要用到域名区分,这样不管使用哪个域名都不用输入指定的端口号(修改配置文件中的server_name和root),而且可以使用不同的网站站点目录放不同的页面/软件目录
3) 目录结构
温馨提示: Nginx不同的安装方法:目录,文件会有所区别.
下面是yum/apt安装默认的路径.不同系统会有差异.
编译安装的ngx就不同了(可以自己指定)
4) 日常启动与管理
systemctl enable nginx systemctl start nginx 也可以用 systemctl enable --now nginx
检查端口与进程:
systemctl status nginx
ss -lntup |grep 80
ps -ef |grep nginx
命令行访问: curl -v 10.0.0.7
浏览器访问: http: //10.0.0.7:80/
4.4 部署第2个网站 ⭐⭐⭐⭐
配置文件(放在conf.d)
[root@web01 ~]# cat /etc/nginx/conf.d/bird.oldboylinux.cn.conf server { listen 80; server_name bird.oldboylinux.cn; root /app/code/bird; location / { #首页文件 没有指定uri的时候默认展示的页面. index index.html; } }
nginx -t 检查语法
2) 根据配置文件准备环境(目录和代码)
创建目录 mkdir -p /app/code/bird/ 上传代码 #unzip bird.zip #mv bird/* /app/code/bird/ tar xf bird.tar.gz -C /app/code/bird/ 检查首页文件 ls -l /app/code/bird/index.html 配置linux和windows hosts解析 #win: C:\Windows\System32\drivers\etc\hosts #windows下面win键+r 输入drivers 访问etc下的hosts #linux: /etc/hosts 10.0.0.7 bird.oldboylinux.cn
3) 访问之前
reload重载服务;检查host解析和conf.d/*.conf的文件名
浏览器页面显示中文乱码问题解决方案:
可以在html文件中显式指定字符类型<meta charset="UTF-8">
或者在配置文件上加上 # 添加这行强制设置字符集 charset utf-8; # 另外建议添加这行确保 Content-Type 包含字符集 add_header "Content-Type" "text/html; charset=UTF-8"; 
4) 小结
书写配置文件(子配置文件) 以.conf结尾.
准备目录,准备代码,修改权限
访问与测试
linux: hosts解析与检查
windows: hosts 浏览器访问
5. WEB集群-Ngx核心功能详解
5.1 配置文件 /etc/nginx.conf
1) 主配置文件详解:
熟练掌握的指令:
include 文件包含,引用其他地方的ngx配置文件.
user指定ngx用户.
error_log错误日志
access_log 访问日志
2) 子配置文件
ngx:必会问题: ⭐ ⭐ ⭐ ⭐ ⭐
如果站点目录不存在,进行访问会发生什么? 404 Not Found
如果首页文件不存在,进行访问会发生什么? 403 Forbidden
查看错误日志: error.log
3) 配置文件小结
nginx.conf主配置文件
conf.d/*.conf 子配置文件
掌握子配置文件中的指令: user,工具人进程,error_log,access_log,listen,server_name,root,index.
http区域与server区域关系
http{
server{}
}
重启: 配置修改了,重启ngx.
5.3 如果使用Ip地址访问会访问哪个节点? (ngx处理用户请求流程)
目标:nginx如何处理用户请求.
使用ip访问ngx(不存在域名),ngx会如何处理?
1) ngx处理用户请求流程
2) 用户请求ngx详细描述(全过程)
- DNS解析域名 — ip地址.
- 通过ip+端口,三次握手建立连接.
3. http请求:
🅰 GET / HTTP/1.1
🅱 Host: 域名
🆎 UA(User_Agent):浏览器
4. 请求通过建立的连接80端口,到达nginx,ngx开始处理,http区域处理.
5. 用户请求的域名与子配置文件中的server_name部分匹配.
🅰 如果匹配成功,则对应的server(站点)处理用户请求.
🅱 匹配失败,默认的站点(显示default_server标记的页面或按照顺序的第1个子配置文件(按照首字母排序))进行处理.
6. 站点处理用户请求的时候根据用户请求的uri+站点目录进行处理.如:子配置文件中写
server_name test.linuxjk.cn;
root /var/www/html;
location中 index index.html
如果用户只写域名,不写目录下的网页文件就会访问到/var/www/html/index.html
(待补充location规则)
7. 处理完成把结果发回给用户.
3) 设置网站默认的站点default_server(处理ip访问默认80端口或不存在的域名.)一般写在nginx.conf中
server { listen 80 default_server; #标记当前的站点是默认的. server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
WEB集群-Ngx核心功能详解
目标
配置ngx虚拟主机
配置ngx访问日志和错误日志.访问日志中涉及到变量,知晓含义.访问日志每一列的含义.
会书写location规则
虚拟主机(服务器中的网页站点)
虚拟主机:相当于是1个网站,在ngx中通过server{}区域实现.
ngx中虚拟主机有不同的类型(配置不同)
1) 概述与分类
2) 基于域名的虚拟主机 ⭐⭐⭐⭐⭐
根据不同的站点目录书写不同的子配置文件,server_name以域名区分
搭建流程:
1.准备子配置文件与检查语法
2.准备目录
3.准备代码,解压到目录中(解压前tar -tf检查是否有index.html).
4.hosts解析与调试
不同域名访问不同的主机.
案例02: 创建bunengsi.linuxjk.cn网站
站点目录/app/code/bunengsi/
书写配置文件.
[root@web01 ~]# cat /etc/nginx/conf.d/bunengsi.linuxjk.cn.conf server { listen 80; server_name bunengsi.linuxjk.cn; root /app/code/bunengsi; location / { index index.html; } }
1.完成后不创建站点目录进行访问看看报什么错误. : 404 not found(找不到站点目录)
2.创建站点目录后再访问看看报什么错误: 403 Forbidden(没有location中指定的首页文件的index.html)
将网站目录或index.html文件权限设为000 :403 Forbidden
(权限不足,无法访问网站目录)
3.创建首页文件和内容,访问看看显示什么: 正常显示
本地测试域名能否访问的小技巧(linux)
curl -v -H "Host: bunengsi.linuxjk.cn" http://10.0.0.7/index.html
-H指定请求头中的host信息(指定目标域名.)可以在本地测试能否访问时不修改linux的host解析,有多台服务器时更加方便,不用修改/etc/hosts
3) 基于端口的虚拟主机
不同的端口访问不的网站.
比如listen:80是默认的http
listen 8080 ;server_name 域名/ip负责显示另外的网站目录,需要用域名/ip+端口号访问
一些服务软件使用高端口,比如grafana:3000
配置高端口的网页目录可以起到一定的安全性,但是可以用nmap -怕1-665535 IP地址
扫描出来起服务器用了什么端口
案例:使用8080端口创建duimutou站点目录,使用ip或者域名加:8080访问
[root@web01 /etc/nginx/conf.d]# cat duimutou_ip_access.conf server{ listen 8080; server_name duimutou.linuxjk.cn; root /app/code/duimutou; location /{ index index.html; } }
使用duimutou.linuxjk.cn:8080或者10.0.0.7:8080访问网页即可,如果这里没有输入端口号直接访问会默认目录或者自动找子配置文件中排名靠前的站点目录
测试 curl -v -H,-H表示指定请求头 中的host字段
curl -v -H "Host: duimutou.linuxjk.cn" 10.0.0.7:8080
curl -v -H "Host: duimutou.linuxjk.cn" 172.16.1.7:8080
4) 基于ip的虚拟主机(模拟在企业中只用内网访问部分高端口服务的情形,外网拒绝连接)
搭建duimutou网站,端口是8080,只能通过172.16.1.7内网访问
只需要将listen 8080改成listen 172.16.1.7:8080
5) 小结
Ngx日志–点击查看官网帮助手册
案例04:给每个虚拟主机指定自己独立的访问日志
1) 概述
2) 错误日志
指定错误日志的位置和错误级别(日志级别)—–错误日志的详细程度
error_log指令 格式:error_log 文件名 错误日志级别; 指令放在哪:main , http , mail , stream , server , location
错误日志级别;:左到右,越来越粗糙. 记录信息的详细程度.
debug, info, notice, warn, error, crit, alert, oremerg.
error是默认的.(比较详细)
notice 推荐.
debug: 未来用于调试使用,短时间开启,网站访问量较大别开.(特别详细)
生产建议:案例03:给每个虚拟主机指定自己独立的错误日志
不需要注释nginx.conf里面的error_log(此站点的错误日志不会写入默认的/var/log/error.log)
server { listen 80; server_name bunengsi.linuxjk.cn; error_log /var/log/nginx/bunengsi.linuxjk.cni_error.log notice; #access_log是下面案例04的 access_log /var/log/nginx/bunengsi.linuxjk.cni_access.log main; root /app/code/bunengsi; location / { index index.html; } }
修改配置文件后进行nginx -t检查,reload或重启服务会自动创建配置文件中指定的日志文件
3) 访问日志
辅助我们进行分析,网站访问量,ip,pv. 访问日志是记录下用户信息的宝藏. ip信息,请求方法,访问uri,文件大小,ua头,特别信息.
log_format指定访问日志的格式: log_format 格式名字 格式...
(放在 http{}中)
先用log_format定义日志的内容(叫做main格式):
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
再用access_log指定日志文件并引用已经写好的格式main:
access_log /var/log/nginx/access.log main;
access_log 日志位置 格式 这一行放在哪:http , server , location , if in location , limit_except
具体什么东西可以放在哪参考—-更多nginx内置变量—点击查看官方文档
$time_local中的0800是时区
记住变量的含义—
access_log中状态码后面的数字即变量$request_bytes_sent是请求的文件大小,代表服务端给客户端发送了多大的文件,未来可以统计流量
如果某个变量写在配置文件中定义了日志的格式,但是网站中没有这个参数,那么在日志文件中,就会显示为”-“的形式,如$http_referer,显示从哪个网站跳转过来的,如果是域名/ip直接访问就没有跳转的操作
生产建议 案例04:给每个虚拟主机指定自己独立的访问日志.
配置文件格式同上—error_log的格式一致,略有不同,access_log后面接的不是日志级别而是提前定义好的日志格式;且也不需要将nginx.conf中的access_log那一行注释
案例05: 修改访问日志格式:(给access_log中加上一个”$ “负责展示URL)
已知:
$scheme 是ngx内置变量表示http或https.
$host 是ngx内置变量表示 用户请求的域名.
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
' "$scheme://$host"';
在向定义日志格式的语句中添加变量的时候,仿照原有的格式进行书写,‘’代表与上面的属于同一行,变量外围的””可加可不加
访问日志其他选项access_log(了解,未来根据需要进行配置)
access_log /var/log/nginx/bunengsi.linuxjk.cn_access.log main gzip buffer=32k flush=10s ;
4) ngx日志小结
错误日志error_log与错误日志级别debug,notice
访问日志常见格式log_format说出常用的格式,可以查看ngx访问日志并知晓常见部分的含义.
定义与使用access_log
2.6 Location规则 ⭐⭐⭐(用于匹配站点uri),其它的匹配以后使用判断
域名:buy.linuxjk.cn
站点目录:/app/code/buy/
用户首页文件:/app/code/buy/index.html
后台管理页面:/app/code/buy/admin/index.html
要求后台(这里匹配admin目录)只能内网访问:172.16.1.0/24网段.
1) location概述(有的地方给location规则也叫路由规则.)
ngx的location规则:
在ngx用于匹配用户请求中的uri.(URL和URI区别)
请求进来先匹配端口,再匹配域名找到了这个子配置文件,这时ngx根据用户请求头的url,进行匹配,找到对应符合的location规则显示对应页面
如果用户请求的uri是xxxx,则做xxxx.
2) location案例05: 搭建大型直播购物网站
要求: 域名:buy.linuxjk.cn 站点目录:/app/code/buy/ 首页文件index.html 后台管理页面:/app/code/buy/admin/index.html 要求后台只能内网访问:172.16.1.0/24网段
[root@web01 /etc/nginx/conf.d]# cat buy.linuxjk.cn.conf server{ listen 80; server_name buy.linuxjk.cn; root /app/code/buy/; error_log /var/log/nginx/buy.linuxjk.cn_error_log notice; access_log /var/log/nginx/buy.linuxjk.cn_access_log main; location / { index index.html; } #如果用户的uri是/admin/ 则 运行allow和deny2个指令. location /admin { index index.html; allow 172.16.1.0/24; deny all; } }
小结
location 匹配uri,location匹配目录,uri开头部分.
location /admin/ {} 匹配uri中/admin/开头的.
allow和deny: allow 准许指定的ip,网段进行访问.; deny 拒绝ip,网段,all;
先allow 再deny
3) location案例06:搭建2048游戏网站,给网站加速,设置缓存,网站中html,js,css结尾的文件缓存1天,图片缓存30天.
这里的缓存是浏览器缓存,使用 expires 指令实现;用正则匹配相应的文件格式
静态资源一般都做浏览器缓存,cache-control
cdn付费,这个效果更好(用户浏览器处理)免费的
server{ listen 80; server_name erlingsiba.linuxjk.cn; root /app/code/erlingsiba; error_log /var/log/erlingsiba.linuxjk.cn_error.log notice; access_log /var/log/erlingsiba.linuxjk.cn_access.log main; location / { index index.html; } location ~* \.js|\.css|\.html { expires 1d; } location ~* \.(jpg|jpeg|png|gif|bmp)$ { expires 1d; } }
做了浏览器缓存后会在响应报文中标明
expires :过期时间,
cache-control:max-age=86400
小结
location规则与正则. perl \d
location ~* 正则
~ 正则区分大小写
~*正则不区分大小写
expires设置浏览器缓存.
perl正则新的写法 :
\d === [0-9]
\w === [a-zA-Z0-9_]
4) location 规则小结
#用于指定状态码与对应的页面 只要遇到500 502 503 504的状态码 就访问/50x.html页面 error_page 500 502 503 504 /50x.html; #用于指定403.html的位置. error_page 403 /403.html; location = /403.html { root /usr/share/nginx/html; } #用于指定403.html的位置. error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } error_page 500 502 503 504 /50x.html; #用于指定50x.html的位置. location = /50x.html { root /usr/share/nginx/html; }
5) 案例07 根据目录设置是否缓存及缓存时间
用正则匹配存放某类文件的目录,匹配规则从上面的寻找.css/.html文件变成匹配对应的目录
location ~* .js$ { expires max; root /app/code/erlingsiba/js; } location ~* .css$ { expires max; root /app/code/erlingsiba/css; } location ~* .png$ { expires max; root /app/code/erlingsiba/css; }
3.一个高清视频下载站
3.0 搭建要求
名字: 一个高清视频下载站。
网站初衷: 做1个人人看得起的大片网站。
目录结构(目标)
网站整体要求:
- 浏览器打开后,显示目录结构(如上图)。()
- 增加svip功能(认证)。
- 增加统计功能,统计nginx服务的状态,访问情况。
3.1 下载站基本要求( autoindex模块首页显示文件索引)
域名:v.oldboylinux.cn
站点目录: /app/code/v/
touch 几个文件即可
温馨提示:不创建首页文件.
自动索引功能(列表站点目录的内容),没有首页文件
3.2 增加vip认证功能(auth_basic模块)
增加一个svip目录,里面创建文件.
增加认证功能(用户名和密码).
auth_basic "请输入密码:"; #输出提示,根据不同浏览器,可能不显示.但是必须要写上面的这一行 auth_basic_user_file conf.d/htpasswd; #指定用户名,密码文件
要求:
只要用户访问的路径中包含vip资源,提示输入密码
创建密码文件: yum install -y httpd-tools #创建文件 htpasswd -bc /etc/nginx/user liuchuan 1 #-b增加用户,-c创建密码文件(只有第一次创建密码文件的时候需要加-c, 后面增加其他用户都不要加-c,否则第一次创建的用户名密码会被覆盖掉) htpasswd -b /etc/nginx/user pangzengbao 1 #修改权限 chmod 600 /etc/nginx/user chown nginx.nginx /etc/nginx/user
符合要求的配置:添加一个匹配VIP目录的location
location /svip/ { auth_basic "input password:"; auth_basic_user_file /etc/nginx/auth_basic_passwd; }
3.3 增加统计功能⭐(stub_status模块)
显示ngx当前状态(显示ngx状态信息),未来用于监控ngx.需要熟练使用状态模块.
sp2的麒麟 ngx-1.21.5默认没有stub_status模块,需要编译安装.
查看服务器中的nginx是否存在这个模块:
nginx -V 列出所有支持的模块,得到输出信息之后复制到文档软件,搜索模块关键词即可
root@yxy0238:~# nginx -V nginx version: nginx/1.20.1 built by gcc 11.5.0 20240719 (Red Hat 11.5.0-5) (GCC) built with OpenSSL 3.2.2 4 Jun 2024 TLS SNI support enabled configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-cc-opt='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --with-ld-opt='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,-E'
stub_status模块/指令,显示nginx服务的状态,用户访问的状态.
location /status { stub_status; } 页面显示只有四行:![]()
ab 压力测试命令 apache bench
ab -n 999999 -c 300 http://v.linuxjk.cn/
ab -n 99999 -c 3 -H Host:v.linuxjk.cn http://10.0.0.7/
-n 次数
-c 并发
3.动态网站架构(部署一份开发的php 代码)
开发书写了一个php代码,java,Python,Golang.发给我们部署下。
3.1 概述
如何区分静态资源和动态资源
通过url简单/初步判断,网站的类型
url中包含&或?或者包含.php 或.jsp ….一般都是动态网站.
3.2 常见动态网站的架构
本质:开发使用什么语言书写的代码.
PHP: LNMP(LEMP), LAMP, WNMP/WAMP (PHP,Windows,Apache)
WNMP 一般开发使用(本地电脑临时测试)
Java: LNMT(Tomcat,Jetty,Weblogic,Jboss, )
Python: LNMP(Python,uwsgi)
Golang: LNMG(Golang)
C/C ++: LNM?……..
3.3 LNMP架构细节
LNMP原理:Nginx处理动态请求与静态请求流程概述。
0) 环境准备(新的)
版本选择:
在部署一个动态网站的时候,问清楚,支持什么版本的数据库,什么版本的语言
部署的时候可以先从后往前部署,熟练后从哪开始都可以
ngx一般没有版本要求. 稳定即可. ngx 1.21.5
php的版本要求,根据代码来定. php7.2 php7.4最新
数据库:用什么与什么版本也要根据代码要求. mariadb
软件/代码: 部署wordpress.
1) 数据库
db01数据库服务器安装mariadb-server
数据库服务器ip 10.0.0.51/172.16.1.51
yum install -y mariadb-server #mariadb-server 服务端 #mariadb 客户端 systemctl enable mariadb systemctl start mariadb #检查 ss -lntup |grep mysql ps -ef |grep mysql
数据库安全配置(SQL语句实现,现在他通过mysqlSQL语句实现)
mysql_secure_installation #仅仅刚安装的时候运行.仅首次运行即可. 用于设置root密码,清理用户和清理临时库. Enter current password for root (enter for none):回车 Set root password? [Y/n] Y设置密码 New password: 输入密码 Re-enter new password: 再次输入 Password updated successfully! Reloading privilege tables.... ....Success! Remove anonymous users? [Y/n] Y 删除数据库中的匿名用户(没有用户名的用户,容易导致安全问题) Disallow root login remotely? [Y/n] Y 是否禁止root远程登录 Remove test database and access to it? [Y/n] Y 是否删除test测试用的数据库 Reload privilege tables now? [Y/n] Y 是否更新权限信息表
mysql -uroot -p回车输入密码登入数据库
show databases; show tables from mysql; 或者下方两条语句格式(个人习惯) use mysql; show tables; 进入mysql表中开始执行sql语句 查看系统中所有的用户(查看mysql库中的user表中的user列和host列) select Host,User from user; user用户名 host用户白名单,用户可以从哪里登录. 用户是否可以从指定的ip或网段登录. 一般只能本地登录 看完之后开始操作: create database blog; (创建wp使用的库,名为blog) 添加用户wp用户管理wordpress数据库,白名单只能从内网172.16.1.0/24登录与访问 grant all on blog.* to 'wp'@'172.16.1.%' identified by '1'; grant all on blog.* to 'wp'@'localhost' identified by '1'; 授权 所有权限(增删改查) 在 blog库.所有表 '用户名user'@'白名单host' by 设置个密码 '密码'
删除用户或重新添加用户:
drop user ‘wp’@’172.16.1.%’;
删除用户重新添加用户后,需要执行更新用户权限信息的指令.
grant all on wordpress.* to ‘wp’@’172.16.1.%’ identified by ‘1’;
flush privielges;
创建wordpress的库:
create database blog;
测试数据库时,查看当前哪个用户连接。用户名后的@可以看本地还是某网段连接select user()
本地模拟远程连接,mysql -u blog -p -h 本机ip
2) web01安装php
yum -y install php php-bcmath php-cli php-common php-devel php-embedded php-fpm php-gd php-intl php-mbstring php-mysqlnd php-opcache php-pdo php-process php-xml php-json
#设置开机自启动
systemctl enable --now
#修改配置文件(user改为nginx或www)
/etc/php-fpm.conf #主配置文件
/etc/php-fpm.d/www.conf #子配置文件
grep -n '^(user|group|listen =)' /etc/php-fpm.d/www.conf
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen = /run/php-fpm/www.sock(可以和上面的监听端口同时存在)
3) ngx
#下面为web服务器配置文件,
server{ listen 80; server_name blog.linuxjk.cn; root /app/code/blog; error_log /var/log/nginx/blog.linuxjk.cn_error.log notice; access_log /var/log/nginx/blog.linuxjk.cn_access.log main; location / { index index.php; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; #监听的端口,这种形式是tcp socket的形式; #也可以使用Unix socket方式:fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;(通常性能更好)。 fastcgi_index index.php; #当请求指向一个目录路径时,默认执行的PHP脚本文件---index.php fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #$document_root为网站根目录,$fastcgi_script_name为站点URI,组合在一起表示php文件的绝对路径,php-fpm根据php文件的绝对路径进行处理,类似于执行脚本 #常见错误:如果这个参数设置错误(例如路径拼错),PHP-FPM找不到文件,会返回 Primary script unknown 错误和 404 或 502 状态码。 include fastcgi_params; } }
4) 部署代码与设置权限
下载,解压,部署代码 ;页面安装
写了一些文章后就会保存在数据库中,使用以下sql语句按行查看
select * from blog.wp_posts \G;
5) 排错与调试
在网站部署好之后如果出现一些错误,可以让开发写一个调试页展示网站的基本信息
测试ngx+php是否ok,ngx能否把动态请求转发php,php能否处理与解析
cat /app/code/blog/test_ngx_php.php <?php phpinfo(); ?>
测试php+mysql:
cat test_php_db.php
<?php //数据库地址 $db_host='172.16.1.51'; //数据库用户名 $db_user='blog'; $db_pass='1'; //数据库名字 $db_name="blog"; $link_id=mysqli_connect($db_host,$db_user,$db_pass,$db_name); if($link_id){ echo "mysql successful by linuxjk.cn from web1,and db is 172.16.1.51!\n" ; }else{ echo "connection failed!\n" ; } ?>
测试结果:
6) 检查用户上传与数据库信息
a) 用户上传内容:/wordpress/wp-content/uploads
b) 数据库信息(文章):select * from blog.wp_posts \G;
4.常见故障
1) 权限问题(网页目录所有者不是nginx)
2) 数据库连接问题(安装页面输入错误的用户名密码或者数据库的mysql库中没有设置某用户/网段允许远程连接)
5. 连接存储
1 所需机器清单
2 流程
①nfs服务端:准备好存储共享目录(设置用户压缩,nfs共享目录设置为www用户)
②web服务器配置/etc/php-fpm.d/www.conf
用户为www,nginx配置nginx.conf 用户为www
③web服务器:找出用户上传的目录. (wp-content/uploads),讲用户上传目录已有内容移动出来,挂载存储再移动回去.否则会被存储文件夹里的覆盖显示不出来
④访问网站测试能否显示之前的内容,并测试能否上传内容
故障案例:
1)如果没提前设置好nginx和php-fpm为www用户,网站目录所有者为www,就会出现以下提示,但是不影响保存
2)上传文件显示此请求不是合法的json响应,查看错误日志显示:
/var/lib/nginx/tmp/client_body/0000000011" failed (13: Permission denied),
一个上传文件时候临时使用的目录所有者还是nginx,修改为www即可
3)上传文件时显示超过了站点的最大上传限制(默认2MB)。—-修改php.ini
4)wordpress文章移动到回收站失败的时候提示:Error in moving the item to Trash
删除文章时需要使用临时目录,mysql配置文件/etc/my.cnf.d/mariadb-server.cnf
中写了tmpdir=/var/lib/mysql/tmp
但是不会自动生成,需要手动创建目录
6.数据库备份与恢复
1 代码中的数据库连接配置文件
一般应用代码中都要一个文件,记录着代码连接哪个数据库,用户名,密码,端口.
wordpress 站点目录下面 wp-config.php 示例文件:wp-config-sample.php
define( 'DB_NAME', 'blog' ); define( 'DB_USER', 'blog' ); define( 'DB_PASSWORD', '1' ); define( 'DB_HOST', '172.16.1.51' ); define( 'DB_CHARSET', 'utf8mb4' ); define( 'DB_COLLATE', '' );
2 mysql备份与恢复语句
备份所有库⭐ ⭐ ⭐ ⭐ ⭐
mysqldump
把数据库中的内容以SQL语句形式导出 .sql结尾的文件打开就是创建这个数据库的sql语句
备份指令: 备份所有库(gzip加速备份过程)
mysqldump -uroot -p1 --all-databases |gzip >/backup/all-dbs.sql.gz
恢复指令:(zcat,zless,vim可以查看gz文件)
zcat /backup/all-dbs.sql.gz |mysql -uroot -p(因为备份是所有库所以这里不用指定)
也可以先解压.sql.gz文件然后 mysql -uroot -p <xxx.sql 导入
备份指定库
#备份
mysqldump -uroot -p --databases blog | gzip >/backup/blog.sql.gz
#恢复
zcat /backup/blog.sql.gz | mysql -uroot -p blog
mysql -uroot -p blog </backup/blog.sql