@cdmonkey
2017-01-22T14:39:59.000000Z
字数 10544
阅读 1125
Apache
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=21266384&id=186469
主流Web服务器产品对比说明:
性能非常稳定强大,据官方说,其
2.4
版本性能超强。
Prefork模式取消了进程创建的开销,性能很高。
处理动态业务数据时,因关联到后端的引擎和数据库,所以瓶颈并不在于Apache本身。
高并发时所消耗的系统资源相对要高一些。
增加扩展模块的方式为“DSO”方式(使用apxs
指令)。
总体来说,功能多,更稳定,更安全,插件丰富,对于动态业务的支持非常出色。
基于异步IO模型(epoll、kqueen),性能强,能够支持上万并发。
对小文件支持很好,性能很高(限于静态小文件<1M
)。
代码简洁,扩展库必须编译进主程序。
消耗系统资源比较低。
处理纯动态数据时,其优势并不明显,尤其是处理大文件,而阿帕奇在动态大文件的场景下性能更好些。
#需要安装的依赖包:
[root@WEB-A1 ~]# yum install -y zlib zlib-devel
[root@WEB-A1 ~]# cd tools/
[root@WEB-A1 tools]# wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.27.tar.gz
[root@WEB-A1 tools]# tar xvf httpd-2.2.27.tar.gz
[root@WEB-A1 tools]# cd httpd-2.2.27
------------------------------------
#开始编译安装:
./configure \
--prefix=/application/apache2.2.27 \
--enable-deflate \
--enable-expires \
--enable-headers \
--enable-modules=most \
--enable-so --with-mpm=worker \
--enable-rewrite
make && make install
[root@WEB-A1 httpd-2.2.27]# ln -s /application/apache2.2.27/ /application/apache
结束安装后需要做的是启动服务:
#检查配置文件的语法:
[root@WEB-A1 ~]# /application/apache/bin/apachectl -t
---------------------------
#这里有可能会出现如下的信息:
httpd: apr_sockaddr_info_get() failed for WEB-A1
httpd: Could not reliably determine the servers fully qualified domain name, using 127.0.0.1 for ServerName
Syntax OK
#这个问题应该是没有在主配置文件中设定“ServerName”。所以会用主机上的名称来取代,首先会去找hosts文件中有没有主机的定义。解决办法也很简单,就是在主配置文件中进行定义,或者在hosts文件中添加自己的主机名。
[root@WEB-A1 ~]# vim /application/apache/conf/httpd.conf
#ServerName www.example.com:80
#将上面这行的注释去掉,被修改为下面的内容:
ServerName localhost:80
---------------------------
#接下来就可以启动服务了:
[root@WEB-A1 ~]# /application/apache/bin/apachectl start
[root@WEB-A1 ~]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 57144 root 4u IPv6 49054 0t0 TCP *:http (LISTEN)
httpd 57275 daemon 4u IPv6 49054 0t0 TCP *:http (LISTEN)
httpd 57276 daemon 4u IPv6 49054 0t0 TCP *:http (LISTEN)
httpd 57277 daemon 4u IPv6 49054 0t0 TCP *:http (LISTEN)
#可以看到,80端口已经处于监听状态,这说明服务已经在运行了,我们也可以检查进程信息。
[root@WEB-A1 ~]# ps -ef|grep httpd|grep -v grep
root 57144 1 0 14:30 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start
daemon 57274 57144 0 14:44 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start
daemon 57275 57144 0 14:44 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start
daemon 57276 57144 0 14:44 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start
daemon 57277 57144 0 14:44 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start
然后我们可以访问默认站点了:
如果出现了It works!
字样,则表示Apache服务器完装完毕,并可以正常运行了。我们看一下此时默认站点目录的用户权限:
[root@WEB-A1 ~]# ll /application/apache/htdocs/
total 4
-rw-r--r-- 1 root root 44 Nov 21 2004 index.html
[root@WEB-A1 ~]# ll -d /application/apache/htdocs/
drwxr-xr-x 2 root root 4096 Mar 14 2014 /application/apache/htdocs/
如果无法正常显示,则一般的排错过程为:
80
端口是否存在。
#最后在本地进行测试:
[root@WEB-A1 ~]# wget 172.16.1.10
--2014-12-06 15:50:10-- http://172.16.1.10/
Connecting to 172.16.1.10:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 44 [text/html]
Saving to: “index.html”
100%[================================================>] 44 --.-K/s in 0s
2014-12-06 15:50:10 (5.92 MB/s) - “index.html” saved [44/44]
#当然也可以使用curl指令进行测试:
[root@WEB-A1 ~]# curl -I 172.16.1.10 -s|grep HTTP
HTTP/1.1 200 OK
Apache软件安装后的目录结构:
[root@WEB-A1 ~]# tree /application/apache/bin/
/application/apache/bin/
├── ab #Apache服务器性能测试工具,简单易用。
├── apachectl #该工具为Apache服务的主要执行脚本,它实际上是调用了httpd指令。
├── apr-1-config
├── apu-1-config
├── apxs #为Apache服务器编译和安装扩展模块的工具。
├── checkgid
├── dbmmanage
├── envvars
├── envvars-std
├── htcacheclean #清理磁盘缓冲区的指令,很少使用。
├── htdbm
├── htdigest
├── htpasswd #为站点设置用户名及密码,建立和更新基本认证文件的工具。
├── httpd #是Apache的控制指令,apachectl会调用该指令。
├── httxt2dbm
├── logresolve
└── rotatelogs #自带的日志轮询工具,但老师习惯使用cronolog工具代替之。
[root@WEB-A1 ~]# tree /application/apache/conf/
/application/apache/conf/
├── extra #额外的配置文件目录。
│ ├── httpd-autoindex.conf
│ ├── httpd-dav.conf
│ ├── httpd-default.conf
│ ├── httpd-info.conf
│ ├── httpd-languages.conf
│ ├── httpd-manual.conf
│ ├── httpd-mpm.conf
│ ├── httpd-multilang-errordoc.conf
│ ├── httpd-ssl.conf
│ ├── httpd-userdir.conf
│ └── httpd-vhosts.conf #规划虚拟主机配置文件(非常重要的配置文件)。
├── httpd.conf #主配置文件。
├── magic
├── mime.types
└── original #这个目录中存放的应该是配置文件初始状态的备份。
[root@WEB-A1 ~]# tree /application/apache/htdocs/
/application/apache/htdocs/ #编译安装Apache服务器后默认的站点目录。
└── index.html
[root@WEB-A1 ~]# tree /application/apache/logs/
/application/apache/logs/
├── access_log #访问日志。
├── cgisock.57144
├── error_log #错误日志。
└── httpd.pid #服务进程的PID文件,httpd进程启动后,会将所有的PID写入此文件。
对于该文件的更相似的说明请参考下面的网址:
http://www.jinbuguo.com/apache/menu22/configuring.html
http://www.cnblogs.com/sunky/articles/1409267.html
[root@WEB-A1 ~]# cat /application/apache/conf/httpd.conf
----------------------
### Section 1: Global Environment
ServerRoot "/application/apache2.2.27"
#服务器设置的最顶层目录(换句话说也是Apache软件安装的路径)。包括logs、modules等数据都应该要放置到此目录下面(若果没有声明成绝对路径时)。
#即指令设置了服务器所在的目录,其它配置文件的相对路径即基于此目录。
Timeout 60
#接收和发送的超时时间(服务器在断定请求失败前等待的秒数)。
Listen 80
#默认的监听端口。
LoadModule php5_module modules/libphp5.so
LoadModule ...
#加载目标文件或库,并将其添加到活动模块列表。
User daemon
Group daemon
#后台服务进程httpd默认使用的用户账号及属组账号,出于安全考虑,应该额外指定用户和组。
### Section 2: 'Main' server configuration
ServerAdmin you@example.com
#管理员的邮箱地址。
ServerName localhost:80
#服务器用于辨识自己的主机名和端口号。
DocumentRoot "/application/apache2.2.27/htdocs"
#默认站点的根目录(组成网络上可见的主文档树的根目录)。默认状态下,所有的请求都以这个目录为基础。
<Directory /> #<Directory>...</Directory>标签内主要是相应的权限控制。
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all #拒绝任何人访问根目录。
</Directory>
#上述的设置是针对www服务器的默认环境而来的,因为是针对“/”的设置,建议保留上述的默认值(上面的权限设置已经是很严格的限制了)。
<Directory "/application/apache2.2.27/htdocs">
Options Indexes FollowSymLinks #划线部分允许显示站点目录结构,应该屏蔽掉。
#这里是一个安全优化点,可以将划线部分去掉,或在其前面加上一个减号(-),达到不对外展示站点目录结构的目的。
AllowOverride None
Order allow,deny
Allow from all #允许任何人访问该目录。
</Directory>
#这是针对特定目录的设置。
<IfModule dir_module>
DirectoryIndex index.php index.html
#设置可以访问的首页文件(当客户端请求一个目录时寻找的资源列表),按优先顺序依次排列,是用空格符分隔。
</IfModule>
<IfModule mod_userdir.c>
UserDir disabled
</IfModule>
<Directory "/application/apache2.2.27/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
#上面是对cgi动态页面的支持,由于它已被淘汰,所以可以删除这些配置项。
DefaultType text/plain #在服务器无法由其他方法确定内容类型时,发送的默认MIME内容类型。
<IfModule mime_module>
TypesConfig conf/mime.types #指定记录媒体类型(mime.types)文件或类似的东东放置的位置。
AddType application/x-compress .Z #在给定的文件扩展名与特定的内容类型之间建立映射。
#推荐使用AddType指令增加新的媒体类型映射关系,而不是改变TypesConfig文件。
AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
</IfModule>
Include conf/extra/httpd-mpm.conf
Include conf/extra/httpd-vhosts.conf #加载虚拟主机配置文件。
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
HostnameLookups Off #启用对客户端地址的DNS查找,此指令启用了DNS查询,使得主机名能被记入日志。
<Directory "/var/html">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Alias /icons/ "/var/www/icons/" #映射URL到文件系统的特定区域(为目录指定一个URL别名)。
<Directory "/var/www/icons">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8
#显示目录索引的各种配置设置,包括设定字符集、
注意:如果你有其他的设定,最好不要随便的在该文件里找个地方写入,否则如果刚好写在了<Directory>
块里面,那么就会发生错误,最好的方法是直接在配置文件的会后面加入即可。
<Directory>
块是针对特定目录的设置,一个块对应一个目录。
<Directory>
和</Directory>
用于封装一组指令,使之仅对某个目录及其子目录生效。任何在目录上下文中可以使用的指令都允许在这种情况下使用。Directory-path
可以为一个目录的完整路径,或是包含了通配符的字符串。其内部封装的指令设置了指定目录的访问权限,一般会包含下列五个指令:
一般来说<Directory>
指令只会出现在httpd.conf
文件中,但它们也可能出现在任何其它配置文件中。该指令不可被嵌套使用。
#我们可以使用httpd指令来进行Apache服务的启停。
[root@WEB-A1 ~]# /application/apache/bin/httpd -k start
[root@WEB-A1 ~]# /application/apache/bin/httpd -k restart
[root@WEB-A1 ~]# /application/apache/bin/httpd -k graceful
[root@WEB-A1 ~]# /application/apache/bin/httpd -k stop
--------------------
#也可以使用下面的指令:
[root@WEB-A1 ~]# /application/apache/bin/apachectl start
[root@WEB-A1 ~]# /application/apache/bin/apachectl restart
虚拟主机(Virtual Host)是在同一台机器搭建基于不同域名或者基于不同地址的多个站点的技术。可以为运行在同一台主机上的各个网站指配不同的地址和端口,也可让多个网站拥有不同的域名。
编辑配置文件:
[root@ServerD ~]# vim /application/apache/conf/extra/httpd-vhosts.conf
NameVirtualHost *:80
<VirtualHost *:80>
#这里是虚拟主机的配置模板。每增加一个虚拟主机,就添加类似下面的一个配置块。
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/application/apache2.2.27/docs/dummy-host.example.com"
ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
创建虚拟主机:
[root@ServerE var]# mkdir html/{www,bbs,blog} #创建虚拟主机目录。
[root@ServerE var]# touch /var/html/{www,blog,bbs}/index.html
[root@ServerE ~]# for name in www blog bbs;do \
echo "http://$name.etiantian.org" >/var/html/$name/index.html;done
#创建首页文件。
[root@ServerE ~]# for name in www blog bbs;do cat /var/html/$name/index.html;done
http://www.etiantian.org
http://blog.etiantian.org
http://bbs.etiantian.org
-------------------------------------------
[root@ServerE extra]# vim httpd-vhosts.conf
<VirtualHost *:80> #添加下面的内容:
ServerAdmin 49000448@qq.com
DocumentRoot "/var/html/www"
ServerName www.etiantian.org
ServerAlias etiantian.org
#指定别名,访问此别名等同于访问ServerName指定的域名。
ErrorLog "logs/www-error_log" #指定错误日志。
CustomLog "logs/www-access_log" common #记录访问日志的格式。
</VirtualHost>
<VirtualHost *:80>
ServerAdmin 49000448@qq.com
DocumentRoot "/var/html/blog"
ServerName blog.etiantian.org
ErrorLog "logs/blog-error_log"
CustomLog "logs/blog-access_log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin 49000448@qq.com
DocumentRoot "/var/html/bbs"
ServerName bbs.etiantian.org
ErrorLog "logs/bbs-error_log"
CustomLog "logs/bbs-access_log" common
</VirtualHost> #上面所添加的内容是创建三个虚拟主机的站点目录。
[root@ServerD ~]# vim /application/apache/conf/httpd.conf
#编辑主配置文件,并添加下面的内容:
<Directory "/var/html">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#将下面两条配置项打开。
Include conf/extra/httpd-mpm.conf #378
Include conf/extra/httpd-vhosts.conf #396
#配置完后进行平滑重启。
[root@ServerE conf]# /application/apache/bin/apachectl graceful
一旦你为Apache服务器设置了虚拟主机,那么原来的默认站点目录将无法访问,如果再使用IP地址直接访问Apache服务器时,将默认出现第一个虚拟主机的主页。如果你想保留原来的默认站点,你就需要给原来的默认站点设置一个虚拟主机。
取消中心主机(Mainhost):
如果你想在现有的服务器上增加虚拟主机,你必须也为现存的主机建造一个定义块。这个虚拟主机中
ServerName
和DocumentRoot
所包含的内容应与全局的ServerName和DocumentRoot保持一致。还要把这个虚拟主机放在配置文件的最前面,来让它扮演默认主机的角色。
以上是《Apache2.2中文手册》中的原话,按照手册中所述,如果想保留默认站点,做法是在虚拟主机配置文件中增加如下内容,并且将该虚拟主机配置块作为第一个虚拟主机块:
<VirtualHost *:80>
DocumentRoot "/application/apache2.2.27/htdocs"
ServerName localhost
</VirtualHost>
需要在主配置文件和虚拟主机配置文件中分别进行编辑修改。
第一步:修改主配置文件
[root@WEB-A1 ~]# vim /application/apache/conf/httpd.conf
Listen 80
#默认情况下,Web服务器只监听80端口,我们可以添加需要坚挺的端口:
Listen 8000
Listen 9000
第二步:修改虚拟主机配置文件
NameVirtualHost *:80
NameVirtualHost *:8000 #添加与主配置文件中对应的端口。
NameVirtualHost *:9000
#接下来为每个虚拟主机标签添加相应的端口号。
<VirtualHost *:80>
<VirtualHost *:8000>
<VirtualHost *:9000>
#这样的话,在访问域名就要配合端口号使用。这是域名加端口的混合用法。
#基于端口的虚拟主机一般用在内部网络中。
为了便于分析Apache的访问日志,Apache的默认配置文件中,按记录的信息不同(用不同格式昵称说明不同的信息)将访问日志分为四类,并由“LogFormat”指令定义了昵称,如表所示。
格式分类 | 格式昵称 | 说明 |
---|---|---|
普通日志格式(common log format, CLF) | common | 大多数日志分析软件都支持这种格式。 |
参考日志格式(referer log format) | referer | 记录客户访问站点的用户身份。 |
代理日志格式(agent log format) | agent | 记录请求的用户代理。 |
综合日志格式(combined log format) | combined | 结合以上三种日志信息。 |