yum更新遇到依赖错误的处理经验总结

redhat系列linux系统的yum,有时会出现错误的依赖,用linux早期,遇到该类问题简直是束手无策,无奈之下会在yum的“教唆“下使用“--skip-broken”参数,有时确实可以解决问题,但有时的后果,可以把系统玩儿坏,下次启动无法启动,或出现其它莫名其妙的问题。

列一个典型的错误依赖消息如下:

--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libva1-1.3.1-11.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libmad0-0.15.1b-4.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 librtmp0-2.3-1.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libx264_142-0.142-20_20140406.2245.el7.x86_64 需要
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libxvidcore4-1.3.2-15.el7.x86_64 需要
.......
错误:软件包:libmad0-0.15.1b-4.el7.x86_64 (@atrpms)
          需要:/usr/sbin/ldconfig
          正在删除: glibc-2.17-55.el7_0.1.i686 (@updates)
              未找到
          更新,由: glibc-2.17-55.el7_0.3.i686 (updates)
              未找到
错误:软件包:librtmp0-2.3-1.el7.x86_64 (@atrpms)
          需要:/usr/sbin/ldconfig
          正在删除: glibc-2.17-55.el7_0.1.i686 (@updates)
              未找到
          更新,由: glibc-2.17-55.el7_0.3.i686 (updates)
              未找到
 您可以尝试添加 --skip-broken 选项来解决该问题
 您可以尝试执行:rpm -Va --nofiles --nodigest

看到了最后两行了吧,通常别听信它,小心!

为了优雅的处理类似错误依赖的问题,要搞先了解一下该问题的原因。通常是在自己手动安装了一些非官方rpm包,或使用了多个yum源所致。尤其是升级安装了新版本的包。例如,在centos里为了安装某些软件而使用fedora里的包升级了系统自带的包。

个人经验如下:

先移除/etc/yum.repo.d/下非系统官方的源,备份到其它目录里,处理好问题后还移回来继续用。

yum list 查看系统都有哪些源的包,除了@base @anaconda @updates 之外的,都要留意一下,按“靠谱”程度从低到高逐渐移除。这里的“靠谱程度”,要凭一些经验的。 如本文前面列出错误依赖的这个例子,本人用了好多个源的包,@epel @atrpms  @nux-dextop @google-chrome 等这几个第三方源,epel是很高质量的,google-chrome 只有chrome浏览器,其它几个就是不太靠谱的,先移除它们。

检查yum list列出的包名,是否用了fedora,或非本机架构的等的包(如x64系统下686的包),yum erase移除它们。卸载包时,注意着,别把重要的系统包卸载了。千万别这样带-y 参数据 yum erase  {包名}  -y,yum erase 卸载某个包时,系统提示会提示都移除哪些包,如果看着不对劲就按 N

最后,你会找到出问题的那个包名,即提示错误依赖的信息
--> 正在处理依赖关系 /usr/sbin/ldconfig,它被软件包 libbluray1-0.4.0-6.el7.x86_64 需要
--> 解决依赖关系完成
错误:软件包:libbluray1-0.4.0-6.el7.x86_64 (@atrpms)
          需要:/usr/sbin/ldconfig
          正在删除: glibc-2.17-55.el7_0.1.x86_64 (@updates)
              未找到
          更新,由: glibc-2.17-55.el7_0.3.x86_64 (updates)
              未找到
 您可以尝试添加 --skip-broken 选项来解决该问题
 您可以尝试执行:rpm -Va --nofiles --nodigest

会类似上面所示,只是少数一两个包,尝试卸载一下看看

[root@fsc ~]# rpm -e libbluray1-0.4.0-6.el7.x86_64
错误:依赖检测失败:
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-fuse-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-afc-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-gphoto2-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-goa-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-mtp-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-smb-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-afp-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) gvfs-archive-1.16.4-7.el7.x86_64 需要
    libbluray.so.1()(64bit) 被 (已安裝) libbluray-0.4.0-6.el7.x86_64 需要
    libbluray1 = 0.4.0-6.el7 被 (已安裝) libbluray-0.4.0-6.el7.x86_64 需要

那查查系统里该包是什么版本吧 rpm -q {包名}

上面例子里,该包是atrpms源的包,比centos源里的包新。回忆时当时为了安装smplayer,装了一系列atrpms的包。而印象中,atrpms源有时会升级centos的包,所以就造成了yum update 升级系统时造成错误依赖。到centos镜像里下载这个rpm包,rpm --force  -Uvh {包文件路径}覆盖安装一下,然后再yum更新试试。

如果没有问题,那就好了。再把yum 源的配置文件移回去,重新yum makecache,然后根据刚才卸载的包的记录,把它们安装上;可参考history 命令的记录.

大概就是这样,写得有点乱。

cygwin下一些包名与命令不一致的包的安装(telnet,dig,netstat等)及ping方案

