一、Web基础
URL(uniform resoure locator 统一资源定位符)
URL主要是用于各种www服务器,URL可以用统一的格式来描述各种静态资源信息,包括图片、html、视频等。
URL组成:
- 协议 http://
- 主机名 即网站的域名,可以通过dns解析成服务器的IP地址
- 端口号 80(http协议默认端口)、443(https,加密的http协议)
- 文件资源具体目录 在文件服务器上进行修改的
URI(uniform resoure identifer 统一资源标识符)
用来标识某一个互联网资源的字符串,在世界互联范围内,标识定位某一个唯一的资源信息
HTTP(HyperText transfer protocol 超文本传输协议)
OSI体系结构:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层
TCP/IP体系结构:网络接口层、网际层IP、运输层(TCP、UDP)、应用层(各种应用协议)
二、网页
静态网页:
在网页设计中,纯HTML的网页文件(HTML文件中,包含的只有图片,视频,JS等)就会被称为一个静态网页。
(静态网页没有和数据库打交道,仅仅是从服务器磁盘上,读取数据,返回给用户查看)
静态网页特征:
- 静态网页一般都有固定的URL地址,URL地址中不包含任何的?&等特殊的符号
- 静态网页内容一般固定不变,非常容易被搜索引擎收录(html,.html)
- 静态网页没有数据库支持,在网站制作上维护较难
- 静态网页交互性很差,缺少程序的动态功能加载
- 客户端在解析网址的时候,由于静态网页不需要和数据库交互,因此服务器能够承载更高的并发数,请求到来的时候,直接去磁盘读取即可
- 静态网页,一般发布到服务器,网页文件内容是单独的一个文件,保存在服务器上
动态网页:
包含了静态网页的内容,以及能够和数据库交互,有后台程序,可以和用户交互的网页
动态网页特征:
- 动态网页一般都是.asp、.aspx、.php、.js、.cgi 这样的后缀,一般都是动态请求,并且动态请求的url,常见会有? & = 等特殊符号
- 动态网页主要以数据库为支撑,能够大大减少网页内容的维护工作
- 搜索引擎一般都不会抓取网页url携带?等特殊符号的站点,因此企业一般都会做伪静态;让一个动态网页模拟成以html结尾的静态网页
单进程模式:
单进程和单线程是一个概念,因为一个进程单位必须有一个线程单位在工作。
当大量请求进入服务器的时候,单线程情况下一个一个去处理请求,请求很容易积压,得不到响应。这是一种没有并发概念的模式
多进程模式:
服务器的多进程工作模式,也就有多个进程可以处理客户端的请求。
主进程负责请求分配,子进程负责干活。
复用的IO模型:
一个进程响应n个请求,但是不是单纯的一个单进程,而是背后生成了多个线程去工作
三、TCP/IP协议
TCP三次握手:
- 第一次:客户端发送SYN,seq=x,服务器接收到了客户端发来的数据包,知道自己要和客户端建立连接了
- 第二次:服务器给客户端发送SYN=1,seq=y,ACK=x+1,服务端发送前两个数据都是为了证明自己的发消息的能了,服务器在客户端发出的随机数x上+1表示明确客户端的身份,他俩是同一个连接。
第三次:客户端再次向服务器发送一个ACK=y+1,明确告诉服务器,可以进行通信了。

四、HTTP服务器接入与响应流程

