Linux课程笔记 Day08 课上内容总结 Apache,Raid技术及Nginx

一 http基础概念

1.1   静态网页的特点:

(1)       静态网页每个页面都有一个固定的URL,而且URL一般以.htm、.html、.shtml等形式为后缀,而且地址中不含有问号”?”

(2)       静态网页是实实在在保存在服务器上的文件,每个都是一个独立的文件

(3)       静态网页的内容相对稳定,容易被搜索引擎收录(优点)

(4)       静态网页没有数据库的支持,在网站制作和维护方面工作量较大(缺点)

(5)       静态网页的交互性较差,在功能方面有较大的限制(缺点)

(6)       网页程序在用户浏览器端解析,程序解析效率更高,由于服务器端不进行解析,因此可以接受更多的并发访问。(优点)

 

 总结:1)客户端解析   2)格式html,jpg为主  3)易被搜索引擎收录

 

1.2   动态网页

特点:

(1)       动态网页一般以数据库技术为基础,可以实现更多的功能,可以大大降低维护网站的工作量;

(2)       并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页

(3)       动态网页中的“?”对搜索引擎的收录存在一定的问题

(4)       程序在服务器端解析,会消耗大量的CPU和内存等资源,效率不如静态网页

 

总结:一般以数据库技术为基础,程序在服务器端解析,扩展名为asp,aspx,php,jsp,do,cgi,perl

 

1.3   伪静态网页

由于搜索引擎无法正确读取带参数的动态网页内容,很多大型的网站都采用了动态网页生成静态网页的技术,消除动态网页中的参数,是搜索引擎收录更多的内容,达到优化的效果。

另外的办法,就是动态网页伪静态技术,通过某些技术(如rewrite规则),把网页的url重写,但是并不需要生成任何网页,仅仅是改变了地址路径,以达到有利于搜索引擎收录的效果。伪静态的实质依然是动态网页,因此在性能上存在瓶颈,效率没有任何提升,没有动态转静态网页效率高。

 

1.4   web架构优化

在实际高并发网站架构中,偶们可以考虑把用户请求的数据解析后存成静态文件放于磁盘中或放于内存中,来降低动态服务器的压力,从而提升用户体验。

 

1.5   IP-PV-UV

IP:指独立IP数,00:00-24:00内相同IP地址被计算一次

 

PV:即Page View,页面浏览量或页面点击量,每次刷新即被计算一次。具体的度量方法就是从浏览器发出一个对网络服务器的请求,网络服务器街道这个请求后,会将该请求对应的一个网页发送给浏览器,从而产生一个PV,那么这里只要是这个请求发送给了浏览器,无论这个页面是否完全打开,那么都是应该计为1个PV

 

UV:即Unique Visitor,访问网站的一台电脑客户端为一个访客。00:00-24:00相同的客户端即被计算一次。UV的度量方法:1.网站服务器分辨;2.Cookie分辨

 

1.6   网站访问基本流程

 

 

 

注意:如果本机上有要访问网站的IP地址解析的缓存,就直接进行第5步,即直接访问目的网站。
二 Apache服务生产实战应用

2.1 Apache特点

功能强大、配置简单、速度快、应用广泛、性能稳定可靠,并可做代理服务器或负载均衡器

 

2.2 Apache应用场合

(1)使用Apache运行静态HTML页、图片(处理静态小文件能力不及Nginx)

(2)使用Apache结合PHP引擎运行PHP、Perl等程序,LAMP被称之经典组合

(3)使用Apache结合Tomcat/Resin运行JSP,JAVA等程序,成为中小企业的首选

(4)使用Apache做代理、负载均衡、rewrite规则过滤等等

 

2.3 安装Apache

2.3.1 卸载系统默认安装的Apache软件包

[root@test2 ~]# rpm -qa httpd*    #查看系统默认安装的Apache软件包

httpd-manual-2.2.22-jason.1

httpd-2.2.22-jason.1

 

#可以使用yum remove httpd*的方式删除,也可以根据依赖关系一个个文件删除

 

2.3.2 下载Apache软件包

[root@test2 tools]# wget http://apache.dataguru.cn/httpd/httpd-2.2.25.tar.gz 

--2013-10-19 01:03:53--  http://apache.dataguru.cn/httpd/httpd-2.2.25.tar.gz

正在解析主机 apache.dataguru.cn... 112.81.51.52

Connecting to apache.dataguru.cn|112.81.51.52|:80... 已连接。

已发出 HTTP 请求,正在等待回应... 200 OK

长度:7445734 (7.1M) [application/octet-stream]

Saving to: `httpd-2.2.25.tar.gz'

 

100%[==============================================================================================================================>] 7,445,734    221K/s   in 32s    

 

2013-10-19 01:04:29 (230 KB/s) - `httpd-2.2.25.tar.gz' saved [7445734/7445734]

 

#可以去www.apache.org官网去查找有关的软件包,然后再使用wget的方式下载。

 

2.3.3  解压编译

 [root@test2 tools]# tar zxf httpd-2.2.25.tar.gz

[root@test2 tools]# cd httpd-2.2.25

[root@oldboy httpd-2.2.25]# ./configure \

> --prefix=/application/apache2.2.25 \  #指定安装路径,默认安装路径是/usr/local/apache2

> --enable-deflate \      #提供对内容的压缩传输编码支持,一般html,js,cdd等内容的站点,使用此参数功能会大大提高传输速度。在生产环境中,这是apache调优的一个重要选项之一。在服务器端压缩之后传输,在客户端浏览器再解压。

> --enable-expires \  #激活允许通过配置文件控制HTTP的“Expires:”和“Cache-Control:”头内容,即对网站图片、js、css等内容。提供在客户端浏览器缓存的设置。这是apache调优的一个重要选项之一。

> --enable-headers \  #提供允许对http请求头的控制