cygwin下有一些命令,按命令名在setup里搜索不到的,每次安装都要google,汇总记录备忘于此。

telnet, 包名 inetutils ,属于 Net 类

dig, 包名 bind-utils ,属于 Net 类

FreeTDS-devel,替代包名 libsybdb-devel (libraries to connect to MS-SQL and Sybas databases development), 用来安装pymssql时会需要freeTDS开发包的sqlfront.h文件(比如pip install pymssql 时报错 sqlfront.h: No such file or directory ),但cygwin中并没有freetds-devel, 这时安装 libsybdb-devel可通过。事实上,在cygwin里libsybdb 是freetds的依赖包,而libsybdb-devel 并没有随之安装,需要编译时自然是找不到头文件了,这在cygwin官方文档的里有提到的: https://cygwin.com/packages/summary/freetds-src.html

可以使用windows版代替的包

win32默认是ansi/gbk编码,默认输出是乱码,可以使用iconv转换一下

ping,nslookup

中文windows环境下ping乱码方案参看本文后

cygwin里没有,或暂时还没找方案的包

netstat, 好像没有这个工具,使用windows的版本吧....

nslookup

windows版工具输出乱码的解决方案

ping,nslookup等工具只能使用windows版的,但是windows默认是本地化ansi编码,在cygwin下显示为乱码。更麻烦的是,因为乱码内容骗死人不偿命,看下图里的ip地址cygwin_ping 看ip地址被煞有其事的显示成什么样子!

解决方案如下:

新建一个文件 /usr/local/bin/ping

#!/usr/bin/env bash
echo "## this is windows ping, not cygwin/gnu ping"
echo " for help: ping /? "
ping.exe $* |iconv -c -f gbk -t utf-8

创建一个符号链接,并赋执行权限

chmod +x /usr/local/bin/pin

重新打开cygwin的shell

netstat, nslookup等可如法炮治。

#!/usr/bin/env bash
echo "## this is windows netstat, not cygwin/gnu netstat"
echo "    for help:  netstat /? "
netstat.exe $* |iconv -c -f gbk -t utf-8

其他有用软件的包

Scheme解释器(lisp方言Scheme的运行环境):chicken

chicken: A practical and portable scheme system. 在setup中搜索sheme搜不出来中,要搜索chicken.  The CHICKEN Scheme interpreter.

GNU common lisp解释器,直接搜索clisp即可搜索出来。

在cygwin里调用windows版git-scm的gitk/git-scm与cygwin协同工作

20161216更新:

如果安装了git-scm的  Git-2.11.0-64-bit.exe,将如下命令加入~/.bashrc,重启cygwin即可(32位版本及以后的新版本应该是类似的)。

alias gitk='/cygdrive/d/Program\ Files/Git/cmd/gitk.exe'
. /cygdrive/d/Program\ Files/Git/mingw64/share/git/completion/git-completion.bash

假设git-scm安装在 D:\Program Files\Git

上面第一行命令是把gitk别名到windows版gitk的程序位置。第二行是执行git-completion以让git支持自动补全,方便使用,注意开头点号后面有个空格。


git-scm windows版的安装选项

以从 git-scm官方下载的Git-2.11.0-64-bit安装为例,典型的windows程序安装流程,可以一路下一步到底;不过有几步强烈建议按下面的选择

安装位置 ,推荐安装到D盘;重装windows后git还可直接使用

