数据库运维
记录DBA学习成长历程

第16章:LNMP网站架构

文章目录

1 课程安排说明

1) 用户访问网站原理 OK
2) HTTP协议的数据报文(抓包wireshark) OK
3) HTTP协议的一些资源(动态资源 静态资源) OK??动态
4) 网站度量方式 ok
4) 网站的常见服务说明 ok
5) 将nginx服务进行安装 ok

2 用户访问网站的一个原理过程

0) 用户打开浏览器输入地址之后,按下回车
1) 完成地址域名的解析过程(域名--IP解析)
   本地解析过程: 缓存 hosts
   递归查询过程: 
   LDNS服务器(网站卡配置的)
   LDNS服务器获取到A记录信息,也会进行缓存
   迭代查询过程: 
   LDNS--根域名服务器(顶级域名服务器信息)---顶级域名服务器(二级域名服务器)---二级域名服务器(域名-IP对应关系:A记录)
2) 用户利用解析后的IP地址发起网络访问: 三次握手过程
3) 用户发起HTTP访问过程: HTTP请求信息 (多个)
4) 用户发起HTTP访问过程: HTTP响应信息 (多个)
5) 用户在浏览器看到页面 
6) 用户利用解析后的IP地址结束网络访问: 四次挥手过程

重点考核:
1) DNS解析过程
2) TCP三次握手/四次挥手过程
3) HTTP报文信息

3 HTTP报文信息说明

—3.1 HTTP请求报文

——3.1.1 HTTP请求行信息 :

GET index.html HTTP 1.1
a 请求方法:
  GET方法: 获得得到 --- 下载
  POST方法: 提交推送 --- 上传
b 请求的数据信息:
c 请求时使用的协议(HTTP1.1)

——3.1.2 HTTP请求头信息

Accept: text/html
01. 请求文件信息类型
    Accept-Encoding: gzip 
02. 对请求信息做了什么处理
    Accept-Language: zh-CN,zh;q=0.9
03. 请求的语言语言
    Cache-Control: no-cache
04. 请求是否调用了缓存
    Connection: keep-alive = 0(短连接)
05. 是否使用TCP长连接
    Cookie: BAIDUID=B2A2C53E6B6CA12D400 
06. ????
    Host: www.baidu.com --- www(主机部分) .baidu.com(域名部分) 
07. 定义访问的主机信息
    User-Agent: Chrome/67.0.3396.99
08. 客户端访问网站的浏览器软件信息(手机 IPhone android)

——3.1.3 空行

——3.1.4 请求主体信息

POST方法调用需要提交的信息 --- 数据库服务器中
1) 注册的信息 
2) 登陆的信息
3) 购物的信息
4) 评论的信息
5) 投票的信息

—3.2 HTTP响应报文

——3.2.1 响应行(起始行)

HTTP/1.1 200 OK
a) 协议信息
b) 状态码信息 状态码描述信息

——3.2.2 响应头部

Cache-Control: private 和缓存相关的设置
Connection: Keep-Alive 是否设置为TCP长连接
Content-Encoding: gzip 响应的信息是否进行压缩
Content-Type: text/html 响应的数据类型
Cxy_all: baidu+553422cecf477402ecd4a78eecb35952
Date: Mon, 11 Mar 2019 06:30:11 GMT 响应时间
Expires: Mon, 11 Mar 2019 06:29:14 GMT 缓存上的时间
Server: nginx/1.xx 百度的web服务器所使用的软件名称(BWS) 重点
Set-Cookie: delPer=0; path=/; domain=.baidu.com
????
X-Ua-Compatible: IE=Edge,chrome=1

——3.2.3 响应空行

——3.2.4 响应主体内容

一般都是代码信息
HTML 静态页面信息 页面有什么都需要用HTML代码编写好
css 定义网页样式 给网页信息进行排版
js 定义页面特效 让网站显示更加好看

4 HTTP协议说明

—4.1 HTTP是什么

超文本传输协议(HTTP,HyperText Transfer Protocol)
是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。
设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法

—4.2 HTTP协议版本

2.0版本
1.1版本和1.0版本之间的区别
a 1.1版本: TCP长连接-- 一次连接,实现多次请求
b 1.0版本: TCP短连接-- 一次连接,实现一次请求

5  HTTP常见响应的状态码信息

200 OK: 请求成功 处理方式:获得响应的内容,进行处理
301 Moved Permanently 永久跳转 第一次访问跳转后,再次访问会直接访问跳转后地址
302 Moved temporary 临时跳转 第一次访问跳转后,在次访问依旧会需要进行访问跳转的服务器
304 cache 图片缓存在客户端本地, 利用缓存进行查看图片(节省网站带宽和网站负载压力) 缓存有时间
403 Forbidden 网站拒绝(黑客)访问(实践)
404 访问的网站信息不存在
500 Internal Server Error 内部服务代码错误(找开发人员) 
502 后端节点出现问题,无法进行访问(负载均衡服务器 --- 用户)
503
504 超时访问,后端节点不能很快做出响应(负载均衡服务器 --- 用户)

