cpucpucores怎么设置在哪?

Apache2 HTTP Server
阅读:1646次&&&时间: 13:34:24&&
绑定地址与端口
启动apache2
调用命令apache2ctl来启动,而非apache2。它可以简单地用start、stop、restart等参数,也可以使用和apahce2一样的参数。在/etc/init.d/apache2脚本里,也是调用的apahce2ctl。
在文件/etc/apache2/ports.conf里可以看到这行:
它表示监听服务器所有网卡的80端口。
我们也可以在不同网卡上监听不同端口:
Listen 192.0.2.1:80
Listen 192.0.2.5:8000
如果要监听IPv6,需要在地址周围使用方括号:
Listen [2001:db8::a00:20ff:fea7:ccea]:80
为了用最少的socket来同时处理IPv4和IPv6请求,则需要使用IPv4映射的IPv6地址。--enable-v4-mapped配置选项用于启动这个映射。默认情况下,除了FreeBSD, NetBSD, and OpenBSD,其它平台都默认启用这个选项。
如果只想处理IPv4请求,则在所有的Listen指令上都指定一个IPv4地址:
Listen 0.0.0.0:80
Listen 192.0.2.1:80
Listen有一个可选的protocol参数。在未指定的情况下,https的默认端口为443,而http为其它的端口。这个protocol用来决定哪个模块来处理请求,以及使用AcceptFilter来应用协议相关的优化。
我们只有在响应非标准的端口上时,才需要指定protocol参数。比如:
Listen 192.170.2.1:8443 https
与虚拟主机的协作
Listen指令并不实现Virtual Host,它仅仅告诉主服务器监听哪些地址以及哪些端口,如果没有使用&VirtualHost&指令,服务器会以相同的方式处理所有接受到的请求。&VirtualHost&指令可以为一个或多个地址或端口指定不同的行为。要使用VirtualHost,服务器必须先监听使用的地址和端口,否则&VirtualHost&不能被访问。
主要配置文件
Apache通过在文本配置文件里放置指令来配置HTTP服务器。主配置文件通常为httpd.conf(apache2为/etc/apache2/apache2.conf,它会包含httpd.conf),该文件的位置在编译期中设置,也可以使用命令行参数-f来重写。此外,其它配置文件可以通过Include指令来引用,这里可以使用通配符来引用多个配置文件(比如厅Include mods-enabled/*.conf)。httpd在启动或重启时会加载主要配置文件。
服务器也读取一个包含mime文档类型的文件,文件名通过TypeConfig指令来指定。默认情况下为mime.types。
配置文件里通过一个指令为一行。在行末用“”可以标示指令占据多行。
指令本身是不区分大小写的,但它的参数通常是大小写敏感的。以#开头的行被视为注释。空白行和指令前的空格都被忽略。
Define定义的变量和shell环境变量可以通过${VAR}的形式在配置文件里使用。通过Define定义的变量比环境变量的优先级高。如果VAR没有定义,那么${VAR}会保持不变,而且一个警告会发生。变量名不能包含“:”,以免干扰RewriteMap指令。
只有在服务器启动前定义的环境变量才会被展开。在配置文件本身定义的环境变量,如通过SetEnv定义的,不会展开。
配置文件在展开变量、联合后续行(结尾表示)后的最大长度大约为16M。.htaccess文件里行的最大长度为8190个字符。
使用命令apachectl configtest或apachectl -t可以在不启动服务器的情况下检查配置文件语法错误。
mod_info模块的-DUMP-CONFIG可以输出解析所有引用文件和环境变量,以及删除注释、不匹配的&IfDefine&和&IfModule&的配置文件。
核心服务器只包含了最基本的功能,扩展特性可以通过加载模块来使用。默认情况下,一个模块的基本集在编译期包含进了服务器。如果服务器被编译成使用动态加载模块,那么模块可以分开编译,并在任何时候使用LoadModule指令加入。否则,服务器必须重新编译来加入或删除模块。&IfModule&块里的指令只在所需模块被加载时才会执行,比如:
&IfModule mod_gnutls.c&&&& Listen 443&/IfModule&
命令行参数-l可以查看编译进server的模块,-M可以查看动态加载的模块。指令作用域
在主配置文件里的指令会作用于整个服务器。 放入&Directory&、&DirectoryMatch&、&Files&、&FilesMatch&、&Location&、和&LocationMatch&块里的指令只作用于服务器的一部分。它们根据文件系统的位置或URL来应用指令。它们也可以嵌套。
Apache允许多个不同的网站同时运行,这被称为Virtual Hosting。在&VirtualHost&块里的指令只应用到特定的网站里。
尽管多数指令都可以放在任何区块里,但一些指令在一些上下文里没有意义。
.htaccess文件
如果在某个目录下放置一个.htaccess文件,那么它里面的配置会应用在当前目录以及它的所有子目录里。.htaccess文件的语法和主配置文件的语法相同。这个文件的名字也可以通过主配置文件里的AccessFileName指令来指定。
由于.htaccess文件在每次请求时读取,该文件的任何修改都会立即得到反映。
主配置文件里可以使用AllowOverride指定来决定什么指令可以放置在.htaccess文件里。
&IfDefine&只在命令行参数里有相应定义时才会应用。比如:
&IfDefine ClosedForNow&&&& Redirect / /&/IfDefine&
只有以Apache2 -DClosedForNow命令启动时才会应用。
&IfModule&只在相应模块可用时才应用。比如:
&IfModule mod_mime_magic.c&&&& MimeMagicFile conf/magic&/IfModule&
只在模块mod_mime_magic可用时才有效。
&IfVersion&根据服务器版本应用。比如:
&IfVersion &= 2.4&&&& # this happens only in versions greater or&&& # equal 2.4.0.&/IfVersion&
文件系统容器
&Directory&指定一个目录并把指令应用到该目录以及它所有的子目录里,和.htaccess文件的作用相同。例如:
&Directory /var/web/dir1&&&& Options +Indexes&/Directory&
&File&指定文件名,而不管它在哪个目录里。例如:
&Files private.html&&&& Require all denied&/Files&
&Directory&和&Files&也可以联合使用:
&Directory /var/web/dir1&&&& &Files private.html&&&&&&&& Require all denied&&& &/Files&&/Directory&
它应用于指定目录及其子目录里的所有名为private.html的文件。
web空间容器
与文件系统不同,这主要是指明URL内的路径。例如:
&LocationMatch ^/private&&&& Require all denied&/Location&它可以匹配所有以/private开头的URL路径,比如:/private、/private123、和/private/dir/file.html等。
&Location&所指的文件可能不存在于文件系统里,它可能是根据数据库生成的。一般原则是:可以用&Directory&和&File&表示的,尽量不要使用&Location&。
在路径出现交叠时,我们要注意顺序,例如我们必须这样写:
&Location /foo&&/Location&&Location /foo/bar&&/Location&
相对的,&Alias&应该使用相反的顺序:
Alias /foo/bar /srv/www/uncommon/barAlias /foo /srv/www/common/foo
ProxyPass也是如此:
ProxyPass /special-area
smax=5 max=10ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|jsessionid nofailover=On
通配符和正则表达式
&Directory&、&Files&、和&Location&里可以使用shell风格的通配符:“*”表示任意字符串;“?”表示任意单个字符;“[seq]”表示任意出现在seq里的字符。“/”不会匹配任何通配符,必须明确指明。比如:
&Directory /home/*/public_html&&&& Options Indexes&/Directory&
这些指令还有相应的正则表达式的指令:&DirectoryMatch&、&FilesMatch&、和&LocationMatch&。比如:
&FilesMatch .(?i:gif|jpe?g|png)$&&&& Require all denied&/FilesMatch&
逻辑表达式
&If&指令根据逻辑表达式来选择应用。例如:
&If "!(%{HTTP_REFERER} -strmatch '/*')"&&&& Require all denied&/If&
当HTTP Referer头不以/开头时启用。
&If&可以内嵌在&Directory&、&File&、和&Location&里。
&VirtualHost&容器针对特定的主机。
&Proxy&和&ProxyMatch&容器,应用于通过mod_proxy的代理服务器的站点。例如:
&Proxy /*&&&& Require all granted&/Proxy&
阻止代理服务器被用来访问/。有效的指令
通常在&Directory&里有效的指令也可以在&DirectoryMatch&、&Files&、&FilesMatch&、&Location&、&LocationMatch&、&Proxy&、和&ProxyMatch&里使用。但也有以下例外:
AllowOverride只能在&Directory&里使用。
FollowSymLinks和SymLinksIfOwnerMatch选项只在&Directory&和.htaccess文件里使用。
Options指令不能在&Files&和&FilesMatch&里使用。
三状态的RFC2616 HTTP缓存
HTTP协议包含了内建的对内联缓存机制的支持。mod_cache模块被用来利用这个机制。
与简单的双状态键/值缓存(内容过期后会消失)不同,HTTP缓存引用了一个机制来更新过期的内容。一个HTTP缓存项有三种状态:
Fresh:不超过保鲜期(freshness lifetime),新鲜的缓存会被直接返回而不调用原始服务器。
Stale:超过保鲜期,在返回给客户前,需要和原始服务器联系来核查该内容是否仍然新鲜。如果过期则需要从原始服务器得到更新的内容。核查完毕后,内容重新被标记为新鲜的状态。在一些特殊情况下,服务器也可以向客户返回过期内容。比如原始服务器返回5xx错误,或另一个请求正在更新给定的内容。这些情况下,响应里会加入Warning头部。
Non Existent:当缓存满时,它可以删除新鲜的或是过期的缓存来腾出空间。它可以发生在任何时候。
根据QuickCacheHandler的值(on/off),mod_cache模块可以在两个可能的时间与服务器挂钩:
Quick handler phase:在请求处理期间,就在请求被解析后的非常早的阶段。如果在缓存中发现内容,则立即返回,从而几乎所有的请求处理都被绕过。这种模式提供了最快速的性能,因为主要的服务器处理都被绕过了。但它同样绕过了身份验证(authentication)和授权(authorization)。
Normal Handler phase:发生在请求处理的晚期,在所有请求阶段完成后。这种模式提供了最大化的灵活性,因为缓冲可以潜在发生在过滤链里的被精确控制的点上,同时缓存的内容在返回给用户前可以被过滤或个性化。
如果没有在缓存中找到URL,mod_cache会向过滤栈加上一个过滤器,然后退居二线,让普通的请求处理继续执行。如果内容会认定为可缓存,那么内容会被保存以便下次服务,否则内容会被忽略。
如果在缓存中找到过期的内容,mod_cache模块把请求转换成conditional request。如果原始服务器返回普通的响应,该响应被缓存以代替过期的内容。如果原始服务器返回304 Not Modified响应,那么缓存被重新标记为新鲜,过滤器把缓存返回而不保存它。
如果一个虚拟主机有许多别名,那么把UseCanonicalNames设置为on会极大地提升缓存命中率。这是因为主机的名字被用作缓存的键,这个设置会避免主机产生不同的缓存项。
规范格式的要缓存的内容应该使用Cache-Control头的max-age或s-maxage域,或包含一个Expires头部来声明一个显式的保鲜期。同时,服务器定义的保鲜期可以被客户请求里的Cache-Control头部覆盖。这种情况下,请求和响应之间更短的保鲜期被使用。
当请求和响应都没有指明保鲜期时,默认的保鲜期被使用。默认情况下它为一小时。CacheDefaultExpire指令可以修改这个值。
如果响应提供了Last-Modified头部但没有提供Expires头部,mod_cache会基于CacheLastModifiedFactor指令的控制对其作出推断。
对于本地内容,或者没有定义自己Expires头部的远程内容,mod_expires可能被用来通过加入max-age和Expires来调整保鲜期。
最大的保鲜期也可以使用MaxCacheExpires来控制。
如果服务器被设计为基于请求里不同的头部作出不同的响应,比如对于相同URL的支持多种语言,那么HTTP的缓存机制缓存相同URL的相同页面的各种变体。这通过在原始服务里加入一个Vary头部来完成,它指明哪些头部用来区别不同的变体。比如:
Vary: negotiate,accept-language,accept-charset
这时只有在accept-language、accept-charset匹配原始请求时,mod_cache才会使用缓存的内容。
内容的多个变体可以同时存在,moc_cache使用Vary头部已经Vary列出的请求头部的相应的值来决定向客户返回哪种变体。
moc_cache依赖于后端存储实现来管理缓存,而moc_cache_disk用来支持到磁盘的缓存。通常模块被配置为:
CacheRoot&& "/var/cache/apache/"CacheEnable disk /CacheDirLevels 2CacheDirLength 1
值得注意的是,由于缓存存在本地,操作系统的内存缓存也会应用。所以虽然它们存在磁盘上,但如果它们经常被访问,那么它们很可能会从内存中获得。
双状态的键/值共享对象缓存
Apache HTTP服务器提供了低层共享对象缓存,表示如SSL会话,身份凭证的缓存信息,使用socache接口。
每种实现都提供了额外的模块,提供了以下后端:
mod_socache_dbm:基于DBM的共享对象缓存;
mod_socache_dc:基于分布式会话缓存(discache,Distributed session caching)的共享对象缓存;
mod_socache_memcache:基于分布式内存缓存(memcache)的共享对象缓存;
mod_socache_shmcb:基于共享内存(shared memory)的共享对象缓存。
mod_authn_socache模块允许身份验证的结果被缓存,缓解验证后端的负载。
mod_ssl模块使用socache接口提供会话缓存和stapling缓存。
特殊文件缓存
在文件系统很慢、或文件处理很耗时的平台上,存在选项在启动时预加载文件到内存。在打开文件很慢的操作系统上,存在选项在启动时打开文件并在内存中缓存句柄。这些选项对访问静态文件很慢的系统很有帮助。
打开文件本身就会造成延迟,特别是网络文件系统。通过为通用文件缓存打开文件的描述符,httpd可以避免这个延迟。httpd当前提供了File-Handle Caching的一个实现,由mod_file_cache提供。它维护了一张文件描述符的表,而不是缓存文件内容。在配置文件里使用CacheFile指令来指定这种方式的缓存。这个指令告诉httpd启动时打开文件,并在后续对这个文件的访问都重用这个文件句柄。比如:
CacheFile /usr/local/apache2/htdocs/index.html
虽然CacheFile使文件本身不被缓存,但这也意味着httpd运行时文件的修改或删除都不会察觉,服务器始终用的是启动时打开的文件内容。
从系统内存作出响应的最快的方式。从磁盘甚至是远程网络读取文件会级数级地变慢。
操作系统缓存由操作系统自动完成。而mod_file_cache提供了MMapFile指令把静态文件的内容在启动时映射到内存里,比如:
MMapFile /usr/local/apache2/htdocs/index.html
和CacheFile一样,在httpd启动后文件的修改不会被察觉。
由于内存有限,不要过度使用MMapFile。每个httpd的子进程都会复制这块内存,所以要确定映射的文件不能太大,以致于系统交换内存。
在默认状态下,QuickCacheHandler被设置为on,mod_cache无法知道被缓存的内容是否被授权,只要缓存未过期,它就会返回缓存的内容。我们可以使用CacheDisable指令或mod_expires来避免缓存。
当QuickCacheHandler被设置为Off时,完成的请求处理被执行,而安全模型保持不变。
因为发给终端用户的请求可以从缓存中得到响应,所以缓存本身变为那些希望丑化和干涉内容的人的目标。很重要的一点是我们必须忍受缓存一直对运行httpd的用户是可写的。这和我们提倡的完全相反:保持内容对Apache用户是不可写的。
如果Apache用户让步,比如通过CGI处理的缺陷,那么缓存可能会成为目标。当使用mod_cache_disk时,插入和修改缓存项要相对容易。
这导致了一个相对其它类型的攻击,Apache用户更可能出现的风险。当使用mod_cache_disk时,我们要时刻谨记对httpd进行安全更新,同时运行CGI进程时,尽可能地使用suEXEC作为非Apache用户运行。
当作为缓存代理服务器运行httpd时,有潜在的被称为Cache Poisoning的危险。攻击者使用它使得代理服务器从原始服务器得到错误的内容。
例如如果我们运行httpd的DNS服务器是易受攻击的,那么攻击者可能可以控制当从原始服务器请求内容时httpd连接到哪。另一个例子是所谓的requet-smuggling攻击。
Vary机制允许相同URL的多个变体可以并肩存在。这个机制也可以变成一个问题,当有一个被熟知的头部,比如User-Agent,在通用情况下有很大的取值范围时,同一个URL可能有上万甚至上亿的变体。
在其它情况下,有需要根据请求修改一个特定资源的URL,通常是在URL上加上一个“cachebustering”的字符串。如果内容被声明为可缓存的,那么这些缓存项会把合法缓存项挤出缓存。CacheIgnoreURLSessionIdentifiers指令可以避免这类问题。
协商(Negotiation)
一个资源可能有多种表现方式。比如不同的语言或不同的媒体类型。选择最恰当的形式的一种方式是给用户一个索引页,让他自己选择。但一般服务器可以自动地选择,因为浏览器会在请求里添加它想要的表现形式,比如在头部加入语言信息:
Accept-Language: fr
用户也可以指定多种选择,按优先级排列:
Accept-Language: q=1.0, q=0.5Accept: text/ q=1.0, text/*; q=0.8, image/ q=0.6, image/ q=0.6, image/*; q=0.5, */*; q=0.1
表示法语优先,英语其次。html最优,图片其次,其它类型也都接受。
httpd根据HTTP/1.1规范,完全支持“服务器驱动”内容协商。它完全支持Accept、Accept-Language、Accept-Charset和Accept-Encoding请求头部。httpd也支持RFC2295和RFC2296定义的实验性协商协议:“透明”内容协商。但它没有支持这些RFC定义的“特性协商”。
一个“资源”是由URI(RFC 2396)标识的概念实体。像Apache这样的HTTP服务器提供了对资源“表示”的访问。每个资源在任何时刻可能关联0个、1个或多个表示。如果有多个表示,资源被称为“可协商的”(negotiable),每个表示被称为一个变体。资源可以表示的方式数量被称为协商的“维度”。
httpd的协商
为了协商一个资源,服务器需要知道它的每一个变体的信息。有两种方式:
使用type map,它显式地给出了包含变体的文件;
使用MultiViews搜索,服务器执行隐式的文件名样式匹配,从结果中选择。
type map是一个与名为type-map的handler关联的一个文档。(为了和更早的httpd配置兼容,它也可以是application/x-type-map的MIME类型。)要使用这个特性,我们必须在配置文件里定义一个handler集来定义一个文件后缀作为type-map。最好的方式为:
AddHandler type-map .var
type map文件名为要描述的资源名加上.var后缀。这个文件应该为每个可用的变体提供一个项,这些项由HTTP格式的头部行组成。变体项之间由空行分隔。例如(foo.var):
URI: fooURI: foo.en.htmlContent-type: text/htmlContent-language: enURI: foo.fr.de.htmlContent-type: text/charset=iso-8859-2Content-language: fr, de
文件里的URI是与tpye map文件的相对路径,也可以是绝对路径。通常这些文件和type map文件放在相同目录下,但这不是必需的。
typemap文件的优先比文件名的扩展名高,即使MultiViews被打开。如果变体有不同的源品质,则可以用媒体类型的qs参数来指定:
URI: fooURI: foo.jpegContent-type: image/ qs=0.8URI: foo.gifContent-type: image/ qs=0.5URI: foo.txtContent-type: text/ qs=0.01
qs值的取值范围为0.000到1.000。任何qs值为0的变体不会被选择。没有qs参数的变体默认qs值为1。qs参数指定了与其它变体的相对的“品质”。
MultiViews是一个基于目录的选项,意味着它可以在&Directory&、&Location&或&Files&片段里用Option来设置。如果有AllowOverride设置,.htaccessyy文件里也可以设置。注意Options All并没有设置MultiViews,需要显式指定。
如果/some/dir启用了MultiViews,在收到/some/dir/foo的请求而该目录不存在时,那么目录会查找名为foo.*的文件,并高效地模拟一个type map来命名这些文件,并赋给它们相同的媒体类型和内容编码。之后它根据客户的请求来选择最好的匹配。
如果服务器尝试索引一个目录,那么MultiViews也可以应用于搜索DirectoryIndex指令命名的文件。如果配置文件指定为:
DirectoryIndex index
那么如果index.html和index.html3同时存在时服务器会从它们之间进行选择,如果它们都不存在而有index.cgi,那么服务器就会运行它。
如果在读取一个目录时有文件的扩展名无法被mod_mime识别从而指定它的Charset, Content-Type, Language, or Encoding,那么结果取决于MultiViewsMatch指令的设置。这个指令决定了handler、filter、和其它扩展类型是否可以参与到MultiViews协商中。
有两种协商方法:
使用httpd算法的服务器驱动的协商,用于普通情况;
透明内容协商,浏览器使用RFC2295定义的机制发出请求,从而完全控制最好的变体。
动态共享对象
Apache HTTP服务器是一个模块化的程序。模块可以被编译成与httpd程序独立的动态共享对象(Dynamic Shared Object,DSO)。DSO模块可以在Server编译时编译,也可以通过Apache扩展工具(apxs,APache eXtenSion) 在稍晚的时候编译和加入。
DSO必须基于mod_so模块,该模块是除core之外唯一一个必须在静态编译到服务器的。当我们提供了一个名为mod_foo.so的DSO时,可以在http.conf里使用LoadModule指令在服务器启动时加载这个模块。编译时configure的参数--enable-mods-static可以禁用DSO。
/etc/apahce2/mod_enables/*.load里便是使用了LoadModule指令。环境变量
有两种影响Apache HTTP Server的环境变量:
底层操作系统的环境变量,它们在服务器启动之前就设置好了。它们可以在配置文件里展开,也可以通过PassEnv指令传递给CGI脚本和SSI。
服务器提供了用命名变量存储信息的机制。这些信息可以控制登陆和访问等各种操作。它们在Apache内部结构里存储和操作,只有在提供给CGI脚本和SSI(Server Side Include)脚本时,才变成真正的操作系统环境变量。
设置环境变量
最基本的方式是使用SetEnv指令。也可以使用PassEnv指令把启动服务器的外壳的环境传入。
由mod_setenvif提供的指令允许不同的请求设置不同的环境变量。mod_rewrite的RewriteRule使用[E=...]选项来设置环境变量。
mod_unique_id为每个请求设置一个唯一的UNIQUE_ID环境变量的值。
除了Apache配置的环境变量和shell传入的环境变量,根据CGI规范,CGI脚本和SSI页面还被提供关于请求的元信息。
Apache HTTP Server提供了许多不同的机制来记录所有服务器发生的事情。第三方模块也可以提供日志机制,或向已有日志文件里注入信息。CGI程序、PHP脚本或其它handler都可以向服务器错误日志发送消息。
ErrorLog指令可以指定错误日志的名字和地址。ErrorLogFormat指令指定错误日志的格式。
基于每个模块记录
LogLevel指令可以基于每个模块指定日志严重等级。这种方式可以调试特定模块的错误,特别是mod_proxy和mod_rewrite模块。在LogLevel指令里指定模块:
LogLevel info rewrite:trace5
设置info为主要安全级,但mod_rewrite设置为trace5。
记录服务器处理的所有请求。CustomLog指令控制访问日志的位置和内容。LogFormat用来简化日志的内容。典型的配置为:
LogFormat "%h %l %u %t "%r" %&s %b" commonCustomLog logs/access_log common
为格式起一个别名“common”并把它应用到access_log 上。
另一种常用的格式为合并的日志格式:
LogFormat "%h %l %u %t "%r" %&s %b "%{Referer}i" "%{User-agent}i"" combinedCustomLog log/access_log combined
它的输出可能为:
127.0.0.1 - frank [10/Oct/:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
多个访问日志:
LogFormat "%h %l %u %t "%r" %&s %b" commonCustomLog logs/access_log commonCustomLog logs/referer_log "%{Referer}i -& %U"CustomLog logs/agent_log "%{User-agent}i"
基于条件的日志:
# Mark requests from the loop-back interfaceSetEnvIf Remote_Addr "127.0.0.1" dontlog# Mark requests for the robots.txt fileSetEnvIf Request_URI "^/robots.txt$" dontlog# Log what remainsCustomLog logs/access_log common env=!dontlog
SetEnvIf Accept-Language "en" englishCustomLog logs/english_log common env=englishCustomLog logs/non_english_log common env=!english
由于日志量会很大,所以需要定期压缩旧的日志以节省空间:
mv access_log access_log.oldmv error_log error_log.oldapachectl gracefulsleep 600gzip access_log.old error_log.old
CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common
通过调用Apache自带的rotatelogs,可以每24小时循环记录一次,而不必重启服务器。
默认情况下管道是不会启动shell的,|$可以产生一个shell:
# Invoke "rotatelogs" using a shellCustomLog "|$/usr/local/apache/bin/rotatelogs&& /var/log/access_log 86400" common
如果在&VirtualHost&片段里的有CustomLog或ErrorLog指令的话,那么虚拟主机的所有请求和错误都只会记录到它们指定的日志文件里。
LogFormat "%v %l %u %t "%r" %&s %b" comonvhostCustomLog logs/access_log comonvhost
里的%v用来记录虚拟主机的名字。
映射URL到文件位置
httpd在决定给请求返回哪个文件时,默认行为是把URL-Path(主机名和端口名之后的路径)添加到配置文件指明的DocumentRoot的后面。因此在DocumentRoot下的文件和目录组成了在web上可见的基本文档树。
每个虚拟主机都可以指定自己的DocumentRoot。另一种方式是使用mod_vhost_alias模块的指令,根据所请求的IP或主机名,动态地决定文档的位置。
DocumentRoot之外的文件
要让客户可以得到DocumentRoot外部的文件,一种方式是使用符号链接,但必须在Options设置里包含FollowSymLinks或SymLinksIfOwnerMatch。
另一种方式是使用Alias指令:
Alias /docs /var/web
如此URL /docs/dir/file.html会映射到文件/var/web/dir/file.html。
ScriptAlias指令的功能相同,此外在目标目录下的所有文件都被视为CGI脚本。
AliasMatch和ScriptAliasMatch是相应的正则表达式版本:
ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi-bin/(.+)&& /home/$1/cgi-bin/$2
它可以把/~user/cgi-bin/script.cgi映射到/home/user/cgi-bin/script.cgi并视其为一个CGI脚本。
基于Unix的思想,mod_userdir模块使用~user来得到特定用户的主目录:
/~user/file.html
出于安全考虑,直接在Web上访问用户主目录是不合适的,所以UserDir指令指定一个主目录下的子文件夹作为Web上的主目录。通过默认的设置
Userdir public_html
前面的URL会被映射到/home/user/public_html/file.html。
有时客户所请求的内容在另一个URL上。Redirect指令可以实现重定向:
Redirect permanent /foo/&& /bar/
相应的正则表达式版本为RedirectMatch:
RedirectMatch permanent ^/$&&& /startpage.html
临时地把所有页面都重定向到另一个网站:
RedirectMatch temp .*& /startpage.html
httpd可以把远程文档映射到本地服务器的URL。它和通常的(前向)代理不同,因为在用户看来,文档起源于反向代理服务器。例如:
ProxyPass /foo/ /bar/ProxyPassReverse /foo/ /bar/ProxyPassReverseCookieDomain
ProxyPassReverseCookiePath /foo/ /bar/
ProxyPass把服务器配置为获取合适的文档,而ProxyPassReverse重写了由源于的重定向,这样它们可以定位到本地服务器上的合适目录。类似地,ProxyPassReverseCookieDomain和ProxyPassReverseCookiePath重写了由后端服务器设置的cookie。当客户请求/foo目录下的文档时,服务器会从的/bar/目录取得,而后作为本地服务器的内容返回给用户。
值得注意的是,文档内的链接没有被重写,任何绝对链接都会破坏反向代理的行为,并直接从远程服务器上请求。mod_substitute可以用户修改页面内部的链接:
Substitute s///i
mod_proxy_html可以处理更复杂的HTML和XHTML内的链接的重写。mod_rewrite提供了重写引擎,提供更强大的替换。
File Not Found
有时URL所请求的文件无法在文件系统里找到。有时这是因为文件被移动到其它地方,这时使用URL重定向可以引导到正确的位置。另一种情况是URL拼写错误,可以是浏览器输入或HTML里的链接错误。这种情况下mod_spelling(sic)可以用来找到文件名相似的文件并返回。如果找到多个,那么向客户返回一个列表。
ServerAdmin和ServerToken指令控制关于服务器的信息,它显示在服务器产生的文档里,比如错误消息。ServerTokens指令设置了Server Http响应头域的值。
ServerName、UseCanonicalName和UseCanonicalPhysicalPort指令,被服务器用来决定如何构建自引用的URL。例如当客户请求一个目录但没有在目录名内包含末尾的斜杠时,httpd必须把客户重定向到包含末尾斜杠的完整名,以便客户可以正确地解析文档的相关引用。
CoreDumpDirectory、DocumentRoot、ErrorLog、Mutex、PidFile、ScoreBoardFile和ServerRoot用来控制httpd为正确操作所需的各种文件的位置。当所用路径名不以斜杠开头,那么文件的位置和ServerRoot相对。
LimitRequestBody、LimitRequestFields、LimitRequestFieldsize和LimitRequestLine指令用来限制在从客户读取请求时所用的资源的量。通过这些限制,可以克制某些种类的服务攻击。
RLimitCPU、RLimitMEM和RLimitNPROC用来限制从httpd子进程分离出的进程所能使用的资源的量。特别地,它控制CGI脚本和SSI exec命令所使用的资源。
ThreadStackSize在某些平台在上控制栈的大小。
Mutex指令用来改变为互斥体使用的底层实现。
加密算法(Cryptographic Algorithm)有两类:
协议加密(Conventional cryptographic):也称对称(symmetric)加密。发送者和接收者共享一个密钥,用来加密和解密。
公钥加密(Public key cryptographic):也称不对称加密。用户有两个密钥,任何一个都可以用来加密。如果其中一个用来加密,那必须用另一个来解密。如此就可以把一个密钥公开,而秘密保存另一个。任何人都可以通过公钥来加密信息,但只有私钥的主人才能读取它。
虽然发送的消息被加密,但仍有可能某人修改原始消息,并用其它消息代替它,比如向错误的帐号汇款。解决方法是为发送的消息创建一个汇总,一同发送给接收方。接收方收到消息时,也创建它自己的汇总。如果两个汇总相同,就说明发送方的消息没有被篡改。这样的汇总称为消息摘要(message digests)、单向函数或哈希函数。消息摘要为更长的可变长度的消息创建一个更小的固定长度的消息。摘要算法为每个消息创建唯一的摘要。理论上不可能找到两条不同的但有相同摘要的消息,同时在实践中也极难从摘要确定消息的内容。
我们必须确保消息摘要要安全地发送。一种方式是使用数字签名。通过发送者的密钥加密消息摘要和其它信息(比如序列号),创建数字签名。尽管任何人都可以用公钥解密这个签名,但只有发送者才能为这个消息签名。这样其它人就无法修改摘要并同时为它签名。证书
虽然客户可以发送私密消息给网站,为它签名并保证它的完整性,但他仍然要确保和他通信的网站确实是真实可靠的。也就是说他所使用的公钥是网站密钥对的一部分,而不是其他人的。为此需要认证机构(Certificate Authorities,CA)来颁发把公钥与真实个体(比如网站)关联的证书。任何被信任的代理都可以作为认证机构。
在授予证书前,通过验证认证请求的信息,认证机构必须确保自己是密钥对里的私钥的主人。例如,当有人申请个人证书时,认证机构首先必须确认那个人确实和他所声明的身份一致。
认证机构可以为另一个认证机构颁发证书,这称为认证链。当检查证书时,我们可能需要检查证书的颁发者。沿着链一直找到自己信任的为止。
证书可以由自己颁发给自己,这样的称为顶级认证机构,有许多公司都建立了自己的CA。
认证机构不仅负责颁发证书,它还需要负责证书的管理和废除。
安全套接字层(Secure Sockets Layer,SSL)
SSL在TCP和应用层之间,提供客户端和服务器端的安全交流。它允许彼此认证、为完整性而对数字签名的使用、以及为隐私的加密。SSL目前最新版本为SSL3.0。
SSL会话可以通过客户端和服务器端的握手过程来建立。根据服务器的配置,这个过程可以是向客户提供或索取一个证书。一旦SSL会话建立,它可以被重用以减少开销。服务器赋给每个会话一个唯一的会话ID,缓存在服务器里,客户之后的连接都可以使用它以减少握手时间,直到会话过期。
握手的过程为:
1、协商传输数据所使用的加密套件(suit);
2、在客户端和服务器端之间建立并共享会话密钥;
3、服务器可选地向客户认证;
4、客户可选地向服务器认证;
SSL3.0定义了31种加密套件。一个加密套件由以下几个组件构成:
1、密钥交换方法;
2、数据传输的加密;
3、为了创建消息认证代码(Message Authentication Code,MAC)的消息摘要。
握手过程使用了三个协议:
1、SSL握手协议:建立客户和服务器的会话;
2、SSL Change Cipher Spec协议:在加密套件上达成共识;
3、SSL Alert协议:在客户和服务器之间传输错误消息。
https是SSL的一种普遍使用方式。
Listen 443&VirtualHost *:443&&&& ServerName &&& SSLEngine on&&& SSLCertificateFile /path/to/.cert&&& SSLCertificateKeyFile /path/to/.key&/VirtualHost&
加密套件以及强制强安全
创建一个只接受强加密的SSL服务器:
SSLCipherSuite HIGH:!aNULL:!MD5
指定特定的速度优化的加密:
SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:!aNULL:!MD5SSLHonorCipherOrder on
接受所有通用加密类型,但对特定URL的访问需要强加密:
# be liberal in generalSSLCipherSuite ALL:!aNULL:RC4+RSA:+HIGH:+MEDIUM:+LOW:+EXP:+eNULL&Location /strong/area&# but https://hostname/strong/area/ and below# requires strong ciphersSSLCipherSuite HIGH:!aNULL:!MD5&/Location&
客户认证和访问控制
强制客户使用证书认证:
# require a client certificate which has to be directly# signed by our CA certificate in ca.crtSSLVerifyClient requireSSLVerifyDepth 1SSLCACertificateFile conf/ssl.crt/ca.crt
对特定URL强制客户使用证书认证,但允许用户随意访问其它URL:
SSLVerifyClient noneSSLCACertificateFile conf/ssl.crt/ca.crt&Location /secure/area&SSLVerifyClient requireSSLVerifyDepth 1&/Location&
只允许有证书的官户访问特定URL,但允许所有用户访问服务器的其它部分:
SSLVerifyClient&&&&& none&Directory /usr/local/apache2/htdocs/secure/area&&&& SSLVerifyClient&&&&& require&&& SSLVerifyDepth&&&&&& 5&&& SSLCACertificateFile conf/ssl.crt/ca.crt&&& SSLCACertificatePath conf/ssl.crt&&& SSLOptions&&&&&&&&&& +FakeBasicAuth&&& SSLRequireSSL&&& AuthName&&&&&&&&&&&& "Snake Oil Authentication"&&& AuthType&&&&&&&&&&&& Basic&&& AuthBasicProvider&&& file&&& AuthUserFile&&&&&&&& /usr/local/apache2/conf/httpd.passwd&&& Require&&&&&&&&&&&&& valid-user&/Directory&
上述的httpd.password由DES加密,内容为:/C=DE/L=Munich/O=Snake Oil, Ltd./OU=Staff/CN=Foo:xxj31ZMTZzkVA/C=US/L=S.F./O=Snake Oil, Ltd./OU=CA/CN=Bar:xxj31ZMTZzkVA/C=US/L=L.A./O=Snake Oil, Ltd./OU=Dev/CN=Quux:xxj31ZMTZzkVA
https服务器的配置
apache2的工具a2enmod可以启用模块。运行命令:
a2enmod ssl
启用ssl模块,你可以在/etc/apache2/mods-enabled/下找到ssl。
重启apache令其生效。netstat -l命令可以发现https端口已经被兼听。
创建私钥(使用Triple-DES加密的1024位的私钥,以PEM存储从而是ASCII可读的):
openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus...++++++.......................++++++e is 601)Enter pass phrase for server.key:Verifying - Enter pass phrase for server.key:
创建CSR (Certificate Signing Request):
openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [AU]:CNState or Province Name (full name) [Some-State]:ShanghaiLocality Name (eg, city) []:ShanghaiOrganization Name (eg, company) [Internet Widgits Pty Ltd]:TommyOrganizational Unit Name (eg, section) []:Tommy SubCommon Name (e.g. server FQDN or YOUR name) []:TommyEmail Address []:tommy_Please enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:123456An optional company name []:Yt
产生自签名的证书:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature oksubject=/C=CN/ST=Shanghai/L=Shanghai/O=Tommy/OU=Tommy Sub/CN=Tommy/emailAddress=tommy_Getting Private keyEnter pass phrase for server.key:安装证书:
sudo mkdir /etc/apache2/conf/ssl.crtsudo mkdir /etc/apache2/conf/ssl.keysudo cp server.crt /etc/apache2/conf/ssl.crt/sudo cp server.key /etc/apache2/conf/ssl.key/
修改虚拟主机:
&VirtualHost *:443&& & SSLEngine on& & SSLCertificateFile /etc/apache2/conf/ssl.crt/server.crt& & SSLCertificateKeyFile /etc/apache2/conf/ssl.key/server.key
& & ......
&/VirtualHost&
重启apache2。用浏览器打开https://localhost,可以看到
“该网站的安全证书不受信任!”
的信息,这是由于证书是自签名的原因。点“仍然继续”,可以正常浏览网站。
由于每次启动apache都要输入密码,所以我们可以去掉密码:
tommy:~$ cp server.key server.key.orgtommy:~$ openssl rsa -in server.key.org -out server.key
重新签名证书:
tommy:~$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crtSignature oksubject=/C=CN/ST=Shanghai/L=Shanghai/O=Tommy/OU=Tommy Sub/CN=Tommy/emailAddress=tommy_Getting Private key
重新安装:
tommy:~$ sudo cp server.key /etc/apache2/conf/ssl.key/tommy:~$ sudo cp server.crt /etc/apache2/conf/ssl.crt/
重启apache:tommy:~$ sudo apache2ctl restart
为了获得受信任的证书,需要向某些网站申请,可能需要付费。
mod_rewrite模块
mod_rewrite提供了一种操作URL的方式,它用于处理复杂的任务。它使用Perl兼容的正则表达式。对于简单的任务,应该使用mod_alias。
RewriteRule由空格分隔的三个参数组成:
1、pattern:应该被规则影响的URL;
2、Substitution:用于替换匹配的部分;
3、[flags]:影响重写请求的选项。
RewriteRule ^/games /usr/local/games/web
RewriteRule ^/product/view$ /seeproduct.html [R]
RewriteRule ^/product/(.*)/view$ /var/web/productdb/$1
具体的flag参考:http://httpd.apache.org/docs/2.4/rewrite/flags.html。
RewriteCond可以用来限制要传给后面的请求类型。第一个参数是描述请求的一个特性的变量;第二个参数是匹配第一个参数的正则表达式;第三个可选参数是一列flags来修改匹配如何取值。
RewriteCond %{REMOTE_ADDR} ^10.2.RewriteRule (.*) $1或RewriteCond %{QUERY_STRING} hackRewriteCond %{HTTP_COOKIE} !goRewriteRule . - [F]
或RewriteCond %{HTTP_HOST} (.*)RewriteRule ^/(.*) /sites/%1/$1
RewriteMap指令提供了调用外部函数的一种方式。具体参考http://httpd.apache.org/docs/2.4/rewrite/rewritemap.html。
Rewrite一般推荐在&Directory&片段外面配置,也可以在&VirtualHost&里。在&Directory&里或.htaccess文件里配置会增加额外的复杂性的开销。虚拟主机
&VirtualHost *:80&&&& # This first-listed virtual host is also the default for *:80&&& ServerName &&&
&&& DocumentRoot /www/domain&/VirtualHost&&VirtualHost *:80&&&& ServerName &&& DocumentRoot /www/otherdomain&/VirtualHost&
&VirtualHost 172.20.30.40:80&&&& ServerAdmin webmaster@&&& DocumentRoot /www/vhosts/www1&&& ServerName &&& ErrorLog /www/logs/www1/error_log&&& CustomLog /www/logs/www1/access_log combined&/VirtualHost&&VirtualHost 172.20.30.50:80&&&& ServerAdmin webmaster@www2.example.org&&& DocumentRoot /www/vhosts/www2&&& ServerName www2.example.org&&& ErrorLog /www/logs/www2/error_log&&& CustomLog /www/logs/www2/access_log combined&/VirtualHost&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
Copyright &
All Rights Reserved

我要回帖

更多关于 win10cpu设置在哪里 的文章

 

随机推荐