windows shelll集成选项。如果平时主要使用cygwin里的命令行版git、windows版只使用gitk看版本历史(推荐),建议全部取消选择。当然这里也可以保持默认选项。(新版本的git-scm在这里增加了几个选项,其中一项为 "Git LFS(Larget File Support)",推荐选中;其它的,自然就没必要。 [update 2019/09/15] 

强烈建议选第一项,只在Git Bash里使用git。强烈反对在windows cmd中使用git。推荐平时使用cygwin里的命令行版git。

强烈建议选第三项,不要让git自作聪明的修改换行风格,以避免被同伴鄙视+痛恨!

保持默认。强烈反对在windows cmd中使用git bash。事实上更推荐使用cygwin里的shell bash


旧文章归档

下面是操作方法适合早期版本,具体截止哪个版本号不明;内容是2014年底所写。

[标题] 在cygwin里调用windows版git-scm的gitk/git-scm与cygwin协同工作

-----------本文前面部分废话比较多,可以直接跳过前五段,阅读下一条分隔线后--------------------

前言

cygwin作为潜伏在windows里的类unix/linux操作系统,堪称神器,几乎可以运行一切unix工具,甚至连gui版的unix软件也可以用cygwin-X模拟。但是这个X实在太丑陋了,使用也不方便。不过,事实上,我们用cygwin主要是使用grep, cut, vim, git 等这些经典的的unix工具,而不是gui;毕竟gui也不是unix/linux的擅长项。

对于使用git的朋友,应该更依赖cygwin下的命令行版git,自由,快捷,随心所欲。然而要查阅版本历史时,还是gui版的git更直观。

而windows版git-scm自带了git gui/gitk工具,可以在git bash里运行gitk调用,这点与unix/linux下的git一致,使用还是比较方便的;但git bash有个硬伤,工具太少,而且shell太傻,完全是windows命令提示符的风格,通过鼠标做选择复制等操作,几乎是脑残得令人无语;比cygwin差了N个星系的距离。

于是:如果能在cygwin直接调用win32下git-scm的gitk,就完美了。

然而,一直没有找到方法,连万能的google也没帮上忙。经过艰苦卓绝的不懈努力,终于找到了办法,并发现多次尝试错误的原因。

----------------- 前面废话多;下面是原理,不想看可跳到下条分隔线(十段之后) ------------

原理简析

假设win32版git-scm装在 D:\Program Files\Git ,那么gitk位于 D:\Program Files\Git\bin\gitk 该文件是一个bash风格的脚本,它是由D:\Program Files\Git\bin\wish.exe 所调用执行的。

在windows开始菜单的git子项里,查看“git gui”的属性,会发现它是一个快捷方式,指向 "D:\Program Files\Git\bin\wish.exe" "d:\Program Files\Git\libexec\git-core\git-gui"  其中的gui-gui同样也是个bash风格的脚本,由wish调用。

因为cygwin本身支持windows原生的win32程序,执行该wish.exe并带上相应的参数,就可以调用这些bash风格脚本。

原理就是如上这些。我们按照cygwin风格重写这些命令。

在cygwin里,windows盘符挂载到/cygwin/下,形式如/cygdrive/c, /cygdrive/d ... 那么,上述wish.exe 在cygwin里,路径即

/cygdrive/d/Program\ Files/Git/bin/wish.exe
路径中的空格,要做转义。

后面要带上参数,这个参数要使用windows风格的路径,因为wish.exe是win32程序,它的参数是win32风格的。gtk的脚本即如下

/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"

wish的参数加了双引号,这也是win32风格。可以在cygwin下切换到一个git项目目录里,执行上面的命令测试一下。

以cygwin里创建一个命令别名 gitk 到上面的命令上,如下

$ alias gitk='/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"'

然后执行gitk即可,与git-scm的bash环境里执行gitk一样。不过这只能在本次会话中有效,将其放到 ~/.bashrc 里,后面增加如下一行

alias gitk='/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"'

大功告成。

如果需要在cygwin里使用git gui的话,方法类似。

-----------------只想看解决方案者,可以直接从这里开始看 --------------------

一句话操作

假设win32版git-scm装在 D:\Program Files\Git  .  在cygwin里修改 ~/.bashrc 文件,追加如下一行:

$ alias gitk='/cygdrive/d/Program\ Files/Git/bin/wish.exe "D:\Program Files\Git\bin\gitk"'

保存后,启动cygwin即可。

如果不明白,建议看前文的原理部分

linux磁盘操作总结(分区、LVM、在线增减),以CentOS 7为例

总结Linux 硬盘方面的内容,不定期更新

 

在线增减磁盘(不重启系统,增加或移除磁盘)

增加磁盘,系统不一定能立即认出来,这时就要手工通知内核刷新设备了。增加scsi或sata磁盘后,执行下面命令

echo "- - -" > /sys/class/scsi_host/host2/scan

其中1)  三个短横线"- - -" 之间都是有空格分隔的;  2)  host2是新磁盘插槽号,如果不确定,在该目录下ls查看,再一个一个的试。   命令执行后,可以查 /var/log/message  消息,或 ls /dev/sd* ,看是否发现了新磁盘。

移除磁盘,内容可能还不知道磁盘已经移除,执行下面命令通知内核

echo 1 > /sys/block/sdc/device/delete

其中 sdc是待移除磁盘的设备名,执行后,会发现 sdc的设备已经不存在。

参考 http://blog.51cto.com/skypegnu1/1429375

Linux分区

分区表MBR, 编号,

LVM

简单来看PV, VG, LV

文件系统

文件系统其实不能算磁盘操作,暂时放这里,内容多时再单独成篇

无损变更文件系统类型

如果是ext2/3/4 之间的转换,使用 tune2fs 更合适。

可以使用 fstransform ,简单示例: fstransform /dev/sdb1 ext4

不过对根文件系统似乎不太合适,在在vmware下CentOS 7根分区转换失败了(通过安装盘的救援模式,拷入fstransform的二进制程序到/usr/sbin等目录下、把磁盘挂在/mnt/下转换)。

参考 https://linux.cn/article-9966-1.html

 

从地址栏输入到页面显示 -深入探究web运行机制(半草稿持续更新中)

服务器特点:的相对性

 

dns解析,tcp/ip网络,必须有ip地址才能数据传输

http封包

osi七层协议

 

定义