6 HTTP协议的一些资源

—6.1 两个名词概念

URL: url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址
URI: 统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串。

www.baidu.com /img/bd_logo1.png
URL:域名信息 URI:访问资源信息
www.baidu.com / == /index.html(首页)
URL:域名信息 URI: 空

—6.2 静态网页资源

所见即所得 重点
1) 页面扩展名: .html、.htm、.shtml
每个页面都有一个固定的URL地址,且URL一般以.html、.htm、.shtml等常见形式为后缀,而且地址中不含有问号“?”或“&”等特殊符号

2) 静态网页是实实在在保存在服务器上的文件实体,每个网页都是一个独立的文件。
网页内容一经发布到网站服务器上,无论是否有用户访问,每个网页的内容都是保存在网站服务器文件系统上的

3) 便于被搜索引擎收录
网页内容是固定不变的,因此,容易被搜索引擎收录(容易被用户找到)(优点)。

4) 因为网页没有数据库的支持,所以在网站制作和维护方面的工作量较大,当网站信息量很大时,完全依靠静态网页比较困难(缺点)。

5) 网页的交互性较差,在程序的功能实现方面有较大的限制(缺点)

6) 网页程序在用户浏览器端解析,如IE浏览器,程序解析效率很高,由于服务器端不进行解析,并且不需要读取数据库,因此服务器端可以接受更多的并发访问。
当客户端向服务器请求数据时,服务器会直接从磁盘文件系统上返回数据(不做任何解析)。待客户端拿到数据后,在浏览器端解析并展现出来(优点)。

—6.3 动态网页资源

需要进行解析处理
1) 网页扩展名后缀常见为:.asp(IIS)、.aspx、.php、.js(java)、.do(java)、.cgi等。 ※
2) 网页一般以数据库技术为基础,大大降低了网站维护的工作量。
3) 采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、投票、用户管理、订单处理、发博文等。
4) 动态网页并不是独立存在于服务器上的网页文件,当用户请求服务器上的动态程序时,服务器解析这些程序并可能通过读取数据库来返回一个完整的网页内容。
5) 动态网页中的“?”在搜索引擎的收录方面存在一定的问题,搜索引擎一般不会从一个网站的数据库中访问全部网页,或者出于技术等方面的考虑,
搜索蜘蛛一般不会去抓取网址中“?”后面的内容,因此在企业通过搜索引擎进行推广时,需要针对采用动态网页的网站做一定的技术处理(伪静态技术),
以便适应搜索引擎的抓取要求。

7 网站度量方式

互联网如何衡量网站公司的好坏
http://alexa.chinaz.com/default.html
IP度量值: 参考 3-4IP
根据用户访问的源IP地址,统计一天的数量,决定网站的用户访问量
1000万源IP地址 A网站
800万源IP地址 B网站

PV度量值: 参考 20页面**几千==几万
根据用户访问的网站页面数量, 统计一天的数量, 决定网站的用户访问量

UV度量值: 100台 准确 几千电脑
根据一个独立访客进行统计,统计一天的数量

重点部分:
COOKIE: 一个会员卡号(钥匙), 主要识别不同主机的身份信息; 由网站进行分配
SESSION: 一个会员名单册(锁头), 主要识别主机身份 需要在网站进行部署

网站并发量: 几千并发 4000-5000千同时连接访问网站
一个网站服务器同一时刻可以承载多少用户进行连接访问
网站并发如何定义:
a 每秒钟接收多少用户的访问数量 10个用户访问==10个并发
c 每秒钟处理多少用户的访问数量 10个用户访问==10个并发
d 单位时间内处理多少用户的访问数量 

老家肉饼: 30个座位
30个用户用餐 9:00 
9:00:01

8 web网站软件分类

—8.1 处理静态服务软件(静态请求)

01. apache 
02. nginx 重点
03. Lighttpd(百度贴吧 豆瓣)

—8.2 处理动态服务软件(动态请求)

01. php 语言
02. tomcat 语言java 重点(移动互联网) java开发移动端程序---手机安卓
03. python 语言python

9 nginx软件安装部署方法

—9.1 采用编译方式进行安装

./configure 
make
make install 
无法解决依赖关系

—9.2 采用yum安装

利用epel扩展源进行yum安装 稳定版本 程序目录可能和官方不太统一
利用nginx官方源进行yum安装(推荐) 最新版本 程序目录比较规范(/etc/nginx)

—9.3 利用rpm包方式进行安装

(软件包不好获得)
rpm -ivh xxx.rpm

—9.4 官方源安装nginx