> --enable-modules=most \

> --enable-so \       #激活apache服务的DSO支持,即在以后可以以DSO的方式编译安装共享模块,这个模块本身不能以DSO方式编译

> --with-mpm=worker \  #选择apache mpm的模式为worker模式,因worker模式原理是更多的使用线程来处理,所以可以处理更多的并发请求,而系统资源的开销小鱼基于进程的MPM perfork(默认)

> --enable-rewrite     #提供基于URL规则的重写功能。即根据已知URL地址,转换其他想要的URL地址。如前文讲解的伪静态功能就是这个模块实现的。

 

#如果在安装apache软件包时,如果忘记安装了以上模块,可以在安装后,以dso方式编译安装,具体方法见后文。

 

[root@oldboy httpd-2.2.25]#make

[root@oldboy httpd-2.2.25]#make install

#初学者一定要学会在编译安装的过程,查看记录信息,看是否有ERROR等信息

 

[root@oldboy httpd-2.2.25]#ln -s /application/apache2.2.25  /application/apache

特别注意25后面不能有”/”。另外,要删除这个软链接,则执行rm   -rf  /application/apache这个后面也不能带”/”

#这条ln命令的意义十分深远重大。这可是生产环境的经验 。

#安装时指定版本号路径是便于查看区分当前使用的apache版本、也方便以后升级。当apache软件升级带新版本号后,删除原来软链接再重新建立新的到/application/apache的软链接就好了。

#程序中如果有应用apache路径的地方,不需要做任何更改,因为升级后访问路径还是/application/apache.

 

2.3.4 检查Apache安装情况

[root@test2 application]# /application/apache/bin/apachectl -l

[root@test2 application]# /application/apache/bin/apachectl -M

# /application/apache/bin/apachectl使用这个命令,可以查看apache的参数

 

2.3.5 启用Apache

[root@test2 application]#  /application/apache/bin/apachectl start

 

2.3.6 验证启动情况

1.[root@test2 application]# lsof -i tcp:80  #查看80端口的使用情况

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

httpd   6417   root    3u  IPv6 335624      0t0  TCP *:http (LISTEN)

httpd   6419 daemon    3u  IPv6 335624      0t0  TCP *:http (LISTEN)

httpd   6421 daemon    3u  IPv6 335624      0t0  TCP *:http (LISTEN)

httpd   6423 daemon    3u  IPv6 335624      0t0  TCP *:http (LISTEN)

 

2.[root@test2 application]# ps -ef | grep httpd  #查看httpd进程

root      6417     1  0 02:07 ?        00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6418  6417  0 02:07 ?        00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6419  6417  0 02:07 ?        00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6421  6417  0 02:07 ?        00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6423  6417  0 02:07 ?        00:00:00 /application/apache2.2.25/bin/httpd -k start

root      6619 10864  0 02:09 pts/4    00:00:00 grep httpd

 

3.在浏览器输入192.168.1.3(这是安装apache服务的ip地址)

 

2.3.7 故障排查

如果不能显出It works,请从下面原因依次排查

1. iptables防火墙和selinux是否关闭

[root@test2 ~]# /etc/init.d/iptables status

防火墙已停

如果是生产环境,请允许80端口的访问,而不是关闭防火墙

iptables  -I INPUT -p tcp --dport 80 -j ACCEPT

 

关闭selinux

临时关闭:setenforce 0

永久关闭:/etc/selinux/config

 

2. 通过下面命令确认httpd端口是否存在

[root@test2 ~]# netstat -tupnl |grep :80

tcp     0      0 :::80        :::*               LISTEN      6417/httpd

 

3. 查看是否有http进程存在

[root@test2 application]# ps -ef | grep httpd

root      6417     1  0 02:07 ?        00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6418  6417  0 02:07 ?        00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6419  6417  0 02:07 ?        00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6421  6417  0 02:07 ?        00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6423  6417  0 02:07 ?        00:00:00 /application/apache2.2.25/bin/httpd -k start

root      6619 10864  0 02:09 pts/4    00:00:00 grep httpd

 

4. 在服务器本地wget http://192.168.1.3测试

#注意2和3都不符合要求,4就不用查了

 

5. 查看apache服务的日志

[root@test2 ~]# tail -100 /application/apache/logs/error_log

 

 

2.4  Apache目录结构介绍(注释过的重点掌握)

[root@test2 apache]# ls -l /application/apache/

总计 112

drwxr-xr-x  2 root root  4096 10-19 01:42 bin

drwxr-xr-x  2 root root  4096 10-19 01:43 build

drwxr-xr-x  2 root root  4096 10-19 01:42 cgi-bin

drwxr-xr-x  4 root root  4096 10-19 01:42 conf

drwxr-xr-x  3 root root  4096 10-19 01:42 error

drwxr-xr-x  2 root root  4096 06-29 04:37 htdocs

drwxr-xr-x  3 root root  4096 10-19 01:42 icons

drwxr-xr-x  2 root root  4096 10-19 01:43 include

drwxr-xr-x  3 root root  4096 10-19 01:42 lib

drwxr-xr-x  2 root root  4096 10-19 02:07 logs

drwxr-xr-x  4 root root  4096 10-19 01:43 man

drwxr-xr-x 14 root root 12288 06-29 04:38 manual

drwxr-xr-x  2 root root  4096 10-19 01:42 modules

 

2.4.1 bin目录介绍

[root@test2 apache]# tree bin

bin

|-- ab   #Apache HTTP性能测试工具,简单易用

|-- apachectl  #Apache的启动脚本

|-- apr-1-config

|-- apu-1-config

|-- apxs  #一个为Apache HTTP服务器编译和安装拓展模块的工具,在进行DSO方式编译模块时用到,后文在编译php时就用到此参数,--with-apxs2=/application/apache/bin/apxs

|-- checkgid

|-- dbmmanage