主机:连接在网络上,有通过网络进行数据收发的设备。对于web开发而言,主要关心指web服务器,数据库服务器,普通用户计算机,除此还有dns解析服务器,代理服务器,等其它类型。

互联网上主机,要想进行数据传输,就必需有传输目的主机的ip地址。如,普通用户计算机,对于web开发者而言,主要关心的是其浏览器,有时也称web客户端(在与web服务器相对而言时,也简称客户端)。本文在不引起误解的情况下,会混称以下概念:web浏览器,客户端,用户主机。

对于web开发者,在不引起误解时web服务器也经常简称服务器。

 

服务器(端)与客户端,及其特点

服务器(端)与客户端,是一对相对的概念。服务器是可以向其它主机提供一种网络服务的网络设备。繁体中文(台湾)中称伺服器,这个名称更能体现服务器的特点,即“伺”与“服”,即等待其它主机提出服务请求,并向其它主机提供响应。它永远都是被动的向请求方(客户端)提供响应,而不会主动提供服务。服务器提供的响应,一般是一个数据包,通过一定的网络协议把响应数据包发给请求方。(网络协议可以简单的理解为数据传输的格式或规则)。以数据传递的走向来看,客户端是主动方,它主动向服务器提出请求。而服务器则是被动方,只有在接受到客户端的请求时,才向客户端提供相应的响应数据。

服务器可以按所提供服务划分为多种类型,如数据库服务器,域名服务器,web服务器,缓存服务器等多种。

(注:以上从功能的角度对服务器与客户端的进行的解释,非物理实体角度的解释。)

从软件的角度看,一台物理上的服务器就是安装了某种网络服务软件的计算机。

一般情况下,一台物理服务器都提供单一的网络服务,以获得最佳的性能。当然在服务器主机性能有富余时、或降低成本时,也会安装把多个服务器软件安装在同一台物理服务器主机上。

 

Web服务器与浏览器

web服务器是提供web服务的服务器;而主动向web服务器发送请求的主机,即是web客户端。一般情况下,服务器都提供单一的网络服务,以获得最佳的性能,web服务器也是这样;而物理上的 web客户端,绝大多数情况就是我们平时使用的计算机,上面会安装多种软件,包括浏览器、下载工具、输入法程序、即时通讯工具等,浏览器只是其中之一,不过对于web开发者,我们主要关心的只是浏览器,所以在不死混淆时,我们会笼统地把用户端计算机、web客户端与浏览器等价看待。

 

 

Web服务器的主要功能解析

web服务器是安装了web服务软件的一台主机。上面最主要的软件就是web服务器软件,它接受http协议的请求,并返回相应的http响应数据给请求者。 目前最常用的是Apache HTTP Server (简称apache, httpd) internet information services(简称iis)ginxlighttpd

它主要有以下功能模块:http请求数据包分析器,响应数据生成器,响应数据包封装器。

http请求数据包分析器,是分析浏览器发送来的请求数据包,从中拆解出请求字段,并传递给响应数据生成器。拆解出的字段至少包括请求的主机域名,请求端口号,请求文件路径,请求字符串(GET请求字串)等等。

响应数据生成器,主要是根据请求中的字段,生成相应的响应数据。1. 对服务器上静态页面的请求,就直接把请求文件路径字段对应的文件读取出来,传递给响应数据包封装器。一般来说图片、静态html页面,css文件,javascript文件都是这样。 2. 而动态页面的请求,则需要调用安装在web服务器程序里的动态程序引擎,执行相应的web程序,才得到响应数据。web开发者开发程序主要打交道的主要就是这里所说的“动态程序引擎”,web开发者编写的程序正是由它执行的。每种动态程序,如php, jsp, python, asp(.net)等,都有其相应的引擎;其中asp的引擎比较特殊,它内置在iis里,以一个.dll的形式存在,与iis紧密联系。

响应数据包封装器,把动态或静态生成的响应数据,附带上必要的http头字段,构造成http响应数据包。

最终生成的响应包,递交给操作系统,由操作系统发送给客户端。

 

浏览器的主机功能

浏览器至少包含以下重要的功能模块:域名解析客户端,http请求封装器,http响应接收器,排版引擎,客户端脚本解析引擎,页面缓存系统,cookie处理模块,

域名解析客户端,互联网上的主机需要与任何主机进行数据传输,都需要知道对方的ip地址,使用网址访问服务器时,就必须查询到网址域名的ip地址,该项工作就是由域名解析客户端进行。工作过程大致如下:域名解析客户端向dns服务器(操作系统的网络配置里的dns配置)发起域名解析请求,请求包中包括待解析的域名,dns服务器通过一系列查询,得到域名对应的ip地址,返回给域名解析客户端。

http请求封装器根据请求域名的ip地址,请求域名、端口、文件路径、GET字串、POST数据、COOKIE、浏览器描述信息(user-agent, 是否接收zip压缩,保持连接等)等信息,封装成http请求数据包,提交给操作系统,发送给目标服务器。

