HTTP概述与Nginx部署
1. HTTP协议
1.1 HTTP概述
- 默认端口是80
- HTTP超文本传输协议: 数据请求与响应.
- 传输:网站的数据如何传递给用户.
- 超文本:文本,图片,视频....
- 用户打开网站后:网站如何传递数据给用户.
- 专业名字:数据请求与响应.
- 请求request:打开网站,访问网站.
- 响应response:网站显示出,返回给你想要的内容.
通过curl或wget访问网站并显示详细过程
request&response
root@iZ2zei5cw2j6q770mgp5kvZ:~# curl -v taobao.com
* Trying 59.82.122.140:80...
* Connected to taobao.com (59.82.122.140) port 80 (#0)
> GET / HTTP/1.1 # request start
> Host: taobao.com
> User-Agent: curl/7.81.0
> Accept: */*
> # request end
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently # response start
< Server: Tengine/AServer-Ingress/3.0.19
< Date: Wed, 23 Oct 2024 08:08:49 GMT
< Content-Type: text/html
< Content-Length: 270
< Connection: keep-alive
< Location: https://taobao.com/
< X-protocol: HTTP/1.1
< EagleEye-TraceId: 0b5162fd17296709294582601e1305
< # response end
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr/>Powered by Tengine/AServer-Ingress/3.0.19<hr><center>tengine ingress</center>
</body>
</html>
* Connection #0 to host taobao.com left intact
root@iZ2zei5cw2j6q770mgp5kvZ:~# wget --debug taobao.com
DEBUG output created by Wget 1.21.2 on linux-gnu.
Reading HSTS entries from /root/.wget-hsts
URI encoding = ‘UTF-8’
Converted file name 'index.html' (UTF-8) -> 'index.html' (UTF-8)
--2024-10-23 16:10:21-- http://taobao.com/ # dns解析开始
Resolving taobao.com (taobao.com)... 59.82.122.140, 59.82.122.130, 59.82.121.163, ...
Caching taobao.com => 59.82.122.140 59.82.122.130 59.82.121.163 59.82.44.240 59.82.43.234 59.82.43.238 59.82.43.239 59.82.122.165 2408:4001:f00::3c 2401:b180:7003::aa 2401:b180:7003::ed 2401:b180:7003::25 2408:4001:f10::6f 2408:4001:f10::5e 2401:b180:7003::6b 2408:4001:f00::87
Connecting to taobao.com (taobao.com)|59.82.122.140|:80... connected. # dns解析结束
Created socket 3.
Releasing 0x00005646027165b0 (new refcount 1).
---request begin---
GET / HTTP/1.1
Host: taobao.com
User-Agent: Wget/1.21.2
Accept: */*
Accept-Encoding: identity
Connection: Keep-Alive
---request end---
HTTP request sent, awaiting response...
---response begin---
HTTP/1.1 301 Moved Permanently
Server: Tengine/AServer-Ingress/3.0.19
Date: Wed, 23 Oct 2024 08:10:21 GMT
Content-Type: text/html
Content-Length: 270
Connection: keep-alive
Location: https://taobao.com/
X-protocol: HTTP/1.1
EagleEye-TraceId: 0b51554717296710214216965e16db
---response end---
# 用户访问网站流程结合在一起.
curl -Lv taobao.com | head -n10
curl或wget访问,隐藏真实请求头
User-Agent
root@iZ2zei5cw2j6q770mgp5kvZ:~# curl -H User-Agent:douniwan/8.88 -v jd.com | less
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 106.39.171.134:80...
* Connected to jd.com (106.39.171.134) port 80 (#0)
> GET / HTTP/1.1
> Host: jd.com
> Accept: */*
> User-Agent:douniwan/8.88
>
* Mark bundle as not supporting multiuse
root@iZ2zei5cw2j6q770mgp5kvZ:~# curl -A User-Agent:douniwan/8.88 -v jd.com | head
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 106.39.171.134:80...
* Connected to jd.com (106.39.171.134) port 80 (#0)
> GET / HTTP/1.1
> Host: jd.com
> User-Agent: User-Agent:douniwan/8.88
> Accept: */*
>
* Mark bundle as not supporting multiuse
1.2 HTTP协议版本
http1.0 |
http1.1 | http2.0 | http3.0(quic) | |
特点 |
短连接,每次请求都需要重复建立断开连接. |
加入长连接功能 |
增加并发,访问更快 |
基于udp更快, 应用于流媒体 |
占用服务端资源 |
keepalive功能 (网站响应后不会立刻断开,保留下这个连接) |
|||
是否加密 |
http 不加密的(80) https 加密的(443) |
默认基于https |
||
基于tcp/udp |
tcp | tcp | tcp | udp |
目前状态
大部分企业还在使用http1.1, 一部分使用http2.0
目前http3.0(QUIC) 流媒体直播在使用.
HTTP1.1 vs 2.0 速度对比:https://https2.sinacloud.com/
1.3 HTTP协议详解⭐⭐⭐⭐⭐
HTTP请求报文
HTTP响应报文
1.3.1 HTTP请求
概述
request
---request begin---
GET / HTTP/1.1
Host: taobao.com
User-Agent: Wget/1.21.2
Accept: */*
Accept-Encoding: identity
Connection: Keep-Alive
---request end---
请求报文起始行⭐⭐⭐⭐⭐
请求方法: 用于指定客户端如何访问服务端(下载,上传,查看服务端信息)
常见的请求方法 |
说明 |
GET |
下载(大部分请求) |
POST |
上传(上传文件内容,登录) |
HEAD |
类似于GET,仅仅输出响应的头部信息.(查看服务端的信息,一般用于检查) curl -I |
DELETE |
删除 |
OPTION |
- 资源的位置(URI): 这个资源在网站站点目录的哪个地方,叫什么名字.
- 这里面写的/lidao.mp4,斜线并非是Linux系统的根目录.这个/叫网站的站点目录.
- URI(统一资源标识符)
- 站点目录是用于存放网站代码的地方.未来在nginx中我们可以指定与查看
测试www.taobao.com是否可以通过http访问
curl -I taobao.com
# 发出HEAD请求方法,查看服务端信息,服务端是否可以访问
root@iZ2zei5cw2j6q770mgp5kvZ:~# curl -I taobao.com
HTTP/1.1 301 Moved Permanently
Server: Tengine/AServer-Ingress/3.0.19
Date: Wed, 23 Oct 2024 09:15:51 GMT
Content-Type: text/html
Content-Length: 270
Connection: keep-alive
Location: https://taobao.com/
X-protocol: HTTP/1.1
EagleEye-TraceId: 212b899017296749515006407e16ad
root@iZ2zei5cw2j6q770mgp5kvZ:~# wget --method=HEAD --debug www.taobao.com
---request begin---
HEAD / HTTP/1.1
Host: www.taobao.com
User-Agent: Wget/1.21.2
Accept: */*
Accept-Encoding: identity
Connection: Keep-Alive
---request end---
HTTP request sent, awaiting response...
---response begin---
HTTP/1.1 200 OK
Server: Tengine
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Date: Wed, 23 Oct 2024 09:20:33 GMT
Vary: Accept-Encoding
x-server-id: 28c3d6b2523ca52c32ad72931842b19a2034e009ad85e753e7776749e65609d318860f5b9ea54579
x-air-hostname: air-ual033005091087.center.na610
x-air-trace-id: 1bdd7a2017296752329967035e
Cache-Control: max-age=0, s-maxage=117
x-node: 3c475217b2b99de4147dbb113025ec3f
x-eagleeye-id: 1bdd7a2017296752329967035e
x-wh-action: crossEngineRewrite
x-retmsg: ok
x-content-type: text/html; charset=utf-8
Vary: Ali-Detector-Type, X-Host, x-document-bundle, Accept-Encoding, Origin
streaming-parser: open
x-retcode: SUCCESS
etag: W/"12fe6-ATFhK0ctvxXETYhOWo7Z3W4ewIc"
x-readtime: 329
x-via: cn4750.l1, cache27.cn4750, l2nu16-1.l2, cache21.l2nu16-1, wormholesource033043122179.center.na610
x-air-source: proxy
x-xss-protection: 1; mode=block
Strict-Transport-Security: max-age=31536000
Ups-Target-Key: air-ual.vipserver
X-protocol: HTTP/1.1
EagleEye-TraceId: 1bdd7a2017296752329967035e
s-brt: 332
Via: cache21.l2nu16-1[359,355,200-0,C], cache32.l2nu16-1[358,0], ens-cache9.cn7307[0,0,200-0,H], ens-cache11.cn7307[4,0]
Age: 20
Ali-Swift-Global-Savetime: 1729675233
X-Cache: HIT TCP_MEM_HIT dirn:-2:-2
X-Swift-SaveTime: Wed, 23 Oct 2024 09:20:33 GMT
X-Swift-CacheTime: 117
x-air-pt: pt0
Timing-Allow-Origin: *
EagleId: b4d5b39f17296752530846522e
---response end---
200 OK
请求头⭐⭐⭐⭐⭐
字段(一些关键词) |
含义 |
User-Agent |
UA头客户端代理(用什么工具访问网站),浏览器. |
Host |
Host头表示访问的目标网站:域名或ip |
Connection: Keep-Alive |
长连接 |
... |
其他
- 空行: 分割请求头与请求报文主体
- 请求报文主体(body): 一般上传或者post请求时候才有
浏览器调试查看
浏览器的调试功能:DevTools
F12或Fn+F12查看"网络"部分即可.
如果是火狐浏览器或Edge浏览器,F12默认是中文的.
如果是谷歌浏览器第1次F12需要选择 第1个蓝色内容,变成中文.
小结:
- 核心内容: 请求起始行请求方法,请求URI(资源位置)
- 核心内容: 请求头中 UA头,HOST头
- http请求豹纹: 用户目标,上传/下载,资源位置/名字,自报家门(UA)
1.3.2 HTTP响应
状态码与服务端信息
response
---response start---
HTTP/1.1 301 Moved Permanently
Server: Tengine/AServer-Ingress/3.0.19
Date: Wed, 23 Oct 2024 08:10:21 GMT
Content-Type: text/html
Content-Length: 270
Connection: keep-alive
Location: https://taobao.com/
X-protocol: HTTP/1.1
EagleEye-TraceId: 0b51554717296710214216965e16db
---response end---
响应报文起始行
协议与版本 HTTP/1.1
状态码: 数字3位,用于描述服务端是否能找到或处理用户的请求.(类似于命令行错 误提示) 200 ok. 404
状态码描述
响应头
响应头字段 |
说明 |
Server |
显示服务端使用的web服务器及版本 |
Content-Type |
媒体类型(文件类型) |
Content-Length |
大小 |
Location |
跳转之后的新的位置(rewrite 301/302),跳转的时候才有 |
Via/Cache |
查看是否经过cdn. |
其他
- 空行
- 响应报文主体: 服务端返回给客户端的数据.
1.3.3 http请求与响应详细流程
https://www.processon.com/view/link/630c2f1f7d9c080730b62980
1.3.4 http协议状态码⭐⭐⭐⭐⭐
状态码: 错误提示,反映出服务端是否能够正常的处理用户请求
状态码 |
含义 |
2xx |
表示正常 |
3xx |
表示需要进行跳转,表示正常 |
4xx |
表示异常,客户端问题 |
5xx |
表示异常,服务端问题 |
状态码详细说明
详细的状态码 |
说明 |
200 ok |
访问正常 |
301 Moved Permanently |
永久跳转 |
302 Found或Moved Temporarily |
临时跳转 |
304 Not Modified |
浏览器缓存 |
401 |
认证失败 |
403 Forbidden |
权限拒绝(拒绝访问) 🅰 权限问题,🅱 首页文件问题 |
404 Not Found |
文件找不到,一般辅助错误日志排查 |
405 Method Not Allowed. |
不准许的请求方法,一般服务器或安全软件限制 |
413 request entity too large |
web服务的文件大小限制 |
500 Internal Error |
内部错误,SElinux开启,其他原因一般辅助错误日志排查 |
502 Bad Gateway |
网关错误,一般发生在负载中(类似场景下),请求发送到后面,后面无人处理,提示502 |
503 service temporarily unavailable |
.服务临时不可用,后端负载异常等情况,人为设置(升级) |
504 Gateway Time-out |
网关超时. |
注意:
- 访问域名找不到index页面报403,url里直接加上index.html会报404
- curl -Lv -L跟随跳转,遇到301/302会读取响应头中的Location头重新访问
- 更多状态码:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
1.4 HTTP协议小结
- HTTP: 用户的请求与响应被后格式与定义
- HTTP请求报文
- ⭐ ⭐ ⭐ ⭐ ⭐ 请求起始行 GET / (uri) HTTP/1.1
- ⭐ ⭐ ⭐ ⭐ ⭐ 请求头(head):
- User-Agent: 客户端代理(浏览器)
- Host: 域名
- 空行
- 请求豹纹主体(body): POST
- HTTP响应报文
- 响应报文的起始行: HTTP/1.1 状态码⭐ ⭐ ⭐ ⭐ ⭐
- 响应头: Server(web服务器) ⭐ ⭐ ⭐ ⭐ ⭐
- 空行
- 响应豹纹的主体(body): 文件内容
- 状态码与含义⭐ ⭐ ⭐ ⭐ ⭐
2.WEB集群-衡量系统访问量指标
衡量网站访问量大小
2.1 概述 ⭐⭐⭐⭐⭐
指标 |
说明 |
并发访问量 |
同一时间内,访问网站的用户数量(tcp 已建立连接的数量) |
IP |
访问网站的独立ip数量,公网ip |
PV |
页面访问量Page view,用户访问1次页面PV+1 |
传统网站 |
门户网站,搜索网站 |
UV |
独立访客数量,接近于用户数量 Unique Vistor |
移动端APP |
|
DAU |
每天的活跃用户的数量:日活(日活跃用户) |
MAU |
月活(月活跃用户) |
2.2 统计
IP,PV,UV 三剑客进行过滤,第三方统计插件(百度统计,.....网站页面加入代码),ELK(日志收集与分析)
DAU,MAU 第3方工具,数据库统计用户登录情况. https://alexa.chinaz.com/
统计并发
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.php
3.WEB集群-Nginx
3.1 WEB服务
- WEB服务:网站服务,部署并启动了这个服务,你就可以搭建一个网站.
- WEB中间件: 等同于WEB服务
- 中间件: 在用户和硬件(系统)之间的软件、服务
- 数据库中间件:数据库,数据库缓存,消息对列...
3.2 常见网站服务(web中间件)
网站服务 |
说明 | 官网 |
通用WEB中间件 |
||
Nginx |
大部分使用nginx,Engine X 异步模型(epoll) |
http://nginx.or g/en/docs/ |
Tengine |
基于Nginx二开,淘宝开源,更多内置模块 |
https://tengine. taobao.org/ |
Openresty |
基于Nginx二开,加强Lua功能与模块 |
|
apache(httpd) |
目前较少使用. select模型(同步) |
|
... | ||
特殊环境 | ||
Tomcat/Jboss/Jetty/Weblogic |
运行java环境的,web服务 | |
PHP |
运行php环境,需要 ngx(LNMP) |
|
Python/Golang |
|
|
... |
|
|
信创(国产化) |
等等 |
详解
'''
Linux Web中间件是指在 Linux 操作系统上运行的、用于支持 Web 应用程序的中间层软件。
它通常充当客户端(如浏览器)和后端服务(如数据库或应用服务器)之间的桥梁,提供各种功能以增强 Web 应用的性能、可扩展性和安全性。
'''
# 以下是一些常见的 Linux Web 中间件的类型和功能:
# 1. Web 服务器
Apache HTTP Server:一个开源的 Web 服务器,广泛用于托管网站和 Web 应用。
Nginx:高性能的 Web 服务器和反向代理服务器,常用于负载均衡和静态内容服务。
# 2. 应用服务器
Tomcat:一个开源的 Java Servlet 容器,支持 Java EE 应用程序的运行。
WildFly(以前称为 JBoss):一个开源的 Java EE 应用服务器,提供全面的企业级功能。
# 3. 反向代理和负载均衡
Nginx 和 HAProxy:用于分发客户端请求到多个后端服务器,以提高应用的可用性和性能。
# 4. 数据库中间件
MySQL、PostgreSQL:虽然它们是数据库管理系统,但在 Web 应用中,它们通常作为中间件与应用服务器交互,存储和检索数据。
# 5. 消息队列
RabbitMQ、Kafka:用于处理异步消息传递,支持微服务架构中的服务间通信。
# 6. 缓存中间件
Redis、Memcached:用于缓存数据,以提高 Web 应用的响应速度和性能。
# 7. API 网关
Kong、API Gateway:用于管理和路由 API 请求,提供安全性、监控和流量控制等功能。
# 8. 安全中间件
OAuth、OpenID Connect:用于实现用户身份验证和授权,保护 Web 应用的安全性。
#总结
Linux Web 中间件在现代 Web 应用架构中扮演着重要角色,提供了必要的功能以支持高效、可扩展和安全的 Web 服务。
通过合理选择和配置这些中间件,可以显著提升 Web 应用的性能和用户体验。
3.3 极速上手指南
记录常用服务的版本: 1.16.x 1.18.x
选用稳定版本,上一个稳定版本
3.3.1 配置yum源
麒麟kylin-sp2不用配置,直接yum安装即可. 麒麟sp3配置yum源然后安装
https://nginx.org/en/linux_packages.html#RHEL
[root@m01 ~]# vim /etc/yum.repos.d/nginx.repo
# 写入如下内容
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
3.3.2 检查安装
[root@m01 ~]# rpm -qa | grep nginx
[root@m01 ~]#
[root@m01 ~]# rpm -ql nginx
未安装软件包 nginx
[root@m01 ~]#
[root@m01 ~]# nginx -V
-bash: nginx:未找到命令
[root@m01 ~]#
[root@m01 ~]# yum install nginx -y
3.3.3 目录结构
温馨提示:
Nginx不同的安装方法:目录,文件会有所区别.
下面是yum/apt安装默认的路径.不同系统会有差异.
编译安装的ngx就不同了
目录结构 |
说明 |
/etc/nginx/ |
nginx各种配的目录 |
/etc/nginx/nginx.conf |
主配置文件 |
/etc/nginx/conf.d/*.conf |
子配置文件(网站) 如果没有手动创建 conf.d default.d 子配置文件 |
/etc/nginx/conf.d/default.conf |
默认的子配置文件 不一定存在. |
/usr/sbin/nginx |
ngx命令 |
/usr/share/nginx/html/ |
ngx默认的站点目录,网站的根目录(可以通过查看配置得知) |
/var/log/nginx/ |
ngx日志:访问日志,错误日志,跳转日志 |
/etc/logrotate.d/nginx |
日志切割(防止文件过大) |
/etc/nginx/mime.types |
媒体类型 |
/etc/nginx/fastcgi_params |
ngx+php |
/etc/nginx/uwsgi_params |
ngx+python |
/usr/lib/systemd/system/nginx.service |
systemctl配置文件 |
/var/cache/nginx/ |
缓存目录 |
3.3.4 日常启动与管理
# 启动
[root@m01 ~]# systemctl enable --now nginx
# 检查服务状态
[root@m01 ~]# systemctl status nginx
# 检查服务进程
[root@m01 ~]# ps -ef | grep nginx
root 3139 1 0 11:54 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 3140 3139 0 11:54 ? 00:00:00 nginx: worker process
nginx 3141 3139 0 11:54 ? 00:00:00 nginx: worker process
root 3144 1153 0 11:54 pts/0 00:00:00 grep --color=auto nginx
# 检查服务端口
[root@m01 ~]# ss -lntup | grep nginx
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=3141,fd=9),("nginx",pid=3140,fd=9),("nginx",pid=3139,fd=9))
# 命令访问
[root@m01 ~]# curl 10.0.0.71
[root@m01 ~]# curl -v 10.0.0.71
浏览器访问:http://10.0.0.71/
3.4 部署小鸟飞飞 ⭐⭐⭐⭐
网站要求 |
说明 |
域名 |
bird.m01.cn bird.web01.cn ---DNS解析(临时测试hosts解析)-->10.0.0.71 |
站点目录 |
/app/code/bird/ |
子配置文件 |
/etc/nginx/conf.d/bird.m01.conf #以.conf结尾 |
代码来源 |
bird.tar.gz或bird.zip |
- nginx只能处理静态资源:
- html(页面架构),css(页面样式),js(样式动起来),图片,视频..
- (Java,Go,Python)动态资源这里指的是:用户上传,用户注册,用户刷礼物,评论..
搭建网站流程
- nginx完成部署与测试
- 根据要求创建子配置文件,准备环境
- 检查语法然后重启
- hosts解析(linux,windows)与访问
3.4.1 配置文件
bird.m01.conf
# 配置文件
[root@m01 /etc/nginx/conf.d]# cat bird.m01.conf
server {
listen 80;
server_name bird.m01.cn bird.web01.cn;
root /app/code/bird;
location / {
# 首页文件 没有指定uri的时候默认展示的页面.
index index.html;
}
}
[root@m01 /etc/nginx/conf.d]#
# 检查语法
[root@m01 /etc/nginx/conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
3.4.2 根据配置文件准备环境(目录和代码)
环境部署
# 创建站点目录
[root@m01 /etc/nginx/conf.d]# mkdir -p /app/code/bird
[root@m01 /etc/nginx/conf.d]#
[root@m01 /etc/nginx/conf.d]# cd
# 上传代码
[root@m01 ~]# rz
[root@m01 ~]# ls
anaconda-ks.cfg bird.tar.gz initial-setup-ks.cfg
# 查看包内容
[root@m01 ~]# tar tf bird.tar.gz
[root@m01 ~]#
# 解压到站点目录
[root@m01 ~]# tar xf bird.tar.gz -C /app/code/bird/
[root@m01 ~]#
# 检查代码内容
[root@m01 ~]# ll /app/code/bird/
总用量 140
-rw-r--r-- 1 root root 15329 8月 2 2014 2000.png
-rw-r--r-- 1 root root 51562 8月 2 2014 21.js
-rw-r--r-- 1 root root 254 8月 2 2014 icon.png
drwxr-xr-x 2 root root 102 8月 8 2014 img
-rw-r--r-- 1 root root 3049 8月 2 2014 index.html
-rw-r--r-- 1 root root 63008 8月 2 2014 sound1.mp3
[root@m01 ~]#
# 重新加载nginx
[root@m01 ~]# systemctl reload nginx
3.4.3. 配置DNS解析
修改宿主机hosts ,文件路径C:\Windows\System32\drivers\etc\hosts
# 在宿主机hosts文件追加一行内容
10.0.0.71 bird.m01.cn bird.web01.cn
3.4.4 访问
http://bird.m01.cn 或者 http://bird.web01.cn
3.4.5 小结
- 书写配置文件(子配置文件) 以.conf结尾.
- 准备目录,准备代码,修改权限
- 访问与测试
- linux: hosts解析与检查
- windows: hosts 浏览器访问
- 正式环境中配置DNS解析
4. WEB集群-Ngx核心功能详解⭐⭐⭐⭐
4.1 配置文件
/etc/nginx/nginx.conf
4.1.1 主配置文件详解
https://www.processon.com/view/link/6679326da1d80a3c06ff5575
4.1.2 子配置文件
网站中常用必会指令
#网站中常用必会指令 说明
listen # 指定监听端口
server_name # 指定域名,多个通过空格分割.
location(区域) # 匹配请求中的uri(资源地址)
root # 指定站点目录(网站的根目录) root /app/code/www; www.baidu.com/lidao/lidao.txt ==>/app/code/www/lidao/lidao.txt
index # 指定站点的首页文件. 用户访问的时候不加上任何的文件,展示首页文件.
error_log # 指定错误状态码与对应的错误页面
ngx:必会问题: ⭐ ⭐ ⭐ ⭐ ⭐
- 如果站点目录不存在,进行访问会发生什么? 404 Not Found
- 如果首页文件不存在,进行访问会发生什么? 403 Forbidden
- 查看错误日志: error.log
4.1.3 配置文件小结
nginx.conf # 主配置文件
conf.d/*.conf # 子配置文件
掌握子配置文件中的指令: # user,工具人进程用户,error_log,access_log,listen,server_name,root,index.
# http区域与server区域关系
http{
server{}
}
# 重启: 配置修改了,重启ngx
4.2 如果使用Ip地址访问会访问哪个节点?(ngx处理用户请求流程)⭐⭐⭐⭐⭐
https://www.processon.com/view/link/630d8479e401fd0711f31b23
4.2.1 ngx处理用户请求流程
4.2.2用户请求ngx详细描述
# 1.DNS解析域名-->ip地址.
# 2.通过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+站点目录进行处理.(location规则)
# 7.处理完成把结果发回给用户
4.2.3 设置网站默认的站点
用于处理ip访问或不存在的域名
default_server
[root@m01 /etc/nginx/conf.d]# cat default.conf
server {
listen 80 default_server; # default_server 标记当前的站点时默认的
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
特殊情况:
请求的uri没写 比如 http://bird.m01.cn uri就是/斜线
ngx处理的时候 uri+站点目录 /index.html + /app/code/bird/
index index.html; 首页文件
4.3. 域名注册-解析-备案
dns解析
记录类型(域名-->xxx) 说明
A记录 域名-->ipv4
AAAA记录 域名-->ipv6
CNAME记录 别名记录 域名1--->域名2 CDN,WAF
TXT记录 域名-->字符串 检查,校验(域名是否是你的.)
MX记录 企业邮箱使用
4.4 虚拟主机
- 虚拟主机:相当于是1个网站,在ngx中通过server{}区域实现.
- ngx中虚拟主机有不同的类型(配置不同)
4.4.1 概述与分类
虚拟主机的分类 |
说明 | 应用场景 |
⭐ 基于域名的虚拟主机 |
不同域名访问不同的站点. |
生产环境最常用的.(域名不同端口是80,443) |
基于端口的虚拟主机 |
不同端口访问不同的站点. |
保护,设置特殊端口.1024以上 8888 18888 |
基于ip的虚拟主机 |
不同ip访问不同的站点. |
保护,用户只能通过某个ip连接进来.用来限制网站只能通过指定的ip进行访问内网ip,vpn ip |
4.4.2 基于域名的虚拟主机 ⭐️⭐️⭐️⭐️⭐️
站点说明 |
域名 | 站点目录 | 代码 |
小鸟飞飞 |
bird.m01.cn | /app/code/bird |
bird.tar.gz |
小霸王游戏网站 |
small_overlord.m01.cn | /app/code/game/small_overlord |
FC小霸王怀旧游戏机-HTML源码.zip |
走遍中国 |
china.m01.cn | /app/code/china | china.tar.gz |
搭建流程:
- 准备子配置文件与检查语法
- 准备目录
- 准备代码,解压过去.
- hosts解析与调试
不同域名访问不同的主机
创建small_overlord.m01.cn网站
站点目录/app/code/game/small_overlord、
书写配置文件.
- 完成后不创建站点目录进行访问看看报什么错误.
- 创建站点目录后再访问看看报什么错误.
- 创建首页文件和内容,访问看看显示什么.
书写配置
small_overlord.conf
[root@m01 /etc/nginx/conf.d]# cat /etc/nginx/conf.d/small_overlord.conf
server{
listen 80;
server_name small_overlord.m01.cn;
root /app/code/game/small_overlord;
location / {
index index.html;
}
}
[root@m01 /etc/nginx/conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@m01 /etc/nginx/conf.d]# systemctl reload nginx
[root@m01 /etc/nginx/conf.d]#
[root@m01 /etc/nginx/conf.d]# ss -lntup | grep nginx
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2265,fd=9),("nginx",pid=2264,fd=9),("nginx",pid=921,fd=9))
tcp LISTEN 0 128 0.0.0.0:8088 0.0.0.0:* users:(("nginx",pid=2265,fd=11),("nginx",pid=2264,fd=11),("nginx",pid=921,fd=11))
[root@m01 /etc/nginx/conf.d]#
[root@m01 /etc/nginx/conf.d]# systemctl restart nginx
[root@m01 /etc/nginx/conf.d]#
[root@m01 /etc/nginx/conf.d]# ss -lntup | grep nginx
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2369,fd=8),("nginx",pid=2368,fd=8),("nginx",pid=2367,fd=8))
tcp LISTEN 0 128 10.0.0.71:8088 0.0.0.0:* users:(("nginx",pid=2369,fd=9),("nginx",pid=2368,fd=9),("nginx",pid=2367,fd=9))
[root@m01 /etc/nginx/conf.d]#
其他准备
other
# 创建站点目录
[root@m01]# mkdir -p /app/code/game/small_overlord
# 上传代码文件
[root@m01 ~]# rz
[root@m01 ~]# ls
anaconda-ks.cfg bird.tar.gz FC小霸王怀旧游戏机-HTML源码.zip initial-setup-ks.cfg
# 查看代码文件
[root@m01 ~]# unzip -l FC小霸王怀旧游戏机-HTML源码.zip
#解压,不显示过程
[root@m01 ~]# unzip -q FC小霸王怀旧游戏机-HTML源码.zip -d /app/code/game/small_overlord/
# 查看解压文件
[root@m01 ~]# ll /app/code/game/small_overlord/
总用量 48
-rw-r--r-- 1 root root 28032 5月 24 2021 bgm.mp3
drwxr-xr-x 2 root root 23 5月 24 2021 css
drwxr-xr-x 2 root root 23 5月 24 2021 images
-rw-r--r-- 1 root root 8956 5月 24 2021 index.html
drwxr-xr-x 2 root root 213 5月 24 2021 js
drwxr-xr-x 2 root root 4096 5月 24 2021 roms
-rw-r--r-- 1 root root 811 5月 24 2021 shuoming.html
页面访问:http://small_overlord.m01.cn/
本地测试域名的小技巧(linux)
curl -v -H "Host:small_overlord.m01.cn" http://10.0.0.71/index.html # -H修改请求头里面的内容
curl -v -H
[root@m01 ~]# curl -v -H "Host:small_overlord.m01.cn" http://10.0.0.71/index.html
* Trying 10.0.0.71:80...
* Connected to 10.0.0.71 (10.0.0.71) port 80 (#0)
> GET /index.html HTTP/1.1
> Host:small_overlord.m01.cn
> User-Agent: curl/7.71.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.26.1
< Date: Tue, 29 Oct 2024 01:37:57 GMT
< Content-Type: text/html
< Content-Length: 8956
< Last-Modified: Sun, 23 May 2021 22:50:22 GMT
< Connection: keep-alive
< ETag: "60aadc2e-22fc"
< Accept-Ranges: bytes
<
4.4.3 基于端口的虚拟主机
不同的端口访问不的网站
[root@m01 ~]# cat /etc/nginx/conf.d/small_overlord.conf
server{
listen 8088;
server_name small_overlord.m01.cn;
root /app/code/game/small_overlord;
location / {
index index.html;
}
}
[root@m01 ~]# systemctl reload nginx
页面访问:http://small_overlord.m01.cn:8088/
4.4.4 基于ip的虚拟主机
搭建game网站,端口是8088,只能通过172.16.1.7内网访问.
listen 172.16.1.71:8088
[root@m01 ~]# cat /etc/nginx/conf.d/small_overlord.conf
server{
listen 172.16.1.71:8088;
server_name small_overlord.m01.cn;
root /app/code/game/small_overlord;
location / {
index index.html;
}
}
# 配置文件修改ip后必须得重启
[root@m01 ~]# systemctl restart nginx
# 限制之后 10不能访问,172可以访问
[root@m01 ~]# curl -v -H "Host:small_overlord.m01.cn" http://10.0.0.71:8088/index.html
* Trying 10.0.0.71:8088...
* connect to 10.0.0.71 port 8088 failed: 拒绝连接
* Failed to connect to 10.0.0.71 port 8088: 拒绝连接
* Closing connection 0
curl: (7) Failed to connect to 10.0.0.71 port 8088: 拒绝连接
[root@m01 ~]#
[root@m01 ~]# curl -v -H "Host:small_overlord.m01.cn" http://172.16.1.71:8088/index.html
* Trying 172.16.1.71:8088...
* Connected to 172.16.1.71 (172.16.1.71) port 8088 (#0)
> GET /index.html HTTP/1.1
> Host:small_overlord.m01.cn
> User-Agent: curl/7.71.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.26.1
< Date: Tue, 29 Oct 2024 01:52:21 GMT
< Content-Type: text/html
< Content-Length: 8956
< Last-Modified: Sun, 23 May 2021 22:50:22 GMT
< Connection: keep-alive
< ETag: "60aadc2e-22fc"
< Accept-Ranges: bytes
4.5 Ngx日志
- 给每个虚拟主机指定自己独立的错误日志.
- 给每个虚拟主机指定自己独立的访问日志
4.5.1 概述
日志 |
使用建议 | 定义 | 使用 |
错误日志 |
发生故障的时候可以查看,4xx,5xx |
通过错误级别指定 | error_log |
访问日志 |
记录着用户什么时候访问网站哪些页面,客户端信息. |
通过log_format定义访问日志的格式 |
access_log |
4.5.2 错误日志
指定错误日志的位置和错误级别(日志级别)
- error_log指令
- 格式:error_log 文件名 错误日志级别;
- 指令放在哪:main , http , mail , stream , server , location
# 错误日志级别;:左到右,越来越粗糙. 记录信息的详细程度.
debug, info, notice, warn, error, crit, alert, or emerg.
error是默认的.
notice 推荐.
debug: 未来用于调试使用,短时间开启,网站访问量较大别开
# 实例
error_log /var/log/nginx/bird_error.log notice;
指令帮助:https://nginx.org/en/docs/
4.5.3 访问日志
- 辅助我们进行分析,网站访问量,ip,pv.
- 访问日志是记录下用户信息的宝藏.
- ip信息,请求方法,访问uri,文件大小,ua头,特别信息
log_format指定访问日志的格式
- log_format 格式名字 格式.....;
- 放在哪里: http
Ngx访问日志格式(ngx内置变量) # 说明
$remote_addr # 客户端ip地址
$remote_user # 用户名(空,ngx进行认证用户)
$time_local # 时间 30/Aug/2022:14:44:27 +0800
$request # 请求报文的起始行(请求方法 URI HTTP/1.1)
$status # http状态码
$body_bytes_sent # 响应给客户的文件的大小,响应报文的主体大小(文件大小) 单位字节 bytedance
$http_referer # (用户从哪里来的)从哪里跳转,访问到这个网站的. 网站运营分析
$http_user_agent # UA 客户端代理(浏览器)
$http_x_forwarded_for # XFF头,使用负载,记录用户真实的ip地址.其他常用的ngx变量
$request_method # 请求方法 GET或POST或HEAD
$uri # 请求中的uri部分内容
更多ngx内置变量:https://nginx.org/en/docs/varindex.html
access_log指定日志,使用对应格式
- access_log指定访问日志
- access_log 日志位置 格式
- 放在哪:http , server , location , if in location , limit_except
生产建议给每个虚拟主机指定自己独立的访问日志
访问日志其他选项access_log(未来根据需要进行配置)
access_log
# access_log 说明
access_log off; # 关闭访问日志一般要配合if或location实现精确匹配与处理.access_log off ; access_log /dev/null;
访问日志进行压缩 # gzip需要通过zcat/zless/zgrep查看
进行缓存 # buffer = 32k 先把日志写入到内存中,定期写入到磁盘
定义刷新时间 # flush =10s
[root@m01 /etc/nginx/conf.d]# cat bird.m01.conf
server {
listen 80;
server_name bird.m01.cn bird.web01.cn;
error_log /var/log/nginx/bird_error.log notice;
access_log /var/log/nginx/bird_access.log main;
# access_log /var/log/nginx/bird_access.log.gz main gzip buffer=32k flush=10s;
root /app/code/bird;
location / {
index index.html;
}
location ~* \.(html|css|js) {
expires 1d;
}
location ~* \.(jpg|png|gif|jpeg) {
expires 30d;
}
}
4.6 Location规则 ⭐️⭐️⭐️⭐️⭐️
4.6.1 location概述
ngx的location规则:
在ngx用于匹配用户请求中的uri.ngx对用户请求中的uri进行判断.
如果用户请求的uri是xxxx,则做xxxx.
接下来详细说说location规则
有的地方给location规则也叫路由规则.
# URI vs URL
URL网址 https://nginx.org/en/docs/
URI: /en/docs/
http://www.baidu.com/test/1.txt
URI: /test/1.txt 域名后面的内容
URI: / 域名后面的内容
URL: http://www.baidu.com 网址
4.6.2 location匹配
环境准备
域名:buy.web01.cn
站点目录:/app/code/buy/ 首页文件index.html
后台管理页面:/app/code/buy/admin/index.html
要求后台只能内网访问:172.16.1.0/24网段.
配置文件
buy.web01.cn.conf
[root@web01 /etc/nginx/conf.d]# cat buy.web01.cn.conf
server {
listen 80;
server_name buy.web01.cn;
root /app/code/buy;
location / {
index index.html;
}
# buy.web01.cn/admin/
# uri: /admin/
# 如果用户的uri是/admin/ 则 运行allow和deny 2个指令.
location /admin/ {
# 准许172.16.1.0/24网段访问
allow 172.16.1.0/24;
# 拒绝所有
deny all;
}
}
测试
# 环境准备
mkdir -p /app/code/buy/admin/
echo "buy.web01.cn site" >/app/code/buy/index.html
echo "admin dangerous buy.web01.cn" >/app/code/buy/admin/index.html
# 测试结果
# 加上 /admin/ uri之前
curl -H Host:buy.web01.cn http://172.16.1.69/admin/ -->admin buy.web01.cn
# 加上 /admin/ uri之前后
curl -H Host:buy.web01.cn http://10.0.0.69/admin/ -->403 Forbidden
- location 匹配uri,location匹配目录,uri开头部分.
- location /admin/ {} 匹配uri中/admin/开头的.
- allow和deny
- allow 准许指定的ip,网段进行访问.
- deny 拒绝ip,网段,all;
- 先allow 再deny
4.6.3 location正则匹配
bird小鸟飞飞网站,给网站加速,设置缓存,网站中html,js,css结尾的文件缓存1天,图片缓存30天.
这里的缓存是浏览器缓存,使用 expires 指令实现.
基本配置浏览器访问并没有缓存
[root@web01 ~]# cat /etc/nginx/conf.d/bird.web01.cn.conf
server {
listen 80;
server_name bird.web01.cn;
root /app/code/bird;
location / {
index index.html;
}
}
设置浏览器缓存功能
server {
listen 80;
server_name bird.web01.cn;
root /app/code/bird;
location / {
index index.html;
}
#uri包含 .html或.js或.css 缓存1天
location ~* \.(html|js|css)$ {
expires max; # 最大缓存
# expires 1d;
}
#uri包含 .jpg 或 .jpeg 或 .png 或 .gif 或 .bmp
location ~* \.(jpg|jpeg|png|gif|bmp)$ {
expires 1h;
}
}
打开浏览器F12显示是否缓存的方法
小结
- location规则与正则. perl语言的正则表达式(pcre)
- location ~* 正则
- ~ 正则区分大小写
- ~*正则不区分大小写
- expires 设置浏览器缓存.
- perl正则新的写法 :
- \d === [0-9]
- \w === [a-zA-Z0-9_]
4.6.4 location 规则小结
location规则 |
说明 |
⭐ location / {xxxx} |
默认规则,保底,location规则在进行匹配的时候,其他的规则都匹配失败了,这时候匹配默认的规则. |
⭐ location /image/ {} |
用于匹配请求的uri (路径) bird.web01.cn/image/1.txt ✅ |
⭐ location ~ \.(jpg|jpeg)$ {} |
支持正则,区分大小写 bird.web01.cn/image/1.jpg |
⭐ location ~* \.(jpg|jpeg)$ {} |
支持正则,不区分大小写 bird.web01cn/image/1.jpg |
location ^~ /test/ |
不支持正则,仅仅匹配普通字符,很少使用,优先. |
location = /50x.html |
请求的uri与书写的内容一模一样.不支持正则,精确匹配,使用较少 |
location @名字{} |
命名的location一般用于return/error_log 内部跳转. |
报错设置页面
location = #用于指定 状态码与对应的页面
# 用于指定403.html的位置.
error_page 403 /403.html;
location = /403.html {
root /usr/share/nginx/html;
}
# 用于指定404.html的位置.
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
#用于指定50x.html的位置.
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
4.6.5 部署china代码
项目需求
代码:china.tar.gz
站点目录:/app/code/china/
域名:china.web01.cn
如果访问.js文件,设置1天缓存,站点目录设置为/app/code/china/js
如果访问.css文件,设置1天缓存,站点目录设置为/app/code/china/css
执行过程
查看代码
[root@web01 ~]# cd /etc/nginx/conf.d/
[root@web01 /etc/nginx/conf.d]# ls
blog.web01.cn.conf default.conf php-fpm.conf phpmyadmin.web01.cn.conf
[root@web01 /etc/nginx/conf.d]# vim blog.web01.cn.conf
[root@web01 /etc/nginx/conf.d]#
[root@web01 /etc/nginx/conf.d]# cp blog.web01.cn.conf china.web01.cn.conf
[root@web01 /etc/nginx/conf.d]# vim china.web01.cn.conf
[root@web01 /etc/nginx/conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 /etc/nginx/conf.d]#
[root@web01 /etc/nginx/conf.d]# systemctl restart nginx
[root@web01 /etc/nginx/conf.d]#
[root@web01 /etc/nginx/conf.d]# mkdir -p /app/code/china
[root@web01 /etc/nginx/conf.d]#
[root@web01 /etc/nginx/conf.d]# cd
[root@web01 ~]# ls
all_db.sql.gz blog.tar.gz initial-setup-ks.cfg phpMyAdmin-5.2.1-all-languages wordpress
anaconda-ks.cfg go-pear.php nginx phpMyAdmin-5.2.1-all-languages.zip wordpress.zip
[root@web01 ~]# rz
[root@web01 ~]# ls
all_db.sql.gz blog.tar.gz go-pear.php nginx phpMyAdmin-5.2.1-all-languages.zip wordpress.zip
anaconda-ks.cfg china.tar.gz initial-setup-ks.cfg phpMyAdmin-5.2.1-all-languages wordpress
[root@web01 ~]#
[root@web01 ~]# tar tf china.tar.gz
china/
china/css/
china/css/样式.css
china/index.html
china/js/
china/js/脚本.js
china/字体.woff
[root@web01 ~]#
[root@web01 ~]# tar xf china.tar.gz
[root@web01 ~]# mv china/* /app/code/china/
[root@web01 ~]#
[root@web01 ~]# grep user /etc/nginx/nginx.conf
user www;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'"$http_user_agent" "$http_x_forwarded_for"';
[root@web01 ~]#
[root@web01 ~]# chown -R www.www /app/code/china/
[root@web01 ~]#
[root@web01 ~]#
配置文件
china.web01.cn.conf
[root@web01 ~]# cat /etc/nginx/conf.d/china.web01.cn.conf
server{
listen 80;
server_name china.web01.cn;
root /app/code/china/;
error_log /var/log/nginx/china-error.log notice;
access_log /var/log/nginx/china-access.log main;
location / {
index index.html;
}
location ~* \.js$ {
expires 1d;
root /app/code/china/js;
}
location ~* \.css$ {
expires 10d;
root /app/code/china/css;
}
}
[root@web01 ~]#
访问
4.7 loation优先级
location匹配的时候优先级(演示)
优先级
# 优先级 location符号
1 =
2 ^~
3 ~ ~*
4 /image/
5 /
server {
listen 80;
server_name game.m01.cn;
default_type text/html;
location / {
return 200 "location /\n";
}
location = /index.html {
return 200 "location =/\n";
}
location ~ /index.html {
return 200 "location ~/\n";
}
location ^~ /index.html {
return 200 "location ^~\n";
}
}
分析
location_match
server {
listen 80;
server_name game.m01.cn;
default_type text/html;
location = / {
return 200 " [ configuration A ]";
}
location / {
return 200 " [ configuration B ]";
}
location /documents/ {
return 200 " [ configuration C ]";
}
location ^~ /images/ {
return 200 " [ configuration D ]";
}
location ~* \.(gif|jpg|jpeg)$ {
return 200 " [ configuration E ]";
}
}
# 测试与访问 匹配的结果.
'''
“/” A
“/index.html” B
“/documents/document.html” C
“/images/1.gif” D
“/documents/1.jpg” E
'''