官方网站:apache.org
http://www.taobao.com/index.html为例
1.http请求的内容
    请求行
        请求方法:get(获取):请求方法,其他常见方法:post(提交表单、单选、端选...)、put(提交评价)、delete(删除服务器上的某个内容(商家))
        index.html:请求的文件
        http/1.1版:请求的协议
    请求头
        host:请求的主机(源IP)
        accept:是否接受请求
        accept-language:请求内容的语言表示,zh_CN
        accept-charset:请求内容的字符编码
        accept-encoding:是否启用压缩
        referer:http://www.tmall.com/apple/s01.php(请求的地址(服务器端))
        User-agent:浏览器的类型和版本
        Connection:keepalive(保持活的连接)
        date:访问的日期和时间
    请求的实际文件内容
        welcome to access my website!!
2.http响应的内容
    1.根据客户端请求的信息进行响应
    2.状态码
        100-199:服务器成功接收客户端的请求,有时需要客户机继续发送请求信息,完成整个请求的过程(如输入用户名和密码)
        200-299:表示成功处理客户端请求
        300-399:找其它服务器(代理服务器找不到,向服务器发送请求),302:找其它的服务器,需要在响应头中有location信息;304,307:找缓存
        400-499:错误信息;403:页面存在,但没有权限访问;404:页面不存在
        500:服务器内部错误


代理服务器(前端代理和后端代理)

IIS APACHE NGNIX TOMCAT+APACHE WEBSPHERE
安装LAMP环境(Linux+apache+MySQL+PHP)
apache:重量级(功能比较全)
ngnix:轻量级(功能较少,但在某方面反应速度更快,占用资源比较少,在集群方面,性能比较高)

要求将httpd安装到/usr/local/httpd目录下
安装编译环境  yum install gcc gcc-c++
1.安装apr(提供优化,提供接口,增强并发)
    # ./configure --prefix=/usr/local/apr --enable-profile --enable-threads
       # make(当CPU是多核的话,可以使用make -j n,可以提高编译效率) && make install

2.安装apr-iconv(提供转码功能)
    # ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr/
      # make && make install

3.安装apr-util(提供优化)
    # ./configure --prefix=/usr/local/apr-util --with-iconv=/usr/local/apr-iconv --with-apr=/usr/local/apr
       # make && make install

4.安装pcre(提供正则表达式扩展功能)
    # ./configure --prefix=/usr/local/pcre --enable-utf8 --enable-jit
       # make && make install

5.安装httpd(apache是以模块运行的,安装层次:模块(modules)--认证(auth)--缓存(cache)--代理(proxy))
    # ./configure --prefix=/usr/local/httpd --enable-cache --enable-cache-disk --enable-cache-socache --enable-so --enable-modules=all --enable-mods-shared=all --enable-ssl --enable-echo --enable-data --enable-include --enable-sed --enable-proxy --enable-proxy-connect --enable-proxy-http --enable-proxy-fcgi --enable-proxy-scgi --enable-proxy-ajp --enable-proxy-balancer --enable-session --enable-session-cookie --enable-info --enable-rewrite --enable-deflate --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre --enable-mpms-shared=all --enable-userdir

另外一种方法(把apr和apr-util放到httpd目录下面的srclib目录下面,不要带版本号,vim httpd/INSTALL,查找srclib,可以看到相应的解释)
mv apr-1.5.2 httpd/srclib/apr
mv apr-util-x httpd/srclib/apr-util
安装httpd(apache是以模块)
    # ./configure --prefix=/usr/local/httpd --enable-cache --enable-cache-disk --enable-cache-socache --enable-so --enable-modules=all --enable-mods-shared=all --enable-ssl --enable-echo --enable-data --enable-include --enable-sed --enable-proxy --enable-proxy-connect --enable-proxy-http --enable-proxy-fcgi --enable-proxy-scgi --enable-proxy-ajp --enable-proxy-balancer --enable-session --enable-session-cookie --enable-info --enable-rewrite --enable-deflate --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre --enable-mpms-shared=all --enable-userdir