http响应接收器,接收服务器的响应数据包。

排版引擎,根据html文档,css样式把页面内容显示在浏览器视图区域。

客户端脚本解析引擎,处理客户端动态脚本,主要是javascript,在IE系列浏览器里还有vbscript.

页面缓存系统,打开网页时,如果页面中的一幅图片是刚刚请求过的图片,就不必重新向服务器请求该图片,而是使用之前请求返回的图片文件,这样可以加快整个网页打开速度,还节约带宽。这就是页面缓存系统的功能。

cookie处理模块,cookie机制在浏览器上的实现。

特殊的浏览器:搜索引擎的蜘蛛,即网络爬虫,自动获取网页html代码,用于搜索引擎的索引系统。

 

浏览器几个特性

连接保持,缓存,排版引擎差异,

连接保持,浏览器与服务器进行数据传递(http请求与响应都是数据传递)前,需要建立数据连接,一般是tcp连接,而这一过程通常是个比较耗时的过程。为了减少整个数据传递的总耗时、从而加快页面打开速度,通常会开启“连接保持”的功能,即服务器与浏览器在首次建立tcp连接、并完成一个http数据传递后,并不把这个tcp连接断开,而是暂时保持一段时间(一般在2分钟左右),如果这一段时间内还需要进行数据传输,则直接使用这个tcp连接;这样就节省了建立连接的时间花费。

缓存,已经在上面讲述过(打开网页时,如果页面中的一幅图片是刚刚请求过的图片,就不必重新向服务器请求该图片,而是使用之前请求返回的图片文件,这样可以加快整个网页打开速度,还节约带宽)。缓存在动态文件上有可能造成一些问题,如有一个动态user.php,作用为显示当前用户的状态;当浏览器第一次打开该文件时,用户状态是未登录的,而用户登录后,该页面将显示用户信息;但如果浏览器使用缓存,则还显示未登录的信息。所以就需要在响应数据包的http头中加入一个字段: Cache-Control,标识是缓存有效期 ,用于告诉浏览器当前页面使用缓存方式。如果在http响应头里没有这个字段,浏览器就按其自身默认设置应用缓存,而不同的浏览器默认设置并不相同。正是因此,有时页面刚刚修改过,但某些浏览器显示的还是老内容,点浏览器的“刷新”也不行,只能关闭浏览器窗口,并清空缓存。强制浏览器不使用缓存还可以在每次请求的地址后面加入随机的GET字串,如user.php?a=25seg

排版引擎差异,同样的html,在不同浏览器里显示效果并不相同,如IEfirefoxchrome等浏览器之间,甚至IE的不同版本间都有很大差异。

 

 

 

web服务器是安装了web服务软件的一台主机,web开发者的计算机中一般都会安装上相应的web服务器端软件,常称为web server,如apache, iis 等,这台计算机也就是一台web服务器;同时,该主机上也有浏览器,因此,这台物理上的主机,既上服务器端也是客户端。

 

 

实例:简单模拟一个常规静态页面的打开。

服务器www.testsite.net上有这样一个简单网页(如图),其中包含一个html文档及一张引用图片

index.html

<html>

<head>测试网页</head>

<body>

<p>第一行文字</p>

<p>the 2nd line</p>

<img src=”img.jpg” alt=”just a test image” height=”50” width=”40” />

<p>本文档到此就结束了</p>

</body>

</html>

 

img.jpg

 

 

 

 

就这两个文件,放置在站点www.testsite.netweb根目录下,这样使用浏览器访问www.testsite.net/index.html就可以打开这个页面。这个过程至少包括以下几个重要的步骤:

  1. 域名解析。浏览器根据用户输入的网址,从中获取请求的主机名,www.testsite.net,通过域名解析获得该域名对应的ip地址192.168.10.166.
  1. 请求数据库的封装。浏览器根据用户请求,把多个信息封装成为http请求包,这个请求包里一般都包含以下几部分,请求的主机名,请求服务器上的文件路径,请求字符串,cookie,客户端(浏览器)的IP地址等(除此还有,客户端user-agent字符串,是否接受zip压缩等多个字段)
  2. 浏览器(客户端)提交给所在计算机操作系统,由操作系统把封装好的http请求数据包提交给目标主机,这里就是www.testsite.net所在的192.168.10.166. 提交完成后,浏览器一般会在状态栏里显示为“正在等待服务器响应”,并显示进度条表示等待服务器返回响应数据的过程。。
  3. 服务器接收到客户端的请求后,由操作系统把这个请求递交给web服务器(一般是apache, iis 等)。
  4. web服务器对这个请求包进行分析,然后交由www.testsite.net站点进行处理。
  5. web服务器到www.testsite.netweb根目录下寻找index.html,找到该文件后,把此文件的内容读取,然后按照http响应数据包的格式进行封装。其中包括http响应数据头,响应数据内容主体两大部分。响应头里包含了响应状态码,响应数据类型(这次为text/html),要求客户端设置cookie的信息等。
  6. 客户端从服务器响应数据包里,解析出响应数据的类型,为text/html,浏览器于是按照text/html的格式分析其内容,边分析边把页面内容按html格式显示在浏览器的页面里。(不同的排版引擎之间对html的解析稍有不同,所以同样的网页在不同浏览器下看到效果可能稍有不同)
  7. 浏览器解析index.html文件时,发现其中还有对图片img.jpg的引用,于是再发送一次http请求给服务器www.testsite.net,用于请求img.jpg文件。这一过程,如果发生在浏览器全部获取http响应数据之前,就可以解析出还需要其它文档,这里就开始对下一个页面元素的请求;而不是等浏览器还没有读取到完整的html文档后,这样无疑就加快了浏览器打开页面的速度。如果打开一个比较庞大的html文档时,这个影响就很可观了。
  8. 服务器对请求图片的http请求作出响应。这次响应的数据类型是image/jpeg.
  9. 浏览器得到服务器的响应,解析出图片,并把图片在index.html页面上绘制出来。

 