|-- envvars

|-- envvars-std

|-- htcacheclean   #这是情理磁盘缓冲区的命令,需要在编译时指定相关参数才能使用,一般很少使用

|-- htdbm

|-- htdigest

|-- htpasswd   #建立和更新基本认证文件,配置nagios等监控服务时会用到

|-- httpd      #为apache的程序控制命令,apachectl执行时会调用到httpd

|-- httxt2dbm

|-- logresolve

`-- rotatelogs   #apache自带的日志轮询命令,但老师习惯用cronlog代替

 

0 directories, 17 files

 

2.4.2 conf目录介绍

[root@test2 apache]# tree conf -L 1

conf

|-- extra   #这是额外的apache配置文件目录,会经常访问修改,httpd-vhosts.conf就在此目录

|-- httpd.conf  #apache的主配置文件,每一行的命令参数都要弄清楚

|-- magic

|-- mime.types

`-- original

 

2 directories, 3 files

 

2.4.3 htdocs目录介绍

#htdocs目录是编译安装时默认的站点目录,如果是yum的方式安装,就不一定是这个目录了,在主配置文件httpd.conf文件中的DocumentRoot参数设定的。

[root@test2 apache]# tree htdocs/

htdocs/

`-- index.html   #默认的首页文件,在主配置文件httpd.conf中DirectoryIndex参数设定的。

 

0 directories, 1 file

 

2.4.4  logs目录介绍

[root@test2 apache]# tree logs/

logs/

|-- access_log   #apache的默认访问日志

|-- cgisock.6417

|-- error_log    #apache的错误日志

`-- httpd.pid    #apache的进程文件,把主进程文件写进来,如果要杀死apache进程,只要杀死这个主进程就可以了

 

0 directories, 4 files

[root@test2 apache]# ps -ef |grep httpd |grep -v grep

root      6417     1  0 02:08 ?      00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6418  6417  0 02:08 ?     00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6419  6417  0 02:08 ?     00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6421  6417  0 02:08 ?     00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6423  6417  0 02:08 ?     00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    6754  6417  0 02:12 ?     00:00:00 /application/apache2.2.25/bin/httpd -k start

[root@test2 apache]# ps -ef |grep httpd |grep -v grep |awk '{print $2}'

6417

6418

6419

6421

6423

6754

[root@test2 apache]# cat logs/httpd.pid             

6417

 

2.4.5 modules目录介绍

#apache的模块目录

[root@test2 apache]# tree modules/

modules/