三种模块都有它自身的最大并发量,如果要修改的话,需要在编译之前就要对源文件进行操作(/httpd/server/mpm/event),修改#define MAX_SERVER_LIMIT 20000

修改APACHE的版本,可以提高安全性

模块的工作方式
    prefork    进程        稳定性较高,消耗内存较大,一个进程崩溃,不会影响其他进程
    worker    进程和线程    稳定性较低,一个线程崩溃,可能会影响其他线程,消耗内存较小(长连接和短连接)
    event    进程和线程    最好,可以把固定的socket转发到其他的服务器,并不固定

cd /usr/local/httpd
    bin:命令
    build:编译工具
    cgi-bin:公共网关协议脚本的命令
    conf:配置文件
    error:报错文档
    htdocs:web服务器的根目录
    icons:图标文件
    include:头文件
    lib:库文件
    logs:日志文件
    man:web文档
    manual:manual手册页
    modules:模块文件

安装第三方模块
    解压缩模块文件
    进入解压缩文件夹
    cd apache2
    有configure文件,则可以直接进行编译安装
    没有configure文件,则执行/usr/local/httpd/bin/apxs -i -a -c(编译) mod_rpaf-2.0.c(模块的c文件),添加该模块

主配置文件(/usr/local/httpd/conf/httpd.conf)
从配置文件:在主配置文件里面添加:Include 路径(/目录是安装目录)

    ServerRoot(安装目录并不是Web根目录) "/usr/local/httpd"
    Listen(监听) 80
    LoadMoudule(加载模块) unixd_module(模块名)  module/unixd_module.so(模块路径)
    <IfMoudule unixd_module> --- 局部配置
        User demon    --- 使用demon用户运行
        Group demon
    </IfModule>
    ServerAdmin(管理员邮箱)  admin@sjjy.com
    ServerName  www.sjjy.com:80 --- 和DNS没有关系,不设置,默认为localhost
    <Directory /> --- Web站点的根的配置,也可对其他目录
        AllowOverride
    </Directory>
    DocumentRoot "/usr/local/httpd/htdocs" --- Web站点的根
    <IfModule dir_module>
        DirectoryIndex index.html --- web站点的默认文档
    </IfModule>
    <Files ".ht*"> --- 对文件进行设置
    </Files>
    ErrorLog "logs/error_log" --- 错误日志的保存路径
    LogLevel warn --- 记录高于等于warn级别的日志
    LogFormat " %h %l %u ... "--- 定义访问日志的格式
    CustomLog "logs/access_log" common(定义的几种日志格式文件的一种) --- 记录访问日志的路径
    AddType  程序名  .Z(后缀名) --- 当遇到这种文件的后缀,由那个应用程序控制
    Include extra/http-default.conf
编辑基本配置文件
vim extra/http-default.conf
    Timeout 60 --- 超时时间,客户端连接到服务器后,在超时时间内没有发送信息,则超时
    KeepAlive On --- 长连接(静态站点常用) Off为短连接(动态站点常用)
    MaxKeepAliveRequests 100 --- 最大请求长连接次数(长连接失效次数)
    KeepAliveTimeout 5 --- 长连接失效时间5s
    UseCanonicalName Off --- 不需要对客户端进行反向解析
    
vim extra/httpd-mpm.conf
    <IfModule mpm_prefork_module> --- prefork模块
        StartServbers 5 --- 除了一个父进程,再启动5个空闲子进程(提高访问速度)
        MinSpareServers 5 --- 最小的空闲进程数量
        MaxSpareServers 10 --- 最大的空闲进程数量
        MaxRequestWorkers 250 --- 最大并发客户数(取决于内存,设置的最大值)
        MaxConnectionsPerChild 0 --- 每个子进程最大响应客户端请求数,无限制
    </IfModule>
    <IfModule mpm_event_module> --- 不支持HTTPS协议
        StartServers  --- 开启的进程数
         MinSpareThreads --- 最小的空闲线程数量
        MaxSpareThreads --- 最大的空闲线程数量
        ThreadsPerChild    --- 每个进程产生的线程数
        MaxRequestWorkers --- 最大并发连接数
        MaxConnectionsPerChild    --- 每个子进程最大响应客户端数
    </IfModule>
