一、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,明确告诉服务器,可以进行通信了。

    Web基础 - 图1

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

Web基础 - 图2

  1. 客户端和服务器建立连接,客户端发出请求与服务器进行三次握手身份确认,在建立链接
  2. 服务器接收到请求之后,linux内核根据socket进程通信管道把客户端请求发送给HTTP应用程序去解析
  3. HTTP服务器开始处理请求,对用户的请求报文进行解析,明确客户需要和资源和请求方式等等
  4. HTTP在存储系统上,请求资源,内核去本地文件系统上读取数据
  5. HTTP服务器构造响应体,应用程序创建响应报文
  6. linux发出HTTP服务器构造的响应报文,发送给客户端
  7. HTTP服务器会进行事务记录,记录着流程的日志

常见的HTTP请求方法:

  • get 向服务器获取数据、资源
  • post 向服务器提交数据,比如登录、注册信息
  • head 获取URL的响应头信息,不要响应体信息
  • put 将请求主体发送给服务器
  • delete 删除服务器的一些资源
  • trace 追踪请求到达服务器的一系列变动

HTTP状态码类别:

  • 1XX 信息状态码、服务器接收到请求、需要客户端继续操作
  • 2XX 操作成功
  • 3XX 重定向状态码,需要进一步的操作
  • 4XX 客户端错误,请求语法错误等
  • 5XX 服务端错误,服务器出了过程中出错了

常见的状态码:

  • 200 服务器成功返回网页
  • 404 请求的网页不存在
  • 503 服务器不可用

五、事务

事务是指程序中一系列严密的逻辑性操作,并且必须保证所有操作都能够完成;如果出错,那么得保证每个操作中的更改动作,都会被撤销。
事务的一些特性:

  • 原子性:执行命令,要么全部成功,要么全部失败,只要有一个环节出错,那么其他指令都要进行数据回滚,回滚到执行命令之前的操作。
  • 一致性:事务的执行使得数据从一个状态,进入另一个状态;但是对于数据的完整性,还是保持不变
  • 隔离性:当多个用户并发访问数据库的时候,共同操作一张数据表,数据库他会为每一个用户开启事务,不能被其他的事务所干扰;多个并发的事务操作,要进行隔离。
  • 持久性:当事务正确完成后,对数据的修改时永久性的。

HTTP事务流程:
在浏览器中输入网站直到最终看到整个页面的过程,其实就是HTTP事务流程。
1、DNS解析

  1. 1. 输入book.luffycity.com 浏览器会解析域名对应的IP地址
  2. 1. 浏览器去客户本地机器寻找DNS缓存,是否存在记录
  3. 1. 服务器继续读取客户端配置的hosts文件,是否有对应的域名与IP的对应关系。
  4. 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                消息队列

image.png

搭建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下文件权限