第一个历程:部署配置官方nginx源
/etc/yum.repos.d/nginx.repo
[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

第二个历程: 部署安装nginx程序
yum install -y nginx 

第三个历程: 启动服务程序
systemctl start nginx
systemctl enable nginx 

第四个历程: 进行访问测试
在浏览器上输入web服务器IP地址信息

10 重点知识梳理总结

1) 掌握用户访问网站的原理过程(DNS tcp协议 HTTP访问报文信息)
2) HTTP报文结构
   a 请求报文 (请求行--请求方法 协议信息(TCP长连接/短连接) 请求头---hosts/UA)
   b 响应报文 (响应行--状态码)
3) HTTP资源信息
   URL/URI 
   静态资源是什么
   动态资源是什么
4) 网站度量方式
   IP PV UV 并发访问量
   cookie/session
5) nginx部署方式
   官方yum源方式

11 nginx软件概述说明

—11.1 功能

1) 可以实现网站服务功能 apache
2) 可以实现负载均衡功能 LVS haproxy
3) 可以实现前端缓存功能 squid
4) 可以实现安全访问功能(NGINX + LUA=WAF) 防火墙

—11.2 作用特点

1) 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
2) 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB
3) 支持异步网络I/O事件模型epoll(Linux 2.6+)

—11.3 nginx软件和apache软件进行对比

nginx使用的网络模型epoll
处理效率:

apache使用的网络模型select
处理效率:

宿舍管理员大妈:
男生 --> 女生 --> 宿舍管理员

select模型版管理员:
男生 --> 女生 --> 管理员 --> 一个一个屋查找 (线性轮询)

epoll模型版管理员:
男生 --> 女生 --> 管理员 --> 查找入住名单 (回调)

幼儿园阿姨:
阿姨 --> 看孩子

阿姨 --> 一个一个孩子询问 select

阿姨 --> 所有人通知好 ---> 谁要上厕所到圈里 epoll

12  nginx软件目录结构

—12.1 日志切割目录

/etc/logrotate.d/nginx --- nginx服务日志切割文件
01: 利用shell脚本+cron 
mv nginx.log nginx.log_$(date +%F)
systemctl restart nginx
02: 系统自带日志切割工具logrotate

—12.2 nginx程序目录

/etc/nginx* 
/etc/nginx/fastcgi_params --- fastcgi接口内置变量配置文件
/etc/nginx/koi-utf --- 和nginx程序字符集相关文件
/etc/nginx/win-utf --- 和nginx程序字符集相关文件
/etc/nginx/koi-win --- 和nginx程序字符集相关文件
/etc/nginx/mime.types --- 媒体资源类型文件??? 识别请求信息类型
/etc/nginx/nginx.conf --- nginx主配置文件(*)
/etc/nginx/scgi_params --- scgi接口内置变量配置文件
/etc/nginx/uwsgi_params --- uwcgi接口内置变量配置文件

—12.3 nginx程序模块文件保存目录

/etc/nginx/modules

—12.4 保存nginx程序的扩展配置文件

/etc/nginx/conf.d 
/etc/nginx/conf.d/default.conf --- 默认的nginx扩展文件

—12.5 nginx服务启动相关的目录和文件

/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service

—12.6  nginx程序需要调取的一些库文件保存目录

/usr/lib64/nginx
/usr/lib64/nginx/modules
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade

—12.7 nginx程序命令文件保存路径

/usr/sbin/nginx --- nginx服务管理命令(*) systemctl 
/usr/sbin/nginx-debug

—12.8  nginx程序的帮助文档信息

/usr/share/doc/nginx-1.14.2
/usr/share/doc/nginx-1.14.2/COPYRIGHT
/usr/share/man/man8/nginx.8.gz

—12.9  nginx程序的站点目录

/usr/share/nginx
/usr/share/nginx/html*
/usr/share/nginx/html/50x.html --- 优雅显示错误信息文件
/usr/share/nginx/html/index.html --- 默认的首页文件

—12.10 nginx程序默认缓存目录

/var/cache/nginx

—12.11 nginx日志文件保存目录

/var/log/nginx* --- 访问日志/错误日志

13 掌握nginx配置文件中的参数信息

—13.1 路径

1 nginx主配置文件: /etc/nginx/nginx.conf
2 nginx扩展配置文件: /etc/nginx/conf.d/

—13.2 主配置文件信息

nginx配置文件结构组成
xxxxxx; --- 核心区块进行配置/功能区块 main
xxxx;
events{ --- 事件区块
xxxx
}
http { --- HTTP区块
server { --- server主机区块
location { --- location区块
if (判断的条件) { --- 判断区块

}
}
}
}

—13.3 配置文件详细参数(指令)说明

——13.3.1 nginx.conf

