Linux Apache web服务器 配置详细教程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux Apache web服务器 配置详细教程相关的知识,希望对你有一定的参考价值。

3 Linux Apache web服务器 v2.4.29
学习要点:
1.apache用途,工作模式,httpd.conf的配置重要参数
2.虚拟主机

  1. 工作模式的参数优化

3.1 Apache 概述:

3.1.1 Apache 概述
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。同时Apache音译为阿帕奇,是北美印第安人的一个部落,叫阿帕奇族,在美国的西南部。也是一个基金会的名称、一种武装直升机等等。

apache发布静态站点,html jpg htm jss png css txt

wget -r -x http://www.baidu.com 抓取网站内容

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
1) 从概念上
进程:一个程序对一个数据集的动态执行过程,是分配资源的基本单位。
线程:一个进程内的基本调度单位。
线程的划分尺度小于进程,一个进程包含一个或者更多的线程。
进程是系统进行资源分配和调度的一个独立单位.
本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
2) 从执行过程中来看
进程:拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率。
线程:每一个独立的线程,都有一个程序运行的入口、顺序执行序列、和程序的出口。但是线程不能够独立的执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
3) 从逻辑角度来看:(重要区别)
多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但是,操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源分配。

3.1.2 apache的特点:
功能强大,配置简单,带度快,处理静态文件 ,应用广泛,性能稳定,并支持代理和负载均衡

3.1.3 apache适应场合
apache运行静态html网页,图片,处理静太小文件不如ningx
apache结合php引擎运行php,perl, python等程序 LAMP
apache结合tomcat resin运行jsp java等程序,
apache作代理,负载,rewrite规测过滤

3.2 Apache 的工作模式

  1. prefork:它是一个无线程设计的工作模式,进程与进程之间相互独立,一个连接占一个子进程,如果现有的子进程不能满足负载控制进程将派生新的子进程,可以通过配置文件来定义, 这种工作模式的优点是性能高,且比较稳定,不适用于高并发网站,比较消耗内存,如1个进程占用100M的内存,若内存只有1G那么只有1000/100=10个连接可用

  2. worker:它是一个多进程多线程混合工作模式,线程共享进程的内存,一个工作进程(子进程)可以处理大量的连接 ,如果其中的一个子进程断开,那么整个子进程的所有线程将会断开,也就是说所有的连接将会断开。如果现有子进程中的线程总数不能满足负载控制进程将派生新的子进程,这种工作模式的优点是网站并发能力强,但不太稳定
    这个嘛

  3. event:
    这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。Event MPM不能在安全HTTP(HTTPS)访问下工作。

prefork模式:apache默认工作模式
每个工作进程(子进程)处理一个请求连接,如果默认启动的工作进程满了,新来的请求,会占用空闲进程连接,空闲进程不够,master会预先生成更多的进程,直到所有的请求数(并发数)达到maxclient为止。
worker模式:
每个工作进程(子进程)生成多个线程,每个线程接受新来的请求,空闲进程不够,master会预先生成更多的工作进程,工作进程再生成多个线程,满足用户来访问,直到所有的请求数(并发数)达到maxclient为止。

查询apache的工作模式
[[email protected] httpd]# httpd -l

<IfModule mpm_prefork_module>
StartServers 8 #工作进程(子进程), master进程只有1个,一般配置8-16个预派生
ServerLimit 1500   #系统设置最大进程数,如果MaxClients超出了ServerLimit定义的范围那么它将无效,它的默认值为256
MinSpareServers   25 #默认生成的最少空闲进程数 ,表示目前没有接受任何连接也就是没有占用任何内存且连接资源
MaxSpareServers   75 #默认生成的最多空闲进程数
MaxClients 1000 # 最大客户端数,即同时允许的并发连接数,建议配置1000-4096,500036008
MaxRequestsPerChild   10000 #最大请求数,0代表不限,不推荐这样配置。它的含义是如果把值配置成10000,当达到10001时,也就是直到超过1万个请求后它将会从1重新开始
</IfModule>

<IfModule mpm_worker_module>
StartServers 2 #工作进程(子进程),master进程只有1个
MaxClients 150 #每秒总的并发数。每个子进程处理最大请求数,是他下属线程请求数之和,最好不要超过5000
MinSpareThreads 25 #默认生成的最少线程数
MaxSpareThreads 75 #默认生成的最少最多线程数
ThreadsPerChild 25 #每个子进程所支持的线程数,是他下属线程请求数之和, 这里为25,不能超过75
MaxRequestsPerChild 0 #最大请求数,0代表不限,不推荐这样配置,如果配置成10000,当达到10001时,重新从1开始处理
</IfModule>

MaxClients of 1000 exceeds ServerLimit value of 256 servers,  
# 需要设置ServerLimit 1000

maxclients = statservers X Threadsperchild

修改工作模式

yum安装的httpd

vim /etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

通过加载模块的方式加载运行模式的模块

cd /etc/httpd/modules
[[email protected] httpd]# ls modules/modmpm
mod_mpm_event.so mod_mpm_prefork.so mod_mpm_worker.so

源码安装的httpd

源码安装的apache在编译时指定参数--enable-mpms-shared 然后在配置文件修改LoadModule方式加载模块,也可以直接编译时指定模块,不过编译后无法修改,需要重新编译

3.3 Apache 安装

3.3.1 yum 安装

yum install httpd* -y

yum install apr-devel apr-util-devel gcc* pcre pcre-devel –y; 安装依赖包

3.3.2 源码包安装:

1、apr安装
wget -c http://mirrors.cnnic.cn/apache/apr/apr-1.5.2.tar.bz2
tar xvf apr-1.5.2.tar.bz2;cd apr-1.5.2
./configure --prefix=/usr/local/apr/ && make && make install

2、apr-util安装
wget -c http://mirrors.cnnic.cn/apache/apr/apr-util-1.5.4.tar.bz2
tar xvf apr-util-1.5.4.tar.bz2
cd ../apr-util
./configure --prefix=/usr/local/apr-util/ --with-apr=/usr/local/apr/ && make && make install

3、pcre安装
wget -c ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.bz2
tar xvf pcre-8.39;cd pcre-8.39
./configure --prefix=/usr/local/pcre && make && make install

? 下载源码包 httpd-2.4.25.tar.gz
wget –c https://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.25.tar.gz
tar xvf httpd-2.4.25.tar.gz;cd httpd-2.4.25; ./configure --prefix=/usr/local/apache/ --with-arp=/usr/local/apr --with-apr-util=/usr/local/arp-util --with-pcre=/usr/local/pcre --with-mpm=prefork 
make; make install

tar xvf httpd-2.4.25.tar.gz;cd httpd-2.4.25;
./configure --prefix=/usr/local/apache/
--enable-rewrite
--enable-deflate
--enable-expires
--enable-headers
--enable-modules=most
--enable-so
--with-mpm=worker
--enable-rewrite && make && make install

--with-mpm=prefork    # 指定工作模式
--enable-rewrite      # 开启rewrite模块
--enable-so # DSO capability

发布目录 /user/local/apache/htdocs/