`-- httpd.exp

 

0 directories, 1 file

 

2.5 Apache主配置文件httpd.conf介绍

#ServerRoot: The top of the directory tree under which the server's configuration, error, and log files are kept.

ServerRoot  "/application/apache2.2.25" 

 

#Change this to Listen on specific IP addresses as shown below to prevent Apache from glomming onto all bound IP addresses.

#Listen 12.34.56.78:80

Listen 80

 

#If you wish httpd to run as a different user or group, you must run httpd as root initially and it will switch. 

#User/Group: The name (or #number) of the user/group to run httpd as.It is usually good practice to create a dedicated user and group for  running httpd, as with most system services.

User daemon

Group daemon

 

# ServerAdmin: Your address, where problems with the server should be e-mailed.  This address appears on some server-generated pages, such as error documents.     

e.g. admin@your-domain.com

ServerAdmin you@example.com

 

# ServerName gives the name and port that the server uses to identify itself.

# This can often be determined automatically, but we recommend you specify it explicitly to prevent problems during startup.

# If your host doesn't have a registered DNS name, enter its IP address here.

#ServerName www.example.com:80

ServerName 127.0.0.1:80  #如果使用注释的写法,在启动apache的时候,会有提示你修改这个参数,但是依然会成功启动

 

#DocumentRoot: The directory out of which you will serve your documents. By default, all requests are taken from this directory, but symbolic links and aliases may be used to point to other locations.

DocumentRoot "/application/apache2.2.25/htdocs"

 

<Directory />

Options FollowSymLinks  #允许符号链接,但是不允许在没有首页文件的情况下,浏览所有的文件夹

# AllowOverride controls what directives may be placed in .htaccess files. It can be "All", "None", or any combination of the keywords:  Options FileInfo AuthConfig Limit

AllowOverride None     #不允许被重写,即不支持在.htaccess文件重写这个目录

Order deny,allow

 Deny from all

</Directory>

 

<Directory "/application/apache2.2.25/htdocs">

  Options Indexes FollowSymLinks

  AllowOverride None

  Order allow,deny

  Allow from all

</Directory>

 

# DirectoryIndex: sets the file that Apache will serve if a directory is requested.

<IfModule dir_module>

    DirectoryIndex index.html  #可以配置多个默认首页,会优先访问前面的页面

</IfModule>

 

# The following lines prevent .htaccess and .htpasswd files from being viewed by Web clients.

<FilesMatch "^\.ht">    

    Order allow,deny

    Deny from all    #阻止客户端访问匹配以”.ht”开头的文件

    Satisfy All

</FilesMatch>

 

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   #日志的级别为警告级别

老师对httpd.conf的注释

[root@test2 apache]# egrep -v "^.*#|^$" conf/httpd.conf | nl

1  ServerRoot "/application/apache2.2.25"  #apache的根目录,应只能root访问

2  Listen 80  #apache监听的端口,默认为80端口,如果同时监听81端口,可以另加一行

3  <IfModule !mpm_netware_module>

 

#3~8行为apache的用户和组配置,即在apache在运行时以此用户的身份启动服务和读取文件

 

4  <IfModule !mpm_winnt_module>

5  User daemon   #apache的用户,默认为daemon,建议修改下,如”qinbf”

6  Group daemon  #apache的用户组,默认为daemon,建议修改下,如”qinbf”

7  </IfModule>

8  </IfModule>

 

9  ServerAdmin you@example.com  #系统管理员的信箱

10  DocumentRoot "/application/apache2.2.25/htdocs"  #apache的默认web站点,路径结尾不要加斜线

 

#11~16行行为对根目录的限制

 

11  <Directory />

12      Options FollowSymLinks #表示允许使用符号链接,没加的选项默认禁用

13      AllowOverride None    #表示禁止用户对目录配置文件(.htaccess进行修改重载,普通站点目录此项建议不开)

14      Order deny,allow  #以deny方式优先处理,没有明确说明拒绝的都将通过

15      Deny from all     #明确指出,拒绝所有访问

16  </Directory>

17  <Directory "/application/apache2.2.25/htdocs">

18      Options Indexes FollowSymLinks

19      AllowOverride None

20      Order allow,deny

21      Allow from all

22  </Directory>

23  <IfModule dir_module>

24      DirectoryIndex index.html  #配置默认的apache首页文件,首页文件可以有多个,每个文件用空格分开,调用时,前面优先匹配。

25  </IfModule>

26  <FilesMatch "^\.ht">  #防止.htaccess和.htpasswd等重要隐藏文件被web用户查看

27      Order allow,deny

28      Deny from all

29      Satisfy All

30  </FilesMatch>

31  ErrorLog "logs/error_log"   #错误日志路径

32  LogLevel warn

33  <IfModule log_config_module>

34      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

#访问日志格式

35      LogFormat "%h %l %u %t \"%r\" %>s %b" common  #普通访问日志格式

36      <IfModule logio_module>

37        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

38      </IfModule>

39      CustomLog "logs/access_log" common   #默认站点访问日志配置

40  </IfModule>

#41~51行为cgi的配置,没有特殊需求应考虑全部注释掉或者干脆删掉

41  <IfModule alias_module>

42      ScriptAlias /cgi-bin/ "/application/apache2.2.25/cgi-bin/"

43  </IfModule>

44  <IfModule cgid_module>

45  </IfModule>

46  <Directory "/application/apache2.2.25/cgi-bin">  #允许cgi路径访问

47      AllowOverride None

48      Options None

49      Order allow,deny

50      Allow from all

51  </Directory>

52  DefaultType text/plain  #DefaultType:定义不能确定MIME类型时服务器提供的默认MIME类型.如果服务主要包含text或HTML文档,”text/plain”是一个很好的选择

53  <IfModule mime_module>

54      TypesConfig conf/mime.types

55      AddType application/x-compress .Z 

56      AddType application/x-gzip .gz .tgz

57  </IfModule>

58  <IfModule ssl_module>

59  SSLRandomSeed startup builtin

60  SSLRandomSeed connect builtin

61  </IfModule>

 

2.6  apach扩展的配置文件

2.6.1

# Virtual hosts

#Include conf/extra/httpd-vhosts.conf

#如果取消此行前面的#号,表示开启虚拟主机的配置,即加载conf/extra/httpd-vhosts.conf配置文件

 

[root@test2 apache]# tree -L 2 conf/extra/

conf/extra/

|-- httpd-autoindex.conf

|-- httpd-dav.conf

|-- httpd-default.conf    #这个文件里配置的是apache的相关服务参数如:超时时间、保持连接时间

|-- httpd-info.conf

|-- httpd-languages.conf  #语言支持配置

|-- httpd-manual.conf

|-- httpd-mpm.conf   #服务器池管理,也就是优化apache的一个配置文件,常用的模式有worker模式和profork模式,偶人情况是profork模式。

|-- httpd-multilang-errordoc.conf

|-- httpd-ssl.conf      #提供apache SSL支持配置文件

|-- httpd-userdir.conf

`-- httpd-vhosts.conf   #虚拟主机的配置文件

 

0 directories, 11 files

 

2.6.2  apache虚拟主机配置文件介绍

[root@test2 extra]# egrep -v "^#|^$" httpd-vhosts.conf

NameVirtualHost *:80

#这表示使用基于名称的虚拟主机配置,这是产品环境下最常用的配置。

<VirtualHost *:80>  #定义一个虚拟主机,监听主机所有ip地址80端口上提供的http请求

    ServerAdmin webmaster@dummy-host.example.com

    DocumentRoot "/application/apache2.2.25/docs/dummy-host.example.com"

    ServerName dummy-host.example.com

#这里配置提供服务的域名,如www.baidu.com,如果是生产环境需要把www.baidu.com解析到服务器配置的外网VIP或IP上,如果是测试,也可以在本机上做hosts解析。

    ServerAlias www.dummy-host.example.com

#这是配置虚拟主机的别名,也就是可以配置多个域名访问同一个站点,但是需要apache mod_alias模块支持

    ErrorLog "logs/dummy-host.example.com-error_log"

#这里是配置apache错误的日志路径

    CustomLog "logs/dummy-host.example.com-access_log" common

#访问日志配置,在生产环境用,我们一般用combined格式代替common格式,以获得更多的格式输出。

</VirtualHost>

<VirtualHost *:80>

    ServerAdmin webmaster@dummy-host2.example.com

    DocumentRoot "/application/apache2.2.25/docs/dummy-host2.example.com"

    ServerName dummy-host2.example.com

    ErrorLog "logs/dummy-host2.example.com-error_log"

    CustomLog "logs/dummy-host2.example.com-access_log" common

</VirtualHost>

提示:在虚拟主机配置文件httpd-vhosts.conf中,我们发现了有些参数选项是和httpd.conf重复的。这里是局部(httpd-vhosts.conf)优先原则,如果局部没有配置,则使用全局配置。

2.7 Apache基于域名的虚拟主机实战配置

1.开启主配置文件httpd.conf包含httpd-vhost.conf文件的配置

[root@test2~]#cp /application/apache/conf/httpd.conf/application/apache/conf/httpd.conf.qinbf.2013.10.21 #备份