直观查看http数据包的传递,及http

工具:firefox(需要插件live http headers, firebug)

一般我们通过浏览器看到的内容,都是http数据主体的内容,而http头,我们一般是看不到的。因为浏览器向我们隐藏了这些细节,这些细节对于一般使用者是没有意义的。但对于web开发人员,还是十分有必要理解这些的。所以我们就需要借助一些工具达成目的。

可以查看http头的工具很多,包括本机网络数据抓包工具,浏览器插件等都是可行的,以浏览器插件最为简便实用。

 

 

域名与web服务器 /域名解析,域名绑定

域名解析,有时也会说dns解析。互联网上的数据传输依赖于IP地址,但日常使用的却是英文域名,所以首先要把域名解析为IP地址,这项工作是dns服务器进行。而前面说过,服务器的工作都是被动的,这个域名解析过程中的主动方就是需要把域名解析为ip地址的程序,在B/S架构里,就是浏览器(B,browser)

平时我们在浏览器地址栏里输入网站域名,就能打开其网页,看似域名与web服务器是同一套服务,但事实上完全不是这样。域名服务与web服务两人者是隔离的,要把这两者协同工作,我们至少需要完成两项工作:域名解析到web主机ip地址、web主机上设定该域名的站点。

以实际中的例子讲解。举个例子,我们注册了一个域名path8.net,注意,注册域名时,前面没有wwwwww其实是我们注册域下的一个子域名,子域名我们可以任意开设。不过习惯上,在web上,大家都把www的子域名作为主要域名;甚至有些人错误的认为域名前面都要带www,笔者就多次见过这样的情形。笔者参与维护的一个网站为客户开设了子域名服务,于是就有了zhangsan.xxx.yy, lisi.xxx.yy, wangwu.xx.yy等等这样的一系列子域名,但很多用户访问网站时,会输入www.zhangsan.xxx.yy这样的域名,就是在子域名前面再加上www. ,这当然是无效的子域名。然而我们无法给每个访客说明子域名与www的关系(我们无法控制用户的行为,只能适应用户,或者有意引导用户),所以使用了一个巧妙的方法,对于www.subdomain.xxx.yy的请求,在web程序里直接把前面的www.去掉,这样用户即使

多输www.也可以打开正确的页面。扯远了。

每一个子域名都是需要单独设置解析的,域名解析有多种形式,最常见的就是A记录,也就是直接把一个域名解析到一个ip地址上。除了A记录外,还有mx记录,cnametxt记录等。cname记录是把域名解析到另外一个域名上,也称为“别名”,这点非常有用。假设我有100个域名,我想把这100个域名全部指向到一台主机上,但这台主机的ip地址会定期改变。,这样的话,岂不是ip地址一变化,我就要设置100条域名解析信息吗?!如果有更多域名,可想而知是什么情况。借助cname就可以轻松实现这一点,我可以把其中100个域名“别名”。到一个域名(如alias.xxx.yy)上,然后再为这个域名alias.xxx.yy设置一条A记录到ip地址上;以后只需要修改alias.xxx.yyA记录就可以了。cname还经常在cdn加速服务器设置。mx记录是用于邮件系统的,txt一般用于防止“谎称域名而发送防垃圾邮件”的授权验证。如果你看过域名管理的控制面板,应该见过这些。

上面所说的A记录,mx记录,cnametxt记录,每设置一条都是一条解析。如果为path8.net设置 5A记录linux.path8.net, php.path8.net, mysql.path8.net, path8.net, 另有2cname记录,一条mx记录,那我们就一共需要设置5+2+1=8条解析记录。事实上,我们的域名注册(服务)商,一般不会允许我们设置无限多条解析记录的,限制通常是1020条,如果需要更多条解析,就需要另外购买了。当然我们可以自建dns服务器,用来解析我们的域名,而不再使用域名商的解析服务,这样我们就可以设置任意多条域名了。不过自建服务器费用昂贵,通常没有这个必要。

