httpd:

安装方法:yum -y install httpd

 rpm -ql  httpd   #查看有哪些配置文件的;

 

/etc/httpd/conf/magic   #定义本地主机如何识别mime格式的,通过mime编码而来的其他的非纯文本文档。

/etc/rc.d/init.d/httpd  #服务脚本的启动文件

/etc/sysconfig/httpd    #服务脚本的配置文件

我们将/etc/sysconfig/httpd下面的配置文件进行更改,我们的服务脚本就可以允许在不同的模式下了。

/usr/bin/ab   #apache压力测试所用的配置文件;

/usr/bin/htpasswd #基于权限进行创建;


下面我们查看下服务是否开启使用这个命令:

[root@localhost test]# netstat -tnlp |grep 80

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

[root@localhost test]# ps -aux |grep http  

[root@localhost test]# ps -aux |grep http

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ

root     27259  0.0  0.3 175308  3192 ?        Ss   17:46   0:00 /usr/sbin/httpd

apache   27260  0.0  0.2 175308  2380 ?        S    17:46   0:00 /usr/sbin/httpd

apache   27261  0.0  0.2 175308  2380 ?        S    17:46   0:00 /usr/sbin/httpd

apache   27262  0.0  0.2 175308  2380 ?        S    17:46   0:00 /usr/sbin/httpd

apache   27263  0.0  0.2 175308  2380 ?        S    17:46   0:00 /usr/sbin/httpd

apache   27264  0.0  0.2 175308  2380 ?        S    17:46   0:00 /usr/sbin/httpd

apache   27266  0.0  0.2 175308  2380 ?        S    17:46   0:00 /usr/sbin/httpd

apache   27267  0.0  0.2 175308  2380 ?        S    17:46   0:00 /usr/sbin/httpd

apache   27268  0.0  0.2 175308  2380 ?        S    17:46   0:00 /usr/sbin/htt


这个时候就可以在客户端查看web服务器的欢迎页面了;这个时候我们看到的这个欢迎页面的默认地址为/etc/httpd/conf.d/welcom.conf


修改web服务器的页面路径下的配置文件:

[root@localhost html]# pwd 

/var/www/html

[root@localhost html]# cat a.html 

<html>

<tittle>haha</tittle>

<body>

welcom to my test file.

</body>

</html>

[root@localhost html]# service httpd restart 

这个时候,我们去访问的时候,给个页面。发现还是没法查看,因为默认的页面需要手动去指定。

[root@localhost conf]# pwd 

/etc/httpd/conf

[root@localhost conf]# grep "Section" httpd.conf 

### Section 1: Global Environment

### Section 2: 'Main' server configuration

### Section 3: Virtual Hosts

注意:要有主服务器段,就不能有虚拟主机,有虚拟主机就不能有主服务器段。因为我们安装的apache是系统自带的,所以版本比较低。


[root@localhost conf]# more /etc/httpd/conf/httpd.conf

KeepAlive Off #是否开启长链接;

长链接的时间针对不同的服务器来讲,需要进行不同的测试。

我们可以使用ab参数进行测试,LoadRunner。


APACHE MPM模块:

Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作。不同平台和不同的环境往往需要不同 的特性,或可能以不同的方式实现相同的特性最有效率。Apache httpd 通过模块化的设计来适应各种环境。这种设计允许网站管理员通过在 编译时或运行时,选择哪些模块将会加载在服务器中,来选择服务器特性。


Apache HTTP 服务器 2.0 扩展此模块化设计到最基本的 web 服务器功能。 它提供了可以选择的多处理模块(MPM),用来绑定到网络端口上,接受请求, 以及调度子进程处理请求。


扩展到这一级别的服务器模块化设计,带来两个重要的好处:


Apache httpd 能更优雅,更高效率的支持不同的平台。尤其是 Apache httpd 的 Windows 版本现在更有效率了,因为 mpm_winnt 能使用原生网络特性取代在 Apache httpd 1.3 中使用的 POSIX 层。它也可以扩展到其它平台 来使用专用的 MPM。