[root@web01 nginx]# grep -v "^$" nginx.conf
user nginx; --- 定义nginx服务进程管理用户(实现用户身份转换)
worker_processes 1; --- 可以有多少个worker进程 设置的数值=总的服务器CPU的核心数
error_log /var/log/nginx/error.log warn; --- 确认错误日志的保存路径 以及错误信息的记录级别
debug (调式---日志信息最详细)
info (信息级别---日志信息较为详细), 
notice (通知级别---日志信息较为详细) 
warn (警告级别---只记录警告信息) 
error (错误级别---只记录错误信息)
以下级别信息出现, 服务就可能无法正常运行 
crit (严重级别---只记录稍微严重的错误信息)
alert (报警级别---只记录比较严重的错误信息)
emerg (灾难级别---只记录非常严重的错误信息)
========================================================
pid /var/run/nginx.pid; --- 指定pid文件保存路径
events {
worker_connections 1024; --- 一个worker进程可以支持多少个并发连接 设置的数值*worker_processes<系统的文件打开数
}
http {
include /etc/nginx/mime.types; --- 加载媒体资源类型文件????
default_type application/octet-stream; --- 默认识别的媒体资源类型???
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' --- 定义nginx访问日志文件格式信息
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format oldboy '$remote_addr - $remote_user'
access_log /var/log/nginx/access.log oldboy; --- 定义nginx访问日志文件保存路径信息
sendfile on; --- 实现高效数据传输
#tcp_nopush on;
#tcp_nodelay on; 
keepalive_timeout 65; --- 超时时间
#gzip on;
include /etc/nginx/conf.d/*.conf; --- 加载扩展的配置文件信息
}

——13.3.2 default.conf

[root@web01 conf.d]# egrep -v "#|^$" default.conf 
server {
listen 80; --- 定义服务的监听地址或端口信息
server_name www.oldboy.com; --- 定义网站的域名信息
location / {
root /usr/share/nginx/html; --- 定义站点目录
index index.html index.htm; --- 定义首页文件 默认将指定信息响应给用户
当所有默认的首页信息不存在时,用户访问网站会报403错误
}
error_page 500 502 503 504 /50x.html; --- 实现页面的优雅显示
location = /50x.html { --- 进行匹配
root /usr/share/nginx/html; --- 指定站点目录
}
}
========================================================
官方配置文件指令说明; http://nginx.org/en/docs/dirindex.html

14 完成一个网站页面的部署html

第一个历程: 编写网站扩展配置文件
cd /etc/nginx/conf.d
vim www.conf
server {
listen 80;
server_name www.oldgirl.com;
location / {
root /html/;
index index.html;
}
}

第二个历程: 准备网站站点目录环境
mkdir /html/ -p
vim /html/index.html 静态页面文件
<html>
<meta charset="utf-8">
<head>
<title>老男孩教育57期综合架构</title>
</head>
<body>
老男孩教育57期最帅
<table border=1>
<tr> <td>01</td> <td>oldboy01</td> </tr>
<tr> <td>02</td> <td>oldboy02</td> </tr>
<tr> <td>03</td> <td>oldboy03</td> </tr>
</table>
<a href="http://blog.oldboyedu.com">
<img src="stu.png" />
</a>
</body>
</html>

第三个历程: 重启nginx
systemctl restart nginx

第四个历程: 进行访问测试
进行本地域名解析: hosts C:\Windows\System32\drivers\etc
浏览器进行域名访问测试

15 如何管理nginx服务运行状态

1) 利用systemctl管理运行状态
2) 利用nginx命令管理运行状态
nginx
nginx -s stop
nginx -s reload
nginx -t 检查配置文件语法格式是否正确
PS: 两种方法不能混用

16  nginx在企业中实际应用

—16.1 企业中实现多个网站配置

实现多个网站在一台服务器上配置==>实现多个虚拟主机==>实现多个server区块配置
第一个历程: 编写多个server配置文件
[root@web01 html]# cd /etc/nginx/conf.d/
[root@web01 conf.d]# ll
total 12
-rw-r--r-- 1 root root 127 Mar 12 12:17 www.conf

www网站虚拟主机
[root@web01 conf.d]# cat www.conf 
server {
listen 80;
server_name www.oldgirl.com;
location / {
root /html/www;
index index.html;
}
}

bbs网站虚拟主机配置
server {
listen 80;
server_name bbs.oldgirl.com;
location / {
root /html/bbs;
index index.html;
}
}

blog网站虚拟主机配置
[root@web01 conf.d]# cat blog.conf 
server {
listen 80;
server_name blog.oldgirl.com;
location / {
root /html/blog;
index index.html;
}
}

第二个历程: 创建站点目录并编写站点目录代码文件
mkdir /html/{www,bbs,blog} -p
[root@web01 conf.d]# mkdir /html/{www,bbs,blog} -p
[root@web01 conf.d]# for name in www bbs blog;do echo $name.oldgirl.com_web01 >/html/$name/index.html;done
[root@web01 conf.d]# tree /html/
/html/
├── bbs
│?? └── index.html
├── blog
│?? └── index.html
├── index.html
├── oldboy.jpg
└── www
└── index.html

3 directories, 5 files
[root@web01 conf.d]# for name in www bbs blog;do cat /html/$name/index.html;done
www.oldgirl.com_web01
bbs.oldgirl.com_web01
blog.oldgirl.com_web01

第三个历程: 重启nginx服务
[root@web01 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 conf.d]# systemctl reload nginx

第四个历程: 进行访问测试
windows: 在windows主机中修改hosts
linux: 在linux主机上修改hosts
[root@web01 conf.d]# curl www.oldgirl.com
www.oldgirl.com_web01
[root@web01 conf.d]# curl bbs.oldgirl.com
bbs.oldgirl.com_web01
[root@web01 conf.d]# curl blog.oldgirl.com
blog.oldgirl.com_web01

—16.2 企业中实现页面显示站点目录结构

(WEB服务-->文件服务器)

第一个历程: 准备目录结构环境
[root@web01 www]# mkdir oldboy{01..05}

第二个历程: 编写配置文件
vim www.conf 
server {
listen 80;
server_name www.oldgirl.com;
location / {
root /html/www;
index index.html;
autoindex on;
}
}
PS: 只有当默认首页文件不存在时,aotoindex指令功能才能生效

第三个历程: 重启nginx服务

—16.3 目录索引结构

a 如何让目录索引结构中可以显示中文信息
charset UTF-8; 实现网页信息中文显示

b 如何实现网站配置文件全局配置
将指令信息放置在HTTP区块

c 如何理解媒体资源类型文件
  /etc/nginx/mime.types;
  在媒体资源类型文件中定义的资源信息,才能被nginx识别为静态信息,进行处理
  在媒体资源类型文件中没有定义的资源,会进行下载处理

—16.4 企业中虚拟主机配置方式

——16.4.1 基于域名配置方式

——16.4.2  基于端口配置方式

[root@web01 conf.d]# cat www.conf 
charset UTF-8;
autoindex on;
server {
listen 8080;
server_name www.oldgirl.com;
location / {
root /html/www;
index index.html;
#charset UTF-8; 
}
}

——16.4.3 用户访问网站流程

01. 进行域名解析 www.oldgirl.com --- 10.0.0.7
02. 利用解析地址进行访问(建立三次握手)
03. 发送HTTP请求报文
    hosts: blog.oldgirl.com
    访问服务端口信息: 8080
04. 服务端接收HTTP请求,进行分析处理
   1) 检查服务是否有80端口
   2) 哪些虚拟主机配置监听80端口
   3) 检查请求HOSTS信息是否和监听端口匹配server主机信息域名是否一致
   特殊: 当请求hosts信息 满足端口号server域名信息 都不匹配
   显示符合端口要求加载的第一个虚拟主机页面信息
05. 进行HTTP响应报文发送

——16.4.4 基于IP地址负载均衡访问

[root@web01 conf.d]# cat blog.conf 
server {
listen 172.16.1.7:80;
server_name blog.oldgirl.com;
location / {
root /html/blog;
index index.html;
}
}
PS: 在nginx中涉及监听IP地址的修改, 需要重启nginx服务,不能采用平滑重启

17 企业实践引用

—17.1 企业中网站服务安全控制

——17.1.1 禁止某些用户访问网站的指定页面

网站阻止访问模块: Module ngx_http_access_module
官方资料: http://nginx.org/en/docs/http/ngx_http_access_module.html
Syntax: allow address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except

Syntax: deny address | CIDR | unix: | all;
Default: —
Context: http, server, location, limit_except

第一个历程: 需要在nginx配置文件中编写禁止访问的指令信息
举例说明
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
} 

[root@web01 conf.d]# cat www.conf 
charset UTF-8;
autoindex on;
server {
listen 80;
server_name www.oldgirl.com;
location / {
root /html/www;
index index.html;
deny 10.0.0.0/24;
allow 10.0.0.1;

#charset UTF-8; 
}
}
问题: 如何灵活的控制网站页面资源是否进行阻止访问??? --- location

——17.1.2 采用认证方式进行访问控制

网站认证访问模块: ngx_http_auth_basic_module
Syntax: auth_basic string | off; --- 是否开启认证功能
Default: auth_basic off;
Context: http, server, location, limit_except

Syntax: auth_basic_user_file file; --- 定义密码文件信息
Default: —
Context: http, server, location, limit_except

第一个历程: 编写nginx配置文件,添加认证功能
[root@web01 conf.d]# cat www.conf 
charset UTF-8;
autoindex on;
server {
listen 80;
server_name www.oldgirl.com;
location / {
root /html/www;
index index.html;
auth_basic oldboy_auth;
auth_basic_user_file conf.d/http.password;
}
}


第二个历程: 生成密文的密码文件,并进行授权 600
yum install -y httpd-tools
[root@web01 conf.d]# htpasswd --help --- apache软件工具包中生成密文密码信息命令 
Usage:
htpasswd [-cimBdpsDv] [-C cost] passwordfile username
htpasswd -b[cmBdpsDv] [-C cost] passwordfile username password

htpasswd -n[imBdps] [-C cost] username
htpasswd -nb[mBdps] [-C cost] username password
-c Create a new file. 重点 演示
创建一个新的文件
-n Don't update file; display results on stdout. 演示
密码文件不进行更新,输出显示操作结果
-b Use the password from the command line rather than prompting for it. 重点 演示
在命令直接输入密码信息,相当于提示交互输入密码 
-i Read password from stdin without verification (for script usage).
采用标准输入方式读入密码信息,但是不做任何验证 ????

-m Force MD5 encryption of the password (default).
密码信息加密方式: MD5
-B Force bcrypt encryption of the password (very secure).
密码信息加密方式: bcrypt
-d Force CRYPT encryption of the password (8 chars max, insecure).
密码信息加密方式: CRYPT
-s Force SHA encryption of the password (insecure).
密码信息加密方式: SHA
-p Do not encrypt the password (plaintext, insecure). 演示
密文密码信息 
-D Delete the specified user.
删除指定用户 

-C Set the computing time used for the bcrypt algorithm
(higher is more secure but slower, default: 5, valid: 4 to 31).
??? 
-v Verify password for the specified user. 演示
验证密码信息

总结: 利用htpasswd命令生成密码文件方式
htpasswd -bc http.password oldboy 123456 --- 没有密码文件,创建文件,并添加用户信息
htpasswd -b http.password oldboy01 123456 --- 拥有密码文件,在已有密码文件中添加新的用户信息

——17.1.3 nginx网站服务用户映射原理

01. 客户端以oldboy用户访问
02. 请求发送到服务端,会将oldboy用户映射为worker进程用户
03. 会以worker进程用户身份读取密码文件,判断用户认证是否成功

—17.2 企业中网站服务流量控制

——17.2.1 攻击方式

a) 利用客户端增加连接数,消耗网站连接数资源
b) 利用客户端增加请求数,消耗网站负载资源

——17.2.2 解决方式

a) 限制每隔IP地址的连接数 
b) 限制每个IP地址的请求频率

——17.2.3 如何限制IP地址的连接数

ngx_http_limit_conn_module --- 限制用户连接数模块
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http

Syntax: limit_conn zone number;
Default: —
Context: http, server, location

——17.2.4 配置举例

http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location / {
limit_conn addr 1;
}

$binary_remote_addr: 客户端源IP地址信息 采用二进制格式 将IP头部字节控制在4字节
$remote_addr: 客户端源IP地址信息 将IP头部字节控制在24字节
zone=addr:10m; 从内存分配出一定空间(默认10m空间),用于存储访问网站客户端的源IP地址信息,
将分配空间进行命名(默认名称addr)
addr 1; 限制内存空间中的每个地址只能建立一个连接

——17.2.5 进行压力测试

利用ab进行压力测试

ab命令参数
-n requests Number of requests to perform --- 总共请求多少次
-c concurrency Number of multiple requests to make at a time --- 每一次并发请求量
ab -n 10000 -c 100 www.oldgirl.com/oldboy.jpg

——17.2.6 如何限制IP地址的请求频率

ngx_http_limit_req_module --- 用于限制一个IP地址访问网站的请求数
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

Syntax: limit_req_zone key zone=name:size rate=rate [sync]; 收集源IP地址请求信息
Default: —
Context: http

Syntax: limit_req zone=name [burst=number] [nodelay | delay=number]; 对相应IP地址请求做出限制
Default: —
Context: http, server, location

——17.2.7 举例配制

http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; 

...

server {

...

location / {
limit_req zone=one burst=10;
}

rate=1r/s; 定义访问请求频率 每秒请求一次 request

——17.2.8 实际配置

limit_req_zone $binary_remote_addr zone=oldboy:10m rate=1r/s;
server {
listen 80;
server_name www.oldgirl.com;
location / {
root /html/www;
index index.html;
limit_req zone=oldboy burst=10 nodelay; 
}
}
nodelay: 是否延迟发送请求信息,配置上表示不延迟发送,将过多请求进行丢弃

—17.3 企业中网站访问信息收集

——17.3.1 说明

a 对日志信息进行分析总结 awk(数组) ELK Elasticsearch(数据库) Logstash(对日志进行过滤 error warn) Kibana(进行数据图形展示)
b 应用nginx服务状态模块,显示nginx服务访问信息

——17.3.2 实现状态模块配置

ngx_http_stub_status_module --- 显示用户访问网站信息
http://nginx.org/en/docs/http/ngx_http_stub_status_module.html
举例配置
location / {
stub_status;
}

[root@web01 conf.d]# vim state.conf
server {
listen 80;
server_name state.oldgirl.com;
location / {
stub_status;
}
}

——17.3.3 状态页面信息说明

Active connections: 2 --- 此时访问网站的激活链接数
server accepts --- 网站服务启动后, 总共收到了多少连接数
handled --- 网站总共处理的连接数
requests --- 网站服务启动后, 总共的请求数

配置NAT信息
访问 192.168.12.200:9000 == 10.0.0.7:80

—17.4 企业中配置服务日志

——17.4.1 错误日志配置方法

error_log /var/log/nginx/error.log warn; --- 错误日志的记录级别,
错误级别越低记录的信息越多;错误级别越高记录信息越少

——17.4.2 访问日志配置方法

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 /var/log/nginx/access.log main; 定义访问日志保存路径,并调用日志格式信息

$remote_addr --- 记录访问网站服务客户端源IP地址信息
-
$remote_user --- 访问网站认证登陆用户信息
[$time_local] --- 用户访问网站的时间信息
"$request" --- 记录HTTP请求报文中请求行的信息
$status --- 显示HTTP响应报文中状态码信息
$body_bytes_sent --- 获得网站信息消耗的流量
"$http_referer" --- ????? 进行盗链时会出现
$http_user_agent --- 记录客户端用什么软件访问网站
$http_x_forwarded_for --- 和负载均衡有关系

18 nginx服务location模块

—18.1 location指令作用

用于匹配uri信息,针对不同的uri信息做出不同的处理

—18.2 location匹配方法

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location

= 精确匹配 优先级01
^~ 优先匹配(不识别匹配中的正则信息) 优先级02
~ 模糊匹配(对匹配信息大小写敏感) 优先级03
~* 模糊匹配(对匹配信息大小写不敏感) 优先级03
uri 模糊匹配(指定清楚匹配内容) 优先级03
loaction / 默认匹配的location 优先级最低

—18.3 nginx服务主机文件location

location = /index.html {
root /html/www/oldboy01;
index index.html; >>location = /
}

location / {
root /html/www/oldboy;
index index.html; >>location /
}

location /documents/ {
root /html/www/oldboy02;
index index.html; >>location /documents/
}

location ^~ /images/ { 
root /html/www/oldboy03;
index oldboy.jpg; 
}

location ~* \.(gif|jpg|jpeg)$ {
root /html/www/oldboy04;
index index.html; >>location ~* \.(gif|jpg|jpeg)
}

—18.4 实践配置01: 只让用户不能访问oldboy.jpg图片配置

server {
listen 80;
server_name www.oldgirl.com;
location / {
root /html/www;
index index.html;
}
location /oldboy.jpg {
root /html/www;
index index.html;
deny 10.0.0.1;
}
}

—18.5 实践配置02. 将图片信息放置在站点目录下面的子目录中

[root@web01 www]# pwd
/html/www
[root@web01 www]# ll oldboy
total 52
-rw-r--r-- 1 root root 52645 Mar 12 11:56 oldboy.jpg

server {
listen 80;
server_name www.oldgirl.com;
location / {
root /html/www;
index index.html;
}
location /oldboy/ {
root /html/www;
index index.html;
deny 10.0.0.1;
}
}

—18.6 实践配置03: 虚拟主机文件多个location

[root@web01 conf.d]# cat www.conf 
server {
listen 80;
server_name www.oldgirl.com;
location = /index.html { 
root /html/www/oldboy01;
index index.html;
}

location / {
root /html/www/oldboy;
index index.html;
}

location /documents/ {
root /html/www/oldboy02;
index index.html;
}

location ^~ /images/ { 
root /html/www/oldboy03;
index oldboy.jpg; 
}

location ~* \.(gif|jpg|jpeg)$ {
root /html/www/oldboy04;
index index.html;
}

}

—18.7 准备网站访问环境

mkdir oldboy{01..04} -p

oldboy站点目录:
echo 'location /' >oldboy/index.html

oldboy01站点目录:
echo 'location = /' >oldboy01/index.html

oldboy02站点目录:
echo 'location /documents/' >oldboy02/index.html

oldboy03站点目录:

oldboy04站点目录:
echo 'location ~* \.(gif|jpg|jpeg)$' >oldboy04/index.html

19 LNMP架构

—19.1 什么是LNMP架构

L linux系统
N nginx网站服务 接收用户的访问,并进行处理(静态请求)
P PHP网站服务 接收用户的访问,并进行处理(动态请求)
M Mysql数据库服务

20 安装部署LNMP架构

—20.1 Linux系统进行安装

( 防火墙关闭 selinux关闭 /tmp目录权限为1777)

—20.2 Nginx服务程序安装

( 利用yum官方源方式进行安装)

—20.3 MySQL数据库服务安装

01. 利用yum进行安装软件*
02. 利用编译方式安装软件
03. 利用二进制包方式安装

什么是数据库:
将文本信息 === 转换为表格信息进行存储 (execl)
数据库(库) --> 数据库(表) --> 数据库(项目信息)
execl 文件 --> execl sheet --> execl 一行或一列信息


第一步:yum安装数据库
yum install mariadb-server mariadb -y

第二步:启动数据库服务
systemctl start mariadb.service 
systemctl enable mariadb.service

第三步:设置数据库服务登录密码
mysqladmin password oldboy123
mysql -uroot -poldboy123

简单SQL语句介绍
show databases; --- 查看数据库服务中有哪西数据库信息
use mysql; --- 切换数据库,到指定数据库中
show tables; --- 查看指定数据库中的所有表信息

—20.4 PHP部署安装

第一个:解决PHP软件冲突
yum remove php-mysql php php-fpm php-common

第二个:更新yum源信息,用户安装php程序
# 准备yum安装软件扩展源信息
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

第三个:直接安装php服务相关软件
yum install -y php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
php71w --- 主程序软件
php71w-gd --- 和显示图形相关的软件
php71w-mcrypt --- 和数据传输加密相关
php71w-pdo --- 让php和数据库建立联系
php71w-fpm --- ???

重要文件和目录信息
/etc/php-fpm.conf ---php-fpm进程的配置文件
/etc/php-fpm.d ---php-fpm进程加载配置文件的目录

/etc/php-fpm.d/www.conf
user = nginx --- 利用指定用户管理php工作进程 建议配置和nginx服务相同的用户
group = nginx --- 利用指定用户组管理php工作进程
listen = 127.0.0.1:9000 --- 指定php服务运行后, 监听的地址和端口信息
listen.allowed_clients = 127.0.0.1 --- 只允许本地访问php 9000端口服务

—20.5  LNMP架构配置过程

——20.5.1 LNMP工作原理

看图:
Nginx服务 + PHP服务 建立关系(fastcgi)

——20.5.2 编写nginx配置文件

server {
listen 80;
server_name www.oldgirl.com;
location / {
root /html/www;
index index.php index.html;
} 

www.oldgirl.com/oldgril/oldboy01/index.php ---> nginx ---> fast_cgi /oldboy/index.php --> PHP
---> nginx ---> fast_cgi index.php -->php

location ~ \.php$ {
root /html/www;
fastcgi_pass 127.0.0.1:9000; --- 9000代表就是php服务程序 
fastcgi_index index.php; --- 指定动态请求的默认首页文件
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 

factcgi_param指令说明: 
主要作用是将静态服务获取到的动态请求信息 进行整合 ---
将动态请求告知给PHP程序 
include fastcgi_params; --- 加载fastcgi配置文件,可以识别变量信息
}
}

——20.5.3 实际配置过程

[root@web02 conf.d]# vim www.conf
server {
listen 80;
server_name www.oldgirl.com;
location / {
root /html/www;
index index.php index.html;
} 
location ~ \.php$ {
root /html/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php; 
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;

}
}

——20.5.4 编写的PHP代码

[root@oldboy www]# cat index.php 
<?php
phpinfo();
?>

——20.5.5 PHP代码控制连接数据库

搭建网站: 动态资源更好
访问网站: 静态资源更好(便于搜索引擎收录)
---> 实现伪静态(实质还是动态资源 显示uri信息是静态的信息)

PHP服务 + mysql服务建立关系
准备工作:
[root@oldboy www]# pwd
/html/www

编写代码文件:
[root@oldboy www]# vim test_mysql_conn.php
<?php
$servername = "localhost";
$username = "root";
$password = "oldboy123";
//$link_id=mysql_connect('主机名','用户','密码');
//mysql -u用户 -p密码 -h 主机
$conn = mysqli_connect($servername, $username, $password);
if ($conn) {
echo "mysql successful connect !\n";
}else{
die("Connection failed: " . mysqli_connect_error());
}
?>

21 网站代码上线

—21.1 使用开源代码部署网站

博客网站 blog https://cn.wordpress.org/
论坛网站 bbs http://www.discuz.net/forum-10-1.html
官方网站 www http://www.dedecms.com/
知乎网站 zh http://www.wecenter.com/downloads/

—21.2 搭建blog网站

第一个历程: 下载zh网站代码信息

第二个历程: 编写nginx服务配置文件(blog.conf)
[root@oldboy conf.d]# cat blog.conf 
server {
listen 80;
server_name blog.oldgirl.com;
location / {
root /html/blog;
index index.php index.html;
} 
location ~ \.php$ {
root /html/blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php; 
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
systemctl restart nginx


第三个历程: 根据配置文件准备环境(站点目录)
mkdir /html/blog -p

第四个历程: 上传代码文件/解压代码信息
tar xf wordpress-5.0.3-zh_CN.tar.gz
mv wordpress/* blog
chown -R nginx.nginx blog/

第五个历程: 打开浏览器访问blog页面
结论: nginx服务和php服务连接建立成功

第六个历程: 对数据库进行配置
create database blog;
select user,host from mysql.user;
grant all on blog.* to 'blog'@'localhost' identified by 'oldboy123';
赞(0)
MySQL学习笔记 » 第16章:LNMP网站架构