- 客户端和服务器建立连接,客户端发出请求与服务器进行三次握手身份确认,在建立链接
- 服务器接收到请求之后,linux内核根据socket进程通信管道把客户端请求发送给HTTP应用程序去解析
- HTTP服务器开始处理请求,对用户的请求报文进行解析,明确客户需要和资源和请求方式等等
- HTTP在存储系统上,请求资源,内核去本地文件系统上读取数据
- HTTP服务器构造响应体,应用程序创建响应报文
- linux发出HTTP服务器构造的响应报文,发送给客户端
- HTTP服务器会进行事务记录,记录着流程的日志
常见的HTTP请求方法:
- get 向服务器获取数据、资源
- post 向服务器提交数据,比如登录、注册信息
- head 获取URL的响应头信息,不要响应体信息
- put 将请求主体发送给服务器
- delete 删除服务器的一些资源
- trace 追踪请求到达服务器的一系列变动
HTTP状态码类别:
- 1XX 信息状态码、服务器接收到请求、需要客户端继续操作
- 2XX 操作成功
- 3XX 重定向状态码,需要进一步的操作
- 4XX 客户端错误,请求语法错误等
- 5XX 服务端错误,服务器出了过程中出错了
常见的状态码:
- 200 服务器成功返回网页
- 404 请求的网页不存在
- 503 服务器不可用
五、事务
事务是指程序中一系列严密的逻辑性操作,并且必须保证所有操作都能够完成;如果出错,那么得保证每个操作中的更改动作,都会被撤销。
事务的一些特性:
- 原子性:执行命令,要么全部成功,要么全部失败,只要有一个环节出错,那么其他指令都要进行数据回滚,回滚到执行命令之前的操作。
- 一致性:事务的执行使得数据从一个状态,进入另一个状态;但是对于数据的完整性,还是保持不变
- 隔离性:当多个用户并发访问数据库的时候,共同操作一张数据表,数据库他会为每一个用户开启事务,不能被其他的事务所干扰;多个并发的事务操作,要进行隔离。
- 持久性:当事务正确完成后,对数据的修改时永久性的。
HTTP事务流程:
在浏览器中输入网站直到最终看到整个页面的过程,其实就是HTTP事务流程。
1、DNS解析
1. 输入book.luffycity.com 浏览器会解析域名对应的IP地址1. 浏览器去客户本地机器寻找DNS缓存,是否存在记录1. 服务器继续读取客户端配置的hosts文件,是否有对应的域名与IP的对应关系。1. 浏览器会在向本地配置的DNS服务器地址,进行请求解析,公网的DNS服务器对该域名解析,解析到对应的IP地址之后,浏览器在访问该IP地址
2、客户端此时和服务器建立TCP/IP三次连接
1. 客户端解析到服务器的IP之后,根据客户端的user-agent(标识是PC还是phone),浏览器则会用随机端口(1024到65535)向服务器的80端口发起TCP连接
1. 客户端请求,经过TCP/IP的四层封包之后,请求进入到服务器的应用程序完成解包的过程,完成TCP连接。
1. 此时TCP连接上之后,开始三次握手
1. 第一次握手:客户端发送syn包(syn=x)发送给服务器,客户端进入syn_send状态,等待服务器响应。
1. 第二次握手:服务器收到客户端的syn包之后,并且要回复确认客户端的syn信息(ack=x+1),同时服务器在发出一股syn包(syn=k),服务器一共发送的时syn+ack的包,此时服务器进入到syn_recv状态。
1. 第三次握手:客户端收到服务器的syn+ack包,客户端在向服务器发送ack(k+1),此时服务器和客户端已经建立了连接,完成三次握手。
4. 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“第四次握手”,就是服务器和客户端数据包交互,最终确定断开。
3、数据传输,发送HTTP请求
1. 如何查看用户发出的请求动作,请求方法是什么? 服务器日志或者F12
1. 经过TCP三次握手之后,浏览器发起HTTP请求
4、浏览器解析HTML
浏览器拿到index.html文件之后,解析html文件,遇见静态资源就去服务器再次发请求下载,这个时候就用上了keep-alive特性了,建议一次HTTP连接,可以请求多个资源。
5、浏览器对页面进行渲染
六、Apache
- 跨平台、windows、linux
- 不同的机器平台允许
- 支持多虚拟主机功能(基于端口、域名、IP)
1、基础配置
``` 1、配置yum源,安装apache(linux的软件包就是htttpd) [root@ylin ~]# yum install httpd -y #安装 [root@ylin ~]# systemctl enable httpd.service #配置开机自动启动 [root@ylin ~]# netstat -tunlp #查看80端口是否启用
2、直接访问该IP地址,即可测试应用是否正常
```
apache配置文件:
[root@ylin ~]# rpm -ql httpd |grep ".conf" #查看配置文件
[root@ylin ~]# ll /etc/httpd/conf/httpd.conf #apache的主配置文件
[root@ylin ~]# ll /etc/httpd/conf.d/*.conf #子配置文件
[root@ylin ~]# ll /etc/httpd/ #主配置目录
[root@ylin ~]# ll /var/log/httpd/ #日志文件
总用量 16
-rw-r--r-- 1 root root 6775 1月 29 23:13 access_log
-rw-r--r-- 1 root root 4156 1月 29 21:46 error_log
[root@ylin ~]# ll /var/www/html/ #缺省资源目录
[root@ylin conf]# grep -Ev '^[# ]|^$' httpd.conf #过滤掉配置文件中以空格开头的行、注释开头的行、空行
ServerRoot "/etc/httpd" #主配置文件目录
Listen 80 #定义apache的运行端口
Include conf.modules.d/*.conf #通过include语法,把其他目录中的配置文件包含过来,实现配置简洁化
User apache #运行的用户,通过ps -ef 查看到的进程用户
Group apache #运行的用户组
ServerAdmin root@localhost
<Directory />
</Directory>
DocumentRoot "/var/www/html" #定义httpd的网页根目录
<Directory "/var/www">
</Directory>
<Directory "/var/www/html">
</Directory>
<IfModule dir_module>
</IfModule>
<Files ".ht*">
</Files>
ErrorLog "logs/error_log" #错误日志
LogLevel warn
<IfModule log_config_module>
</IfModule>
<IfModule alias_module>
</IfModule>
<Directory "/var/www/cgi-bin">
</Directory>
<IfModule mime_module>
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
2、根目录与端口
修改apache网页的根目录,需要修改两个参数
1、修改httpd.conf配置文件
DocumentRoot "/var/www/html" #默认在此文件夹中 eg:"/www/html"
#
# Relax access to content within /var/www.
#
<Directory "/var/www"> #此处需要和上面匹配才行 eg:"/wwww"
AllowOverride None
# Allow open access:
Require all granted
</Directory>
2、创建新的站点目录,针对上面修改的目录需要存在对应的文件夹才行 eg:mkdir -p /www/html
3、编辑html首页文件 eg:vim /www/html/index.html
4、确保关闭防火墙、iptables服务、selinux,然后重启服务即可
修改apache端口
[root@ylin ~]# grep -i 'listen' /etc/httpd/conf/httpd.conf
# Listen: Allows you to bind Apache to specific IP addresses and/or
# Change this to Listen on specific IP addresses as shown below to
#Listen 12.34.56.78:80
Listen 8080 #修改该端口即可
apache的工作模式(多进程 工作模式)
[root@ylin ~]# httpd -v #查看工作模式
prefok 在apache服务启动的时候,就预先启动一些进程等待用户的请求,这么做是为了减少频繁的创建和销毁进程,带来的额外系统开销
该模式是一个进程,只有一个线程,一个时间内,只能处理一个请求
优点:成熟稳定、兼容所有的系统模块、并且不用担心线程冲突的问题
缺点:多个进程占用较多的系统资源,销毁了较多的内容、并该模式不适合高并发场景
worker 使用多进程+多线程的混合模式,也是预先打开了多个进程(数量少),每个子进程,都会创建一些子进程,,同时还会有一个监听线程,每个请求来了之后,会 分配给一个线程去处理,线程单位比进程单位,是消耗较少的内存;在高并发场景下,worker模式跟适合
优点:worker模式,占用更少的内存
缺点:需要考虑多线程的资源抢夺问题
event 和worker模式比较相识,解决了tcp的keep-alive长连接的问题,当请求来了之后,交给一个子线程去处理,如果该TCP长连接长时间占用线程资源,对于系 统开销较大,event模式会默认开启一个监听线程,检测到当子线程处理完毕后,会释放该线程,减轻服务器的压力
3、userdir模块
userdir模块 可以很方便的和他人共享服务器的目录资料
1、修改配置文件,开启userdir模块、设置共享目录权限
[root@ylin conf.d]# ll /etc/httpd/conf.d/userdir.conf #需要修改该配置文件
<IfModule mod_userdir.c>
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
#UserDir disabled #注释掉这个
#
# To enable requests to /~user/ to serve the user's public_html
# directory, remove the "UserDir disabled" line above, and uncomment
# the following line instead:
#
UserDir public_html #开启这个,设置共享目录
<Directory "/home/*/public_html"> #配置共享目录资料
# AllowOverride FileInfo AuthConfig Limit Indexes
AllowOverride all
authuserfile "/etc/httpd/passwd"
authname "input your accout"
authtype basic
require user ylin
#Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#Require method GET POST OPTIONS
</Directory>
2、创建网站资料,注意权限问题
创建用户、创建共享目录、创建共享的网页文件
[ylin@ylin ~]$ chmod -Rf 755 /home/ylin/ #设置该目录及其子目录可读可写,必须要设置整个家目录才行
3、通过root用户创建apache的用户认证文件
[root@ylin conf.d]# htpasswd -c /etc/httpd/passwd ylin
4、重启apache服务,重启测试
http://39.101.66.40/~ylin/ #输入账号密码测试即可
4、多虚拟主机
虚拟主机也称作网站空间;其实就是通过一台运行在互联网中的服务器,被划分为多个”虚拟”服务器,其实就是在一个Linux服务器上通过多个不同的文件夹,管理不同的站点内容。
通过虚拟主机的功能,只需要在一台服务器上,配置二个目录即可,就是两个web站点
/www/hanju www.huanju.com
/www/zhanglin www.zhanglin.com
基于IP/域名的多虚拟主机,需要配置多网卡(一个网卡对应一个IP、一个文件夹)
1、给服务器添加多个IP地址
[root@ylin network-scripts]# ip address add 172.20.140.125/20 dev eth0 #此命令临时添加重启失效
2、在Linux上添加多个站点资料
[root@ylin ~]# tree /www/ #配置三个站点资料
/www/
├── html
│ └── index.html
├── yanfei #需要配置首页index文件
└── zhanlin #需要配置首页index文件
2、编辑http.conf文件,在低行添加如下配置,添加的时候不能有多余空格、配置文件当前行不能有中文
<VirtualHost 192.168.178.187> #虚拟主机参数
DocumentRoot /www/yanfei #定义网站根目录
ServerName 'www.yanfei.com'
<Directory /www/yanfei >
AllowOverride None #允许所有访问的权限
Require all granted #允许所有访问的权限
</Directory>
</VirtualHost>
<VirtualHost 192.168.178.111> #第二个站点
DocumentRoot /www/zhanlin
ServerName 'www.zhalin.com'
<Directory /www/zhanlin >
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
3、重启服务,访问测试
5、访问控制
修改对于站点的此配置文件
#<Directory "/var/www">
<Directory "/www">
#AllowOverride None
# Allow open access:
#Require all granted #注释该三行,添加如下参数,默认所有不能访问
Order allow,deny
Allow form 10.10.10.0/24 #允许该网段访问
</Directory>
6、日志管理
在高访问情况下可以调整日志等级,提升服务器性能
/etc/httpd/logs #日志存储位置
ErrorLog "logs/error_log" #错误日志存放位置
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
<IfModule log_config_module>
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
#CustomLog "logs/access_log" common
#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
CustomLog "logs/access_log" combined
</IfModule>
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
#解释
emerg 紧急 - 系统无法使用。 "Child cannot open lock file. Exiting"
alert 必须立即采取措施。 "getpwuid: couldn't determine user name from uid"
crit 致命情况。 "socket: Failed to get a socket, exiting child"
error 错误情况。 "Premature end of script headers"
warn 警告情况。 "child process 1234 did not exit, sending another SIGHUP"
notice 一般重要情况。 "httpd: caught SIGBUS, attempting to dump core in ..."
info 普通信息。 "Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..."
debug 出错级别信息 "Opening config file ..."
7、curl
curl命令是基于URL语法,在命令行下工作的传输工具,支持多种协议,比如:HTTP、FTP
1、curl命令保存网页元素
[root@ylin ~]# curl pythonav.cn > index.html #将该网页元素保存到本地index文件中
[root@ylin ~]# curl -o index.html www.pythonav.cn #直接保存网页,
2、测试网页是否存活
[root@ylin ~]# curl -o /dev/null -s -w %{http_code} www.baidu.com #返回200表示网页正常,-o 目的位置 -s 静默执行 -w 返回值
[root@ylin ~]# echo $? #返回值为0表示上次命令执行成功,如果返回值为非零表示上次命令执行失败
3、保存网页的cookie
[root@ylin ~]# curl -o /dev/null -s -c ./mycookie.txt www.baidu.com #给网站发送http请求,并且获取cookie信息
七、LAMP架构
LAMP结构:Linux+Apache+Mysql+(php、python)
在用户进行网页请求时,apache会对该请求URL后缀进行判断是动态还是静态请求;动态需要交给后端动态程序去执行调取数据数据,静态需求直接处理。
apache nginx web服务器
mysql sqlite oracle mariadb 数据库
redis memcache 缓存数据库
rabbitmq kafka 消息队列