Apache httpd 能更好的为有特殊要求的站点定制。例如,要求 更高伸缩性的站点可以选择使用线程的 MPM,即 worker 或 event; 需要可靠性或者与旧软件兼容的站点可以使用 prefork。

在用户看来,MPM 很像其它 Apache httpd 模块。主要是区别是,在任何时间, 必须有一个,而且只有一个 MPM 加载到服务器中。可用的 MPM 列表位于 模块索引页面

下表列出了不同系统的默认 MPM。如果你不在编译时选择,那么它就是你将要使用的 MPM。


Netware mpm_netware

OS/2 mpmt_os2

Unix prefork,worker 或 event,取决于平台特性

Windows mpm_winnt


在 Unix 或类似平台中,MPM 可以构建为动态模块,与其它动态模块一样在运行时加载。 构建 MPM 为动态模块允许通过修改 LoadModule 指令内容来改变 MPM,而不用重新构建服务器程序。


在执行 configure 脚本时,使用 --enable-mpms-shared 选项可以启用此特性。 当给出的参数为 all 时,所有此平台支持的 MPM 模块都会被安装。还可以在参数中给出模块列表。


默认 MPM,可以自动选择或者在执行 configure 脚本时通过 --with-mpm 选项来指定,然后出现在生成的服务器配置文件中。 编辑 LoadModule 指令内容可以选择不同的 MPM。


MPM: Multi Path Modules (多道处理模块)定义apache来处理多个用户请求时候的模型  98分钟

mpm_winnt

prefork (一个请求用一个进程响应)

worker  (一个请求用一个线程响应) (web服务器生成多个进程,同时每个进程可以生成多个线程,用一个线程响应一个用户请求。默认情况下,服务启动的时候,

生成两个进程。linux上经过测试发现worker模型没有event模型好)

event   (一个进程处理多个请求) 2.4以后默认就支持event这个机制。多路复用多线程web服务器 

2.2默认使用的是prefork,稳定性可以。


当前服务器使用的模块有哪些:可以使用如下命令:这些都是编译好的。


[root@localhost conf]# httpd -l

Compiled in modules:

  core.c

  prefork.c

  http_core.c

  mod_so.c


/usr/sbin/httpd.event

/usr/sbin/httpd.worker


[root@localhost conf]# rpm -ql httpd|grep bin

/usr/sbin/httpd.event

/usr/sbin/httpd.worker


如果想使用某一个模型只需要更改另外一个配置文件即可:

[root@localhost conf]# cat /etc/sysconfig/httpd        #全局的配置文件

# Configuration file for the httpd service.


#

# The default processing model (MPM) is the process-based

# 'prefork' model.  A thread-based model, 'worker', is also

# available, but does not work with some modules (such as PHP).

# The service must be stopped before changing this variable.

#

#HTTPD=/usr/sbin/httpd.worker


2.2中event不建议用,bug多。测试版本。2.4以后使用event比较好。

以上说明了如何在redhat上切换MPM可执行的对应程序的。而这个可执行程序编译完成后,就确定使用哪一些MPM了。因此红帽编译了三次,生成了三个MPM。



同时在主配置文件中,有三个模型.下面说明模块的使用属性:


<IfModule prefork.c>

StartServers       8

MinSpareServers    5

MaxSpareServers   20

ServerLimit      256        #最多允许多少个用户请求

MaxClients       256 #最多允许多少个用户,修改这个参数之后需要将此进程kill掉,然后再开启。

MaxRequestsPerChild  4000 #一个进程最多响应多少个用户请求,达到这个次数之后,无论如何将其kill掉,再生成一个新的进程。

</IfModule> #注意所有的数据都需要自己进行测试。



<IfModule worker.c>

StartServers         2   #默认启动的进程数

MaxClients         150

MinSpareThreads     25  #最小空闲线程

MaxSpareThreads     75 #最大空闲线程数

ThreadsPerChild     25  #一个进程可以生成多少个线程