event模块在2.4版才正式启用

vim extra/httpd-info.conf --- httpd的基本信息
    <Location /server-status>

启动httpd服务
    cd /usr/local/httpd/bin
    ./apachectl -t --- 主配置文件,语法检查
    ./apachectl start --- 启动httpd服务
或者
    cp apachectl /etc/init.d/httpd
    vim /etc/init.d/httpd
在前面添加    # chkconfig: -(启动级别,0-6) 85(启动顺序) 15(关闭顺序)  
    chkconfig --add httpd
    service httpd start

错误集:
apache AH01630: client denied by server configuration错误解决方法
     ServerName zlj.com  
     DocumentRoot "/zlj/web"  
     DirectoryIndex index.html index.php  
      
     <Directory "/zlj/web">  
      Options -Indexes +FollowSymlinks  
      AllowOverride All    
      Allow  all  
     </Directory>  

练习:
    写一个安装脚本,要求运行完后apache服务器就已经启动,并能在其他服务器上使用(只需少量改变),要求功能如下:
    1.挂载光盘并检查是否已经挂载,能给出基本信息
    2.安装几个必须的软件包(gcc,gcc-c++,lynx,openssl)等,如果已经安装了rpm包软件则要卸载
    3.配置、编译和安装apache,屏幕上不要出现多余信息,安装成功则提示安装成功,失败则提示安装失败
    4.将基本内容配置好(sed完成)
    5.准备好并使用启动脚本
    6.httpd服务启动,能启动则提示启动成功,失败则提示启动失败,并显示最后10行错误日志      


apache的Alias(适用于目录),ScriptAlias,options FollowSymLinks(允许使用符号链接,适用于文件),options Indexs配置
作用:访问不在web目录下的文件和列出目录下的内容,但是不能下载
Alias /meizu "/usr/local/httpd/meizu"
ScriptAlias  /cgi-bin/ "/usr/local/httpd/cgi-bin/"
<Directory "/usr/local/httpd/meizu">
    Require all denied
    Require ip 172.16.0.0/16
</Directory>
<Directory />
    options FollowSymLinks
</ Directory>
定义一个文件的符号链接到WEB站点的根目录(/usr/local/httpd/htdocs),并且在index.html文件里面增加连接
options Indexs(建议禁用,当没找到默认页面,会把WEB站点的根目录下面的所有文件列出来)

定义错误提示
cd /usr/local/httpd/error
vim my404.html
里面添加错误提示
vim ../conf/httpd.conf
找到并修改 ErrorDocument 404 /error/my404.html

apache的段配置
<Diretory "/web">*</Directory> --- 访问指定目录的访问规则
<Files ".ht*">*</Files> --- 设置特定文件的访问规则
<Location /server-status>*</Location> --- 设置URL包含特殊信息的访问规则
<IfModule dir_module>*</Ifmodule> --- 判定模块是否加载,如果加载则使用指定的配置项

访问控制、认证和授权
访问控制(需要加载mod_authz_user.so mod_authz_host.so)
Require all granted --- 允许所有用户访问
Require all denied  --- 拒绝所有用户访问
示例:
apache 2.4版
    <Directory "/mmeizu">
        <RequieAll> --- 先允许,后拒绝
            Require all granted
            Require not ip 192.168.0.7
        </RequireAll>
    </Directory>
apache 2.2版
    <Directory "/meizu">
        Order deny,allw --- 先拒绝,后允许
        Deny from 192.168.0.7
        Allow from all
    </Directory>
或者
    <Directory "/meizu"> --- 先拒绝,后允许,不需要<Require>
        Require all denied
        Allow from 192.168.0.7
    </Directory>