有人问了,如果我有100万个用户的博客站点,我想为他们每个人开设一个子域名,可以通过cname别名到一个域名上,对这个域名再设置A记录。这种情况下,我就需要100万还多的解析,不自建服务器怎么办呢? 我们的回答是,照样不需要,我们可以设置泛域名解析。泛域名解析就是把所有没有设置的子域名全部都指向一个ip地址S上。如上对path8.net 设置了4个子域名,再设置一个泛域名指向ip地址P上。这样linux.path8.net的解析当然还是ip地址S,而对windows.path8.net, mssql.path8.net, 将全部解析到ip地址P(如果没有设置泛域名解析,这几个子域名将全部解析失败)。当然,泛域名解析需要域名商的支持(多数域名商是支持的)。

对域名解析扯了很多,也不过是简单介绍,对站长入门有一参考价值,但于web开发人员来说,可能显得多余。不过,个人感觉,对web系统运行的背后的知识不了解,知识结构总是显得苍白无力。个人当初学习web开发时,就对这些东西很感好奇,但不知道去哪里学习(个人完全是靠自学计算机方面的东西,除思科ccna的培训之外,可以臭美一下~~)。

 

下面还要对web程序在服务器上的设置做一下简单介绍。这也是web开发的入门级人员有必要了解的。

 

web服务器,当下最常用的是Apache HTTP Server (简称apache, httpd) internet information services(简称iis)。这里不对它们的配置方法介绍,主要是讲web 服务器共同之处。

最初一台web服务器只能设置一个web站点(对应一个域名),也就是说,如果我要开设一个web站点,就要一台web服务器;每增加一个域名,就要新安装一台物理上的服务器,即使是一个访问量很小的站点也是一样——这早已是很古老的事情了——这里面就有一个无法发挥服务器性能及浪费的问题了。

聪明的人类发现问题后,总是会想解决方案的。虚拟主机的概念就此应运而生。它就是在一台物理的服务器、一套web服务器软件、一个ip地址、一个对外服务的端口上,同时运行多个web站点。在同一台服务器上运行多个web站点,从软件开发角度上讲,就是要用一种机制,把这多个站点区分开来。如果你对网络基础有所了解,这一点类似于:在同一个ip地址、一种协议上,可以使用“端口”对外建立多个数据连接。区分多个web站点的方式,就是“虚拟主机技术”,其实原理非常简单的,就是找区分标准。一台服务器同时运行多个站点,那么这些站点的域名是不同的,我们就可以根据这一点做文章了:如果我们开发一套web服务器软件,它根据客户端(浏览器)发来的http请求数据包里的“主机名”——就是请求网站的域名——的不同,向请求方返回相应站点的页面,这样不就可以解决问题了!

事实上虚拟主机就是这个原理,主流的web服务器软件都有这样功能,不需要我们做相应开发了。

早期的web服务都是静态文件,当时的web服务器主要就是为了共享一些文档而用的;动态web程序是后来才的有。web服务器上每个web站点都对应着一个目录,作用就是通过http协议共享这个目录里的文件。

那我们是否可以在web服务器上建立多个站点(每个站点对应一个域名),对多这个站点全部设置为同一个目录呢?答案是肯定的。但这并不是最简便的方式,可以只建立一个站点,而对这个站点绑定多个域名。

了解了以上这些,你可能已经想象到了:web服务器的多站点功能,其实是一个web服务器软件对http请求的分发,把不同的http请求分发给相应的web站点进行处理;而web站点都是对应着服务器上的一个目录。

上面我们对虚拟主机的讨论,是建立在一个假定的基础上:web服务器只有一个ip地址。那如果我们的web服务器有多个ip地址,是否是也可以就此区分多个站点呢?答案是肯定的。这也是虚拟主机的一种实现机制(同样是对http请求的分发机制),不过目前ipv4的地址很缺乏,都“告急”好些年了,尤其在中国,几乎大家都是在“凑合”着用,大多数公司的办公室都是用对外一个ip地址,通过nat在内部使用私网ip地址,甚至听说有些地方adsl拨号获得的ip地址都是私网ip地址了。又扯远了。总之,就是说ip地址是稀缺资源,“基于ip地址划的虚拟主机”代价太高,很少这么用。而“基于主机名划分的虚拟主机”是常用的,几乎所有的虚拟主机提供商都是采用这种技术。国外某些虚拟主机提供商还提供独立ip地址,他们是把这两人种虚拟主机技术结合实施的。

还说“基于主机名划分的虚拟主机”,我们要在一台服务器上设置多个虚拟主机,就要建立多个站点,给它们分别设置不同的域名(域名绑定)。

再回到我们前面讨论过的“为100万个用户分别设置子域名”的问题。这100万个子域名,是否都要逐个设置呢?先不说答案,我们自己从底层原理上分析一下先。