MaxRequestsPerChild  0   #每一个进程最多响应多少个请求,因为进程不处理用户请求,所以设置为0,表示不做限定。

</IfModule>


#Listen 12.34.56.78:80

Listen 80#说明监听当前主机上的所有80端口。listen指令可以出现多次。

LoadModules#指定apache要装载的模块;

Include conf.d/*.conf

User apache  #开启服务器所用的用户

Group apache  #开启服务所用的组名



httpd属性配置:

[root@localhost conf]# grep "Section" httpd.conf

### Section 1: Global Environment

### Section 2: 'Main' server configuration

### Section 3: Virtual Hosts

分为三段当你,2,3段是冲突的。只能启用一个。


UseCanonicalName Off          #使用正式名称;

DocumentRoot "/var/www/html"  #文档根目录,这个目录也是可以更改的;


URL路径与本地系统路径不是一个概念;URL路径是对应于DocumentRoot路径而言的。同时默认需要定义它可以被那些用户访问。

options定义其下的路径如何被访问,默认路径的权限这里也做限定。

这个就是做默认路径的访问控制的;

<Directory "/var/www/html">


#

# Possible values for the Options directive are "None", "All",

# or any combination of:

#   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews

#

# Note that "MultiViews" must be named *explicitly* --- "Options All"

# doesn't give it to you.

#

# The Options directive is both complicated and important.  Please see

# http://httpd.apache.org/docs/2.2/mod/core.html#options

# for more information.

#

    Options Indexes FollowSymLinks                              #定义索引文件,将该目录下的所有内容都看到,默认是开放的,需要禁用。但是

当我们做下载的时候不需要禁用。Indexes 允许索引目录的。Options后面加none表示所有都不支持。

FollowSymLinks是否支持链接文件。这里的是允许使用符号链接。

Options有五个默认没有任何功能;

  Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews

None: 不支持任何选项

Indexes: 允许索引目录

FollowSynLinks: 允许访问符号链接指向的原文件

Includes: 允许执行服务端包含(SSI)SEVER SIDE INCLUDE  #这个也不安全,除非特殊需要

SymLinksifOwnerMatch:允许执行符号链接,同时制定属主跟httpd进程一直;

ExecCGI: 允许运行CGI脚本;是否允许CGI脚本。有的时候需要打开这个功能;

MultiViews:多视图的一种机制;

All: 支持所有选项;

#

# 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                       #是否允许覆盖

AllowOverride Authconfig                 #


#

# Controls who can get stuff from this server.

#

 #   Order allow,deny #用于定义IP或基于主机的访问控制功能的。定义列表,先allow,后deny。deny是默认值。allow和deny的次序很关键。

  #  Allow from all   #仅允许172.16.100.0访问;


#拒绝:192.168.0.1访问;

  Order deny,allow

  deny from 192.168.0.1  172.16.100.1

</Directory>

地址的表示方式:

IP

network/netmask

HOSTNAME: www.a.com

DOMAINNAME: zledu.com

Partial IP: 172.16, 172.16.0.0/16

在http2.4之后,不使用allow和deny的机制了。

修改完配置文件之后,可以使用httpd -t这个选项来查看配置文件的语法是否正确。

自己如何访问自己?使用elinks纯文本的浏览器。在纯文本的界面下,浏览网页的一个工具。

远程链接的情况下,由于语言不匹配可能会出现乱码。

elinks  http://172.16.100.1

-dump 表示把网页内容显示完成之后,立即退出。

-source      显示网页的源码;


AllowOverride Authconfig           #如果改成none,就不会去读取.htaccess配置文件。

AuthType Basic

AuthName "Restricted Files"

AuthUserFile /usr/local/apache/passwd/passwords

Require user zl


这个文件的创建只能用某一特定命令:

htpasswd -c -m  AuthUserFile /usr/local/apache/passwd/passwords  zl

如果要添加第二个用户将-c参数去掉即可。

htpasswd -m  AuthUserFile /usr/local/apache/passwd/passwords  zl2

option:-D删除用户时使用。


AuthType Basic

AuthName "By Invitation Only"

# Optional line:

AuthBasicProvider file

AuthUserFile /usr/local/apache/passwd/passwords

AuthGroupFile /usr/local/apache/passwd/groups

Require group GroupName


如果使用Group验证,则需要事先将这几个用户进行创建,创建完成后,编辑某一文件,在其下面写上:

GroupName: rbowen dpitts sungo rshersey



Require valid-user              #说明只要是AuthUserFile或者AuthGroupFile里面有的用户都可以拿过来使用。



httpd -M   查看系统装的http的的模块文件有哪些。



PV:page  view页面访问量。网站统计值里面经常用的指标;PV是按照天数来统计的;每天的页面访问量。必须是一个完整的页面才行。

UV:USER VIEW ;每天的独立IP访问量。


apache:服务器


虚拟主机:

apache服务:

中心主机

虚拟主机

基于IP

IP1:80

IP2:80

基于端口

IP:80

IP:8080

基于域名

IP:80

主机名不同

www.zldu.com

www.a.org

www2.a.org

www.b.net

基于主机名,虽然也经过地址解析,但是http协议自身所带的http头信息里面的host能够帮我们找到正确的资源。

apache:

中心主机

虚拟主机

apache 2.4以后想定义什么样的主机就定义什么样的主机。



ServerName:

ServerAlias:        #服务器也是可以有别名的;

DocumentRoot /www/a.org/ 

<Directory "/www/a.org">   #Directory封装的是文件系统路径

Option

AllowOverride

</Directory>

Alias

ErrorLog

CustomLog


<Location "/p_w_picpaths">  #定义URL的时候用的;所使用的方法只有Get方法,其他任何方法都不支持。

ScriptAlias     #允许执行CGI脚本的路径;有了CGI技术,我们的APACHE进程就能够通过CGI协议调用另外一个进程,使其允许一段程序;将其允许结果返回给apache。

</Location>


html,text。





MVC


那么如何将这所有的属性用一个容器进行封装:virtualhost

如何使用虚拟主机,得先取消中心主机,注释中心主机的DocumentRoot即可。

虚拟主机的定义:

<VirtualHost HOST>


</VirtualHost>


HOST的格式:

基于IP,HOST的写法

HOST

IP1:80

IP2:80

基于端口:

HOST

IP:80

IP:8080

基于域名:

*:80

ServerName 不同


如何建立自己的虚拟主机呢?方法如下:

编辑vim /etc/httpd/conf/httpd.conf将里面的主配置文档DocumentRoot进行注释;

然后在/etc/httpd/conf.d目录下面建个文件:

virtual.conf


[root@localhost conf.d]# cat virtual.conf 

<VirtualHost 172.16.100.1:80>

        ServerName www.zledu.com

        DocumentRoot "/www/zledu.com"

CustomLog   /var/www/httpd/zledu.com/access_log combined

<Directory "/www/d.gov">

Options None

AllowOverride none

Deny from 172.16.100.177

</Directory>

</VirtualHost>



<VirtualHost 172.16.100.2:80>

        ServerName www.a.org

        DocumentRoot "/www/a.org"

<Directory "/www/a.org">

Options None

AuthOverride authconfig

AuthType  basic

AuthName "Restrict area"

AuthUserFile "/etc/httpd/.htpasswd"

Required valid-user

</Directory>

</VirtualHost>

htpasswd -c -m /etc/httpd/.htpasswd tom

htpasswd -m /etc/httpd/.htpasswd jerry

<VirtualHost 172.16.100.2:80>

        ServerName www.d.goy

        DocumentRoot "/www/d.goy"

</VirtualHost>

<VirtualHost 172.16.100.1:8080>

        ServerName www.a.org

        DocumentRoot "/www/b.net"

</VirtualHost>



[root@localhost conf.d]# 



 设定默认虚拟主机

<VirtualHost _default_:80>

DocumentRoot /www/default80

# ...

</VirtualHost>


<VirtualHost _default_:*>

DocumentRoot /www/default

# ...

</VirtualHost>



 <Location /status>

SetHandler server-status

Order Deny,Allow

Deny from all

Allow from .foo.com

</Location>


服务器的状态信息,一般情况下不开启。只开启给特定IP的特定用户。



基于OPENSSL的HTTPS服务:

client        server(443)


ssl协商完成之后,将公钥信息发送给客户端,客户端对整数进行验证,客户端验证完成后,发送一个对称秘钥给服务器端。


客户端要信任证书颁发机构,能够信任别人发的证书所用。


SSL会话在建立的时候跟主机名关系不大。ssl是没法基于主机名进行区分的。

如果服务器只有一个IP地址,ssl的功能只能提供给一个虚拟主机。

yum  install  mod_ssl

rpm -ql mod_ssl

[root@localhost ~]# rpm -ql mod_ssl

/etc/httpd/conf.d/ssl.conf

/usr/lib64/httpd/modules/mod_ssl.so

/var/cache/mod_ssl

/var/cache/mod_ssl/scache.dir

/var/cache/mod_ssl/scache.pag

/var/cache/mod_ssl/scache.sem


下面模拟100.8做CA;

cd /etc/pki

ls

cd CA/

(umask 077;openssl genrsa -out private/cakey.pem  2048)               #生成一个私有钥匙对

ls -l private/

openssl req -new -x509 -key private//cakey.pem -out cacert.pem -days 3655

生成一个自签证书,发给自己。

[root@localhost CA]# mkdir certs crl newcerts

[root@localhost CA]# touch index.txt

[root@localhost CA]# echo 01 >serial

more  /etc/pki/tls/openssl.cnf

# the resulting certificates are compatible with Netscape

string_mask = MASK:0x2002


# req_extensions = v3_req # The extensions to add to a cer

tificate request


[ req_distinguished_name ]

countryName                     = Country Name (2 letter c

ode)

countryName_default             = CN

countryName_min                 = 2

countryName_max                 = 2


stateOrProvinceName             = State or Province Name (

full name)

stateOrProvinceName_default     = Henan


localityName                    = Locality Name (eg, city)

localityName_default            = Zhengzhou


0.organizationName              = Organization Name (eg, c

ompany)

0.organizationName_default      = zl


# we can do this but it is not needed normally :-)

#1.organizationName             = Second Organization Name

 (eg, company)

#1.organizationName_default     = World Wide Web Pty Ltd


organizationalUnitName          = Organizational Unit Name

 (eg, section)

organizationalUnitName_default  =Tech


[root@localhost CA]# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 3650

[root@localhost tmp]# rm httpd.c* -f 



在172.16.100.1上进行配置:

[root@localhost httpd]# ls 

conf  conf.d  logs  modules  run

[root@localhost httpd]# mkdir ssl

[root@localhost httpd]# cd ssl

[root@localhost ssl]# ls

[root@localhost ssl]# pwd 

/etc/httpd/ssl

[root@localhost ssl]

(umask 077;openssl genrsa 1024 >httpd.key)


[root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr #生成一个证书颁发请求,注意里面的内容跟配置文件一致;

[root@localhost ssl]# scp httpd.csr 172.16.100.8:/tmp  #将证书申请放到172.16.100.8这个服务器上面去;

[root@localhost ssl]# scp 172.16.100.8:/tmp/httpd.crt ./  #将签发好的证书放到本地;

[root@localhost ssl]# cd /etc/httpd/conf.d/

vi ssl.conf

<VirtualHost 172.16.100.1:443>


# General setup for the virtual host, inherited from global configuration

#DocumentRoot "/var/www/html"

#ServerName www.example.com:443

ServerName www.zledu.com

SSLCertificateFile /etc/httpd/ssl/httpd.crt 

SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

将如下目录下的证书给windows进行传输一份,并改名字叫.crt结尾即可。直接安装即可。受信任的证书颁发。

[root@localhost CA]# pwd

/etc/pki/CA

[root@localhost CA]# ls 

cacert.pem 


做测试的时候,要将这个证书颁发机构给加入到windows服务器里面来。