3.4 apache 服务与端口

端口:80
yum安装方式: server httpd restart

源码安装方式:
/usr/local/apache/bin/apachectl graceful # 方式1
/usr/local/apache/bin/httpd -k restart # 方式2
/usr/local/apache/bin/httpd -t 配置语法检查 # 检查配置
apachectl -t 配置语法检查

将源码安装的命令做成软链接,直接使用
ls –n /usr/local/apache/bin/apachectl /usr/bin

Apachectl retart # 链接完后,可简写

-k start stop restart graceful
-h 帮助文件
-t 检查错误

ipocnfig/fushdns 刷新本地DNS

配置成系统服务:

cp /usr/local/apache/bin/apachectl /etc/init.d/httpd

cp /usr/local/apache/bin/apachectl /usr/local/bin/httpd

ln -s /etc/init.d/httpd /etc/rc.d/rc5.d/S61httpd

ln -s /etc/init.d/httpd /etc/rc.d/rc4.d/S61httpd

ln -s /etc/init.d/httpd /etc/rc.d/rc3.d/S61httpd

打开/etc/init.d/httpd文件在#!/bin/bash下面加入
#chkconfig:345 61 61
#description:Apache

执行chkconfig --list |grep httpd就会出现httpd服务开机运行在345级别
注册服务 chkconfig --add httpd
设置启动级别 chkconfig --levels 345 httpd on

1.1. Apache参数及优化

ServerTokens OS # 隐藏系统和软件版本信息 注释则显示
ServerRoot "/etc/httpd" # 软件主目录
PidFile run/httpd.pid # apache启动文件PID
Timeout 60 #不论接收或发送,当持续连接等待超过60秒则该次连接就中断
#一般来说,此数值在300秒左右即可,不需要修改这个原始值
KeepAlive Off
#这里最好把默认值“Off”修改为“On”
#这里表示是否允许持续性的连接,也就是一个TCP连接可以具有多个文件资料传送的要求
#举例来说,如果你的网页内含有很多图片文件,那么这一次连接就会将所有的数据传送完
#而不必每一个图片都需要进行一次TCP连接。
MaxKeepAliveRequests 100
#可以将默认的100改成500或更高
#与上一个设置的值KeepAlive有关,当KeepAlive的值设置为On的时候,这个数值可以决定
#该次连接能够传输的最大传输数量。为了提高效率则可以改大一点。0代表不限制
KeepAliveTimeout 65
#在KeepAlive设置为“On”的情况下,该次连接在最后一次传输后等待延迟的秒数
#当超过该秒数的时候该连接中断。保持默认值15即可,如果设置的值太高(等待时间较长)
#在较忙碌的系统上面将会有较多的Apache程序占用资源,可能有效率方面的问题。

<IfModule prefork.c>
StartServers 8 #启动Apache的时候,唤醒几个PID来处理服务的。
#Apache使用了进程预派生的技术来处理请求,大大提高了响应速度,
MinSpareServers 5 #最小预备使用的PID数量
MaxSpareServers 20 #最大预备使用的PID数量
ServerLimit 4096 #服务器的限制
MaxClients 4096 #最多可以有多少个客户端同时连接到Apache
#最大的同时连接数量,也就是process不会超过这一数值。
#这个MaxClients设置值可以控制同时连上www服务器的总连接要求数量,
#也可以将其看作是最高实时在线人数。不过要注意的是:这个值并非越大越好
#因为他会消耗物理内存(与process有关),所以如果你设置太高导致超出物理内存
#能够容许的范围,那么效率就会大大降低(因为会跑SWAP),此外,MaxClients也在
#Apache编译的时候就指定最大值了,所以你也无法超出系统最大值,除非你重新编译Apache
MaxRequestsPerChild 4000
#每个程序能够提供的最大传输次数要求。举例来说:如果有个用户连上服务器之后,
#要求数百个网页,当他的要求数量超过这个值的时候则该程序会被丢弃,
#另外切换一个新程序。这个设置可以有效地管理每个process在系统上存活的时间。
#根据观察所得,新程序的效果较好。
</IfModule>
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
#上面的prefork和worker其实就是两个与服务器连接资源有关的设置项目。
#默认的项目配置对于一般中小型网站来说已经很够用了,不过如果网站的流量
#比较大,也可以修订一下里面的数值。这两个模块都是用在提供用户连接资源,
#设置的数值越大代表系统会启动越多的程序来提供Apache的服务,反映速度就比较快

#Redhat和CentOS将这两个模块分别放到了不同的执行文件中,分别是

|- /usr/sbin/httpd 使用prefork模块

|- /usr/sbin/httpd.worker 使用worker模块

