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

网关超时.

注意:

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)动态资源这里指的是:用户上传,用户注册,用户刷礼物,评论..

搭建网站流程

  1. nginx完成部署与测试
  2. 根据要求创建子配置文件,准备环境
  3. 检查语法然后重启
  4. 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

搭建流程:

  1. 准备子配置文件与检查语法
  2. 准备目录
  3. 准备代码,解压过去.
  4. hosts解析与调试

不同域名访问不同的主机

创建small_overlord.m01.cn网站

站点目录/app/code/game/small_overlord、

书写配置文件.

  1. 完成后不创建站点目录进行访问看看报什么错误.
  2. 创建站点目录后再访问看看报什么错误.
  3. 创建首页文件和内容,访问看看显示什么.

书写配置

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 ~]# 

访问

http://china.web01.cn/

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
'''

 

posted @ 2024-10-23 16:27  老虎死了还有狼  阅读(30)  评论(0编辑  收藏  举报