WWW=world wide web 万维网服务器,主要功能是提供网上信息浏览服务。
常见的web服务器: PHP:apache,nginx
Tomcat:JSP+Html
ASP:IIS (Windows)
客户端:各种浏览器-Firefox,Internet Explorer,Chrom,各种手机浏览器等等
今天的主角:LAMP=Linux Apache Mysql PHP中的Apache(HTTPD)
Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。随着开源潮流的蓬勃发展,开放源代码的LAMP已经与J2EE和.Net商业软件形成三足鼎立之势,并且该软件开发的项目在软件方面的投资成本较低,因此受到整个IT界的关注。从网站的流量上来说,70%以上的访问流量是LAMP来提供的,LAMP是最强大的网站解决方案。
Web Service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。
HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:
(1)客户与服务器建立连接;
(2)客户向服务器提出请求;
(3)服务器接受请求,并根据请求返回相应的文件作为应答;
(4)客户与服务器关闭连接。
客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到WWW服务器面向的是Internet中成干上万个用户,且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率。
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出。
HTTP是基于B/S架构进行通信的,其客户端的实现程序主要是Web浏览器,例如Firefox、InternetExplorer、Google chrome、Safari、Opera等,此外,客户端的命令行工具还有elink、curl等。Web服务是基于TCP的,因此为了能够随时响应客户端的请求,Web服务器需要监听在80/TCP端口。这样客户端浏览器和Web服务器之间就可以通过HTTP进行通信了。
0.9阶段
适用于各种数据信息的简洁快速传输,是一个交换信息的无序协议,仅仅限于文本传输。
1.X阶段
支持音频和视频的传输。
2.0阶段
支持动态页面
Apache HTTPD Server简称Apache,是Apache软件基金会的一个开源的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中!Apache HTTP服务器是一个模块化的服务器,各个功能使用模块化进行插拔!目前支持Windows,Linux,Unix等平台!
Apache软件基金会(也就是Apache Software Foundation,简称为ASF),是专门为运作一个开源软件项目的 Apache 的团体提供支持的非盈利性组织,这个开源软件项目就是 Apache 项目!那么我们的HTTPD也只是Apache的开源项目之一!
主要的开源项目:HTTP Server,Ant,DB,iBATIS,Jakarta,Logging,Maven,Struts,Tomcat,Tapestry,Hadoop等等。只是最有名的是HTTP Server,所以现在所说的Apache已经就是HTTPD Server的代号了! 我们还见的比较多的是Tomcat,Hadoop等项目
官方网站:Welcome to The Apache Software Foundation! httpd:Welcome! - The Apache HTTP Server Project
工作模式是:B/S模式
工作端口是:80/http正常端口 443/https SSL端口
httpd-2.2.15-29.el6_4.x86_64.rpm //服务端主程序包,服务器运行核心软件包
httpd-devel-2.2.15-29.el6_4.x86_64.rpm //apache开发程序包,如开发附加模块的时候需要此软件
httpd-manual-2.2.15-29.el6_4.noarch.rpm //Apache手册文档
httpd-tools-2.2.15-29.el6_4.x86_64.rpm //一起apache的工具,如htpasswd
apr-devel-1.3.9-5.el6_2.x86_64.rpm //安装httpd-devel的时候的依赖包
apr-util-devel-1.3.9-3.el6_0.1.x86_64.rpm //安装httpd-devel的时候的依赖包
expat-devel-2.0.1-11.el6_2.x86_64.rpm //安装httpd-devel的时候的依赖包
[root@kylinos63 ~]# yum install -y httpd httpd-manual //安装httpd服务器
[root@kylinos63 ~]# yum install -y elinks //这是一个字符界面浏览器 使用方式 “elinks 域名”,该工具适合检测网页是否正常
[root@kylinos63 ~]# systemctl restart httpd //服务启动
[root@kylinos63 ~]# systemctl enable httpd //服务开机启动
[root@kylinos63 ~]# netstat -antup | grep 80 //启动是否成功,查看端口是否开放
tcp 0 0 :::80 :::* LISTEN 49088/httpd
相关文件
[root@kylinos63 ~]# ls /etc/httpd/ //apache工作目录,配置文件目录
[root@kylinos63 ~]# ls /etc/httpd/conf/httpd.conf //yum或rpm方式安装的配置文件位置
[root@kylinos63 ~]# ls /etc/httpd/conf.d/ //这个是默认httpd.conf里面include位置
[root@kylinos63 ~]# ls /var/log/httpd/ //默认日志目录
[root@kylinos63 ~]# ls /var/log/httpd/access_log //默认访问日志
[root@kylinos63 ~]# ls /var/log/httpd/error_log //默认错误日志
[root@kylinos63 ~]# ls /var/www/html/ //默认网站根目录
[root@kylinos63 ~]# ls /etc/httpd/modules/ //apache库文件,模块文件目录
[root@kylinos63 ~]# ls /etc/httpd/run/httpd.pid //apache运行的进程pid
[root@kylinos63 ~]# ls /var/www/manual/ //apache手册也,需要安装httpd-manual
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
ServerTokens OS #返回操作系统类型,如apache/2.0.54(unix)
ServerRoot "/etc/httpd" #服务器配置文件目录
ServerName 192.168.1.235:80 #服务器主机名
PidFile run/httpd.pid #apache运行进程ID存放
Timeout 60 #超时时间,多少s没有反应就超时
KeepAlive Off #是否允许一个永久的链接,设置为OFF的时候,不能保持连接功能,传输效率比较低,设置为ON时,可以提高服务器传输文件的效率,建议开启
MaxKeepAliveRequests 100 #设置KeepAlive为ON时,设置客户端每次连接允许请求相应最大文件数,默认100个
KeepAliveTimeout 15 #超时时间,同一个客户端下一个请求15s没收到就超时
Listen 80 #监听端口,默认本地IP,如果指定ip写上IP:80
<IfModule prefork.c>
StartServers 8 #服务开始起启动8个进程
MinSpareServers 5 #最小空闲5个进程
MaxSpareServers 20 #最多空闲20个进程
ServerLimit 256 #服务器允许配置进程数上线
MaxClients 256 #最大连接数256,超过要进入等候队列
MaxRequestsPerChild 4000 #每个进程生存期内服务最大的请求数量,0表示用不结束
IfModule>
<Directory />
Options FollowSymLinks #Options Indexes 目录浏览 FollowSymLinks用连接浏览
AllowOverride None #设置为none,忽略.htaccess
Directory>
LoadModule auth_basic_module modules/mod_auth_basic.so #载入的库,模块
● ● ● ● ● ●
Include conf.d/*.conf #conf.d里面的conf文件也属有效配置文件
User apache #apache运行以哪个身份运行
Group apache #apache运行以哪个组的身份运行
ServerAdmin root@localhost #管理员邮箱
DocumentRoot "/var/www/html" #默认的主目录,如果改动要改动两处,Directory
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny #这里默认后者生效,也就是deny生效
Allow from all #这里说允许所有
Directory>
LogLevel warn #日志等级
DirectoryIndex index.html index.html.var #首页
AccessFileName .htaccess #access文件名
AddDefaultCharset UTF-8 #支持的语言,默认编码
#配置文件的最后是虚拟主机的字段,其中你大部分字段做个了解即可,用到的时候去查即可。
注意:
在apache2.4版本中,使用require进行访问控制,不再使用order allow,deny进行访问控制。(require all granted| denied 允许|拒绝)
Apache 本身只是提供静态页面(index.html)的解析 动态网页解析,如php,需要插件,模块,或者服务! apache支持php需要安装Libphp5.so模块。
搭建一台web服务器,采用的IP地址和端口为192.168.1.63:80,首页为index.html文件,管理员E-Mail地址时[email protected],网页采用编码为UTF-8,所有的网站资源全部存放在/var/www/html,将Apache配置文件的根目录设置为/etc/httpd目录
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf //下面的参数我们需要掌握
ServerRoot "/etc/httpd" #Apache配置文件根目录
Timeout 60 #超时时间
Listen 80 #监听端口
ServerAdmin root@localhost #设置管理员,e-mail地址
ServerName www.example.com:80 #服务器主机名
DocumentRoot "/var/www/html" #网站页面根目录
Options Indexes FollowSymLinks #当一个网站目录没有首页的时候,允许显示目录列表(去掉Indexes反之)或者使用-Indexs
DirectoryIndex index.html index.html.var #设定默认首页,若不设定,就不能使用/来显示页面
AddDefaultCharset UTF-8 #页面编码,默认是UTF-8
根据我们的我求,我们需要修改的项目如下
ServerName 192.168.1.63:80 #修改主机名(原先注释掉,启用并修改)
DocumentRoot "/var/www/html" #默认位置正确,不需要修改
<Directory "/var/www/html"> #若修改了一处,这一处对应也要随之修改,默认不需要改
……
DirectoryIndex index.html index.html.var #首页
ServerAdmin root@kylinos.cn #管理员邮箱地址
AddDefaultCharset UTF-8 #页面编码,默认是UTF-8,不需要改
ServerRoot "/etc/httpd" #默认工作目录,不需要修改,符合要求
在浏览器中输入http://192.168.1.63/,看能不能访问
上图是Apache默认的一个欢迎页面!
[root@kylinos63 ~]# vim /etc/httpd/conf.d/welcome.conf //下面段内容默认没有注释,注释掉
#
# Options -Indexes
# ErrorDocument 403 /error/noindex.html
#
[root@kylinos63 ~]# systemctl restart httpd //重启服务
[root@kylinos63 ~]# echo "welcome to 192.168.1.63 Server" > /var/www/html/index.html
注意:在目前的实验环境来说,你需要关闭我们selinux
[root@kylinos63 ~]# getenforce
Disabled
改动网站根目录,并且设置访问权限,只有在我允许的范围之内可以访问
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html/bbs" #修改此项
<Directory "/var/www/html/bbs"> #此处也要修改
Options FollowSymLinks #不允许目录浏览
AllowOverride None #忽略地址重写相关
Order allow,deny #顺序
Allow from 192.168.1.0/24 #从哪里来的允许
Deny from 192.168.1.0/24 #从哪里来的拒绝
Allow from .baidu.com #域的写法
Directory>
#Allow和Deny都会读取,但是根据order的设置,如果冲突的时候,谁在后面谁生效,不冲突都生效
[root@kylinos63 ~]# mkdir /var/www/html/bbs
[root@kylinos63 ~]# systemctl restart httpd
按照上面按的方法,应该是没有权限访问
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
……
Order deny,allow #顺序
Allow from 192.168.1.0/24 #从哪里来的允许
Deny from 192.168.1.0/24 #从哪里来的拒绝
……
[root@kylinos63 ~]# systemctl restart httpd
[root@kylinos63 ~]# cp /var/www/html/index.html /var/www/html/bbs/
别名也叫虚拟目录, 将/usr/local/phpdata通过别名的功能添加到网站的更目录,当访问http://192.168.1.63/phpdata的时候,实际访问的就是/usr/local/phpdata目录
/var/www/html/bbs http://192.168.1.63/phpdata
[root@kylinos63 ~]# mkdir /usr/local/phpdata
[root@kylinos63 ~]# echo "This Alias PHPdata" > /usr/local/phpdata/index.html
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf //搜索Alias,附近添加下面这段内容
Alias /phpdata/ "/usr/local/phpdata/"
<Directory "/usr/local/phpdata/">
Options Indexes FollowSymLinks
AllowOverride None
Allow from all
Require all granted
Directory>
#Alias /phpdata/ "/usr/local/phpdata"中的第一个phpdata名字可以随便起,起什么访问的时候跟什么,格式要求严格,目录必须使用/结束
[root@kylinos63 ~]# servcie httpd restart
浏览器访问 http://192.168.1.63/phpdata/
[root@kylinos63 ~]# cp -r /boot/ /var/www/html/bbs/
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
……
<Directory "/var/www/html/bbs">
……
Options Indexes FollowSymLinks #加上indexes支持目录访问
……
[root@kylinos63 ~]# systemctl restart httpd
[root@kylinos63 ~]# rm -rf /var/www/html/bbs/index.html //再没有首页的情况下有效
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
……
<Directory "/var/www/html/bbs">
……
Options -Indexes FollowSymLinks #在Indexes上加上-好或者去掉indexes
……
通过软连接,我们可以直接引用网站根目录外面的内容,我们通过目录浏览的方式,在/var/www/html/bbs/面创建一个web2目录, 然后我访问web2目录的话,实际访问的是/usr/local/abc下面的内容
http://192.168.1.63(/var/www/html/bbs) http://192.168.1.68/web2 (/usr/local/abc/)
[root@kylinos63 ~]# mkdir /usr/local/abc
[root@kylinos63 ~]# cp -r /boot/grub/ /usr/local/abc/
[root@kylinos63 ~]# mkdir /var/www/html/bbs/web2
[root@kylinos63 ~]# ln -s /usr/local/abc /var/www/html/bbs/web2
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
……
<Directory "/var/www/html/bbs">
……
Options Indexes FollowSymLinks #开启支持目录浏览,同时FollowSymLinks就是支持软连接
……
[root@kylinos63 ~]# systemctl restart httpd
我们而访问之后,再点击web2,应该访问到的是/usr/local/abc目录
切换:
通过用户认证的方式,对网站目录下/usr/local/phpdata目录进行保护,只要访问此目录,就必须使用用户名和密码的方式!
这里有两种修改配置文件的方法来实现这种功能
在主配置文件中,需要使用用户验证的目录的的相关Directory字段添加内容
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
……
Alias /phpdata/ "/usr/local/phpdata/"
<Directory "/usr/local/phpdata/">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
authtype basic #此行添加,认证类型,基本类型basic
authname "This Auth is Test" #认证区域名称,在弹出的密码用户框中的提示
authuserfile /etc/httpd/conf/passwd.secret #制定包含用户名和密码的文件,一行一对
require valid-user #指定的那些用户可以访问,这里只文件中有效的用户
Directory>
……
#注:valid-user可以写为:user1 user2 空格隔开,只是user1和user2可以访问
[root@kylinos63 ~]# htpasswd -cm /etc/httpd/conf/passwd.secret user1 //创建认证用户
Htpasswd是apache附带的一个程序,可以生产apache可以识别的用户名和加密后的密码,-cm中-c是第一次表示create,创建,-m表示md5加密,如果追加的话,第二次生成用户名和密码,就不要使用-c参数了!默认SHA-1的加密方式,如果不使用-m参数就是SHA-1的加密
[root@kylinos63 ~]# htpasswd -m /etc/httpd/conf/passwd.secret user2
New password: #123456
Re-type new password: #123456
Adding password for user user2
[root@kylinos63 ~]# cat /etc/httpd/conf/passwd.secret
user1:$apr1$e8gak6Um$qCPQddWUrPxZ65EADuNKU0
user2:$apr1$7ejBXdK6$9e6hdL2nSO4K9u9k.xBbQ1
[root@kylinos63 ~]# systemctl restart httpd
测试
输入网址:http://192.168.1.63/phpdata/ //注意要输入末尾的/
在需要使用用户验证的相关目录添加如下
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
……
Alias /phpdata/ "/usr/local/phpdata/"
<Directory "/usr/local/phpdata/">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
# authtype basic #这四行注释
# authname "This Auth is Test"
# authuserfile /etc/httpd/conf/passwd.secret
# require valid-user
AllowOverride Authconfig #这一行添加,表示允许....../phpdata/目录下的文件进行用户验证
Directory>
……
[root@kylinos63 ~]# vim /usr/local/phpdata/.htaccess //创建此文件,并写入下面的内容
authtype basic
authname "Test 2 Auth"
authuserfile /etc/httpd/conf/passwd.secret #还是用上面的用户密码文件
require valid-user
[root@kylinos63 ~]# systemctl restart httpd
拓展:. htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
AllowOverride是指确定允许存在于.htaccess文件中的指令类型,通常利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里。但要使 apache 能够正常的读取.htaccess 文件的内容,就必须对.htaccess 所在目录进行配置。从安全性考虑,根目录的AllowOverride属性一般都配置成“None”不允许任何Override(优先级) 。AuthConfig 允许使用与认证授权相关的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。
[root@kylinos ~]# cd /etc/httpd/conf.d/userdir.conf
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
#UserDir disabled 将该参数注释
#
# To enable requests to /~user/ to serve the user's public_html
# directory, remove the "UserDir disabled" line above, and uncomment
# the following line instead:
#
UserDir public_html #将该参数注释去掉
[root@kylinos ~]# cd /home/student
[root@kylinos ~]# mkdir public_html
[root@kylinos student]# cd public_html/
[root@kylinos public_html]# echo "welcome to student's home " > index.html
[root@kylinos public_html]# chmod 711 /home/student/
[root@kylinos public_html]# chmod 755 /home/student/public_html
[root@kylinos public_html]# chmod 644 /home/student/public_html/index.html
[root@kylinos63 ~]# systemctl restart httpd
[root@kylinos ~]# cd /etc/httpd/conf.d/userdir.conf
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#Require method GET POST OPTIONS
authtype basic
authname "This Auth is Test"
authuserfile /etc/httpd/conf.d/passwd.secret
require valid-user
[root@kylinos63 ~]# systemctl restart httpd
Apache的虚拟主机功能 (Virtual Host) 是可以让一台服务器基于IP、主机名或端口号实现提供多个网站服务的技术。虚拟主机三种实现方法:通过不同IP,通过不同端口,通过不同域名
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
<VirtualHost 192.168.1.63:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /var/www/html #只需要修改网站根目录即可,其他的可以根据自己的需要添加
ServerName dummy-host.example.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
VirtualHost>
<VirtualHost 192.168.1.64:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /var/www/html/bbs
ServerName dummy-host.example.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
VirtualHost>
[root@kylinos63 ~]# ifconfig eth0:1 192.168.1.64 netmask 255.255.255.0//添加一个IP
[root@kylinos63 ~]# rm -rf /var/www/html/* ; mkdir /var/www/html/bbs //重建测试页面
[root@kylinos63 ~]# echo "/var/www/html/" > /var/www/html/index.html
[root@kylinos63 ~]# echo "/var/www/html/bbs" > /var/www/html/bbs/index.html
[root@kylinos63 ~]# systemctl restart httpd
测试:
分别使用不同的IP去访问
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
……
Listen 80 #在原来监控的端口先增加或修改需要监控的端口
Listen 81
……
#NameVirtualHost *:80 #此行注释,只是在启用域名的时候启用
……
<VirtualHost *:80> #修改端口
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /var/www/html/
ServerName dummy-host.example.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
VirtualHost>
<VirtualHost *:81>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /var/www/html/bbs
ServerName dummy-host.example.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
VirtualHost>
[root@kylinos63 ~]# systemctl restart httpd
测试:
端口的访问方式:http://IP:端口
注:默认不带端口,就是80端口
启用虚拟主机
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80 #此行启用,启用基于虚拟主机(目前较为常用的方式)
……
<VirtualHost *:80>
ServerAdmin webmaster@www.abc.com
DocumentRoot /var/www/html
ServerName www.abc.com #基于域名的虚拟主机需要修改的地方,此行是关键,他行随意
ErrorLog logs/www.abc.com-error_log
CustomLog logs/www.abc.com-access_log common
VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@www.bcd.com
DocumentRoot /var/www/html/bbs
ServerName www.bcd.com #基于域名的虚拟主机需要修改的地方,此行是关键,他行随意
ErrorLog logs/www.bcd.com-error_log
CustomLog logs/www.bcd.com-access_log common
VirtualHost>
[root@kylinos63 ~]# systemctl restart httpd
真机作为客户端,需要修改的地方:
打开此文件:C:\Windows\System32\drivers\etc\hosts,末尾添加下面两行
192.168.1.63 www.abc.com
192.168.1.63 www.bcd.com
测试
Apache URL地址重写(伪静态),自定义404页面,301重定向配置
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so #查看有没有重写模块
[root@kylinos63 ~]# vim /var/www/html/index.php
php
echo "The News ......" .$_GET['id']."......Pages"
?>
测试访问方式:使用http://192.168.1.63/index.php?id=8 id值随便写
使用这种方式访问的缺点:暴露了我们页面语言,php写的,MYSQL的字段ID,可以尝试知道你的新闻总条数,一个个值尝试出来,URL很不美观,不利于SEO,暴露你的文件路径以及文件名,那么对他进行伪静态之后,可以访问一个页面是http://192.168.1.63/index8.html来访问同样的页面
修改配置文件,支持.htaccess
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /var/www/html/
<Directory /> #对这个虚拟主机实现Rewrite,需要添加Directory字段中
Options FollowSymLinks
AllowOverride All
Directory>
ServerName dummy-host.example.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
VirtualHost>
[root@kylinos63 ~]# vim /var/www/html/.htaccess //添加伪静态规则
RewriteEngine on
RewriteRule ^index(\d+).html$ index.php?id=$1
[root@kylinos63 ~]# systemctl restart httpd
测试:
http://192.168.1.63/index8.html
输入一个不存在的页面(使用火狐浏览器)
修改.htaccess,支持自定义404页面
[root@kylinos63 ~]# vim /var/www/html/.htaccess //追加下面行
RewriteEngine on
RewriteRule ^index(\d+).html$ index.php?id=$1
ErrorDocument 404 /404.html #自定404,此行添加
[root@kylinos63 ~]# systemctl restart httpd
[root@kylinos63 ~]# echo "My 404 Error" > /var/www/html/404.html
测试:
刷新刚刚那个不存在的页面
假设a.com在某些情况下不能使用,需要将网站全部迁移到b.com,那么我们这个时候就可以对a.com进行301重定向,这样a.com(上的权重,SEO里面的知识)传递到b.com上,这个主要用来实现整站迁移.
重定向需要准备两台主机。
[root@kylinos63 ~]# vim /etc/httpd/conf/httpd.conf
redirect 301 /foo http://192.168.0.3
[root@kylinos63 ~]# vim /var/www/html/.htaccess
RewriteCond %{HTTP_HOST} ^a.com [NC]
RewriteRule ^(.*)$ http://www.b.com/$1 [L,R=301]
服务器的基础目录,一般来说它将包含conf/和logs/子目录,其它配置文件的相对路径即基于此目录。默认为安装目录,不需更改。
语法:ServerRoot directory-path
如: ServerRoot "/usr/local/apache-2.2.6"
注意,此指令中的路径最后不要加 / 。
2. Listen:
指定服务器监听的IP和端口。默认情况下Apache会在所有IP地址上监听。Listen是Apache2.0以后版本必须设置的指令,如果在配置文件中找不到这个指令,服务器将无法启动。
语法:Listen [IP-address:]portnumber [protocol]
Listen指令指定服务器在那个端口或地址和端口的组合上监听接入请求。如果只指定一个端口,服务器将在所有地址上监听该端口。如果指定了地址和端口的组合,服务器将在指
定地址的指定端口上监听。可选的protocol参数在大多数情况下并不需要,若未指定该参数,则将为443端口使用默认的https 协议,为其它端口使用http协议。
使用多个Listen指令可以指定多个不同的监听端口和/或地址端口组合。
默认为:Listen 80
如果让服务器接受80和8080端口上请求,可以这样设置:
Listen 80
Listen 8080
如果让服务器在两个确定的地址端口组合上接受请求,可以这样设置:
Listen 192.168.2.1:80
Listen 192.168.2.2:8080
如果使用IPV6地址,必须用方括号把IPV6地址括起来:
Listen [2001:db8::a00:20ff:fea7:ccea]:80
加载特定的DSO模块。Apache默认将已编译的DSO模块存放于4.1目录结构小节中所示的动态加载模块目录中。
语法:LoadModule module filename
如:LoadModule rewrite_module modules/mod_rewrite.so
如果filename使用相对路径,则路径是相对于ServerRoot所指示的相对路径。
Apache配置文件默认加载所有已编译的DSO模块,笔者建议只加载如下模块:authn_file、authn_default、 authz_host、authz_user、authz_default、auth_basic、dir、alias
、filter、speling、 log_config、env、vhost_alias、setenvif、mime、negotiation、rewrite、deflate、 expires、headers、cache、file-cache、disk-cache、mem-cache。
设置实际提供服务的子进程的用户。为了使用这个指令,服务器必须以root身份启动和初始化。如果你以非root身份启动服务器,子进程将不能够切换至非特权用户,并继续以启动服务器的原始用户身份运行。如果确实以root用户启动了服务器,那么父进程将仍然以root身份运行。
用于运行子进程的用户必须是一个没有特权的用户,这样才能保证子进程无权访问那些不想为外界所知的文件,同样的,该用户亦需没有执行那些不应当被外界执行的程序的权限。强烈建议专门为Apache子进程建立一个单独的用户和组。一些管理员使用nobody用户,但是这并不能总是符合要求,因为可能有其他程序也在使用这个用户。
例:User daemon
设置提供服务的Apache子进程运行时的用户组。为了使用这个指令,Apache必须以root初始化启动,否则在切换用户组时会失败,并继续以初始化启动时的用户组运行。
例:Group daemon
设置在所有返回给客户端的错误信息中包含的管理员邮件地址。
语法:ServerAdmin email-address|URL
如果httpd不能将提供的参数识别为URL,它就会假定它是一个email-address ,并在超连接中用在mailto:后面。推荐使用一个Email地址,因为许多CGI脚本是这样认为的。如果你确实想使用URL,一定要保证指向一个你能够控制的服务器,否则用户将无法确保一定可以和你取得联系。
设置服务器用于辨识自己的主机名和端口号。
语法:ServerName [scheme://]fully-qualified-domain-name[:port]
可选的'scheme://'前缀仅在2.2.3以后的版本中可用,用于在代理之后或离线设备上也能正确的检测规范化的服务器URL。
当没有指定ServerName时,服务器会尝试对IP地址进行反向查询来推断主机名。如果在ServerName中没有指定端口号,服务器会使用接受请求的那个端口。
为了加强可靠性和可预测性,建议使用ServerName显式的指定一个主机名和端口号。
如果使用的是基于域名的虚拟主机,在
设置Web文档根目录。
语法:DocumentRoot directory-path
在没有使用类似Alias这样的指令的情况下,服务器会将请求中的URL附加到DocumentRoot后面以构成指向文档的路径。
如果directory-path不是绝对路径,则被假定为是相对于ServerRoot的路径。
指定DocumentRoot时不应包括最后的"/"。
语法:
Directory-path可以是一个目录的完整路径,或是包含了Unix shell匹配语法的通配符字符串。在通配符字符串中,"?"匹配任何单个的字符,"*"匹配任何字符序列。也可以使用"[]"来确定字符范围。在"~" 字符之后也可以使用正则表达式。
如果有多个(非正则表达式)
正则表达式将在所有普通配置段之后予以考虑。所有的正则表达式将根据它们出现在配置文件中的顺序进行应用。
提供基于文件名的访问控制,类似于
语法:
filename参数应当是一个文件名或是一个包含通配符的字符串,其中"?"匹配任何单个字符,"*"匹配任何字符串序列。在"~"字符之后可以使用正则表达式。
在此配置段中定义的指令将作用于其基本名称(不是完整的路径)与指定的文件名相符的对象。
文件被处理之后,但在
封装根据指定的模块是否启用而决定是否生效的指令。
语法:
module-file是指编译模块时的文件名,比如mod_rewrite.c 。
module-identifier是指模块的标识符,比如mod_rewrite 。
在
控制在特定目录中将使用哪些服务器特性
语法:Options [+|-]option [[+|-]option] ...
option可以为None,不启用任何额外特性,或者下面选项中的一个或多个:
All 除MultiViews之外的所有特性,这是默认设置。
ExecCGI 允许使用mod_cgi执行CGI脚本。
FollowSymLinks 服务器允许在此目录中使用符号连接,如果此配置位于
Includes 允许使用mod_include提供的服务器端包含。
IncludesNOEXEC 允许服务器端包含,但禁用"#exec cmd"和"#exec cgi",但仍可以从ScriptAlias目录使用"#include virtual"虚拟CGI脚本。
Indexes 如果一个映射到目录的URL被请求,而此目录中又没有DirectoryIndex(例如:index.html),那么服务器会返回由mod_autoindex生成的一个格式化后的目录列表。
MultiViews 允许使用mod_negotiation提供内容协商的"多重视图"(MultiViews)。
SymLinksIfOwnerMatch 服务器仅在符号连接与其目的目录或文件的拥有者具有相同的uid时才使用它。 如果此配置出现在
一般来说,如果一个目录被多次设置了Options ,则最特殊的一个会被完全接受(其它的被忽略),而各个可选项的设定彼此并不融合。然而,如果所有作用于Options指令的可选项前都加有"+" 或"-"符号,此可选项将被合并。所有前面加有"+"号的可选项将强制覆盖当前的可选项设置,而所有前面有"-"号的可选项将强制从当前可选项设置中去除。
确定允许存在于.htaccess文件中的指令类型。
语法:AllowOverride All|None|directive-type [directive-type] ...
如果此指令被设置为None ,那么.htaccess文件将被完全忽略。事实上,服务器根本不会读取.htaccess文件。
当此指令设置为All时,所有具有".htaccess"作用域的指令都允许出现在.htaccess文件中。
directive-type可以是下列各组指令之一:
AuthConfig 允许使用与认证授权相关的指令
FileInfo 允许使用控制文档类型的指令、控制文档元数据的指令、mod_rewrite中的指令、mod_actions中的Action指令
Indexes 允许使用控制目录索引的指令
Limit 允许使用控制主机访问的指令
Options[=Option,...] 允许使用控制指定目录功能的指令(Options和XBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令
使用哪些选项。
AllowOverride仅在不包含正则表达式的
Order:控制默认的访问状态与Allow和Deny指令生效的顺序。
Ordering取值范围是以下几种范例之一:
Deny,Allow Deny指令在Allow指令之前被评估。默认允许所有访问。任何不匹配Deny指令或者匹配Allow指令的客户都被允许访问。
Allow,Deny Allow指令在Deny指令之前被评估。默认拒绝所有访问。任何不匹配Allow指令或者匹配Deny指令的客户都将被禁止访问。
Mutual-failure 只有出现在Allow列表并且不出现在Deny列表中的主机才被允许访问。这种顺序与"Order Allow,Deny"具有同样效果,不赞成使用。
关键字只能用逗号分隔,它们之间不能有空格,在所有情况下每个Allow和Deny指令语句都将被评估。
Allow:控制哪些主机可以访问服务器的该区域。可以根据主机名、IP地址、 IP地址范围或其他环境变量中捕获的客户端请求特性进行控制。
语法:Allow from all|host|env=env-variable [host|env=env-variable] ...
这个指令的第一个参数总是"from",随后的参数可以有三种不同形式:如果指定"Allow from all",则允许所有主机访问,按照下述Deny和Order指令的配置;若要只允许特定的主
机或主机群访问服务器。
host可以用下面任何一种格式来指定:一个(部分)域名、完整的IP地址、部分IP地址、网络/掩码、网络/nnn无类别域间路由规格;
第三种参数格式允许对服务器的访问由环境变量的一个扩展指定,指定"Allow from env=env-variable"时,如果环境变量env-variable存在则访问被允许,使用由mod_setenvif提供的指令,服务器用一种基于客户端请求的弹性方式提供了设置环境变量的能力。因此,这条指令可以用于允许基于像User-Agent(浏览器类型)、Referer或其他 HTTP请求头字段的访问。
Deny:控制哪些主机被禁止访问服务器的该区域。可以根据主机名、IP地址、 IP地址范围或其他环境变量中捕获的客户端请求特性进行控制。
语法:Deny from all|host|env=env-variable [host|env=env-variable] ...
此指令的参数设置和Allow指令完全相同。
当客户端请求一个目录时寻找的资源列表。
语法:DirectoryIndex Local-url [Local-url] ...
Local-url(%已解码的)是一个相对于被请求目录的文档的URL(通常是那个目录中的一个文件)。可以指定多个URL,服务器将返回最先找到的那一个,
比如:
DirectoryIndex index.html index.php
指定当服务器遇到错误时记录错误日志的文件。
语法:ErrorLog file-path|syslog[:facility]
如果file-path不是一个以斜杠(/)开头的绝对路径,那么将被认为是一个相对于ServerRoot的相对路径;如果file-path以一个管道符号(|)开头,那么会为它指定一个命令来处理错误日志,如 ErrorLog "|/usr/local/sbin/cronolog /var/log/httpd/%w/errors_log"。
如果系统支持,使用"syslog"替代文件名将通过 syslogd(8)来记载日志。默认将使用系统日志机制local7 ,但您可以用"syslog:facility"语法来覆盖这个设置,其中,facility的取值为syslog(1)中记载的任何一个名字。
用于调整记录在错误日志中的信息的详细程度。
语法:LogLevel level
可以选择下列level,依照重要性降序排列:
emerg 紧急(系统无法使用)
alert 必须立即采取措施
crit 致命情况
error 错误情况
warn 警告情况
notice 一般重要情况
info 普通信息
debug 调试信息
当指定了某个级别时,所有级别高于它的信息也会被同时记录。比如,指定 LogLevel info ,则所有notice和warn级别的信息也会被记录。建议至少使用crit级别。
当错误日志是一个单独分开的正式文件的时候,notice级别的消息总是会被记录下来,而不能被屏蔽。但是,当使用syslog来记录时就没有这个问题。
定义访问日志的记录格式。
语法:LogFormat format|nickname [nickname]
LogFormat指令可以使用两种定义格式中的一种。
在第一种格式中,指令只带一个参数,以定义后续的TransferLog指令定义的日志格式。另外它也可以通过下述的方法使用nickname来引用某个之前的LogFormat定义的日志格式。
第二种定义LogFormat指令的格式中,将一个直接的format和一个nickname联系起来。这样在后续的LogFormat或 CustomLog指令中,就不用一再重复整个冗长的格式串。
定义别名的LogFormat指令仅仅用来定义一个nickname ,而不做其它任何事情,也就是说,它只是定义了这个别名,它既没有实际应用这个别名,也不是把它设为默认的格式。
因此,它不会影响后续的 TransferLog指令。另外,LogFormat不能用一个别名来定义另一个别名。nickname不能包含百分号(%)。
关于format的格式,请参见Apache2.2官方文档中的自定义日志格式小节。
设定日志的文件名和格式。
语法:CustomLog file|pipe format|nickname [env=[!]environment-variable]
第一个参数指定了日志记录的位置,可以使用以下两种方式来设定:
file 相对于ServerRoot的日志文件名。
pipe 管道符"|"后面紧跟着一个把日志输出当作标准输入的处理程序路径。
第二个参数指定了写入日志文件的内容。它既可以是由前面的LogFormat指令定义的nickname ,也可以是直接按Apache2.2官方文档中的自定义日志格式小节所描述的规则定义的format字符串。
第三个参数是可选的,它根据服务器上特定的环境变量是否被设置来决定是否对某一特定的请求进行日志记录。如果这个特定的环境变量被设置(或者在"env=!name"的情况下未被设置),那么这个请求将被记录。可以使用mod_setenvif和/或mod_rewrite模块来为每个请求设置环境变量。
指定日志文件的位置。
语法:TransferLog file|pipe
本指令除不允许直接定义日志格式或根据条件进行日志记录外,与CustomLog指令有完全相同的参数和功能。实际应用中,日志的格式是由最近的非别名定义的LogFormat指令指定。如果没有定义任何日志格式,则使用通用日志格式。
映射URL到文件系统的特定区域。
语法:Alias URL-path file-path|directory-path
Alias指令使文档可以被存储在DocumentRoot以外的本地文件系统中。以(%已解码的)url-path路径开头的URL可以被映射到以directory-path开头的本地文件。
如果对在DocumentRoot之外的某个目录建立了一个Alias ,则可能需要通过
映射一个URL到文件系统并视之为CGI脚本目录。
语法:ScriptAlias URL-path file-path|directory-path
ScriptAlias指令的行为与Alias指令相同,但同时它又标明此目录中含有应该由cgi-script处理器处理的CGI脚本。以URL-path开头的(%已解码的)的URL会被映射到由第二个参数指定的具有完整路径名的本地文件系统中的脚本。
ScriptSock:在以线程式MPM(worker)运行的Apache中设置用来与CGI守护进程通信的套接字文件名前缀(其后附加父进程 PID组成完整的文件名)。这个套接字将会用启动Apache服
务器的父进程用户权限(通常是root)打开。为了维护与CGI脚本通讯的安全性,不允许其他用户拥有写入套接字所在目录的权限是很重要的。
在服务器无法由其他方法确定内容类型时,发送的默认MIME内容类型。
语法:DefaultType MIME-type
默认:DefaultType text/plain
在给定的文件扩展名与特定的内容类型之间建立映射关系。
语法:AddType MIME-type extension [extension] ...
MIME-type指明了包含extension扩展名的文件的媒体类型。这个映射关系会添加在所有有效的映射关系上,并覆盖所有相同的extension扩展名映射。
extension参数是不区分大小的,并且可以带或不带前导点。
批示当遇到错误的时候服务器将给客户端什么样的应答。
语法:ErrorDocument error-code document
error-code 服务器返回的错误代码
document 可以由一个斜杠(/)开头来指示一个本地URL(相对于DocumentRoot),或是提供一个能被客户端解释的完整的URL。
此外还能提供一个可以被浏览器显示的消息。
比如:
ErrorDocument 500http://www.entage.net/err500.html
ErrorDocument 404 /errors/bad_urls.html
ErrorDocument 403 "Sorry can't allow you access today"
指示httpd在递送中如果需要读取一个文件的内容,它是否可以使用内存映射。
语法:EnableMMAP On|Off
当处理一个需要访问文件中的数据的请求时,比如说当递送一个使用mod_include进行服务器端分析的文件时,如果操作系统支持,Apache将默认使用内存映射。
这种内存映射有时会带来性能的提高,但在某些情况下,您可能会需要禁用内存映射以避免一些操作系统的问题:
在一些多处理器的系统上,内存映射会减低一些httpd的性能;
在挂载了NFS的DocumentRoot上,若已经将一个文件进行了内存映射,则删除或截断这个文件会造成httpd因为分段故障而崩溃。
在可能遇到这些问题的服务器配置过程中,应当使用下面的命令来禁用内存映射:
对于挂载了NFS的文件夹,可以单独在
EnableMMAP Off
控制httpd是否可以使用操作系统内核的sendfile支持来将文件发送到客户端。
默认情况下,当处理一个请求并不需要访问文件内部的数据时(比如发送一个静态的文件内容),如果操作系统支持,Apache将使用sendfile将文件内容直接发送到客户端而并不读取文件。
这个sendfile机制避免了分开的读和写操作以及缓冲区分配,但是在一些平台或者一些文件系统上,最好禁止这个特性来避免一些问题:
一些平台可能会有编译系统检测不到的有缺陷的sendfile支持,特别是将在其他平台上使用交叉编译得到的二进制文件运行于当前对sendfile支持有缺陷的平台时;
在Linux上启用IPv6时,使用sendfile将会触发某些网卡上的TCP校验和卸载bug;
当Linux运行在Itanium处理器上的时候,sendfile可能无法处理大于2GB的文件;
对于一个通过网络挂载了NFS文件系统的DocumentRoot (比如:NFS或SMB),内核可能无法可靠的通过自己的缓冲区服务于网络文件。
如果出现以上情况,你应当禁用sendfile :
EnableSendfile Off
针对NFS或SMB,可以单独在
EnableSendfile Off
在服务器配置文件中包含其它配置文件。
语法:Include file-path|directory-path
Shell风格(fnmatch())的通配符可以用于按照字母顺序一次包含多个文件。另外,如果Include指向了一个目录而不是一个文件,Apache将读入该目录及其子目录下的所有文件,并依照字母顺序将这些文件作为配置文件进行解析。但是并不推荐这么做,因为偶尔会有临时文件在这个目录中生成,从而导致httpd启动失败。文件的路径可以是一个完整的绝对路径(以一个斜杠开头),或是相对于ServerRoot目录的相对路径。
#如果需要提供基于文本文件的认证,加载此模块,否则注释掉
LoadModule authn_file_module modules/mod_authn_file.so
#如果需要提供基于DBM文件的认证,加载此模块,否则注释掉
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#如果需要提供匿名用户认证,加载此模块,否则注释掉
#LoadModule authn_anon_module modules/mod_authn_anon.so
#如果需要提供基于SQL数据库的认证,加载此模块,否则注释掉
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#如果需要在未正确配置认证模块的情况下简单拒绝一切认证信息,加载此模块,否则注释掉
LoadModule authn_default_module modules/mod_authn_default.so
#此模块提供基于主机名、IP地址、请求特征的访问控制,Allow、Deny指令需要,推荐加载。
LoadModule authz_host_module modules/mod_authz_host.so
#如果需要使用纯文本文件为组提供授权支持,加载此模块,否则注释掉
#LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
#如果需要提供基于每个用户的授权支持,加载此模块,否则注释掉
LoadModule authz_user_module modules/mod_authz_user.so
#如果需要使用DBM文件为组提供授权支持,加载此模块,否则注释掉
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#如果需要基于文件的所有者进行授权,加载此模块,否则注释掉
#LoadModule authz_owner_module modules/mod_authz_owner.so
#如果需要在未正确配置授权支持模块的情况下简单拒绝一切授权请求,加载此模块,否则注释掉
LoadModule authz_default_module modules/mod_authz_default.so
#如果需要提供基本的HTTP认证,加载此模块,否则注释掉,此模块至少需要同时加载一个认证支持模块和一个授权支持模块
LoadModule auth_basic_module modules/mod_auth_basic.so
#如果需要提供HTTP MD5摘要认证,加载此模块,否则注释掉,此模块至少需要同时加载一个认证支持模块和一个授权支持模块
#LoadModule auth_digest_module modules/mod_auth_digest.so
#此模块提供文件描述符缓存支持,从而提高Apache性能,推荐加载,但请小心使用
LoadModule file_cache_module modules/mod_file_cache.so
#此模块提供基于URI键的内容动态缓存(内存或磁盘),从而提高Apache性能,必须与mod_disk_cache/mod_mem_cache同时使用,推荐加载
LoadModule cache_module modules/mod_cache.so
#此模块为mod_cache提供基于磁盘的缓存管理,推荐加载
LoadModule disk_cache_module modules/mod_disk_cache.so
#此模块为mod_cache提供基于内存的缓存管理,推荐加载
LoadModule mem_cache_module modules/mod_mem_cache.so
#如果需要管理SQL数据库连接,为需要数据库功能的模块提供支持,加载此模块,否则注释掉(推荐)
#LoadModule dbd_module modules/mod_dbd.so
#此模块将所有I/O操作转储到错误日志中,会导致在日志中写入及其海量的数据,只建议在发现问题并进行调试的时候使用
#LoadModule dumpio_module modules/mod_dumpio.so
#如果需要使用外部程序作为过滤器,加载此模块(不推荐),否则注释掉
#LoadModule ext_filter_module modules/mod_ext_filter.so
#如果需要实现服务端包含文档(SSI)处理,加载此模块(不推荐),否则注释掉
#LoadModule include_module modules/mod_include.so
#如果需要根据上下文实际情况对输出过滤器进行动态配置,加载此模块,否则注释掉
LoadModule filter_module modules/mod_filter.so
#如果需要服务器在将输出内容发送到客户端以前进行压缩以节约带宽,加载此模块(推荐),否则注释掉
LoadModule deflate_module modules/mod_deflate.so
#如果需要记录日志和定制日志文件格式,加载此模块(推荐),否则注释掉
LoadModule log_config_module modules/mod_log_config.so
#如果需要对每个请求的输入/输出字节数以及HTTP头进行日志记录,加载此模块,否则注释掉
#LoadModule logio_module modules/mod_logio.so
#如果允许Apache修改或清除传送到CGI脚本和SSI页面的环境变量,加载此模块,否则注释掉
LoadModule env_module modules/mod_env.so
#如果允许通过配置文件控制HTTP的"Expires:"和"Cache-Control:"头内容,加载此模块(推荐),否则注释掉
LoadModule expires_module modules/mod_expires.so
#如果允许通过配置文件控制任意的HTTP请求和应答头信息,加载此模块,否则注释掉
LoadModule headers_module modules/mod_headers.so
#如果需要实现RFC1413规定的ident查找,加载此模块(不推荐),否则注释掉
#LoadModule ident_module modules/mod_ident.so
#如果需要根据客户端请求头字段设置环境变量,加载此模块,否则注释掉
LoadModule setenvif_module modules/mod_setenvif.so
#此模块是mod_proxy的扩展,提供Apache JServ Protocol支持,只在必要时加载
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#此模块是mod_proxy的扩展,提供负载均衡支持,只在必要时加载
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#如果需要根据文件扩展名决定应答的行为(处理器/过滤器)和内容(MIME类型/语言/字符集/编码),加载此模块,否则注释掉
LoadModule mime_module modules/mod_mime.so
#如果允许Apache提供DAV协议支持,加载此模块,否则注释掉
#LoadModule dav_module modules/mod_dav.so
#此模块生成描述服务器状态的Web页面,只建议在追踪服务器性能和问题时加载
#LoadModule status_module modules/mod_status.so
#如果需要自动对目录中的内容生成列表(类似于"ls"或"dir"命令),加载此模块(会带来安全问题,不推荐),否则注释掉
#LoadModule autoindex_module modules/mod_autoindex.so
#如果需要服务器发送自己包含HTTP头内容的文件,加载此模块,否则注释掉
#LoadModule asis_module modules/mod_asis.so
#如果需要生成Apache配置情况的Web页面,加载此模块(会带来安全问题,不推荐),否则注释掉
#LoadModule info_module modules/mod_info.so
#如果需要在非线程型MPM(prefork)上提供对CGI脚本执行的支持,加载此模块,否则注释掉
#LoadModule cgi_module modules/mod_cgi.so
#此模块在线程型MPM(worker)上用一个外部CGI守护进程执行CGI脚本,如果正在多线程模式下使用CGI程序,推荐替换mod_cgi加载,否则注释掉
#LoadModule cgid_module modules/mod_cgid.so
#此模块为mod_dav访问服务器上的文件系统提供支持,如果加载mod_dav,则也应加载此模块,否则注释掉
#LoadModule dav_fs_module modules/mod_dav_fs.so
#如果需要提供大批量虚拟主机的动态配置支持,加载此模块,否则注释掉
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
#如果需要提供内容协商支持(从几个有效文档中选择一个最匹配客户端要求的文档),加载此模块(推荐),否则注释掉
LoadModule negotiation_module modules/mod_negotiation.so
#如果需要指定目录索引文件以及为目录提供"尾斜杠"重定向,加载此模块(推荐),否则注释掉
LoadModule dir_module modules/mod_dir.so
#如果需要处理服务器端图像映射,加载此模块,否则注释掉
#LoadModule imagemap_module modules/mod_imagemap.so
#如果需要针对特定的媒体类型或请求方法执行CGI脚本,加载此模块,否则注释掉
#LoadModule actions_module modules/mod_actions.so
#如果希望服务器自动纠正URL中的拼写错误,加载此模块(推荐),否则注释掉
LoadModule speling_module modules/mod_speling.so
#如果允许在URL中通过"/~username"形式从用户自己的主目录中提供页面,加载此模块,否则注释掉
#LoadModule userdir_module modules/mod_userdir.so
#此模块提供从文件系统的不同部分到文档树的映射和URL重定向,推荐加载
LoadModule alias_module modules/mod_alias.so
#如果需要基于一定规则实时重写URL请求,加载此模块(推荐),否则注释掉
LoadModule rewrite_module modules/mod_rewrite.so
#设置DocumentRoot指定目录的属性
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
#设置默认目录资源列表文件
DirectoryIndex index.html
#拒绝对.ht开头文件的访问,以保护.htaccess文件
Order allow,deny
Deny from all
Satisfy All
#定义访问日志的格式
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\" %I %O" combinedio
#指定访问日志及使用的格式
CustomLog logs/access_log combined
#设定默认CGI脚本目录及别名
ScriptAlias /cgi-bin/ "/usr/local/apache-2.2.6/cgi-bin/"
#在以线程式MPM(worker)运行的Apache中设置用来与CGI守护进程通信的套接字文件名前缀
Scriptsock logs/cgisock
#设定默认CGI脚本目录的属性
AllowOverride None
Options None
Order allow,deny
Allow from all
#设定默认MIME内容类型
DefaultType text/plain
#指定MIME类型映射文件
TypesConfig conf/mime.types
#增加.Z .tgz的类型映射
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
#启用内存映射
EnableMMAP on
#使用操作系统内核的sendfile支持来将文件发送到客户端
EnableSendfile on
#指定多路处理模块(MPM)配置文件并将其附加到主配置文件
Include conf/extra/httpd-mpm.conf
#指定多语言错误应答配置文件并将其附加到主配置文件
Include conf/extra/httpd-multilang-errordoc.conf
#指定目录列表配置文件并将其附加到主配置文件
#Include conf/extra/httpd-autoindex.conf
#指定语言配置文件并将其附加到主配置文件
Include conf/extra/httpd-languages.conf
#指定用户主目录配置文件并将其附加到主配置文件
#Include conf/extra/httpd-userdir.conf
#指定用于服务器信息和状态显示的配置文件并将其附加到主配置文件
#Include conf/extra/httpd-info.conf
#指定提供Apache文档访问的配置文件并将其附加到配置文件
#Include conf/extra/httpd-manual.conf
#指定DAV配置文件并将其附加到主配置文件
#Include conf/extra/httpd-dav.conf
#指定与Apache服务自身相关的配置文件并将其附加到主配置文件
Include conf/extra/httpd-default.conf
#指定mod_deflate压缩模块配置文件并将其附加到主配置文件
Include conf/extra/httpd-deflate.conf
#指定mod_expires模块配置文件并将其附加到主配置文件
Include conf/extra/httpd-expires.conf
#指定虚拟主机配置文件并将其附加到主配置文件
#Include conf/extra/httpd-vhosts.conf
#指定SSL配置文件并将其附加到主配置文件
Include conf/extra/httpd-ssl.conf
#SSL默认配置
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
#配置多路处理模块(MPM) httpd-mpm.conf
首先说一下原理:
prefork模式:
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将
每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。
这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存
超出物理内存的大小。
worker模式:
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进
程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。
控制这个MPM的最重要的指令是,控制每个子进程允许建立的线程数的ThreadsPerChild指令,和控制允许建立的总线程数的MaxClients指令
#设置prefork多路处理模块
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 8000
MaxClients 8000
MaxRequestsPerChild 0
StartServers:设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
MinSpareServers:设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于 MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。
MaxSpareServers:设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers 小,Apache将会自动将其修改成"MinSpareServers+1"。
ServerLimit:服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。要将此指令的值保持和MaxClients一样。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
MaxClients:用于伺服客户端请求的最大请求数量(最大子进程数),任何超过MaxClients限制的请求都将进入等候队列。默认值是256,如果要提高这个值必须同时提高ServerLimit的值。建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。
MaxRequestsPerChild:设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:可以防止(偶然的)内存泄漏无限进行而耗尽内存;
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
如果设置为非零值,建议设为10000-30000之间的一个值。
公式:MaxClients<=ServerLimit
#设置worker多路处理模块
StartServers 5
ServerLimit 20
ThreadLimit 200
MaxClients 4000
MinSpareThreads 25
MaxSpareThreads 250
ThreadsPerChild 200
MaxRequestsPerChild 0
StartServers:设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
ServerLimit:服务器允许配置的进程数上限。只有在你需要将MaxClients和ThreadsPerChild设置成需要超过默认值16个子进程的时候才需要使用这个指令。不要将该指令的值设置的比MaxClients 和ThreadsPerChild需要的子进程数量高。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
ThreadLimit:设置每个子进程可配置的线程数ThreadsPerChild上限,该指令的值应当和ThreadsPerChild可能达到的最大值保持一致。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
MaxClients:用于伺服客户端请求的最大接入请求数量(最大线程数)。任何超过MaxClients限制的请求都将进入等候队列。默认值是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加 ServerLimit的值。建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。
MinSpareThreads:最小空闲线程数,默认值是"75"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
MaxSpareThreads:设置最大空闲线程数。默认值是"250"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。
MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于 MinSpareThreads加上ThreadsPerChild的和。
ThreadsPerChild:每个子进程建立的线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。每个子进程所拥有的所有线程的总数要足够大,以便可以处理可能的请求高峰。
MaxRequestsPerChild:设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:可以防止(偶然的)内存泄漏无限进行而耗尽内存;
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
如果设置为非零值,建议设为10000-30000之间的一个值。
公式:
ThreadLimit >= ThreadsPerChild
MaxClients <= ServerLimit * ThreadsPerChild 必须是ThreadsPerChild的倍数
MaxSpareThreads >= MinSpareThreads+ThreadsPerChild
#配置Apache服务器默认设置 httpd-default.conf
Timeout 300
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 5
UseCanonicalName Off
AccessFileName .htaccess
ServerTokens Prod
ServerSignature Off
HostnameLookups Off
Timeout:设置服务器在断定请求失败前等待的秒数。默认值300。
KeepAlive:设置是否启用HTTP持久链接,On 代表打开,Off 代表关闭。如果用于同一页面包含大量静态文件的应用,设置为On,以提高性能;如果用于主要为动态页面的应用,设置为Off,以节约内存资源;如果服务器前跑有squid或者其它七层设备,设置为On。
MaxKeepAliveRequests:限制当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。建议将此值设为100-500之间的一个值,以确保最优的服务器性能。
KeepAliveTimeout:设置持久链接中服务器在两次请求之间等待的秒数。对于高负荷服务器来说,KeepAliveTimeout值较大会导致一些性能方面的问题:超时值越大,与空闲客户端保持连接的进程就越多。
UseCanonicalName:配置服务器如何确定它自己的域名,可选值为On | Off | DNS。DNS用于为大量基于IP的虚拟主机支持那些古董级的不提供"Host:"头的浏览器使用。建议设置为Off。
AccessFileName:设置分布式配置文件的名字,默认为.htaccess。如果为某个目录启用了分布式配置文件功能,那么在向客户端返回其中的文档时,服务器将在这个文档所在的各级目录中查找此配置文件,因此会带来性能问题,建议关闭分布式配置文件功能。
ServerTokens:控制服务器回应给客户端的"Server:"应答头是否包含关于服务器操作系统类型和编译进的模块描述信息,同时还控制着 ServerSignature指令的显示内容。可选值为Full | OS | Minor | Minimal | Major | Prod。建议设置为显示最少信息的Prod。
ServerTokens Prod #该参数设置http头部返回的apache版本信息,可用的值和含义如下:
Prod:仅软件名称,例如:apache
Major:包括主版本号,例如:apache/2
Minor:包括次版本号,例如:apache/2.0
Min:仅apache的完整版本号,例如:apache/2.0.54
OS:包括操作系统类型,例如:apache/2.0.54(Unix)
Full:包括apache支持的模块及模块版本号,例如:Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7g
ServerSignature:配置服务器生成页面的页脚,可选值为On | Off | EMail。采用On会简单的增加一行关于服务器版本和正在伺服的虚拟主机的ServerName,而EMail设置会额外创建一个指向 ServerAdmin的"mailto:"部分。建议使用默认值Off。
HostnameLookups:设置是否启用对客户端IP的DNS查找,可选值为On | Off | Double。DNS查询会造成明显的时间消耗,建议设置为Off。
#配置mod_deflate压缩模块 httpd-deflate.conf
mod_deflate模块提供了DEFLATE输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。
#编辑mod_deflate压缩模块设置文件:
DeflateMemLevel 9
DeflateWindowSize 15
DeflateBufferSize 8096
DeflateCompressionLevel 8
# 调试时去掉下面5行前的注释符,用以记录压缩日志
#DeflateFilterNote Input instream
#DeflateFilterNote Output outstream
#DeflateFilterNote Ratio ratio
#LogFormat '"%r" %b %{outstream}n/%{instream}n (%{ratio}n%%) "%{User-agent}i"' deflate
#CustomLog logs/deflate_log deflate
# 插入DEFLATE过滤器,以启用输出压缩
SetOutputFilter DEFLATE
# Netscape 4.x 有一些问题,仅压缩txt/html类型
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08不能处理任何压缩内容,不进行压缩
BrowserMatch ^Mozilla/4.0[678] no-gzip
# MSIE 会伪装成 Netscape ,但是事实上它没有问题
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 设置图片、mp3、压缩格式文件等不需要进行压缩内容
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
# 确保代理不会发送错误的内容
Header append Vary User-Agent env=!dont-vary
DeflateMemLevel:指定zlib在压缩时最多可以使用多少内存量,取值范围在1到9之间。
DeflateWindowSize:定义zlib压缩窗口(compression window)的大小,取值范围在1到15之间,通常窗口越大压缩效果越好。
DeflateBufferSize:定义zlib一次压缩的片断的字节数,默认为8096。
DeflateCompressionLevel:设定压缩程度,越高的压缩程度就会有越好的压缩效果,同时也意味着占用越多的CPU资源。取值范围在 1(最低压缩率) 到 9(最高压缩率)之间,如果不设置此指令,默认为zlib的默认值。
DeflateFilterNote:在日志中放置压缩率标记。
语法为:DeflateFilterNote type notename
notename就表示这个压缩率标记的名字,你可以为了某种统计目的将这个标记的名字添加到访问日志中。
type指定notename标记所记录的数据类型:Input,在标记中存储过滤器输入流的字节数;Output,在标记中存储过滤器输出流的字节数;Ratio,在标记中存储过滤器的压缩比(输出/输入*100),这是type的默认值。
SetOutputFilter:设置用于在服务器应答发送到客户端之前使用的过滤器。如果多于一个过滤器,必须按照处理内容的顺序用分号(;)分隔。
BrowserMatch:基于User-Agent头有条件地设置环境变量。
SetEnvIfNoCase:根据大小写无关的客户端请求属性设置环境变量。
Headers:配置HTTP应答头。这个指令可以替换、合并、删除HTTP应答头。应答头紧跟在内容处理器和输出过滤器完工之后生成,这时候才能对头进行修改。
#配置mod_expires模块
这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。这些HTTP头向客户端表明了文档的有效性和持久性。如果有缓存,文档就可以从缓存(除已经过期)而不是从服务器读取。接着,客户端考察缓存中的副本,看看是否过期或者失效,以决定是否必须从服务器获得更新。
编辑mod_expires设置文件:httpd-expires.conf
# mod_expires设置文件
ExpiresActive on
ExpiresDefault A300
ExpiresByType text/html A300
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType text/css A2592000
ExpiresByType text/js A2592000
ExpiresByType text/javascript A2592000
ExpiresByType application/x-javascript A2592000
ExpiresActive:对其作用范围内的文档启用或禁用产生Expires和Cache-Control头的功能。若设置为 Off 则不会为其作用范围内的任何文档生成Expires和Cache-Control头(除非被更低一层的规则改写,比如.htaccess文件)。若设置为 On 则会按照ExpiresByType和ExpiresDefault指令定义的标准为其作用范围内的文档生成Expires和Cache-Control 头。
注意,这个指令并不保证Expires或Cache-Control头一定会产生。如果定义的标准不规范,将不会产生这两个头,其效果是好像从未设置过这个指令一样。
ExpiresByType:为指定MIME类型的文档配置Expires头的值。
语法为:ExpiresByType MIME-type seconds
seconds参数设置了添加到基准时间以构造有效期限的秒数。Cache-Control: max-age的计算方法是从有效期减去当前请求时间并转化为秒数。
基准时刻可以是源文件的最后修改时刻或者客户端对源文件的访问时刻,至于使用那一个则由指定。
"M"表示源文件的最后修改时刻,"A"表示客户端对源文件的访问时刻。
需要注意的是和seconds之间没有空格。如果使用"M",所有当前缓存中的文档副本都将在同一时刻过期,这个可能对定期更新的URL(比如位于同一位置的每周通告)很有好处。如果使用"A",则每个客户端所得到的有效期是不一样的,这个可能对那些几乎不更新的图片文件很有好处,特别是对于一组都引用了相同图片的相关文档。
ExpiresDefault:设置其作用范围内的所有文档的默认有效期的计算方法,它可以被ExpiresByType指令基于MIME类型被改写。
语法为:ExpiresDefault seconds
seconds同ExpiresByType一致。
#最后配置一下虚拟主机 httpd-vhost.conf
#这里重点介绍一下基于多端口的配置
NameVirtualHost *:81
NameVirtualHost *:82
NameVirtualHost *:83
ServerAdmin [email protected]
DocumentRoot /www1
ServerName www.jafy00.com
ErrorLog logs/www1-error.log
CustomLog logs/www1-access_log common
Options FollowSymLinks
#Deny from all
Allow from all
ServerAdmin [email protected]
DocumentRoot /www2
ServerName www.jafy00.com
DirectoryIndex index.php index.html
ErrorLog logs/www2-error.log
CustomLog logs/www2-access_log combined