[root@test2~]# sed -i 's#\#Include conf/extra/httpd-vhosts.conf#Include conf/extra/httpd-vhosts.conf#' /application/apache/conf/httpd.conf   #使用sed命令快速修改配置文件

[root@test2 ~]# grep "Include conf/extra/httpd-vhosts.conf" /application/apache/conf/httpd.conf                                           

Include conf/extra/httpd-vhosts.conf   #验证配置文件

2.修改httpd-vhost.conf文件的配置

[root@test2 extra]# egrep -v "\#|^$" httpd-vhosts.conf

NameVirtualHost *:80

<VirtualHost *:80>

    ServerAdmin 530917@868.com

    DocumentRoot "/var/blog"

    ServerName blog.qinbf.com

    ServerAlias qinbf.com

    ErrorLog "logs/blog.qinbf.com-error_log"  #错误日志路径

    CustomLog "logs/blog.qinbf.com-access_log" common  #普通访问日志路径

</VirtualHost>

3.检查修改过的配置文件的语法

[root@test2 extra]# ../../bin/apachectl -t

#生产环境这一步特别重要,它可以在重启前检查出配置中的语法错误,避免在重启的过程中宕机,这在正规互联网公司是无法接受的

Warning: DocumentRoot [/var/blog] does not exist

Syntax OK

[root@test2 extra]# mkdir /var/blog

[root@test2 extra]# chown daemon.daemon /var/blog

[root@test2 extra]# ll -d /var/blog/

drwxr-xr-x 2 daemon daemon 4096 10-21 23:56 /var/blog/

[root@test2 extra]# ../../bin/apachectl -t

Syntax OK

4.执行graceful重启apache

[root@test2 extra]# ../../bin/apachectl graceful

#这里参数时graceful,而不是restart。这个参数可以使正在访问的用户无法感知,即重启时不会中断用户的请求

5.增加网站站点的授权

#由于/var/blog在httpd.conf文件中没有授权,所以需要增加授权

<Directory /var/blog>

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow

    Deny from all

</Directory>

 

 

2.8 基于IP的虚拟主机实战配置

1.增加ip

[root@test2 ~]# ifconfig eth0:20 192.168.1.20 netmask 255.255.255.0

[root@test2 ~]# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0C:29:DF:E8:87 

          inet addr:192.168.1.3  Bcast:192.168.1.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fedf:e887/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:33305704 errors:0 dropped:0 overruns:0 frame:0

          TX packets:55719435 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:3249594786 (3.0 GiB)  TX bytes:5437750706 (5.0 GiB)

 

eth0:20   Link encap:Ethernet  HWaddr 00:0C:29:DF:E8:87 

          inet addr:192.168.1.20  Bcast:192.168.1.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

 

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:16436  Metric:1

          RX packets:58474 errors:0 dropped:0 overruns:0 frame:0

          TX packets:58474 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:5146512 (4.9 MiB)  TX bytes:5146512 (4.9 MiB)

2.修改配置文件

NameVirtualHost *:80

<VirtualHost  192.168.1.3:80>

    ServerAdmin 530917@868.com

    DocumentRoot "/var/blog"

    ServerName blog.qinbf.com

    ServerAlias qinbf.com

    ErrorLog "logs/blog.qinbf.com-error_log"

    CustomLog "logs/blog.qinbf.com-access_log" common

</VirtualHost>

 

<VirtualHost  192.168.1.20:80>

    ServerAdmin 530917@868.com

    DocumentRoot "/var/bbs"

    ServerName bbs.qinbf.com

    ServerAlias qinbf.com

    ErrorLog "logs/bbs.qinbf.com-error_log"

    CustomLog "logs/bbs.qinbf.com-access_log" common

</VirtualHost>

[root@test2 ~]# /application/apache/bin/apachectl -t

Syntax OK

[root@test2 ~]# /application/apache/bin/apachectl graceful

[root@test2 ~]# ps -ef |grep httpd

daemon    4501  6417  0 12:45 ?     00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    4502  6417  0 12:45 ?     00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    4504  6417  0 12:45 ?     00:00:00 /application/apache2.2.25/bin/httpd -k start

daemon    4506  6417  0 12:45 ?     00:00:00 /application/apache2.2.25/bin/httpd -k start

root      4613  4396  0 12:48 pts/2   00:00:00 grep httpd

root      6417     1  0 Oct21 ?      00:00:01 /application/apache2.2.25/bin/httpd -k start

 

3.在浏览器中分别输入192.168.1.3和192.168.1.20来访问站点的内容

 

2.9 基于端口的虚拟主机实战配置

1.需要在httpd.conf文件下面增加监听端口

Listen 80

Listen 8080

Listen 8081

 

2.修改httpd-vhost.conf文件,把80端口换成其他端口号

3.在浏览器输入http://www.qinbf.com:8080或者http://192.168.1.3:8080才能访问(如果是默认80端口,不需要指定是http协议)

 

 

三 mod_expires模块介绍

3.1 mod_expires介绍

mod_expires允许通过apache配置文件控制HTTP的”Expires:”和”Cache-Control:”头内容,这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期可以设置为相对于源文件的最后修改时刻或客户端的访问时刻。

这些HTTP头向客户端表明了内容的有效性和持久性。如果客户端本地有缓存,则内容就可以从缓存而不是从服务器读取。然后客户端会检查缓存中的副本,看看是否过期或者是小,已决定是否从新从服务器获得内容更新。

 

3.2模块安装方法

常规安装方法:

1. 编译时可加入如下参数:

--enable-expires

 

2. mod_expires DSO安装方法

cd /root/tools/httpd-2.2.25/modules/metadata   ç切到apache软件目录mod_expires程序下

#这个是解压软件包的路径

/application/apache/bin/apxs -c -i -a mod_expires.c ç以dso的方式编译到apache中