认证和授权
<Directory "/usr/local/httpd/meizu">
     Require all denied
     Require ip 10.0.10.178
     AuthType Basic    digest(更安全)
     AuthName "Restricted Files" (自定义)
     AuthBasicProvider file    文件认证|数据库认证
     AuthUserFile "/usr/local/httpd/passwd/password" 认证的文件路径(包含用户名和密码)
     Require valid-user  认证限制(只有存在与认证文件的用户才能通过认证)
     satisfy any(满足其中一个) | all(满足全部)
   </Directory>

生成认证文件
/usr/local/httpd/bin/htpasswd -c /usr/local/httpd/passwd/password user01 ---第一次的话要加-c选项

-Index(表示禁用Index功能)

组认证(先生成文件认证) --- 文件自己生成,有格式限制
AuthGroupFile "/usr/local/httpd/passwd/groups"
GroupName:

实验结果
    Require all granted
#    Require all denied
#    Require ip 10.0.10.178
    AuthType Basic
    AuthName "Restricted Files"
    AuthBasicProvider file
    AuthUserFile "/usr/local/httpd/passwd/password"
    Require valid-user
    satisfy all
当先允许全部,在要求认证的时候是全部生效,但是认证文件不会生效,当先拒绝全部,在要求认证的时候是全部生效,认证文件会生效
当先决绝全部,允许部分ip的时候,在要求认证的时候是全部生效,认证文件不会生效,但是不在允许的ip范围内的,认证文件会生效
Server version: Apache/2.4.20 (Unix)

当几个Web站点的时候,不可能就要配置相应数量的服务器,可以使用虚拟主机来实现,不是虚拟化
虚拟主机的作用:在同一个系统里面,可以搭建多个Web站点
虚拟主机的类型:
    基于域名的虚拟主机(大多数)
    基于端口的虚拟主机
    基于ip的虚拟主机(服务器上必须配有多个ip地址,一个ip对应一个Web站点)
配置基于域名的虚拟主机
    配置域名服务器,将相关的域名解析为同一个ip
mkdir /web
vim httpd.conf
开启vhost的子配置文件
vim httpd-vhosts.conf
<Directory /web>
    Require all granted
</Directory>

<VirtualHost *:80>
    DocumentRoot "/web/blog" --- 必须有
    ServerName www.blog.com --- 必须有
</VirtualHost>

配置了虚拟主机后,所有的web站点都必须配置为虚拟主机
基于域名的虚拟主机不能直接使用ip地址访问,使用ip地址只能访问到第一个虚拟主机

安装php
首先安装gd库,给php模块提供一些图形化的功能
./configure --prefix=/usr/local/gd
make && make install
安装php
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/httpd/bin/apxs --with-config-file-path=/usr/local/php/etc  --with-gd=/usr/local/gd --enable-gd-native-ttf --enable-gd-jis-conv  --enable-mbstring --enable-bcmath --enable-sockets   --enable-zip --with-xpm-dir=/usr/lib64

make && make install
注意:不用加上gd的安装路径,否则会报错:png.h文件找不到
If configure fails try --with-vpx-dir=<DIR>
If configure fails try --with-jpeg-dir=<DIR>
configure: error: png.h not found.
[root@www php-5.5.10]# yum install libpng*

make时可能报如下错误:
/usr/local/src/php-5.5.6/ext/gd/gd.c:57:22: error: X11/xpm.h: No such file or directory
make: *** [ext/gd/gd.lo] Error 1
问题说明:这是提示gd库不支持xpm
解决方法:
安装libxpm
    yum install libXpm-devel.x86_64
rpm -ql libXpm :查询出libXpm的安装位置,发现在/usr/lib64/ 下
重新编译php,./configure中增加 --with-xpm-dir=/usr/lib64/
make && make install 成功!

验证是否安装成功
    查看httpd.conf文件是否加载libphp5.so

配置主配置文件
cp php.ini-production(生产文件,位于php的解压包里面) /usr/loca/php/etc/php.ini
编辑httpd.conf文件,配置php文件的应用处理程序
AddType Application/x-httpd-php .php
AddType Application/x-httpd-php-source .php