搭建ing
1、清空防火墙规则,关闭selinux、关闭防火墙
[root@ylin ~]# iptables -F
[root@ylin ~]# getenforce
Disabled
[root@ylin ~]# systemctl stop firewalld
2、安装apache
[root@ylin ~]# yum install httpd -y
[root@ylin ~]# systemctl restart httpd.service #启动测试访问
通过查看配置文件,确认主目录路径,修改主index文件,测试
3、部署mariadb
[root@ylin ~]# yum install mariadb-server mariadb -y #安装
[root@ylin ~]# systemctl start mariadb.service
[root@ylin ~]# netstat -tunlp |grep mysql
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2476mysqld
4、用数据库客户端命令,登陆数据库,查看数据库信息
#mysql 客户端命令 -u用户名 -p密码
[root@ylin ~]# mysql -uroot -p #默认没有密码
show databases; #查看数据库
use mysql; #切换进入mysql库
show tables; #查看所有数据表
desc user; #显示user表的结构
select user,host,password form user; #从指定的user表中读取指定的字段信息
5、PHP环境搭建
yum install -y zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel libtool-ltdl-devel pcre pcre-devel apr apr-devel zlib-devel gcc make -y
[root@ylin ~]# yum install php php-mysql -y #安装PHP解释器以及PHP连接mysql数据库的驱动
6、直接配置apache主配置文件,让他支持PHP代码即可
DocumentRoot "/var/www/html" #在此下添加如下代码
TypesConfig /etc/mime.types
AddType application/x-httpd-php .php #让apache能识别PHP的程序
AddType application/x-httpd-php-source .phps
DirectoryIndex index.php index.html #默认的返回页面
7、手动编写php代码文件(目录为RocumentRoot后面),基础如下
<meta charset=utf8>
<?php
phpinfo();
?>
8、重启apache服务,登陆测试,能出现PHP信息
9、配置PHP连接mysql代码,访问测试
[root@ylin html]# cat conn_mysql.php
<?php
$conn=mysql_connect('127.0.0.1','root','');
if($conn)
echo "php已经连接上来啦";
else
echo "哎呀错啦 要加油哦";
mysql_close();
?>
https://ip/conn_mysql.php #测试
八、论坛搭建
利用LAMP进行论坛搭建
1.下载论坛的源码 Discuz_X3.2_SC_UTF8.zip,解压,修改权限755
2.移动论坛代码,放入到apache站点的根目录下
[root@ylin lamp]# mv upload/* /var/www/html/
#安装过程中出现配置文件不可写,需要修改html下文件权限
