1.Linux Apache web服务器
学习要点:
1.apache用途,工作模式,httpd.conf的配置重要参数
2.虚拟主机
3. 工作模式的参数优化
1.1.Apache 概述:
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。同时Apache音译为阿帕奇,是北美印第安人的一个部落,叫阿帕奇族,在美国的西南部。也是一个基金会的名称、一种武装直升机等等。
apache发布静态站点,html jpghtm jss png css txt
wget -r -xhttp://www.baidu.com 抓取网站内容
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
从概念上
进程:一个程序对一个数据集的动态执行过程,是分配资源的基本单位。
线程:一个进程内的基本调度单位。
线程的划分尺度小于进程,一个进程包含一个或者更多的线程。
进程是系统进行资源分配和调度的一个独立单位.
本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
从执行过程中来看
进程:拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率。
线程:每一个独立的线程,都有一个程序运行的入口、顺序执行序列、和程序的出口。但是线程不能够独立的执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看:(重要区别)
多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但是,操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源分配。
1.2.Apache 的工作模式
prefork:它是一个无线程设计的工作模式,进程与进程之间相互独立,一个连接占一个子进程,如果现有的子进程不能满足负载控制进程将派生新的子进程,可以通过配置文件来定义, 这种工作模式的优点是性能高,且比较稳定,不适用于高并发网站,比较消耗内存,如1个进程占用100M的内存,若内存只有1G那么只有1000/100=10个连接可用
worker:它是一个多进程多线程混合工作模式,线程共享进程的内存,一个工作进程(子进程)可以处理大量的连接 ,如果其中的一个子进程断开,那么整个子进程的所有线程将会断开,也就是说所有的连接将会断开。如果现有子进程中的线程总数不能满足负载控制进程将派生新的子进程,这种工作模式的优点是网站并发能力强,但不太稳定
这个嘛
event:
这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。Event MPM不能在安全HTTP(HTTPS)访问下工作。
prefork模式:默认
每个工作进程(子进程)处理一个请求连接,如果默认启动的工作进程满了,新来的请求,会占用空闲进程连接,空闲进程不够,master会预先生成更多的进程,直到所有的请求数(并发数)达到maxclient为止。
worker模式:
每个工作进程(子进程)生成多个线程,每个线程接受新来的请求,空闲进程不够,master会预先生成更多的工作进程,工作进程再生成多个线程,满足用户来访问,直到所有的请求数(并发数)达到maxclient为止。
查询apache的工作模式
[root@localhost httpd]# httpd -l
StartServers 8 #工作进程(子进程), master进程只有1个,一般配置8-16个预派生
ServerLimit 1500 #系统设置最大进程数,如果MaxClients超出了ServerLimit定义的范围那么它将无效,它的默认值为256
MinSpareServers 25 #默认生成的最少空闲进程数,表示目前没有接受任何连接也就是没有占用任何内存且连接资源
MaxSpareServers 75 #默认生成的最多空闲进程数
MaxClients 1000 # 最大客户端数,即同时允许的并发连接数,建议配置1000-4096,5000*3600*8
MaxRequestsPerChild 10000 #最大请求数,0代表不限,不推荐这样配置。它的含义是如果把值配置成10000,当达到10001时,也就是直到超过1万个请求后它将会从1重新开始
StartServers 2 #工作进程(子进程),master进程只有1个
MaxClients 150 #每秒总的并发数。每个子进程处理最大请求数,是他下属线程请求数之和,最好不要超过5000
MinSpareThreads 25 #默认生成的最少线程数
MaxSpareThreads 75 #默认生成的最少最多线程数
ThreadsPerChild 25 #每个子进程所支持的线程数,是他下属线程请求数之和,这里为25,不能超过75
MaxRequestsPerChild 0 #最大请求数,0代表不限,不推荐这样配置,如果配置成10000,当达到10001时,重新从1开始处理
1.3.Apache 安装
1.3.1.yum 安装
yum installhttpd* -y
yum install apr-devel apr-util-devel gcc*pcre pcre-devel –y; 安装依赖包
1.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--enable-rewrite; make; make install
--with-mpm=prefork# 指定工作模式
--enable-rewrite# 开启rewrite模块
--enable-so # DSOcapability
发布目录 /user/local/apache/htdocs/
1.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 检测是否OK # 检查配置
将源码安装的命令做成软链接,直接使用
ls –n/usr/local/apache/bin/apachectl /usr/bin
Apachectlretart # 链接完后,可简写
-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程序占用资源,可能有效率方面的问题。
.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在系统上存活的时间。
#根据观察所得,新程序的效果较好。
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
#上面的prefork和worker其实就是两个与服务器连接资源有关的设置项目。
#默认的项目配置对于一般中小型网站来说已经很够用了,不过如果网站的流量
#比较大,也可以修订一下里面的数值。这两个模块都是用在提供用户连接资源,
#设置的数值越大代表系统会启动越多的程序来提供Apache的服务,反映速度就比较快
#Redhat和CentOS将这两个模块分别放到了不同的执行文件中,分别是
# |-/usr/sbin/httpd 使用prefork模块
# |-/usr/sbin/httpd.worker 使用worker模块
#/etc/sysconfig/httpd这个文件决定了Apache使用哪一个模块,可以通过。
#修改这个文件来切换不同的工作模式。
LoadModule cgi_modulemodules/mod_cgi.so
LoadModule version_modulemodules/mod_version.so
#Apache提供了非常多的模块供我们使用,以上就是加载的模块
Include conf.d/*.conf
ServerAdmin root@localhost
#系统管理员的邮箱,当网站出现问题的时候,错误信息会显示的联系邮箱
DocumentRoot "/var/www/html"
#上面这一行的配置指定了放置首页的目录
Options FollowSymLinks
AllowOverride None
#Directory指定后面的路径是系统中的绝对路径
#这个设置是针对www服务器的默认环境而来的,因为是针对“/”的设置
#建议保留上面的默认值
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
# 定义日志过滤时需添加
# 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
CustomLog "logs/access_log"common # 开启访问日志
1.3.apache 虚拟主机
如果在局域网做实验,同要修改本机的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
#################################################################
*: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 # 访问日志文件
# 对目录设置权限
AllowOverride All
Options -IndexesFollowSymLinks
Order allow,deny
Allow from all
*: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 # 访问日志文件
AllowOverride All # 读取规则文件
Options -IndexesFollowSymLinks # 禁止浏览目录
Order allow,deny # allow在前,允许生效
Allow from all # 允许所有访问
rewrite ^/www.baidu.com [L] # 网页跳转
Allowoverride Authconfig # 以下内容为网站主页认证
AuthName "验证提示"
AuthType Basic
AuthUserFile /date/htpasswd
require valid-user
# 认证设置密码 /usr/local/apache/bin/htpasswd -c /data/htpasswdhtpadmin
###############################################################################
权限
AllowOverride 设置为 None 时, .htaccess 文件将被完全忽略。指令设置为 All 时,所有具有 “.htaccess” 作用域将生效.
Options-Indexes FollowSymLinks禁止显示目录,如果要以目录显示需要改成OptionsIndexes FollowSymLinks
Order allow,deny ,默认情况下禁止所有客户机访问;Order deny,allow 默认情况下允许所有客户机访问.
Allow fromall允许所有客户机访问。
NameVirtualHost指令,指定一个基于域名的虚拟主机将使用哪个IP地址来接受请求。
1.4.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 多搜索关键词
一些常见的格式串:
通用日志格式(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则指的是最后请求的状态。
1.5.Apache Rewrite规则
1.5.1.域名跳转域名重定向
RewriteEngine on //启用rewrite引擎 启动rewrite规则前需先添加启动参数
Apache conf/httpd.conf 中是否存在如下代码:
LoadModule Rewrite_module libexec/mod_Rewrite.so
Rewrite URL重定向就是实现URL的跳转和隐藏真实地址,可以把复杂的URL变成简洁直观的URL,对seo优化有很大的帮助。如下几个简单的举例:
把所有配置的域名都跳转到一个域名:
RewriteEngine on //启用rewrite引擎
RewriteCond %{HTTP_HOST} ^hdbattery.com[NC] # 匹配域名是hdbattery.com
RewriteCond %{HTTP_HOST} !^www.hd.com [NC] # 匹配www.hd.com域名
RewriteCond %{HTTP_HOST} ^125.93.253.55 [NC] # 匹配IP地址
RewriteCond %{HTTP_HOST} !^$ # 区配任何内容都跳转
//以上为匹配内容,
RewriteRule ^/(.*)$http://www.hd.com/$1 [L]
//匹配上面条件,然后跳转到http://www.hd.com
R 强制外部重定向。
F 禁用URL,返回403HTTP状态码。
G 强制URL为GONE,返回410HTTP状态码。
P 强制使用代理转发。
L 表明当前规则是最后一条规则,停止分析以后规则的重写。
N 重新从第一条规则开始运行重写过程。
C 与下一条规则关联。
8) OR 逻辑或 多条规则时
%{} 匹配 ^ 开头 NC 大小写匹配
ornext|OR' (or nextcondition)逻辑或,可以同时匹配多个RewriteCond条件RewriteRule适用的标志符
1.5.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 匹配数字
\\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{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]
1.5.3. apache 的域名重定向
.htaccess 301重定向
RewriteEngineOnRewriteCond %{HTTP_HOST} !^ubangmang.com$ [NC]
RewriteRule^(.*)$ http://www.ubangmang.com/$1 [L,R=301]
httpd.ini 301重定向
[ISAPI_Rewrite]#3600 = 1 hourCacheClockRate 3600RepeatLimit 32
RewriteEngineOnRewriteCond 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
1.5.4.日志不记录图片下载信息
Vi vitual-host.conf
SetEnvIf Request_URI ".*\\.gif$" p_w_picpath-request
SetEnvIf Request_URI ".*\\.jpg$" p_w_picpath-request
SetEnvIf Request_URI ".*\\.png$" p_w_picpath-request
SetEnvIf Request_URI ".*\\.bmp$" p_w_picpath-request
SetEnvIf Request_URI ".*\\.swf$" p_w_picpath-request
SetEnvIf Request_URI ".*\\.js$" p_w_picpath-request
SetEnvIf Request_URI ".*\\.css$" p_w_picpath-request
# CustomLog "/tmp/1.log" amingenv=!p_w_picpath-request
CustomLog "|/usr/local/apache/bin/rotatelogs/tmp/access_%Y%m%d.log 86400" aming env=!p_w_picpath-request
# 上面命令实现日志切割,按天生成日志
Vi httpd.conf
LogFormat "%h %l %u %t \\"%r\\"%>s %b \\"%{Referer}i\\" \\"%{User-Agent}i\\"" aming
# 定义日志过滤时需添加
1.5.5. 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
1.6. Apache配置静态缓存
浏览器访问www.aaa.com
vi/usr/local/apache2/conf/extra/httpd-vhosts.conf
上面添加如下信息:
ExpiresActive on
ExpiresByType p_w_picpath/gif "access plus 1 days"
ExpiresByType p_w_picpath/jpeg "access plus 24 hours"
ExpiresByType p_w_picpath/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/p_w_picpath/common/logo.png' -I
1.9.Apache 管理
Httpd –V # 查看系统本版等详细信息,也包括apache工作模式
Httpd -l # 查看工作模式
/usr/local/apache/bin/apachectl –M # 查询当前加载的模块
curl -x192.168.2.135:80 www.a.com -I
1.10.apache 常见错误代码
1.1xx为消息类,该类状态代码用于表示服务器临时回应
100 Continue 表示初始的请求已经被服务器接受,浏览器应当继续发送请求的其余部分(HTTP 1.1)。
101 Switching Protocols服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1)。
2.2xx表示浏览器端请求被处理成功
表1.3 2xx浏览器端请求处理代码说明
代 码 |
说 明 |
200 OK |
一切正常 |
201 Created |
服务器已经创建了文档,Location 头给出了它的 URL |
202 Accepted |
已经接受请求,但处理尚未完成 |
203 Non-Authoritative Information |
文档已经正常地返回,但一些应答头可 能不正确,因为使用的是文档的拷贝(HTTP 1.1新) |
204 No Content |
没有新文档,浏览器应继续显示原来的文档。 这与表1.4中的304非常相似 |
205 Reset Content |
没有新的内容,但浏览器应该重置它所显示的 内容。用来强制浏览器清除表单输入内容(HTTP 1.1新) |
206 Partial Content |
客户发送了一个带有 Range 头的GET请求, 服务器完成了它(HTTP 1.1新)。注意, 通过 Range 可以实现断点续传 |
3.3xx重定向
表1.4 3xx重定向代码说明
代 码 |
说 明 |
300 Multiple Choices |
客户请求的文档可以在多个位置找到,这些位置 已经在返回的文档内列出。如果服务器要提出优 先选择,则应该在Location应答头指明 |
301 Moved Permanently |
客户请求的文档在其他地方,新的URL在Location 头中给出,浏览器应该自动地访问新的URL |
302 Found |
类似于301,但新的URL应被视为临时性的替代, 而不是永久性的。注意,在HTTP1.0中对应的状 态信息是“Moved Temporatily”。出现该状态代 码时,浏览器能够自动访问新的URL,因此它是一 个很有用的状态代码。 注意:这个状态代码有时可以和301替换使用。例如, 如果浏览器错误地请求http://host/~user(缺少了后 面的斜杠),有的服务器返回301,有的则返回302。 严格地说,我们只能假定只有当原来的请求是GET 时浏览器才会自动重定向。可参见307 |
303 See Other |
类似于301/302,不同之处在于,如果原来的请求 是POST,Location头指定的重定向目标文档应该通 过GET提取(HTTP 1.1新) |
304 Not Modified |
客户端有缓冲的文档并发出了一个条件性的请求 (一般是提供If-Modified-Since头表示客户只想比 指定日期更新的文档)。服务器告诉客户,原来缓 冲的文档还可以继续使用 |
305 Use Proxy |
客户请求的文档应该通过Location头所指明的代理服 务器提取(HTTP 1.1新) |
307 Temporary Redirect |
和302(Found)相同。许多浏览器会错误地响应302 应答进行重定向,即使原来的请求是POST,即使它 实际上只能在POST请求的应答是303时才能重定向。 由于这个原因,HTTP 1.1新增了307,以便更加清楚地 区分几个状态代码:当出现303应答时,浏览器可以跟 随重定向的GET和POST请求;如果是307应答,则 浏览器只能跟随对GET请求的重定向(HTTP 1.1新) |
4.4xx错误
表1.5 4xx错误代码说明
代 码 |
说 明 |
400 Bad Request |
请求出现语法错误 |
401 Unauthorized |
客户试图未经授权访问受密码保护的页面。 应答中会包含一个WWW-Authenticate头,浏 览器据此显示用户名字/密码对话框,然后在填 写合适的Authorization头后再次发出请求 |
403 Forbidden |
资源不可用。服务器理解客户的请求,但拒绝处 理它。通常由于服务器上文件或目录的权限设置导致 |
404 Not Found |
无法找到指定位置的资源。这也是一个常用的应答 |
405 Method Not Allowed |
请求方法(GET、POST、HEAD、Delete、PUT、TRACE 等)对指定的资源不适用(HTTP 1.1新) |
406 Not Acceptable |
指定的资源已经找到,但它的MIME类型和客户 在Accpet头中所指定的不兼容(HTTP 1.1新) |
407 Proxy Authentication Required |
类似于401,表示客户必须先经过代理服务 器的授权(HTTP 1.1新) |
408 Request Timeout |
在服务器许可的等待时间内,客户一直没有发出 任何请求。客户可以在以后重复同一请求(HTTP 1.1新) |
409 Conflict |
通常和PUT请求有关。由于请求和资源的当前状 态相冲突,因此请求不能成功。(HTTP 1.1新) |
410 Gone |
所请求的文档已经不再可用,而且服务器不知 道应该重定向到哪一个地址。它和404的不同 在于,返回407表示文档永久地离开了指定的 位置,而404表示由于未知的原因文档不可 用(HTTP 1.1新) |
411 Length Required |
服务器不能处理请求,除非客户发送一个 Content-Length头(HTTP 1.1新) |
412 Precondition Failed |
请求头中指定的一些前提条件失败(HTTP 1.1新) |
413 Request Entity Too Large |
目标文档的大小超过服务器当前愿意处理的大小。 如果服务器认为自己能够稍后再处理该请求, 则应该提供一个Retry-After头(HTTP 1.1新) |
414 Request URI Too Long |
URI太长(HTTP 1.1新) |
416 Requested Range Not Satisfiable |
服务器不能满足客户在请求中指定 的Range头(HTTP 1.1新) |
5.5xx服务器错误
表1.6 5xx服务器错误代码说明
代 码 |
说 明 |
500 Internal Server Error |
服务器遇到了未意料到的情况,不能完成客户的请求 |
501 Not Implemented |
服务器不支持实现请求所需要的功能。例如, 客户发出了一个服务器不支持的PUT请求 |
502 Bad Gateway |
服务器作为网关或代理时,为了完成请求访问 下一个服务器,但该服务器返回了非法的应答 |
503 Service Unavailable |
服务器由于维护或负载过重未能应答。例如, Servlet可能在数据库连接池已满的情况下 返回503。服务器返回503时可以提供一个Retry-After头 |
504 Gateway Timeout |
由作为代理或网关的服务器使用,表示不能 及时地从远程服务器获得应答(HTTP 1.1新) |
505 HTTP Version Not Supported |
服务器不支持请求中所指明的HTTP版本(HTTP 1.1新) |
1.12.apache 常见故障
错误日志
tail -fn 100 /var/log/httpd/error_log 故障排错
1.12.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路径
1.12.2.提示Addressalready in use: make_sock: could not bind to address [::]:80
[root@localhost~]# /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, shuttingdown
解决方法:有服务占用此端口,用netstat-ntupl找到程序停止它
1.12.3.提示apache/bin/apxs:/usr/local/perl:bad interpreter: No such file or directory
apache/bin/apxs:/usr/local/perl: badinterpreter: No such file or directory
configure: error: no - APXSrefers to an oldversion of Apache
./confiure报错:这是因为apsx文件没有指定perl执行程序位置
解决:[root@localhost ~]# vi /usr/local/apache/bin/apxs
#!/replace/with/path/to/perl/interpreter–w #将第一行修改为#!/usr/bin/perl –w即可
#添加环境变量
[root@localhost ~]# echo"PATH=$PATH/:/usr/local/subversion/bin" >> /etc/profile
[root@localhost ~]#source /etc/profile
[root@localhost ~]#svnserve –version #显示版本信息表示正常
1.12.4.提示You don'thave permission to access / on this server.
修改根目录权限
AllowOverride none
Require all granted(denied)