网站服务
一、掌握网站页面访问流程
-
客户端 完成域名的解析过程(DNS)
-
客户端 直接访问相应网站服务器 建立TCP三次握手过程
-
客户端 访问网站服务器 发送HTTP请求报文 多次
-
服务端 响应客户端请求 回复HTTP响应报文 多次
-
客户端 浏览器看到网站页面
-
客户端 结束访问网站过程 完成TCP四次挥手过程
二、HTTP协议请求和响应过程
HTTP请求报文
-
请求行 请求方法: Get --读/看 ---获取/拿过来 post --写/提交 请求信息: index.html(首页文件) oldboy.jpg 请求协议: http 1.1 HTTP: 1.0 TCP短连接 HTTP: 1.1 TCP长连接 HTTP: 2.0 TCP长连接优化 提高用户并发(同时)访问的效率
-
请求头 请求主机信息
-
空行
-
请求主体 使用get方法时, 没有请求主体信息 使用post方法时,具有请求主体内容
HTTP响应报文
-
起始行 状态码信息 访问请求是成功响应/失败响应 面试: 写出几种常见的状态码???
-
响应头部
-
空行
-
响应主体
三、HTTP协议资源信息
URL: 全称为Uniform Resource Location,中文翻译为统一资源定位符 URI: 全称为Uniform Resource Identifier,中文翻译为统一资源标识符
docs.ansible.com / ansible/latest/user_guide/playbooks_reuse_roles.html URL URI
网站页面静态资源: 要什么给我什么, oldboy.jpg index.html 特点说明:
-
网页内容是固定不变的,因此,容易被搜索引擎收录(容易被用户找到)(优点)。
-
因为网页没有数据库的支持,所以在网站制作和维护方面的工作量较大,当网站信息量很大时, 完全依靠静态网页比较困难(缺点)。
-
网页的交互性较差,在程序的功能实现方面有较大的限制(缺点)。
-
当客户端向服务器请求数据时,服务器会直接从磁盘文件系统上返回数据(不做任何解析)。
网站页面动态资源: 要什么信息,需要进行查询数据库进行解析后发送给客户端 查看班级人员信息表
班级 人名 年龄 学历 sz-01 张三 18 高中 ---> 数据库中 oldboy=123 <--- post sz-01 李四 20 大专
班级 人员 年龄 学历 代码信息直接调用数据库的内容
-
采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、 投票、用户管理、订单处理、发博文等。
-
动态资源页面会出现 "?" "&", 不便于被搜索引擎收录
-
接收到用户请求,需要让动态服务和数据库服务进行处理
伪静态资源(动态页面)
-
可以便于搜索引擎进行收录
-
有数据库服务支持,实现网页交互功能
-
评测网站好坏的指标: IP: 根据用户IP地址数量进行统计 300万~400万 一个星期 局域网多个用户访问: 网站服务器只记录一个IP访问 NAT技术 断电了家用电脑会重新拨号: wan--公网地址
PV: 页面访问量 700~800万 一个星期 参考值:
UV: 记录独立访客数量 cookie: 标识用户身份信息, 会保存在用户客户端本地 内存中 session: 记录用户的一些会话操作, eg: 记录用户登录信息 记录在服务端 内存中
网站的并发: (压测技术 1 10 100 1000 10000) A种理解:网站服务器每秒能够接收的最大用户请求数。 B种理解:网站服务器每秒能够响应的最大用户请求数。 C种理解:网站服务器在单位时间内能够处理的最大连接数。
饭店吃饭: 10:00 每个桌子--4个 10个桌子 10:00:00~01 40个人 10:30: 高速公路: 5月1日 - 5月3日 三车道: 三辆
四、常用的网站服务软件
处理静态资源的服务: apache软件: http://apache.org/ nginx软件: http://nginx.org
处理动态资源的服务: PHP: php.net 终端浏览器进行访问 *** Tomcat(java): 利用移动端查看网页 安卓-java PYTHON: 开发难度比较低
五、nginx服务的软件特点:
-
支持高并发,消耗内存资源少
-
具有多种功能 网站web服务功能 --- apache 网站负载均衡功能 --- LVS 网站缓存服务 --- Squid
-
在多种系统平台都可以进行部署
-
nginx实现网络通讯时使用的时异步网络IO模型: epoll模型(apache -- select模型) epoll模型: 宿舍管理员: 找人,查看人员登记信息 幼儿园阿姨: 小朋友上厕所, 都站在教室的某个位置
select模型: 宿舍管理员: 找人,一个一个屋子去问, --线性轮询 幼儿园阿姨: 小朋友上厕所, 一个一个小朋友去询问
六、nginx软件的安装部署过程:
两种安装方式:
-
yum安装软件 a 使用官方yum源进行安装 安装的是最新版本 软件目录结构比较标准 (推荐) b 使用非官方yum源进行安装 安装的不是最新版 目录结构会发生变化
-
编译安装软件 第一个步骤: wget http://nginx.org/download/nginx-1.16.0.tar.gz PS: 解决软件的依赖 openssl-devel pcre-devel 第二个步骤: 解压下载好的软件, 并进入到软件目录中 第三个步骤: 编译安装三步曲 a 进行配置操作 ./configure --prefix= --user=USER --prefix=PATH set installation prefix 指定程序安装路径 --user=USER set non-privileged user for worker processes 设置一个虚拟用户管理worker进程(安全) --group=GROUP set non-privileged group for worker processes 设置一个虚拟用户组管理worker进程(安全) b 进行软件的编译过程: make 编译(翻译) C(英国人) 代码(任务文件) 系统识别 翻译 系统(中国人)处理代码 翻译效率比较低 翻译官(gcc) python(日本人) 代码(任务文件) 系统识别 翻译 系统(中国人)处理代码 翻译效率比较高 百度翻译(python解释器)
c 编译安装过程 make install
yum官方源安装方法: 第一个历程: 更新nginx官方yum源 vim /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
第二个历程: yum安装nginx软件 yum install -y nginx
第三个历程: 启动nginx服务,检查服务是否安装正确 systemctl start nginx systemctl enable nginx 测试访问nginx服务
在百度输入服务器ip地址,显示一下内容则安装配置成功
七、查看软件的目录结构
/etc/logrotate.d 实现nginx日志文件定时切割处理 日志切割方法一: 利用脚本实现切割
#!/bin/bash
# 设置日志文件存放目录
logs_path="/var/log/nginx/"
backup_path="/var/log/nginx/logs/"
# 设置pid文件
pid_path="/run/nginx.pid"
# 重命名日志文件
mv ${logs_path}/access.log ${backup_path}/access_$(date -d "yesterday" +"%Y%m%d").log
mv ${logs_path}/error.log ${backup_path}/error_$(date -d "yesterday" +"%Y%m%d").log
# 向nginx主进程发信号重新打开日志
kill -USR1 `cat ${pid_path}`
# 压缩
gzip ${backup_path}/access_$(date -d "yesterday" +"%Y%m%d").log
gzip ${backup_path}/error_$(date -d "yesterday" +"%Y%m%d").log
# 删除超过指定时间的日志文件,单位:天
find $backup_path -name "*.gz" -type f -mtime +30 -exec rm -rf {} \;
编写定时任务
crontab -e
0 0 * * * sh /usr/bin /var/log/nginx/runlog.sh >/dev/null
日志切割方法二: 利用专用文件切割程序--logrotate vim /etc/logrotate.conf
rotate log files weekly
weekly --- 定义默认日志切割的周期
keep 4 weeks worth of backlogs
rotate 4 --- 定义只保留几个切割后的文件
create new (empty) log files after rotating old ones
create --- 创建出一个相同的源文件
use date as a suffix of the rotated file
dateext --- 定义角标(扩展名称信息)
uncomment this if you want your log files compressed
#compress --- 是否对切割后的文件进行压缩处理
RPM packages drop log rotation information into this directory
include /etc/logrotate.d --- 加载包含/etc/logrotate.d/目录中文件配置
no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp { --- 单独对某个文件进行切割配置 monthly create 0664 root utmp minsize 1M --- 最小大小为1M,小于1M不进行切割 rotate 1 }
/var/log/btmp { missingok monthly create 0600 root utmp rotate 1 }
前端开发: html 页面代码 css 定义页面样式 js 定义页面特效功能
总结:
-
/etc/nginx 配置文件
-
/var/log/nginx 日志文件
-
/usr/bin/nginx 命令文件
-
/usr/share/nginx/html 站点目录??? 图片 附件信息 音频 视频
八、nginx服务配置文件
/etc/nginx/nginx.conf --- 主配置文件 第一个部分: 配置文件主区域配置 user www; --- 定义worker进程管理的用户 补充: nginx的进程 master process: 主进程 ---管理服务是否能够正常运行 boss worker process: 工作进程 ---处理用户的访问请求 员工 worker_processes 2; ---定义有几个worker进程 == CPU核数 / 核数的2倍 error_log /var/log/nginx/error.log warn; --- 定义错误日志路径信息 pid /var/run/nginx.pid; --- 定义pid文件路径信息
第二个部分: 配置文件事件区域 events { worker_connections 1024; --- 一个worker进程可以同时接收1024访问请求 }
第三个部分: 配置http区域 http { include /etc/nginx/mime.types; --- 加载一个配置文件 default_type application/octet-stream; --- 指定默认识别文件类型 log_format oldboy '$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 oldboy; --- 指定访问日志路径 sendfile on; ??? #tcp_nopush on; ??? keepalive_timeout 65; --- 超时时间 #gzip on; include /etc/nginx/conf.d/*.conf; --- 加载一个配置文件 }
/etc/nginx/nginx.conf.default --- 扩展配置(虚拟主机配置文件) 第四个部分: server区域信息(配置一个网站 www/bbs/blog -- 一个虚拟主机) server { listen 8080; --- 指定监听的端口 server_name www.oldboy.com; --- 指定网站域名 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; } }
九、nginx服务的企业应用
-
利用nginx服务搭建一个网站(www) 第一个历程: 编写虚拟主机配置文件 cd /etc/nginx/conf.d/ vim www.conf server { listen 80; server_name www.oldboy.com; location /oldboy { root /usr/share/nginx/html; index oldboy.html; } }
第二个历程: 需要获取开发人员编写的网站代码 <html>
第三个历程: 重启nginx服务(平滑重启) 两种方法: systemctl reload nginx nginx -s reload
nginx命令参数 -t : test configuration and exit 检查测试配置文件语法 -s : send signal to a master process: stop, quit, reopen, reload 控制服务停止或者重新启动
第四个历程: 编写DNS配置信息 真实域名: 在阿里云上进行DNS解析记录配置 模拟域名: 在windows主机的hosts文件中进行配置即可 C:\Windows\System32\drivers\etc\hosts 第五个历程: 进行测试访问 浏览器中: http://www.oldboy.com
部署搭建网站常见错误:
-
网站服务配置文件编写不正确 404 错误 解决方法一: 修改nginx配置文件---location 解决方法二: 在站点目录中创建相应目录或文件数据信息 403 错误 解决方法一: 不要禁止访问 解决方法二: 因为没有首页文件
-
DNS信息配置不正确
-
nginx配置文件修改一定要重启服务; 站点目录中代码文件信息调整,不需要重启服务
-
利用nginx服务搭建一个多网站(www bbs blog) 第一个历程: 在/etc/nginx/conf.d/创建多个虚拟主机配置文件 bbs.conf server { listen 80; server_name bbs.oldboy.com; location / { root /html/bbs; index index.html; } } blog.conf server { listen 80; server_name blog.oldboy.com; location / { root /html/blog; index index.html; } } www.conf server { listen 80; server_name www.oldboy.com; location / { root /html/www; index index.html; } } systemctl reload nginx
第二个历程: 创建站点目录和目录中首页文件 [root@web01 conf.d]# mkdir /html/{www,bbs,blog} -p [root@web01 conf.d]# for name in {www,bbs,blog};do echo "10.0.0.7 $name.oldboy.com" >/html/$name/index.html ;done [root@web01 conf.d]# for name in {www,bbs,blog};do cat /html/$name/index.html ;done 10.0.0.7 www.oldboy.com 10.0.0.7 bbs.oldboy.com 10.0.0.7 blog.oldboy.com
第三个历程: 编写hosts解析文件 10.0.0.7 www.oldboy.com bbs.oldboy.com blog.oldboy.com
第四个历程: 进行访问测试
-
利用windows进行浏览器访问测试
-
利用linux进行命令访问测试 [root@web01 conf.d]# curl www.oldboy.com 10.0.0.7 www.oldboy.com [root@web01 conf.d]# curl bbs.oldboy.com 10.0.0.7 bbs.oldboy.com [root@web01 conf.d]# curl blog.oldboy.com 10.0.0.7 blog.oldboy.com
-
企业中虚拟主机访问方式 a 基于域名的方式进行访问: b 基于地址的方式进行访问: (只能用指定地址访问) --- 负载均衡+高可用服务 server { listen 10.0.0.7:80; server_name www.oldboy.com; location / { root /html/www; index index.html; } } PS: 服务配置文件中涉及到地址修改,必须重启nginx服务,不能平滑重启
c 基于端口的方式进行访问: zabbix服务(apache:80) + web服务(nginx:80) --> 主机 server { listen 8080; server_name www.oldboy.com; location / { root /html/www; index index.html; } }
网站页面的访问原理:
-
将域名进行解析 www.oldboy.com --- 10.0.0.7
-
建立TCP的连接(四层协议) 10.0.0.7 目标端口 8080
-
根据应用层HTTP协议发出请求 请求报文: hosts: bbs.oldboy.com
-
没有相同域名的server主机,会找满足端口要求的第一个主机 显示主机的网站页面
-
企业中网站的安全访问配置 a 根据用户访问的地址进行控制 10.0.0.0/24 www.oldboy.com/AV/ 不能访问 172.16.1.0/24 www.oldboy.com/AV/ 可以访问
nginx访问模块: ngx_http_access_module 举例配置: location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all; } 指令用法 Syntax: deny address | CIDR | unix: | all; Default: — Context: http, server, location, limit_except
第一个历程: 编写配置文件 [root@web01 conf.d]# vim www.conf server { listen 80; server_name www.oldboy.com; location / { root /html/www; index index.html; } location /AV { deny 10.0.0.0/24; allow 172.16.1.0/24; root /html/www; index index.html; } } 补充: location外面的信息, 全局配置信息 location里面的信息, 局部配置信息
b 根据用户访问进行认证 nginx认证模块: ngx_http_auth_basic_module 举例配置: location / { auth_basic "closed site"; --- 开启认证功能 auth_basic_user_file conf/htpasswd; --- 加载用户密码文件 }
第一个历程: 编写虚拟主机配置文件 server { listen 80; server_name www.oldboy.com; location / { root /html/www; index index.html; auth_basic "oldboy-sz-01"; auth_basic_user_file password/pass; }
第二个历程: 创建密码文件(文件中密码信息必须是密文的) htpasswd 创建一个有密文信息的密码文件(在/etc/nginx 创建密码目录与密码文件)
安装htppd
[root@web01 conf.d]# rpm -qf which htpasswd
httpd-tools-2.4.6-89.el7.centos.x86_64 --查看是否安装htppd
mkdir password --创建密码目录
htpasswd -c pass hgg --创建密码文件及用户密码
htpasswd命令参数说明: -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对密码进行加密 -C Set the computing time used for the bcrypt algorithm (higher is more secure but slower, default: 5, valid: 4 to 31). 使用bcrypt algorithm对密码进行加密 -d Force CRYPT encryption of the password (8 chars max, insecure). 密码加密方式 -s Force SHA encryption of the password (insecure). 加密方式 -p Do not encrypt the password (plaintext, insecure). 不进行加密 -D Delete the specified user. 删除指定用户 -v Verify password for the specified user.
修改密码文件权限: ??? chmod 600 pass --修改文件权限为600
chown nginx.niginx pass --修改文件属主属组
第三历程:
重启nginx服务
500 Internal Server Error
-
内部程序代码编写有问题
-
程序服务中文件权限不正确
curl命令参数: -u, --user USER[:PASSWORD] Server user and password [root@web01 password]# curl www.oldboy.com -u oldboy Enter host password for user 'oldboy': 10.0.0.7 www.oldboy.com [root@web01 password]# curl www.oldboy.com -u oldboy:123456 10.0.0.7 www.oldboy.com
-
课程知识总结:
-
如何搭建一个网站(服务器 域名 网页代码 数据库支持)
-
如何搭建多个网站
-
如何访问网站(3种 域名 地址 端口)
-
网站服务安全配置 根据用户访问域名地址进行控制 根据用户访问信息进行认证控制
-
十、nginx的企业实践应用
-
利用nginx服务搭建网站文件共享 第一个步骤: 编写配置文件(www.conf) nginx模块功能: ngx_http_autoindex_module
Syntax: autoindex on | off; Default: autoindex off; Context: http, server, location
server { listen 80; server_name www.oldboy.com; location / { root /html/www; auth_basic "oldboy-sz-01"; auth_basic_user_file password/htpasswd; autoindex on; --- 开启nginx站点目录索引功能 } PS: 1. 需要将首页文件进行删除 2. mime.types媒体资源类型文件作用 文件中有的扩展名信息资源, 进行访问时会直接看到数据信息 文件中没有的扩展名信息资源, 进行访问时会直接下载资源
网站页面目录数据,中文出现乱码,如何解决: location / { root /html/www; #index index.html; auth_basic "oldboy-sz-01"; auth_basic_user_file password/htpasswd; autoindex on; charset utf-8; --- 修改目录结构中出现的中文乱码问题 }
-
利用nginx服务搭配置文件别名功能 第一个历程: 编写配置文件 server_name www.oldboy.com old.com; 第二个历程: 配置好解析信息
作用:
编写网站访问测试
定位要访问的网站服务器
-
利用nginx状态模块功能对网站进行监控 状态模块: ngx_http_stub_status_module location = /basic_status { stub_status; } 第一个历程: 编写配置文件 [root@web01 conf.d]# vim state.conf server { listen 80; server_name state.oldboy.com; stub_status; }
第二个历程: 重启nginx服务,并且编写解析文件 systemctl reload nginx 10.0.0.7 state.oldboy.com
Active connections: 激活的连接数信息 4000用户 3500 accepts: 接收的连接数汇总(综合) TCP handled: 处理的连接数汇总(综合) TCP requests: 总计的请求数量 HTTP协议请求 Reading: nginx服务读取请求报文的数量 100人点餐 Writing: nginx服务响应报文信息数量 100人响应 Waiting: nginx队列机制,要处理(读取或者响应保存进行保存) 监控
-
nginx日志功能配置 访问日志: /var/log/nginx/access.log ngx_http_log_module log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 定义日志内容格式 '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
主配置文件修改:vim /etc/nginx/nginx.conf access_log /var/log/nginx/access.log main; 调用日志格式
$remote_addr 显示用户访问源IP地址信息 $remote_user 显示认证的用户名信息 [$time_local] 显示访问网站时间 "$request" 请求报文的请求行信息 $status 用户访问网站状态码信息 $body_bytes_sent 显示响应的数据尺寸信息 $http_referer 记录调用网站资源的连接地址信息(防止用户盗链) 老男孩nginx---access.log---莫文杰(荒原饮露---老男孩图片链接)---http_referer(链接) $http_user_agent 记录用户使用什么客户端软件进行访问页面的 (谷歌 火狐 IE 安卓 iphone) $http_x_forwarded_for ??? 负载均衡
错误日志: /var/log/nginx/error.log --- Core functionality Syntax: error_log file [level]; 指定错误日志路径以及错误日志记录的级别 Default: error_log logs/error.log error; Context: main, http, mail, stream, server, location
主配置文件修改:vim /etc/nginx/nginx.conf error_log /var/log/nginx/error.log warn; 错误级别: debug :调试级别, 服务运行的状态信息和错误信息详细显示 信息越多 info :信息级别, 只显示重要的运行信息和错误信息 notice :通知级别: 更加重要的信息进行通知说明 warn :警告级别: 可能出现了一些错误信息,但不影响服务运行 error :错误级别: 服务运行已经出现了错误,需要进行纠正 推荐选择 crit :严重级别: 必须进行修改调整 alert :严重警告级别: 即警告,而且必须进行错误修改 emerg :灾难级别: 服务已经不能正常运行 信息越少
PS: 日志文件信息需要做切割处理 几个G
-
nginx服务location作用说明 模块说明: ngx_http_core_module location进行匹配(uri) 错误页面优雅显示 location /oldboy { root /html/www; error_page 404 /oldboy.jpg; } location /oldgirl { root /html/www; error_page 404 /oldgirl.jpg; }
location详细配置: Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: — Context: server, location location = / { --- 精确匹配 优先级01 最高 [ configuration A ] }
location / { --- 默认匹配 优先级04 最低 [ configuration B ] }
location /documents/ { --- 按照目录进行匹配 优先级03 [ configuration C ] }
location ^~ /images/ { --- 优先匹配/不识别uri信息中符号信息 优先级02 [ configuration D ] }
location ~* .(gif|jpg|jpeg)$ { --- 不区分大小写进行匹配 优先级03 [ configuration E ] }
-
利用nginx实现页面跳转功能 利用rewrite模块是跳转功能: http_rewrite_module Syntax: rewrite regex replacement [flag]; rewite 匹配的正则信息 替换成什么信息 Default: — Context: server, location, if
rewrite www.oldboy.com/(.) http://www.oldboy.com/$1 permanent; 重写规则配置 ^/ (.) baidu.com / oldboy.html 跳转方式
跳转方式: 永久跳转: permanent 301 会将跳转信息进项缓存 临时跳转: redirect 302 不会缓存跳转信息
出现无限跳转如何解决: 第一种方法: 利用不同server区块配置打破循环 server { server_name oldboy.com; rewrite ^/(.) http://www.oldboy.com/$1 permanent; } 第二种方法: 利用if判断实现打破循环 if ($host ~ "^oldboy.com$") { rewrite ^/(.*) http://www.oldboy.com/$1 permanent; }
www.oldboy.com/oldboy01/oldboy02/oldboy.jpg --- www.oldboy.com/oldboy.jpg