#/etc/sysconfig/httpd这个文件决定了Apache使用哪一个模块,可以通过。
#修改这个文件来切换不同的工作模式。
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so
#Apache提供了非常多的模块供我们使用,以上就是加载的模块
Include conf.d/*.conf
ServerAdmin [email protected]
#系统管理员的邮箱,当网站出现问题的时候,错误信息会显示的联系邮箱
DocumentRoot "/var/www/html"
#上面这一行的配置指定了放置首页的目录
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
#Directory指定后面的路径是系统中的绝对路径
#这个设置是针对www服务器的默认环境而来的,因为是针对“/”的设置
#建议保留上面的默认值
<Directory "/var/www/html">
#使用Directory指定了一个绝对路径的目录
Options -Indexes FollowSymLinks
#Options(目录参数)
#此设置值表示在这个目录内能够让Apache进行的操作,也就是针对Apache的程序的权限设置。
#主要的参数值有:

Indexes:如果在此目录下找不到首页文件(默认为index.html)时,

就显示整个目录下的文件名,至于首页文件名则与DirectoryIndex设置的值有关

建议注释掉Indexes

FollowSymLinks:这是Fllow Symolic Links的缩写,字面意义是让连接文件可以生效。

我们知道首页的目录是在/var/www/html,既然是WWW的根目录,理论上就像被chroot

一般。一般说来说被chroot的程序无法离开其目录,也就是说,默认的情况下,你在

/var/www/html下面的连接文件只要链接到非此目录的其他地方,则该连接文件默认是失效的。

但是使用这个设置可以让链接有效的离开本目录

ExecCGI:让此目录具有执行CGI的权限,非常重要。举例来说,OpenWebMail使用了

很多Perl程序,你要让OpenWebMail可以执行,就需要在该程序所在目录拥有ExecCGI

的权限才行。但是要注意:不要让所有的目录均可以使用ExecCGI

Includes:让一些Server-Side Include程序可以运行。建议可以加上去

MultiViews:这个有点像是多国语言的支持,与语言数据有关。在错误信息的回报内容中

最常见,在同一台主机中,可以依据客户端的语言而给予不同的语言显示。默认在回报

信息中存在,你可以检查一下/var/www/error/目录下的数据。

AllowOverride None
#允许覆盖参数功能
#表示是否允许额外配置文件.htaccess的某些参数覆盖。我们可以在httpd.conf内设置好所有的权限
#不过这样一来,若用户自己的个人网页想要修改权限时将会对管理员造成困扰。因此,Apache默认
#可以让用户以目录下的.htaccess文件内覆盖<Direcoty>内的某些功能参数。这个项目则是在规定
#.htaccess可以覆盖的权限类型有哪些。常见的有以下几种:

ALL:全部的权限均可以覆盖

AuthConfig:仅有网页认证(帐号与密码)可以覆盖

Indexes:仅允许Indexes方面的覆盖

Limits:允许用户利用Allow、Deny与Order管理可浏览的权限

None:不可覆盖,也就是让.htaccess文件失效

#使用.htaccess会严重影响到Apache的性能,如果不是特殊需要,建议关闭
#

Controls who can get stuff from this server.

#
Order allow,deny
Allow from all
#能否登陆浏览的权限
#决定此目录是否可被Apache的PID所浏览的权限设置。
#能否被浏览主要有两种判断的方式:

deny,allow 以deny优先处理,但没有写入规则的默认为allow

allow,deny 以allow为优先处理,但是没有写入规则的默认为deny

#所以在默认的情况下,因为是allow,deny 所以默认为deny(不可浏览)
#不过在下一行有个allow from all,allow优先处理,因此全部客户端均可浏览

3.5 apache 配置文件

默认网页存放文件 /var/www/html

########## vi /etc/httpd/conf/httpd.conf ###################

documentroot "/var/www/html/" # 定义apache发布目录 (网站根目录)
listen 80 # 监听端口 默认端口
directoryindex index.html index.html.var # 默认主页文件
servername www.baidu.com:80 # 域名访问
serveradmin [email protected] # 管理员邮箱

virtual hosts

NameVirtualHost :80      # 如果独立虚拟站点文件,需要在主配置文件中加入这条
include conf/vhost/
# 开启虚拟主机

创建一个虚拟站点目录,将虚拟主机分多个,www.a.com www.b.com

ServerTokens OS # 系统版本
ServerRoot "/etc/httpd" # 程序目录
PidFile run/httpd.pid # 过程pid号存放文件
Timeout 60 # 连接超时60秒
KeepAlive off # off/on 是否持续性连接
MaxKeepAliveRequests 100 # 连接能够传输最大传输数量
KeepAliveTimeOut 65 # 该次连接在最后传输的等待廷迟(无操作)

? Apache工作模式
<IfModule prefork.c>
StartServers 8 # 启动Apache的时候,唤醒几个PID进程来处理服务的。
#Apache使用了进程预派生的技术来处理请求,大大提高了响应速度,
MinSpareServers 5 # 最小预留(空闲)使用的PID数量
MaxSpareServers 20 # 最大预留(空闲)使用的PID数量
ServerLimit 4096 # 最大并发进程数限制 不能大于maxclients
MaxClients 4096 # 最多可以有多少个客户端同时连接到Apache
MaxRequestsPerChild 0           # 1个进程处理的最大请求数 0表示无限制
</IfModule prefork.c>

? Apache工作模式

<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25          # 每个进程支持的线程数
MaxRequestsPerChild 0          #主
</IfModule>

网站程序的根目录

<Directory />
Options FollowSymLinks
AllowOverride None
Order deny, allow
Allow from all
</Directory>

发布目录站点权限,需要在配置文件中授权,否则无法访问

<Directory "/usr/local/apache/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from al
BandwidthModule On # 启动带宽限制
  ForceBandwidthModule On # 启动带宽限制
  MaxConnection all 2000 # 最大连接数2000
  Bandwidth all 200000 # 单个客户端最大带宽200KB
</Directory>

<IfModule dir_module>
DirectoryIndex index.html index.hml # 默认主页,可以任何名称,有顺序
</IfModule>

<FilesMatch "^.ht">     #匹配文件权限
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>

ErrorLog "logs/error_log"
LogLevel warn # 日志级别

<IfModule alias_module>
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" # 目录别名
</IfModule>

<Directory "/usr/local/apache/cgi-bin"> # 目录别名的应用
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

DefaultType text/plain        # 默认文件类型

<IfModule mime_module> # 支持文件类型
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .php
</IfModule>

<IfModule ssl_module>       # ssl加密
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

<IfModule log_config_module> 日志格式
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" aming

定义日志过滤时需添加

<IfModule logio_module>
  # You need to enable mod_logio.c to use %I and %O
  LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" %I %O" combinedio
</IfModule>
  CustomLog "logs/access_log" common    # 开启访问日志

</IfModule>

对cgi支持 可以注销点,很少使用

<IfModule alias_module>
ScriptAlias /cgi-bin/ "/usr/local/apache//cgi-bin/"
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory "/usr/local/apache//cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

###############################################################

3.6 apache 虚拟主机

虚拟主机的分类:

  1. 基于IP

<VirtualHost 192.168.1.100:80>
ServerAdmin [email protected]
DocumentRoot "/usr/local/apahe//docs/A"
ServerName 192.168.1.100
ServerAlias www.a1.com www.a2.net
</VirtualHost >

  1. 基于域名

  2. 基于虚拟主机多端口

主用于内部测试

基于端口的访问,就是添加多条Listen 80 ServerName

Listen 80
Listen 81
Listen 82

#ServerName :80
#ServerName
:81
#ServerName *:82

如果在局域网做实验,同要修改本机的host文件的映射关系
192.168.1.129 www.a.com
192.168.1.129 www.b.com

Virtual hosts             在配置文件中取消注释

Include conf/extra/httpd-vhosts.conf

配置虚拟主机文件

vi /usr/local/apache/conf/extar/httpd-vhosts.confi

#################################################################
<VirtualHost *:80>
ServerAdmin [email protected] # 管理员邮箱
DocumentRoot "/usr/local/apahe//docs/A" # A网站的发布目录
ServerName www.a.com # 域名
ServerAlias www.a1.com www.a2.net # 域名别名,可以多个
ErrorLog "logs/dummy-host.example.com-error_log" # 错误日志文件
CustomLog "logs/dummy-host.example.com-access_log" common # 访问日志文件 引用日志格式common
<Directory "/usr/local/apahe//docs/A ">            # 对目录设置权限
AllowOverride All
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>

</VirtualHost>

<VirtualHost *:80>
ServerAdmin [email protected] # 管理员邮箱
DocumentRoot "/usr/local/apahe//docs/B" # B网站的发布目录
ServerName www.b.com # 主机名
ServerAlias www.b1.om www.bbb.net # 主机别名
ErrorLog "logs/dummy-host.example.com-error_log" # 错误日志文件
CustomLog "logs/dummy-host.example.com-access_log" common # 访问日志文件
<Directory "/usr/local/apahe//docs/B ">
AllowOverride All # 读取规则文件
Options -Indexes FollowSymLinks # 禁止浏览目录
Order allow,deny # allow在前,允许生效
Allow from all # 允许所有访问
rewrite ^/ www.baidu.com [L] # 网页跳转
Allowoverride Authconfig # 以下内容为网站主页认证
AuthName "验证提示"
AuthType Basic
AuthUserFile /date/htpasswd
require valid-user
</Directory>
</VirtualHost>

认证设置密码 /usr/local/apache/bin/htpasswd -c /data/htpasswd htpadmin

###############################################################################

</Directory>权限
1) AllowOverride 设置为 None 时, .htaccess 文件将被完全忽略。指令设置为 All 时,所有具有 “.htaccess” 作用域将生效.
2) Options -Indexes FollowSymLinks禁止显示目录,如果要以目录显示需要改成Options Indexes FollowSymLinks
3) Order allow,deny ,默认情况下禁止所有客户机访问;Order deny,allow 默认情况下允许所有客户机访问.
4) Allow from all允许所有客户机访问。
5) NameVirtualHost指令,指定一个基于域名的虚拟主机将使用哪个IP地址来接受请求。

3.7 Apache 日志

访问日志: /etc/httpd/logs/access.log
错误日志: /etc/httpd/logs/error_log

Tail -fn 50 /etc/httpd/logs/error_log | grep error | can’t | warn |not found 多搜索关键词

3.7.1 Rotatelogs日志轮询
语法:
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]

选项
-l
使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。

logfile
它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。

rotationtime
日志文件滚动的以秒为单位的间隔时间。7200s=2小时 86400s=24小时

Offset
相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。

filesizeM
指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。

CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/accesswww%y%m%d.log" combined

ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/10.70.25.143:10002.errorlog.%Y%m%d%H 7200 480"
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/10.70.25.143:10002.accesslog.%Y%m%d%H 7200 480" common

用时间控制日志文件,例如:
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/10.70.25.143:10002.accesslog.%Y%m%d%H 7200 480" common

用文件大小控制日志文件,例如:
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/10.70.25.143:10002.accesslog.%Y%m%d%H 5M" common

这里的7200 单位是秒(7200s=2h)也就是说 两小时对日志进行一次轮循,重新生成一log文件。而生成文件的格式是
10.70.25.143:10002.errorlog.%Y%m%d%H (具体参数可随意设置,见如下格式手册)若不设置会被自动加上以秒为单位的".nnnnnnnnnn"后缀。
480 为时差,文件的时间为美国时间,中国的时差要比美国多8个小时也就是480分钟,所以要加上480分钟
其中common为日志记录格式里设置的名称。
若有多个站点,则应将以上配置写到各站点的VirtualHost节点中,这样才会分开文件记录各站点日志。
5M 为文件大小限制

3.7.2 日志格式和参数

语法 格式 引用名
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

一些常见的格式串:
通用日志格式(CLF):
“%h %l %u %t ”%r” %>s %b”
带虚拟主机的通用日志格式:
“%v %h %l %u %t ”%r” %>s %b”
NCSA扩展/组合日志格式:
“%h %l %u %t ”%r” %>s %b ”%{Referer}i” ”%{User-agent}i”"
Referer日志格式:
“%{Referer}i -> %U”
Agent(Browser)日志格式:
“%{User-agent}i”

LogFormat "%h %l %u %t %T "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" common

%h 远端主机
%l 远端登录名
%u 远程用户名
%t 时间
%T 处理完请求所花时间,以秒为单位。
%r 请求的第一行
%b 以CLF格式显示的除HTTP头以外传送的字节数
%I 接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
%O 发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块
/"%{Referer}i"/ 代表访问网站时,自己所处的地址
“%{User-Agent}i”代表用户使用什么浏览器访问的网站,以及用户所使用的系统是什么操作系统
“common”字段很重要,它代表是自己定义的,如果不加些字段,则添加的自定义日志不起作用。
%s 状态。对于内部重定向的请求,这个状态指的是原始请求的状态,—%>s则指的是最后请求的状态。

3.7.3 如何让http的访问日志在nginx负载均衡服务器上显示真实的IP地址?
解决方法:
LogFormat "%h %l %u %t "%r" %>s %b "%{ X-Forwarded-For }i" " common

3.7.4 不记录图片日志

<FilesMatch ".(jpg|css)">     #匹配文件权限
SetEnv IMAG 1
</FilesMatch>

CustomLog "/usr/local/apache/logs//access_log" common env=!IMAG

3.7.5 RS服务器不记录负载均衡健康检查日志
SetEnvIf Request_URI "^/check.txt$" dontlog
CustomLog /var/log/httpd/vhost_access.log combined env=!dontlog

3.7.6 统计日志单IP访问请求数排名

awk ‘{print $1}‘ /usr/local/apache/logs/access.log | sort | uniq -c | sort -rn -k1 | head -10

awk ‘{++S[$1]} END {for (key in S) print S[key],key}‘ /usr/local/apache/logs/access.log | sort -rn -k1 | head -10

1.1. Apache 日志轮询cronolog

  1. 安装cronolog
    http://down1.chinaunix.net/distfiles/cronolog-1.6.2.tar.gz
    tar cronolog-1.6.2.tar.gz
    ./configure
    make
    make install

[[email protected] tools]# ll /usr/local/sbin/cronolog
-rwxr-xr-x 1 root root 40486 Apr 28 17:00 /usr/local/sbin/cronolog

  1. 配置cronolog

将CustomLog在虚拟机插入日志

<VirtualHost 192.168.1.100:80>
ServerAdmin [email protected]
DocumentRoot "/usr/local/apahe//docs/A"
ServerName 192.168.1.100
ServerAlias www.a1.com www.a2.net
CustomLog "/usr/local/apache/logs//access_log" common

按天轮询

CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/accesswww%y%m%d.log" combined
</VirtualHost >

文件格式利用date的参数,小时%H,日%F 周%w

按周建立目录,按小时轮询
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/%w/accesswww%y%m%d.log" combined

3.8 Apache 隐藏版本信息

要在源码编译前修改

改apache软件名称

vi /httpd-2.2.31/include/ap_release.h

#define AP_SERVER_BASEVENDOR "Apache Software Foundation"
#define AP_SERVER_BASEPROJECT "Apache HTTP Server"
#define AP_SERVER_BASEPRODUCT "Apache"

#define AP_SERVER_MAJORVERSION_NUMBER 2
#define AP_SERVER_MINORVERSION_NUMBER 2
#define AP_SERVER_PATCHLEVEL_NUMBER 31
#define AP_SERVER_DEVBUILD_BOOLEAN 0

vi /httpd-2.2.31/os/unix/os.h

#define PLATFORM "Unix"

通过curl命令检查

隐藏版本号

vi /usr/local/apache/conf/extra/httpd-default.conf
ServerTokens Prod
ServerSignature On

vi /usr/local/apache/conf/httpd.conf
include conf/extra/httpd-default.conf

3.9 Apache Rewrite规则

3.9.1 域名跳转 域名重定向
作用:当企业中有多个域名时,为了统一管理,可以将其它域名访问时跳转到您指定的域名在推广和收录方面,都会比较好管理。

配置步骤:

  1. 在httpd.conf中启用Rewrite引擎
    RewriteEngine on //启用rewrite引擎  启动rewrite规则前需先添加启动参数
    1. 确认配置文件中有mod_Rewrite.so,也可以用apachectl -M查看
      LoadModule Rewrite_module libexec/mod_Rewrite.so
    2. 在httpd.conf配置文件中最后添加下面实例1中的代码
      配置注意事项: 所跳转的域名要实际能也访问到网站的URL才有效。

Rewrite URL重定向就是实现URL的跳转和隐藏真实地址,可以把复杂的URL变成简洁直观的URL,对seo优化有很大的帮助。如下几个简单的举例:

Apache Rewrite规则使用中有三个概念需要理解,分别是:Rewrite结尾标识符、Rewrite规则常用表达式、Apache Rewrite变量,如下为三个概念的详解:
(1) Apache Rewrite结尾标识符,用于Rewrite规则末尾,表示规则的执行属性
1) R 强制外部重定向。
2) F 禁用URL,返回403HTTP状态码。
3) G 强制URL为GONE,返回410HTTP状态码。
4) P 强制使用代理转发。
5) L 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N 重新从第一条规则开始运行重写过程。
7) C 与下一条规则关联。
8) OR 逻辑或 多条规则时
%{} 匹配 ^ 开头 NC 大小写匹配
ornext|OR‘ (or next condition)逻辑或,可以同时匹配多个RewriteCond条件RewriteRule适用的标志符

(2) Apache Rewrite规则常用表达式,主要用于匹配参数、字符串及过滤设置
. 匹配任何单字符;
[word] 匹配字符串:word;
[^word] 不匹配字符串:word;
jfedu|jfteach 可选择的字符串:jfedu|jfteach;
? 匹配0到1个字符;

  • 匹配0到多个字符;
  • 匹配1到多个字符;
    ^ 字符串开始标志;
    $ 字符串结束标志;
    转义符标志。

(3) Apache Rewrite变量,常用于匹配HTTP请求头信息、浏览器主机名、URL等
HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT;
connection & request: REMOTE_ADDR, QUERY_STRING;
server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL;
system stuff: TIME_YEAR, TIME_MON, TIME_DAY。
详解如下:
HTTP_USER_AGENT 用户使用的代理,例如浏览器;
HTTP_REFERER 告知服务器,从哪个页面来访问的;
HTTP_COOKIE 客户端缓存,主要用于存储用户名和密码等信息;
HTTP_HOST 匹配服务器ServerName域名;
HTTP_ACCEPT 客户端的浏览器支持的MIME类型;
REMOTE_ADDR 客户端的IP地址
QUERY_STRING URL中访问的字符串;
DOCUMENT_ROOT 服务器发布目录;
SERVER_PORT 服务器端口;
SERVER_PROTOCOL 服务器端协议;
TIME_YEAR 年;
TIME_MON 月;
TIME_DAY 日;

? 实例1:把所有配置的域名都跳转到一个域名:
RewriteEngine on //启用rewrite引擎  
RewriteCond %{HTTP_HOST} ^hdbattery.com [NC,OR] # 匹配域名是hdbattery.com
RewriteCond %{HTTP_HOST} !^www.hd.com [NC,OR]] # 匹配www.hd.com域名
RewriteCond %{HTTP_HOST} ^125.93.253.55 [NC,OR]] # 匹配IP地址
RewriteCond %{HTTP_HOST} !^$ [NC,OR] # 区配任何内容都跳转
//以上为匹配内容,
RewriteRule ^/(.*)$ http://www.hd.com/$1 [L]
//匹配上面条件,然后跳转到http://www.hd.com

? 实例2:访问A域名跳到B域名,多条匹配的时候用到OR参数

实例注意事项:
  1. 这里面匹配%{HTTP_HOST},c.com 与 www.c.com是属于二个URL,不要混为一个
  2. 匹配的URL要严格匹配,从^开始,从$结束
  3. 多个OR的时候,最后一个OR不需要配
  4. 上图ServerAlias的域名可以不配,与跳转没有关联,不影响效果

? 实例3:工作目录的跳转,访问www.jfedu.net首页,跳转至www.jfedu.net/newindex/,R=301表示永久重定向。
RewriteEngine on
RewriteRule ^/$ http://www.jfedu.net/newindex/ [L,R=301]

? 实例4:访问www.jfedu.net首页,内容访问www.jfedu.net/newindex/,但是浏览器URL地址不改变。
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.jfedu.net [NC]
RewriteRule ^/$ /newindex/ [L]

? 实例5:访问/newindex/plus/view.php?aid=71跳转至http://www.jfedu.net/linux/。
RewriteEngine on
RewriteCond %{QUERY_STRING} ^aid=(.+)$ [NC]
RewriteRule ^/forum.php$ /jfedu/thread-new-%1.html? [R=301,L]

? 实例6:访问/forum.php?tid=107258跳转至/jfedu/thread-new-107258.html。
RewriteEngine on
RewriteCond %{QUERY_STRING} ^tid=(.+)$ [NC]
RewriteRule ^/forum.php$ /jfedu/thread-new-%1.html? [R=301,L]

? 实例7:访问/xxx/123456跳转至/xxx?id=123456。
RewriteEngine on
rewriteRule ^/(.+)/(d+)$ /$1?id=$2 [L,R=301]

? 实例8:判断是否使用移动端访问网站,移动端访问跳转至m.jfedu.net。
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^iPhone [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^android [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^WAP [NC]
RewriteRule ^/$ http://m.jfedu.net/index.html [L,R=301]
RewriteRule ^/(.*)/$ http://m.jfedu.net/$1 [L,R=301]

? 实例9:访问/10690/jfedu/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。
RewriteEngine on
RewriteRule ^/([0-9]+)/jfedu/(.+)$ /index.php?tid/$1/items=$2 [L,R=301]

? .htaccess 301重定向

RewriteEngine OnRewriteCond %{HTTP_HOST} !^ubangmang.com$ [NC]
RewriteRule ^(.*)$ http://www.ubangmang.com/$1 [L,R=301]

? httpd.ini 301重定向

[ISAPI_Rewrite]# 3600 = 1 hourCacheClockRate 3600RepeatLimit 32
RewriteEngine OnRewriteCond Host: ^ubangmang.com$
RewriteRule (.*)http://www.ubangmang.com$1[I,RP]

WordPress伪静态化rewrite规则
location / {
index index.html index.php;
if (-f $request_filename/index.html){
rewrite (.) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.
) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}

? PHPCMS伪静态化rewrite规则

location / {
rewrite ^(.)show-([0-9]+)-([0-9]+).html$ $1/show.php?itemid=$2&page=$3;
rewrite ^(.
)list-([0-9]+)-([0-9]+).html$ $1/list.php?catid=$2&page=$3;
rewrite ^(.*)show-([0-9]+).html$ $1/show.php?specialid=$2;
}

? PHPWind伪静态化rewrite规则

location / {
rewrite ^(.)-htm-(.)$ $1.php?$2 last;
rewrite ^(.*)/simple/([a-z0-9_]+.html)$ $1/simple/index.php?$2 last;
}

? ECSHOP伪静态化rewrite规则

if (!-e $request_filename){
rewrite "^/index.html" /index.php last;
rewrite "^/category$" /index.php last;
rewrite "^/feed-c([0-9]+).xml$” /feed.php?cat=$1 last;
rewrite “^/feed-b([0-9]+).xml$” /feed.php?brand=$1 last;
rewrite “^/feed.xml$” /feed.php last;
rewrite “^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-])-([0-9]+)-(.+)-([a-zA-Z]+)(.).html$” /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8 last;
rewrite “^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-])(.).html$” /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5 last;
rewrite “^/category-([0-9]+)-b([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.).html$” /category.php?id=$1&brand=$2&page=$3&sort=$4&order=$5 last;
rewrite “^/category-([0-9]+)-b([0-9]+)-([0-9]+)(.
).html$” /category.php?id=$1&brand=$2&page=$3 last;
rewrite “^/category-([0-9]+)-b([0-9]+)(.).html$” /category.php?id=$1&brand=$2 last;
rewrite “^/category-([0-9]+)(.
).html$” /category.php?id=$1 last;
rewrite “^/goods-([0-9]+)(.).html” /goods.php?id=$1 last;
rewrite “^/article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.
).html$” /article_cat.php?id=$1&page=$2&sort=$3&order=$4 last;
rewrite “^/article_cat-([0-9]+)-([0-9]+)(.).html$” /article_cat.php?id=$1&page=$2 last;
rewrite “^/article_cat-([0-9]+)(.
).html$” /article_cat.php?id=$1 last;
rewrite “^/article-([0-9]+)(.).html$” /article.php?id=$1 last;
rewrite “^/brand-([0-9]+)-c([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+).html” /brand.php?id=$1&cat=$2&page=$3&sort=$4&order=$5 last;
rewrite “^/brand-([0-9]+)-c([0-9]+)-([0-9]+)(.
).html” /brand.php?id=$1&cat=$2&page=$3 last;
rewrite “^/brand-([0-9]+)-c([0-9]+)(.).html” /brand.php?id=$1&cat=$2 last;
rewrite “^/brand-([0-9]+)(.
).html” /brand.php?id=$1 last;
rewrite “^/tag-(.).html” /search.php?keywords=$1 last;
rewrite “^/snatch-([0-9]+).html$” /snatch.php?id=$1 last;
rewrite “^/group_buy-([0-9]+).html$” /group_buy.php?act=view&id=$1 last;
rewrite “^/auction-([0-9]+).html$” /auction.php?act=view&id=$1 last;
rewrite “^/exchange-id([0-9]+)(.
).html$” /exchange.php?id=$1&act=view last;
rewrite “^/exchange-([0-9]+)-min([0-9]+)-max([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.).html$” /exchange.php?cat_id=$1&integral_min=$2&integral_max=$3&page=$4&sort=$5&order=$6 last;
rewrite ^/exchange-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.
).html$” /exchange.php?cat_id=$1&page=$2&sort=$3&order=$4 last;
rewrite “^/exchange-([0-9]+)-([0-9]+)(.).html$” /exchange.php?cat_id=$1&page=$2 last;
rewrite “^/exchange-([0-9]+)(.
).html$” /exchange.php?cat_id=$1 last;
}

? SHOPEX伪静态化rewrite规则

location / {
if (!-e $request_filename) {
rewrite ^/(.+.(html|xml|json|htm|php|jsp|asp|shtml))$ /index.php?$1 last;
}
}

? Discuz 7伪静态化rewrite规则

rewrite ^/archiver/((fid|tid)-[w-]+.html)$ /archiver/index.php?$1 last;
rewrite ^/forum-([0-9]+)-([0-9]+).html$ /forumdisplay.php?fid=$1&page=$2 last;
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ /viewthread.php?tid=$1&extra=page=$3&page=$2 last;
rewrite ^/space-(username|uid)-(.+).html$ /space.php?$1=$2 last;
rewrite ^/tag-(.+).html$ /tag.php?name=$1 last;

? discuzX2.0伪静态化rewrite规则

将 RewriteEngine 模式打开

RewriteEngine On

修改以下语句中的 /discuz 为你的论坛目录地址,如果程序放在根目录中,请将

/discuz 修改为 /
RewriteBase /

Rewrite 系统规则请勿修改

RewriteCond %{QUERY_STRING} ^(.)$
RewriteRule ^topic-(.+).html$ portal.php?mod=topic&topic=$1&%1
RewriteCond %{QUERY_STRING} ^(.
)$
RewriteRule ^article-([0-9]+)-([0-9]+).html$ portal.php?mod=view&aid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.)$
RewriteRule ^forum-(w+)-([0-9]+).html$ forum.php?mod=forumdisplay&fid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.
)$
RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+).html$ forum.php?mod=viewthread&tid=$1&extra=page=$3&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.)$
RewriteRule ^group-([0-9]+)-([0-9]+).html$ forum.php?mod=group&fid=$1&page=$2&%1
RewriteCond %{QUERY_STRING} ^(.
)$
RewriteRule ^space-(username|uid)-(.+).html$ home.php?mod=space&$1=$2&%1
RewriteCond %{QUERY_STRING} ^(.)$
RewriteRule ^blog-([0-9]+)-([0-9]+).html$ home.php?mod=space&uid=$1&do=blog&id=$2&%1
RewriteCond %{QUERY_STRING} ^(.
)$RewriteRule ^archiver/(fid|tid)-([0-9]+).html$ archiver/index.php?action=$1&value=$2&%1

3.9.2 Apache 伪静态
伪静态是需要程序、开发一起写才能正常展示,单运维是无法修改和显示出来的。

静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。就是展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。

RewriteRule ^(.*)/archiver/((fid|tid)-[s]+.html)$ $1/archiver/index.php?$2

文件路径/var/www/html/archiver/index.php http://www.baidu.com/archiver/fid-a.html

RewriteRule ^(.*)/forum-([0-9]+)-([0-9]+).html$ $1/forumdisplay.php?fid=$2&page=$3

文件路径/var/www/html/forumdisplay.php http://www.baidu.com/forum-1-1.html

. 匹配除换行符以外的任意字符
w 匹配字母或数字或下划线或汉字
s 匹配任意的空白符
d 匹配数字
 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
代码/语法 说明

  • 重复零次或更多次
  • 重复一次或更多次
    ? 重复零次或一次
    {n} 重复n次
    {n,} 重复n次或更多次
    {n,m} 重复n到m次

[0-9]{3}  就是代表匹配[0-9],共3次 也就是类似这种,111、192,123 

要把访问域名 www.domain1.com 的域名转发到 www.domain2.com 上

  1. RewriteEngine on
  2. RewriteCond %{HTTP_HOST} ^www.domain1.com$
  3. RewriteRule ^(.*)$ http://www.domain2.com/$1 [R=301,L]

如果是多个域名重定向到一个域名

  1. RewriteEngine on
  2. RewriteCond %{HTTP_HOST} ^www.domain.com [OR]
  3. RewriteCond %{HTTP_HOST} ^www.domain1.com$
  4. RewriteRule ^(.*)$ http://www.domain2.com/$1 [R=301,L]

3.9.3 日志不记录图片下载信息
Vi vitual-host.conf
SetEnvIf Request_URI "..gif$" image-request
SetEnvIf Request_URI ".
.jpg$" image-request
SetEnvIf Request_URI "..png$" image-request
SetEnvIf Request_URI ".
.bmp$" image-request
SetEnvIf Request_URI "..swf$" image-request
SetEnvIf Request_URI ".
.js$" image-request
SetEnvIf Request_URI ".*.css$" image-request

CustomLog "/tmp/1.log" aming env=!image-request

CustomLog "|/usr/local/apache/bin/rotatelogs /tmp/access_%Y%m%d.log 86400" aming env=!image-request

上面命令实现日志切割,按天生成日志

Vi httpd.conf
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" aming

定义日志过滤时需添加

3.9.4 apache 日志中记录代理IP以及真实客户端IP
默认情况下log日志格式为:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
其中%h 是记录访问者的IP,如果在web的前端有一层代理,那么这个%h其实就是代理机器的IP,这不是我们想要的。在这种情况下,
%{X-FORWARDED-FOR}i 字段会记录客户端真实的IP。所以log日志改为:
LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined

3.10 Apache配置静态缓存

Apache如何实现静态缓存可以启用mod_expires&mod_headers

当然如果我们是租用虚拟主机的话,”httpd.conf”设定档我们一般用户是接触不到的,而在网站根目录里写个”.htaccess”设定档, 我想在运用上相对是较灵活的.”mod_expires”的设定资料除了可以写在Apache的”httpd.conf”设定档中,也可以写 在”.htaccess”设定档里.

ExpiresDefault指令

按照Apache Server的介绍,ExpiresDefault的格式如下
ExpiresDefault "<base> [plus] {<num> <type>}*"

其中,base取值如下
access #访问之后,从当前时间计算
now(等价于access) #访问之后,从当前时间计算
modification #修改之后,从服务器文件修改后计算
plus是关键字,这个是系统指定的写法

<num>表示计数,单位为秒

<type> 表示日期单位,后者取值如下
years
months
weeks
days
hours
minutes
seconds

<IfModule expires_module>
ExpiresActive On
#访问之后的一个月不再更新
ExpiresDefault "access plus 1 month"
#访问之后的4周不再更新
#ExpiresDefault "access plus 4 weeks"
#访问之后的30天不再更新
#ExpiresDefault "access plus 30 days"
</IfModule>

浏览器访问www.aaa.com
vi /usr/local/apache2/conf/extra/httpd-vhosts.conf
上面添加如下信息:

      ExpiresActive on
      ExpiresByType image/gif "access plus 1 days"
      ExpiresByType image/jpeg "access plus 24 hours"
      ExpiresByType image/png "access plus 24 hours"
      ExpiresByType text/css "now plus 2 hours"
      ExpiresByType application/x-javascript "now plus 2 hours"
      ExpiresByType application/x-shockwave-flash "now plus 2 hours"
      ExpiresDefault "now plus 0 min"

保存退出
apachectl -t
apachectl graceful
curl -x127.0.0.1:80 ‘http://www.test.com/static/image/common/logo.png‘ -I

<IfModule expires_module>
ExpiresActive On
ExpiresDefault A3600

1 年

<FilesMatch ".(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A9030400
</FilesMatch>

1 星期

<FilesMatch ".(jpg|jpeg|png|gif|swf)$">
ExpiresDefault A604800
</FilesMatch>

3 小时

<FilesMatch ".(txt|xml|js|css)$">
ExpiresDefault M10800
</FilesMatch>
</IfModule>

<IfModule headers_module>

htm,html,txt类的文件缓存一个小时

<filesmatch ".(html|htm|txt)$">
header set cache-control "max-age=3600"
</filesmatch>

css, js, swf类的文件缓存一个星期

<filesmatch ".(css|js|swf)$">
header set cache-control "max-age=604800"
</filesmatch>
</IfModule>

<IfModule expires_module>

Axxxx - Access seconds ,表示访问之后经过多少秒

Mxxxx - Modifyed seconds ,表示修改之后经过多少秒(推荐)

ExpiresActive On
ExpiresDefault A3600 #表示一小时后更新
ExpiresByType image/x-icon A86400 #表示1天后更新
#脚本文件和css样式,我们最好使用 Modification
ExpiresByType application/javascript M604800 #表示修改完之后,更新之后的1周以后更新
ExpiresByType text/css M2592000
#表示修改后如果没有再次修改,那么经过一个星期才允许更新缓存
ExpiresByType image/gif M604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg M604800
ExpiresByType text/plain A604800
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType text/html A900
</IfModule>

3.11 apache 防盗链
资源盗链:是不法网站未经过同意通过链接合法网站的图片,视频等资源在自身的网站上展示来达到宣传自已的目的,侵害了合法网站的权益,同时也占用了合法网站的流量和资源

防盗链手段:利用referer和rewirte实现apache防盗链调用

防盗链环境说明:

  1. 搭建A,B二个网站,A中放置一个正常图片mm.jpg,同时放置一张版本警告图片nolink.jpg,
  2. B网站目录下建立一个html,添加图片链接<img src=http://www.a.com/img/mm.jpg>;
  3. 正常情况下,www.b.com打开html网页的时候,可以正常显示从a盗过来的mm.jpg图片
  4. 在A的httpd.conf的配置文件中,添加如下防盗链代码:重启服务,再测试html打开是否正常

防盗链代码:
RewrtieEngine on
RewriteCond %{HTTP_REFERER} !^www.a.com/.$ [NC]
RewriteCond %{HTTP_REFERER} !^www.a.com$ [NC]
RewriteCond %{HTTP_REFERER} !^www.c.com/.
$ [NC]
RewriteCond %{HTTP_REFERER} !^www.c.com$ [NC]
RewriteRule .*.(gif|jpg|swf)$ http://www.a.com/img/nolink.jpg [R,NC]

3.12 Apache 常用目录学习

/usr/local/apache/
├── bin
│ ├── ab
│ ├── apachectl
│ ├── apxs
│ ├── checkgid
│ ├── dbmmanage
│ ├── envvars
│ ├── envvars-std
│ ├── htcacheclean
│ ├── htdbm
│ ├── htdigest
│ ├── htpasswd
│ ├── httpd
│ ├── httxt2dbm
│ ├── logresolve
│ └── rotatelogs
├── 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
├── htdocs
│ └── index.html

/usr/local/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

1) |- /etc/httpd/conf/httpd.conf ? (Apache的主配文件)
2) |- /etc/httpd/conf.d/*.conf ( (include文件)
此目录下放置着.conf的配置文件,这里面的文件在httpd服务运行时被全部加载,所以在维护或修改参数时,为了不修改原配置文件,可以自已定义一个独立的conf文件,方便管理。

include conf.d/welcome.cnf # 代码格式

3) |- /usr/lib64/httpd/modules/
|- /etc/httpd/modules/
Apache支持很多的外挂模块,例如PHP以及SSL都是Apache外挂的一种。所有你想要使用的模块文件默认是放置在这个目录当中的。
4) |- /var/www/html/ ( (网站根目录)
5) |- /var/www/error/
当因为服务器设置错误,或是浏览器要求的数据错误时,在浏览器上出现的错误信息就以这个目录的默认信息为主
|- /var/www/icons/
这个目录提供Apache默认给予的一些小图示,可以随意使用。
|- /var/www/cgi-bin/
默认给一些可执行的CGI(网页程序)程序放置的目录。
6) |- /var/log/httpd/
默认的Apache日志文件都放在这里,对于流量比较大的网站来说,这个目录要格外注意,这里的数据文件可能会非常大。
7) |- /usr/sbin/apachectl
这个就是Apache的主要执行文件,这个执行文件其实就是一个Shell Script而已,他可以主动地侦测系统上面的一些设置值,好让你启动Apache时更简单一些。
8) |- /usr/sbin/httpd
这个是主要的Apache二进制执行文件。
9) |- /usr/bin/htpasswd ( (Apache密码保护)
在当你想要登入某些网页时你需要输入帐号与密码,那Apache本身就提供一个最基本的密码保护方式,该密码的产生就是通过这个命令来实现的。

3.13 Apache 配置文件权限操作
3.6.1 参考:京峰Linux高级运维视频资料(2016版)

3.14 正确设置站点目录文件及目录权限

为了保证网站不遭受×××***上传及修改文件
安全的权限

  1. 站点所有目录的用户和组都应该为root
  2. 站点所有目录权限是默认的755 不能往目录放文件
  3. 站点所有文件权限默认是644 不能改文件

注意:网站服务的用户不能用root
此权限主要是针对nginx进程用户的访问权限,因为×××主要是用此用户进行×××的
但是以上设置会对有些网站需要上传文件而没有取限,如何解决呢?

3.15 Apache 管理

Httpd –V # 查看系统本版等详细信息,也包括apache工作模式
Httpd -l # 查看工作模式

/usr/local/apache/bin/apachectl –M # 查询当前加载的模块

curl -x192.168.2.135:80 www.a.com -I

3.16 apache的web认证

  1. 修改配置文件httpd.conf
    <Directory "/var/www/html">
    Options Indexes FollowSymLinks
    allowoverride authconfig
    order allow,deny
    allow from al
    <Directory "/>
  2. 在根目录下添加.htaccess文件
    vim /var/www/html/.htaccess
    AuthName "auth"
    AuthType basic
    AuthUserFile /etc/httpd/conf/htpasswd
    require valid-user

  3. 使用htpasswd配置用户名和密码
    htpasswd -bc /etc/httpd/conf/htpasswd user1 1234

  4. 重启apache
    apachectl -k graceful

3.17 Apaceh ab压力测试
ab -n 100 -c 10 http://test.com/

ab常用参数的介绍:
-n:总共的请求执行数,缺省是1;
-c: 并发数,缺省是1;
-t:测试所进行的总时间,秒为单位,缺省50000s
-p:POST时的数据文件
-w: 以HTML表的格式输出结果

[[email protected] html]# ab -n 3000 -c 10 https://121.42.183.93/index.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 121.42.183.93 (be patient)

Server Software:
Server Hostname: 121.42.183.93
Server Port: 443
SSL/TLS Protocol: TLSv1/SSLv3,RC4-MD5,2048,112

Document Path: /index.php
Document Length: 274 bytes

Concurrency Level: 10 # 并发请求
Time taken for tests: 471.724 seconds # 整个测试持续时间
Complete requests: 259 # 完成请求数
Failed requests: 0 # 失败请求数
Write errors: 0
Non-2xx responses: 269
Total transferred: 123471 bytes # 整个场景中的网络传输量
HTML transferred: 73706 bytes # 整个场景中HTML内容传输量
Requests per second: 0.55 [#/sec] (mean) # 吞吐率
Time per request: 18213.293 [ms] (mean) # 用户平均请求等待时间 (mean)平均值
Time per request: 1821.329 [ms] (mean, across all concurrent requests) # 服务器平均请求处理时间
Transfer rate: 0.26 [Kbytes/sec] received # 平均每秒网络上的流量 可以判断是否存在延时

Connection Times (ms)    网络消耗时间
min mean[+/-sd] median max
Connect: 130 212 991.5 145 16070
Processing: 17368 17374 15.7 17373 17622
Waiting: 41 45 2.8 46 53
Total: 17499 17586 991.3 17520 33438

Percentage of the requests served within a certain time (ms)   百分比处理时间(毫秒)
50% 17520      处理到50%时所花费的时间
66% 17524
75% 17526
80% 17528
90% 17533
95% 17539
98% 17556
99% 18267
100% 33438 (longest request)

3.18 Curl命令

见nginx章节

3.19 apache 常见故障

错误日志
tail -fn 100 /var/log/httpd/error_log 故障排错

3.19.1 提示configure: error: APR not found . Please read the documentation

./configure --prefix……检查编辑环境时出现:
checking for APR... no
configure: error: APR not found . Please read the documentation

解决办法:

  1. 事先在编译apache时需要安装apr arp-util pcre三个组件
  2. 在编译的时候,指定apr apr-util pcre路径

3.19.2 提示Address already in use: make_sock: could not bind to address [::]:80
[[email protected] ~]# /usr/local/apache/bin/apachectl -k start
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down

解决方法:有服务占用此端口,用netstat-ntupl找到程序停止它

3.19.3 提示apache/bin/apxs:/usr/local/perl: bad interpreter: No such file or directory
apache/bin/apxs:/usr/local/perl: bad interpreter: No such file or directory
configure: error: no - APXSrefers to an old version of Apache
./confiure报错:这是因为apsx文件没有指定perl执行程序位置

解决:[[email protected] ~]# vi /usr/local/apache/bin/apxs
#!/replace/with/path/to/perl/interpreter–w #将第一行修改为#!/usr/bin/perl –w即可

#添加环境变量
[[email protected] ~]# echo "PATH=$PATH/:/usr/local/subversion/bin" >> /etc/profile
[[email protected] ~]# source /etc/profile
[root[email protected] ~]# svnserve –version #显示版本信息表示正常

3.19.4 提示You don‘t have permission to access / on this server.

修改根目录权限
<Directory />
AllowOverride none
Require all granted(denied)
</Directory>

3.19.5 httpd: Could not reliably determine the server‘s fully qualified domain name, using 127.0.0.1 for ServerName
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80

原因:找不到完整的FQDN域名
解决方法: 修改httpd.conf配置
#ServerName 127.0.0.1:80

以上是关于Linux Apache web服务器 配置详细教程的主要内容,如果未能解决你的问题,请参考以下文章

求高手教我 配置apache-tomcat-6.0.30 怎么弄都弄不好,,求高手。。!!!!!!!!!!!!!!!

手把手教你linux下配置vsftp服务器(以CentOS为例)--非常的详细

配置Web服务器的详细步骤

迅速教你掌握Web运维技能

Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程 (全网最全)

linux centOS下怎么配置web服务器