http请求分发的观点分析:web服务器接收到http请求后,从请求包里读出出所请求的域名,如果发现它是该服务器上绑定的域名,就把该请求分发给相应的web站点进行处理;但如果不在已绑定域名之列,那怎么办呢? 对这样的请求,要么正确响应,要么返回给请求浏览器一个错误消息。返回错误,很简单,就是”请求错误,域名未知”这样的错误消息,不知你是否注意过打开某些网址后显示Bad Request (Invalid Hostname) 样的消息时,这就是iis对这要错误返回的消息文本。而要向请求方发回正确的影响该怎么办呢,总得把这个请求交给一个站点处理才可以吧?是这样的,这个对非配置域名也能处理的站点,就是“默认站点”。

分析到这里,你是否已经想到这怎么解决对100万用户分别设置子域名的解决方案了,不错,就是借助web服务器软件的默认站点功能。

是否发现了,这里有一个问题,那就是一台服务器上只能配置一个默认站点,也就是这要的功能,在从虚拟主机商购买的虚拟主机上,是难于实现的(除非你在该虚拟主机上有独立ip地址,再加上虚拟主机商提允许你“配置该ip地址的默认站点”的功能)。想通过配置默认站点的方式给100万会员分别分配子域名,只能在独立主机上实现。

现在假定已经有独立服务器并配置好了默认站点,它被设置到了一个目录上,我们在web开发者的角度,分析一下怎么对不同的子域名返回不同的页面。

这个问题,其实还是请求分配的问题。现在的情况是:默认站点对应的是一个特定的目录,也就是这些所有子域名,都是靠同样的处理程序实现的。不同的用户有同的用户id号。如果有这个id号,我们就可以根据这个id号,向浏览器输出相应的页面(一般是从数据库里读取出来相应的数据,并形成动态页面)。就是要根据用户id号来作为区分标准,显示不同的页面,现在我们没有这个id号,但我们可以根据子域名的最前一段进行区分。也就是,我们可以根据用户的用户名(或是让用户自己设定的一个子域名)分配子域名给每个用户,而在服务器端的处理程序上,根据用户子域名,从数据库里查询出该用户的id号,接下来,就是常规的程序了,这里就不需多讲了。

 

这里有一个问题,如果一台web服务器上配置了10个域名,浏览器向这台服务器发送一个http请求包,这个请求包里如果包含的是这10个域名其中之一,是没有问题的,可以正确得到结果。但如果请求的是这10个域名之外的域名,返回什么结果呢?

 

综合讲一下域名及web服务器。域名服务器与web服务器是相互隔离的,我们要建网站,就至少要做两个工作:注册域名及对域名的设置,购置web服务器(可以是实际的服务器也可以是虚拟主机)及对web服务器的设置。详细过程大致如下:

  1. 注册域名。(获得了域名及对域名解析到ip地址的管理权)
  2. 购买web服务器。(获得web服务器ip地址及web服务器主机名——也就是域名——的设置权)
  3. 把域名解析到web服务器的ip地址上。一般使用A记录解析。
  4. 把域名“绑定”到web服务器上。使用apache独立主机的话修改apache配置文件,iis的话在iis管理器里,从虚拟主机商购买的虚拟主机的话在的管理后台里。

后两步的设置工作,是缺一不可的。

可以这样讲,因为 域名服务器与web服务器是相互隔离的,所以要建站,就要对域名及web服务器做双向指向:要让域名知道web服务器的存在(域名解析),还要让主机知道域名的存在(域名绑定)

(未完待续)

------------------------- 以下是计划写入的主题条目,实际可能会有适当增减 -------------------------------

服务器特性:相对性;从来都是被动的,从来不主动向任何对象发送数据,而是只在收到请求后才响应;“伺服器”的名称更体现这特点。

dns解析,tcp/ip网络的数据库传输必需得到对方的ip地址才能进行。

http封包

osi七层及tcp/ip

网络数据传输(局域网广域网交换机路由器)简述

web服务器

防火墙

http请求包的拆解,http请求包的分配(被web服务器分配到相应的站点,默认站点)

HTTP变量赋值,rewrite

web语言脚本解析引擎

http响应包的封装,脚本引擎生成部分,再由web服务器补充

http响应状态码

http无状态性及patch方案

cookie,session,不同语言的session机制,不互通

浏览器解析html文档,载入内嵌媒体(图片,js,css等),cookie

http连接保持

客户端脚本javascript执行,js事件触发,ajax

排版引擎

web server的多站点原理,

程序并发性,冲突:

正在进行的一个操作,受到了另一个操作运行的影响,就有可以造成并发访问问题。

(正在进行的一个操作的结果,影响了另一个操作进行的条件)

在一个操作操作完成所需要的时间段内,有另外一个操作也对该资源进行可能冲突访问(一般是“写”),就很有可能造成并发冲突