ll /application/apache2.2.25/modules/mod_expires.so ç检查mod_expires

3. mod_expires  DOS安装出错一例

 

 

注意:如果使用.config的方式编译了mod_expires,又以DSO的方式安装mod_expires模块,检查apache的雨法会出现如下报错提示:(可以在httpd.conf文件中,注释该模块)

[root@test2 metadata]# /application/apache/bin/apachectl -t

httpd: Syntax error on line 54 of /application/apache2.2.25/conf/httpd.conf: module expires_module is built-in and can't be loaded

 

3.3   mod_expires在apache中的应用

[root@oldboy extra]# cat httpd-vhosts.conf---

NameVirtualHost *:80

NameVirtualHost *:8091

NameVirtualHost *:8092

 

#<VirtualHost *:80>

#DocumentRoot "/var/html/tmp"

#</VirtualHost>

 

<VirtualHost *:80>

    ServerAdmin 31333741@qq.com

    DocumentRoot "/var/html/blog"

    ServerName blog.etiantian.org

    ServerAlias etiantian.org

    ErrorLog "/app/logs/blog-error_log"

    #CustomLog "/app/logs/blog-access_log" common

    CustomLog "|/usr/local/sbin/cronolog /app/logs/access_blog_%w.log" combined

    ExpiresActive on

    ExpiresDefault "access plus 12 month"

    ExpiresByType text/html "access plus 12 months"

    ExpiresByType text/css "access plus 12 months"

    ExpiresByType image/gif "access plus 12 months"

    ExpiresByType image/jpeg "access plus12  12 months"

    ExpiresByType image/jpg "access plus 12 months"

    ExpiresByType image/png "access plus 12 months"

    EXpiresByType application/x-shockwave-flash "access plus 12 months"

    EXpiresByType application/x-javascript "access plus 12 months"

    ExpiresByType video/x-flv "access plus 12 months"

#这一串代码可以加在httpd.conf文件的最后,也可以加在httpd-vhost.conf文件中虚拟主机配置的后面

<ifmodule mod_deflate.c>

        DeflateCompressionLevel 9

        SetOutputFilter DEFLATE

        AddOutputFilterByType DEFLATE text/html text/plain text/xml

        AddOutputFilterByType DEFLATE application/javascript

        AddOutputFilterByType DEFLATE text/css

    </ifmodule>

 

</VirtualHost>

 

<VirtualHost *:8091>

    ServerAdmin 31333741@qq.com

    DocumentRoot "/var/html/bbs"

    ServerName bbs.etiantian.org

    ServerAlias etiantian.org

    ErrorLog "/app/logs/bbs-error_log"

   # CustomLog "/app/logs/bbs-access_log" common

    CustomLog "|/usr/local/sbin/cronolog /app/logs/access_bbs_%w.log" combined

</VirtualHost>

使用curl  -I  URL的方式查看该文件的过期时间

 

3.4   生产环境mod_expire优点

3.4.1          提升用户体验

3.4.2          节约网站带宽成本

3.4.3          节约网站服务器及维护成本

 

3.5   expires失效条件

3.5.1          用户主动清空缓存

3.5.2          设置的缓存时间到期

 

3.6控制expires方法

3.6.1 如果网站更新功能或更新文件后,用户再访问时的内容还是旧的,怎么解决这个问题

解答:

1)    首先,对于大多数公司业务来说,图片等资源一般很少会去修改,因此可以修改为10年

2)    对于js,css偶尔会变化的资源,一般expires设置时间比较短,比如1-30天

3)    在更新文件上采取策略,如,更新后以新的文件名发布

 

四 mod_deflate模块介绍

mod_deflate模块提供了DEFLATE输出过滤器,允许服务器在将输出内容在发送到客户端之前进行压缩,以节约带宽。

 

两种安装方式:

  1. 静态编译,即在编译的时候加上--enable-deflate(bin/apachectl -l 查看是否安装)
  2. 以DSO的方式执行安装(bin/apachectl  -M查看是否安装)

 

只需要把下面的配置复制到http.conf结尾保存,即可让所有的虚拟主机生效

<ifmodule mod_deflate.c>

DeflateCompressionLevel 9  #压缩的等级,越大压缩等级越高,消耗CPU越高

SetOutputFilter DEFLATE    #启用压缩

AddOutputFilterByType DEFLATE text/html text/plain text/xml   #这三行设置压缩类型

AddOutputFilterByType DEFLATE application/javascript

AddOutputFilterByType DEFLATE text/css

</ifmodule>

 

同样适用curl  -I URL的方式查看,还可以使用firefox插件查看

 

 

五 Raid技术及生产应用场景

5.1 什么是Raid

Raid是一种把多块独立的磁盘(物理磁盘)按不同的方式组合起来形成一个磁盘组,在逻辑上看起来就像一个大磁盘,从而提供比单个物理磁盘更大的存储容量或更高的存储性能,同时又提供不同级别数据冗余备份的一种技术

 

5.2       Raid级别介绍

把多个物理磁盘通过不同技术方式组成磁盘阵列,这个不同的技术方式就被称为R级别

 

Raid级别一般有:Raid0、Raid 1、Raid 0+1(也称Raid 10)、Raid2、Raid3、Raid4、Raid5、Raid6、Raid7、Raid53

生产场景常用的Raid的级别:Raid0、Raid1、Raid5、Raid10

Raid级别

关键优点

关键缺点

实际应用场景

RAID0

读写速度最快

没有冗余

MySQL Slave,集群的节点RS

RAID1

100%冗余,镜像

读写性能一般,成本高

单独的,数据重要且不能宕机的业务,监控,系统盘

RAID5

具备一定性能和冗余,可以坏一块盘。读性能不错

写入性能不高

一般的业务都可以用

RAID0+1

RAID10

读写速度很快,100%冗余

成本高