编辑一个php测试文件,存放于站点根目录下
vim index.php
<?php
phpinfo();
?>
[Sat Sep 03 16:09:08.592931 2016] [:crit] [pid 15966:tid 140126261696256] Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
AH00013: Pre-configuration failed
解决方法:
编辑httpd.conf配置文件
将event模式改为prefork模式 或者
重编 PHP 的时候加了 --with-openssl 把openssl 模块加进去了的缘故,去掉这个模块就又可以正常与 worker MPM 搭配了。
错误导致原因:以多线程的 worker 模式运行了 Apache,并且使用了非线程安全的 php 和其 apache 模块。
使用 prefork 模式运行 Apache 或换用线程安全版本的 php 及对应的 apache 模块
注意:线上环境,建议编译为线程安全


压力测试 --- 压力测试时间 联动(数据库等等)--- 做最坏的打算
一个进程占多少内存(ps aux | grep httpd)
最大进程数(free -m找free)
启动的进程数为多少比较合适?考虑内存、突发并发量

http_load常用选项 --- 参数是文件(里面存放具体的网站页面),不建议用
-p  并发的进程数量
-r  每秒的访问频率
-f  访问的总数
-s 持续访问的时间
    
webbench的常用选项
-c 并发数量
-t 持续访问时间

ab -n(测试次数) 1000 -c(并发数) 1000 http://10.0.10.178/index.html --- 只能测试某个页面

报错
socket: Too many open files (24)
解决办法
ulimit -n 10000
或者
vim /etc/security/limits.conf

webbench -t 180 -c 100 http://10.0.10.178/index.html

总结:
1.安装前要注意的问题
    隐藏apache的版本号--- 在源码包里面的include文件夹下的ap_release.conf文件,找到主版本号之类的
    考虑是否修改最大并发连接数--- 编辑event.c文件和其他工作模式的.c文件,找到DEFAULT_SEVER_LIMIT之类的
    相关的依赖软件包是否安装
    需要考虑使用那些模块
    考虑使用那种mpm进行工作(prefork,worker,event)
2.基本配置
3.apache的相关段配置
4.访问不在WEB根目录的内容(alias,scriptalias,options FollowSymlinks)
5.访问控制、认证和授权
6.虚拟主机的配置
7.lamp架构搭建

架设安全的ssl站点 --- 对传输的数据进行加密,对应于OSI的表示层,对应于TCP/IP的应用层
1.安装openssl加密软件包
    yum install openssl openssl-devel
2.创建私钥用于签署证书---生成一个章
    mkdir /usr/local/httpd/conf/private
    cd /usr/local/httpd/conf/private
    openssl genrsa -out server.key 1024
3.使用私钥server.key文件生成证书签署请求的csr文件---生成需要盖章的文件
    openssl req -new -key server.key -out server.csr
4.生成证书文件crt---已经盖好章的文件
    openssl x509 -days 3650 -req -in server.csr -signkey server.key -out server.crt
5.编辑httpd-ssl.conf,设置加密虚拟站点
vim /usr/local/httpd/conf/extra/httpd-ssl.conf
    DocumentRoot "/website/ssl/web"
    ServerName www.example.com:443
    ServerAdmin admin@example.com
    ErrorLog
    TransferLog
    SSLEngine on
    SSLCertificateFile "/usr/local/httpd/conf/private/server.crt"
    SSLCertificateKeyFile "/usr/local/httpd/conf/private/server.key"
6.编辑httpd.conf文件
    Include conf/extra/httpd-ssl.conf
    LoadModule ssl_module modules/mod_ssl.so
        LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
    
    添加mod_ssl
        进入源码包
        cd /modules/ssl
        /usr/local/httpd/bin/apxs -a -i -c mod_ssl.c
    如果添加之后还会提示报错,则使用如下命令添加模块
    # /usr/local/httpd/bin/apxs -a -i -c -L/usr/lib/openssl/engines/lib -c *.c -lcrypto -lssl -ldl