性能和冗余要求都很好的业务。数据库主库和存储的主节点

 

下表提供了7级RAID的简单定义

RAID级别

描述

速度

容错性能

RAID 0

磁盘分段

磁盘并行输入/出

RAID 1

磁盘镜像

没有提高

有(允许单个磁盘错)

RAID 2

磁盘分段加海明码纠错

没有提高

有(允许单个磁盘错)

RAID 3

磁盘分段加专用奇偶校验盘

磁盘并行输入/出

有(允许单个磁盘错)

RIAD 4

需异步磁盘

磁盘并行输入/出

有(允许单个磁盘错)

RAID 5

磁盘分段加奇偶校验分布在各磁盘

磁盘并行输入/出比RAID0稍慢

有(允许单个磁盘错)

RAID 0+1

速度快、完全容错、成本高

速度快

有(允许50%个磁盘错)

 

5.3       Raid技术分类

Raid分为软Raid和硬Raid:

1. 软Raid技术

在Linux下安装系统过程中或者安装系统后通过自带的软件就能实现软Raid功能,使用软Raid可省去买昂贵的硬件RAID和福建就能极大地增强磁盘的IO性能和可靠性,而且配置灵活、管理方便

 

2. 硬Raid技术

 基于硬件的RAID解决方案比基于软件RAID技术在使用性能上和服务性能上更胜一筹,具体表现在检测和修复多位错误的能力、错误磁盘自动检测和阵列重建等方面。在实际的生产环境中,基于硬件的RAID解决方案应该是我们的首选。互联网公司常用的生产DELL服务器,默认的就会支持RAID0、1,如果要支持RAID5、10,就要买RAID卡

 

5.4       LVM和RAID的区别

LVM,逻辑管理卷,最大用途是可以灵活的管理磁盘的容量,让磁盘分区任意放大或缩小,便于更好的管理磁盘空间。如果过分强调性能与备份,那还是应该使用RAID功能

 

LVM:灵活的管理磁盘的容量,有一定的冗余和性能提升,但很弱

RAID:更侧重性能和数据的安全,但是不能任意的放大或缩小分区,必须重新分区。

 

用RAID最直接的好处就是:

1)  提升数据安全性

2)  提升数据读写性能

3)  提供更大的单一逻辑磁盘数据容量存储

 

5.5       RAID0描述

RAID0 在所有RAID级别中有最高的存储性能。原理是把连续的数据分散到多个盘上存取。

 

要制作RAID 0至少要有一块物理盘,一般用来做RAID的不同磁盘大小最好一样(所有RAID都是如此),充分发挥并行优势。数据分散存储于不同的磁盘上,在读写的时候可以实现并发。但是没有容错功能,任何一个磁盘的损坏会导致整个RAID数据全部丢失。

 

逻辑图:

 

RAID 0的特点使其特比适用于对性能要求较高,而对数据安全不太在乎的领域,生产应用场景:

1)   负载均衡集群下面的多个相同RS节点服务器

2)    分布式文件存储下面的主节点或CHUNK SERVER

3)   MySQL主从复制的多个Slave服务器

4)   对性能要求很高,对冗余要求很低的相关业务

 

5.6       RAID1描述

RAID 1的宗旨是最大限度的保证用户数据的可用性和可修复性。RAID 1的操作方式是把用户写入一个磁盘的数据百分之百地自动复制到另外一个磁盘上,从而实现存储双份的数据。

整个RAID大小等于两个磁盘中最小的那块磁盘的容量,数据有50%的冗余,在存储同时写入两块磁盘,实现了数据完整备份,但相对降低了写入性能,但是读取数据时可以并发,相当于两块Raid 0的读取效率(有待实践验证)

 

逻辑图:

 

当读取数据时,系统先从RAID1的源盘读取数据,如果读取数据成功,则系统不会去管备份盘上的数据;如果读取源盘数据失败,则系统自动转而读取备份盘上的数据,不会造成用户工作任务的中断(有待验证)

 

5.7       RAID 5描述

RAID 5是一种存储性能、数据安全和存储成本兼顾的存储解决方案。

   RAID 5需要三块或以上的物理磁盘,可以提供热备实现故障的恢复;采用就校验,可靠性强,且只有同时坏两块硬盘时数据才会完全损坏,只损坏一块硬盘时,系统会根据就校验位重建数据,临时提供服务;此时如果有热备盘,系统还会自动在热备盘上重建故障磁盘上的数据

 

RAID 5不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各个不同的磁盘上。当RAID 5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。

 

关注点

描述

容量

损失一块盘的数据容量

性能

RAID 5具有和RAID 0相似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比单个磁盘的写入操作稍慢

冗余

RAID 5数据安全保障程度比RAID 1低而磁盘空间利用率要比RAID 1高

场合

RAID 5可以理解是RAID 0 RAID 1的折中方案。适合对性能和冗余都有一定要求,又都不是十分高的情况。MySQL的主从库都可以,存储也可以

特点

容量损失一块盘,写数据通过奇偶校验

 

5.8       RAID 10

 

大话存储对RAID 10的介绍

 

 

国外资料

 

 

5.9  DELL R710使用6块盘实践RAID制作

 

RAID 0 支持1块盘到多快盘,容量是所有盘之和

RAID 1 只支持2块盘,容量损失一块盘

RAID 5 最少三块盘,不管硬盘数量多少,只损失一块盘容量

RAID 6 最少4块盘,5块盘也可以,损失2块盘,不管硬盘多少,只损失两块盘容量

RAID 10 最少4块盘,必须偶数块硬盘,不管硬盘多少,都损失一半的容量,不支持虚拟磁盘

 

常见的RAID 比较

RAID 级别

RAID 0

RAID 1

RAID 5

RAID 10

别名

带区

镜像

分布奇偶校验

镜像阵列带区

容错性

冗余类型

复制

奇偶校验

复制

热备盘选项

读性能

较高

随机写性能

较高

连续写性能

较高

最小硬盘数

1

仅2

3

4

可用容量

N*单块硬盘容量,N一般不大于16

(N/2)*单块硬盘容量,N一般不大于16

(N-1)*单块硬盘容量,N一般不大于16

(N/2)*单块硬盘容量,N一般不大于16

典型应用环境

迅速读写,安全性能要求不高,如图形工作站

随机写入数据,安全性要求高,如服务器、数据库存储领域

随机数据传输,安全性要求高,如数据库,存储

数据量大,安全性要求高,如银行,金融

 

 

 

六 Nginx基础应用实践

6.1  Nginx介绍

与Apache相比,在性能上,nginx占用更少的系统资源,特定的场景应用(静态数据)能支持更多的并发连接,达到更高的访问效率;在功能上,Nginx是一个优秀的反向代理和负载均衡服务器,也可以作为缓存服务器。

 

6.2  Nginx有点总结:

  1. 高并发:能支持1-2万甚至更多的并发连接(静态小文件环境下)
  2. 内存消耗少:在3万并发连接下,开启的10个Nginx进程消耗不到200M内存
  3. 可以做HTTP反向代理,即负载均衡功能,相当于专业的haproxy软件或lvs的功能
  4. 内置对RS服务器健康检查功能:如果Nginx代理后端某台Web服务器宕机,不会影响前端的访问,这个功能还比较弱,需要后需改进。
  5. 通过cache插件可以实现类似squid等专业的缓存软件实现的功能

     Nginx最主要的优点是:支持kqueue(FreeBSD 4.1+),epoll(Linux 2.6+)等网络IO事件模型,由此来支持高并发的连接。Apache支持的是select模型。

 

 

6.3 Nginx的主要应用场景

Web服务器

1) 结合FastCGI运行PHP、JSP等程序

2) 运行HTML,JS,CSS,小图片等静态数据

代理服务器

3) 做反向代理或负载均衡、规则过滤

缓存服务器

5)   加cache插件实现对web服务器缓存功能

 

6.4 主流服务器产品对比

1. apache

(1) 2.2版本非常强大,官方说明,2.4版本性能超强

(2) Perfork模式取消了进程创建开销,性能很高

(3) 处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在于Apache本身

(4) 高并发消耗系统资源相对多一些

2. Nginx

(1) 基于异步IO模型,性能强,能够支持上万并发

(2) 对小文件支持很好,性能很高(限静态小文件)

(3) 代码优美。扩展必须编进进主进程

(4) 消耗系统资源比较低

 

 

3 为什么Nginx总体性能比Apache高

 

 

6.5  Nginx基础安装

6.5.1  pcre安装

Pcre,中文兼容正则表达式,安装pcre库是为了使Nginx支持HTTP  Rewrite模块

wget http://exim.mirror.fr/pcre/pcre-8.30.tar.gz

tar  zxf  pcre-8.30.tar.gz

cd  pcre-8.30

./configure

make && make install

 

注意:在安装的过程中遇到了“libtool: compile: unrecognized option `-DHAVE_CONFIG_H'”。这是由于没有安装gcc-c++. yum install gcc-c++即可解决。

 

6.5.2  Nginx安装

wget  http://nginx.org/download/nginx-1.2.9.tar.gz

 

useradd  nginx  -s  /sbin/nologin  -M  #创建nginx这个用户,可随意起名

 

tar zxf  nginx-1.2.9.tar.gz

 

cd  nginx-1.2.9

 

./configure --user=nginx --group=nginx --prefix=/application/nginx-1.2.9 --with-http_stub_status_module --with-http_ssl_module

 

make && make install

 

ln  -s  /application/nginx-1.2.9  /application/nginx  #在版本升级的时候很重要

 

./configure 后参数说明: (更多可使用./configure  --help查询)

--user=USER                      set non-privileged user for

--group=GROUP                   set non-privileged group for

--with-http_stub_status_module     enable ngx_http_stub_status_module

--with-http_ssl_module             enable ngx_http_ssl_module

 

6.3  Nginx的启动

[root@test2 nginx-1.2.9]# /application/nginx/sbin/nginx

/application/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

#这是由于libpcre.so.1文件无法找到,如果是yum安装,不会出现这个错误

 

[root@test2 nginx-1.2.9]# find / -type f -name "libpcre.so.*"

/lib64/libpcre.so.0.0.1

/usr/local/lib/libpcre.so.1.0.0

/root/tools/pcre-8.30/.libs/libpcre.so.1.0.0

 

[root@test2 nginx-1.2.9]# vi /etc/ld.so.conf

include ld.so.conf.d/*.conf

/usr/local/lib/

[root@test2 nginx-1.2.9]# ldconfig  #使配置文件生效

[root@test2 nginx-1.2.9]# /application/nginx/sbin/nginx -t

nginx: the configuration file /application/nginx-1.2.9/conf/nginx.conf syntax is ok

nginx: configuration file /application/nginx-1.2.9/conf/nginx.conf test is successful

 

验证启动:

[root@test2 nginx-1.2.9]# lsof -i:80

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

nginx   16853  root    6u  IPv4  34743      0t0  TCP *:http (LISTEN)

nginx   16854  nginx    6u  IPv4  34743      0t0  TCP *:http (LISTEN)

 

疑难问题:

[root@test2 nginx-1.2.9]# /application/nginx/sbin/nginx

nginx: [emerg] getpwnam("nginx") failed

#这是由于没有创建用户导致的,重现这个问题只需要执userdel  nginx

 

 

6.4  Nginx配置文件

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  localhost;

        location / {

            root   html;

            index  index.html index.htm;

        }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    }

}

posted @ 2017-04-22 12:04  fengze  阅读(324)  评论(0编辑  收藏  举报