前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache常用配置-运维笔记

Apache常用配置-运维笔记

作者头像
洗尽了浮华
发布2018-10-22 15:10:00
2.6K0
发布2018-10-22 15:10:00
举报
文章被收录于专栏:散尽浮华散尽浮华

对于Apache日常运维中的配置,特做如下梳理,作为日常运维笔记所用。

代码语言:javascript
复制
指定日志记录格式,组合日志格式(combined)或通用日志格式(common),修改配置文件:
CustomLog logs/access_log combined    组合日志格式
CustomLog logs/access_log common      通用日志格式
=================================================
通用日志格式与组合日志格式的"%h"控制符表示远程请求用户的身份,依据HostNameLookups指令的设定值,可能是主机名也可能是IP地址。
如果想永远记录IP地址,则使用“%a”控制符。
=================================================
记录从客户端收到的cookie
CustomLog logs/cookies_in.log "%{UNIQUE_ID}e %{Cookie}i"
CustomLog logs/cookies2_in.log "%{UNIQUE_ID}e %{Cookie2}i"
 
记录由服务器设定并传送给客户端的cookie值:
CustomLog logs/cookies_out.log "%{UNIQUE_ID}e %{Set-Cookie}o"
CustomLog logs/cookies2_out.log "%{UNIQUE_ID}e %{Set-Cookie2}o"
=================================================
不记录来自本机网页的图像请求:
<FilesMatch \.(jpg|gif|png$)>
SetEnvIfNoCase Referrer "^http://www.example.com/" local_referrer=1
</FilesMatch>
Customlog logs/access_log combined env=!local_referrer
=================================================
按照日或小时来记录请求:
CustomLog "| /usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/access_log.%Y-%m-%d 86400" combined
 
其中:
rotatelogs的第一个参数是主日志文件名如果有%字符,则表示日志文件名中时间的格式,如果没有指定时间格式,则是以秒为单位,
从1970.1.1日算起的秒数
 
第二个参数是产生新日志的间隔是多少秒。也可以是大小如果把上例中的86400换成5M,则表时日志达到5M时,就会产生一个新的日志,
日志的名字是access_log.%Y-%m-%d格式的
=================================================
logresolve 将日志中记录的IP地址解析为主机名
 
例如:
$logresolve -c < /usr/local/apache2/logs/access_log.raw > access_log.resolved
 
也可以让apache在处理过程中使用IP地址,然后在记录日志时,以管道方式的日志记录进程来解析,修改配置文件:
HostnameLookups off
CustomLog "|/usr/local/apache2/bin/logresolve -c >> /usr/local/apache2/logs/access_log.resolved" combined
=================================================
只有一个IP,但想在系统上支持多个网站:
 
NameVirtualHost *
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/dummy-host.example.com
    ServerName dummy-host.example.com
    ServerAlias www.bobo.com                    ######p这条指令可对虚拟主机设定多个名称
    ErrorLog logs/dummy-host.example.com-error_log
    CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
 
其中:
"*" 表示所设定的主机可在所有的地址上运行。对于只有单一地址的机器,这表示会在该地址上运行,同时也会在loopback地址上运行。
如果NameVirtualHost 后面放置主机名称可能会在启动服务器时停用虚拟主机的机制。
虚拟主机会使用户无法再访问配置文件中的主服务器。如果想让主服务器成为默认服务器,则必须在虚拟主机区块中先将它列出。
对于每个虚拟主机名称,还需要在DNS中添加相关记录。
=================================================
# /usr/local/apache2/bin/httpd -S    显示虚拟主机的配置
=================================================
ErrorDocument 404 /err.html    这个指令可以让没有打到指定网页的时候,不显示404错误,而是err.html页面。
错误号可以是其它的号码,如403、500等
 
例如:
<VirtualHost *>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/kevin.com
    ServerName kevin.com
    ErrorLog logs/kevin.com-error_log
    CustomLog logs/kevin.com-access_log combined
    ErrorDocument 404 /err.html
</VirtualHost>
 
根据以上配置,访问kevin.com/index.html时,如果/www/docs/kevin.com目录下没有index.html文件时,
则会显示/www/docs/kevin.com目录下的err.html文件
=================================================
如果是有多个IP的情况下,想在每个地址上支持一个网站:
 
NameVirtualHost 127.0.0.1
<VirtualHost 10.4.5.230>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/bobo.bobo.com
    ServerName bobo.bobo.com
    ErrorLog logs/bobo.bobo.com-error_log
    CustomLog logs/bobo.bobo.com-access_log combined
</VirtualHost>
<VirtualHost 10.4.5.231>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/kevin.com
    ServerName kevin.com
    ErrorLog logs/kevin.com-error_log
    CustomLog logs/kevin.com-access_log combined
</VirtualHost>
 
以上配置根据所访问的IP地址不同,会访问不同的虚拟主机。如果服务器上还有其它的IP地址,但是没有在配置文件的虚拟主机区块列出来时,
这时访问这个其它的IP地址,请求会被送至在配置文件主设定区的虚拟主机
=================================================
建立以IP寻址的默认虚拟主机,以配置文件中加入下面代码:
 
<VirtualHost _default_>
    DocumentRoot /www/htdocs
    ErrorDocument 404 /err.html
</VirtualHost>
 
加入以上代码后,如果访问本地的IP,但是该IP确没有在配置文件中配置时,则会访问以上代码指定的页面
=================================================
混用以IP寻址及以名称寻址虚拟主机:
 
ServerName 127.0.0.1
NameVirtualHost 192.168.10.10
NameVirtualHost 10.4.5.230
<VirtualHost 192.168.10.10>                       ################此处不同
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/kevin.com
    ServerName kevin.com                 ################此处不同
    ErrorLog logs/kevin.com-error_log
    CustomLog logs/kevin.com-access_log combined
</VirtualHost>
<VirtualHost 10.4.5.230>                          ################此处不同
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/kevin.com
    ServerName kevin.bobo.com                          ################此处不同
    ErrorLog logs/kevin.bobo.com-error_log
    CustomLog logs/kevin.bobo.com-access_log combined
</VirtualHost>
<VirtualHost 10.4.5.230>                          ################此处不同
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/kevin.com
    ServerName bobo.bobo.com                          ################此处不同
    ErrorLog logs/bobo.bobo.com-error_log
    CustomLog logs/bobo.bobo.com-access_log combined
</VirtualHost>
=================================================
mod_vhost_alias   模块可以建立大量的虚拟主机
=================================================
将URL对应至特定目录。也就是说,如果访问http://192.168.10.10/bobo,如果不想让他访问/usr/local/apache2/htdocs/bobo,
而是让它访问其它的目录中的内容,可以在配置文件中加入如下:
Alias /bobo /home/bobo/apache_bobo
 
然后还要把指定的目录加入到配置文件中,以让apache可以访问,默认情况下apache是不访问DocumentRoot以外的目录的。
<Directory "/home/bobo/apache_bobo">
    Order allow,deny
    Allow from all
</Directory>
 
这种用Alias的目录指定,其实是用Alias的第二个参数去替换第一个参数。
本例中就是用/home/bobo/apache_bobo去替换/bobo,因此,我们访问http://192.168.10.10/bobo
其实上是访问http://192.168.10.10/home/bobo/apache_bobo
 
这种方法对"/"符号要求非常严格,如果上例我们写成Alias /bobo/ /home/bobo/apache_bobo,
而我们在访问http://192.168.10.10/bobo/index.html,其实是访问http://192.168.10.10/home/bobo/apache_boboindex.html,
这是错误的,因为/home/bobo/apache_bobo替换的是/bobo/,注意,这里把最后的“/”也替换了,所以转换后就是前面所说那样错误的URL。
 
Alias也可以为现有的网页内容创建新的URL,例如要想原来http://192.168.10.10/php/phpinfo.php内容,通过http://192.168.10.10/newphp/phpinfo.php也可以访问,
只要在配置文件中加入如下一行:
  Alias /newphp /usr/local/apache2/htdocs/php
 
Alias只影响本地URI,不会影响URL的主机名部分
=================================================
让服务器的用户都有自己的URL,有自己的网页空间,配置文件:
UserDir public_html     
 
配置文件中有这行指令后,再在用户主目录下创建public_html目录,里面放入网页就可以了。
访问的URL为,以kevin这个用户为例:http://192.168.10.10/~kevin/
还要将配置文件中一段注释去掉:
 
#<Directory /home/*/public_html>
#    AllowOverride FileInfo AuthConfig Limit Indexes
#    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#    <Limit GET POST OPTIONS PROPFIND>
#        Order allow,deny
#        Allow from all
#    </Limit>
#    <LimitExcept GET POST OPTIONS PROPFIND>
#        Order deny,allow
#        Deny from all
#    </LimitExcept>
#</Directory>
 
以配置访问权限。
 
另一种方式:
UserDir /www/user/*/htdocs
这种方法后的参数是完整的路径名,把用户的页面文件都放在了统一的目录下(/www/usr/下),
后面的*号是用户名命名的目录。访问方法和上面第一种方法一样
=================================================
AliasMatch ^/testph(p|ps) /usr/local/apache2/htdocs/php
 
用AliasMatch指令,可以用正则表达式的方式将多个URL对应至同一个目录,以上指令,可以用:
http://192.168.10.10/testphp/phpinfo.php和http://192.168.10.10/testphps/phpinfo.php
来访问同一个目录中的内容
=================================================
重定向至其他URL,修改配置文件:
Redirect /sohu http://www.kevin.com
以上指令访问http:192.168.10.10/sohu时,实际访问的是http://www.kevin.com
 
Redirect指令有几个参数:
temp:表示文件当前不在原来所请求的位置上,可以将来还会在这个位置上,现在只是临时的。这样,客户端会记住原始请求的URL。
permanent:表示被请求的文件不在指定位置上,而是永久在新的位置上。这样,客户端会记住新的URL
gone:表示文件不在此位置,而且以后也不在新的位置上。相当于404错误。但服务器会承认所请求的文件原来在此位置。所以不会被视为错误。
seeother:表示文件不在所请求的位置,而且被不同位置的其它文件取代了(前三个参数都是指同一个文件,这个参数请是不同位置的不同文件取代了原来位置的原来文件)
 
默认情况下是使用temp参数
用RedirectMatch指令可以用正则表达式的方式将多个URL重定向至同一位置。
=================================================
Apache接受不区分大小写的URL:
1.安装mod_speling模块
2.在配置文件中添加:
 CheckSpelling On
=================================================
mod_rewrite模块用途:
可以重写URL请求中的文件,替换成指定的;
可以拒绝访问未被引用的请求;
可以依据查询字符串来重写;
可以将所有请求重定向是单一主机;
将服务器的全部或部分请求重定向至SSL等相关工作
=================================================
在子目录中放宽安全限制
也就是说,比如我们现在已经在/usr/local/apache2/htdocs/这个目录上加上了用户名和密码的认证。
但我们想在/usr/local/apache2/htdocs/php这个目录中不需要认证,使用户可以直接访问
要达到上面的要求我们可以这样,在配置文件中加入:
 
<Directory "/usr/local/apache2/htdocs/php">
Satisfy Any
Order Deny,Allow
Allow from all
</Directory>
 
或者:
 
在/usr/local/apache2/htdocs/php目录下建立.htaccess文件,把
Satisfy Any
Order Deny,Allow
Allow from all
 
这三行内容写在.htaccess文件里面。
=================================================
如果已经限制了一个目录的访问,需要用户名和密码,但想要放开这个目录中的其中一个文件(例如:back.html)
的权限,使其可以任意访问,在配置文件中添加:
 
<Files back.html>
Satisfy Any
Order Deny,Allow
Allow from all
</Files>
=================================================
查看通过验证的用户名称:
可以查看REMOTE_USER环境变更。在access_log中也可以看到。
=================================================
禁止通过代理服务器访问特定的URL,修改配置文件:
 
ProxyBlock .rm .ra .mp3
 
或
 
<Directory proxy:http://10.4.5.135/music/>
Order Allow,Deny
Deny from all
Satisfy All
</Directory>
 
上述方法都无法满足要求时,可以使用正则表达式的方式,使用Rewrite指令。
=================================================
想拒绝所有对目录中文件的访问,除了特殊指定扩展名的文件(比如.html文件):
 
<Directory "/usr/local/apache2/htdocs/test">
Satisfy all
Order Allow,Deny
Deny from all
        <Files *.html>
          Order Deny,Allow
          Allow from all
          Satisfy any
        </Files>
</Directory>
 
以上指令,使得test目录及其子目录下的所有非.html文件无法访问,只有.html的文件可以访问
=================================================
# ab -n 1000 -c 20 http://10.4.5.135/back.html      测试apache性能的工具
其中:
-n  1000 表示请求的数目
-c  20 表示一次送出20 个请求
-h  可以查看帮助
=================================================
取得网站快照,修改配置文件:
 
<Location /server-status>
    SetHandler server-status
#    Order deny,allow
#    Deny from all
#    Allow from .example.com
</Location>
ExtendedStatus On
=================================================
将经常查看的文件存入高速缓存区,修改配置文件:
MMapFile /usr/local/apache2/htdocs/index.html             
 
需要安装mod_file_cache模块
=================================================
将目录列表存入高速缓存区,修改配置文件:
IndexOptions +TrackModified
=================================================

===========================.htaccess文件配置笔记=========================== .htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过对.htaccess文件进行设置,可以帮我们实现:网页301重定向、自定义400/403/404/500错误页面、改变文件扩展名、允许/阻止指定IP用户访问、禁止目录列表、配置默认文档等功能,可以说是功能非常强大。

代码语言:javascript
复制
设置网站错误页面
ErrorDocument 400 /error_pages/400.html
ErrorDocument 401 /error_pages/401.html
ErrorDocument 403 /error_pages/403.html
ErrorDocument 404 /error_pages/404.html
ErrorDocument 500 /error_pages/500.html

设置网页301重定向
#从 old_dir 目录重定向到 new_dir 目录
Redirect /old_dir/ http://www.yourdomain.com/new_dir/index.html
#把通过二级目录访问的请求301重定向到二级域名
RedirectMatch 301 /dir/(.*) http://dir.yourdomain.com/$1

禁止指定IP段用户的访问
#禁止 IP 为 255.0.0.0 和 123.45.6.区段的 IP 访问
order allow,deny
deny from 255.0.0.0
deny from 123.45.6.
allow from all

禁止指定来源网页访问
#禁止从 otherdomain.com 和 anotherdomain.com 的来源访问
RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} otherdomain\.com [NC,OR]
RewriteCond %{HTTP_REFERER} anotherdomain\.com
RewriteRule .* – [F]

图片防盗链设置
#从本站以外的域名访问图片,一律显示 feed.jpg
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC]
RewriteRule \.(gif|jpg|png)$ http://www.yourdomain.com/feed.jpg [R,L]

设置文件夹首页
#防止显示文件夹列表,当访问文件夹时,服务器会查找index.html,并将其做为首页文件,如不存在依次向后查找
DirectoryIndex index.html index.cgi index.php

设置多媒体文件为可下载而非播放
AddType application/octet-stream .mp3 .mp4

自定义HTTP报头
Header set X-Pingback “http://www.yourdomain.com/xmlrpc.php”
Header set article-by “yourdomain.com”

设置文件过期时间 Cache Control
# 启用有效期控制
ExpiresActive On
# gif/png/jpg 有效期为1个月
ExpiresByType image/gif “access plus 1 month”
ExpiresByType image/png “access plus 1 month”
ExpiresByType image/jpg “access plus 1 month”
# js/css 有效期为1星期
ExpiresByType text/javascript “access plus 1 week”
ExpiresByType text/css “access plus 1 week”

WordPress建站程序伪静态代码
# BEGIN WordPress #这是一行注释,表示 WordPress 的 htaccess 从这里开始
#如果Apache加载了mod_rewrite.c模块,则运行以下代码
RewriteEngine On #启用 mod_rewrite 引擎
RewriteBase / #设置目录重写的基准URL为 /
RewriteRule ^index\.php$ – [L] #如果请求路径是 index.php,停止重写操作(避免死循环)
RewriteCond %{REQUEST_FILENAME} !-f #如果请求的不是一个文件,继续处理
RewriteCond %{REQUEST_FILENAME} !-d #如果请求的不是一个目录,继续处理
RewriteRule . /index.php [L] #把所有的请求指向 /index.php
#结束 IfModule
# END WordPress #WordPress 的 htaccess 到这里结束

Discuz x3/x3.1通用伪静态代码
#如果Apache加载了mod_rewrite.c模块,则运行以下代码
RewriteEngine On
RewriteBase /discuz
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\%3D$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
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ plugin.php?id=$1:$2&%1

====================一个简单的apache跳转页面配置的小示例==========================

代码语言:javascript
复制
示例如下:
假设apache的域名(ServerName)为www.kevin.com

下面配置表示:
访问http://www.kevin.com/shibo/admin/下匹配的path资源不存在时,页面跳转到 http://www.kevin.com/missing.html 的404错误页面。
要是admin下匹配的path资源存在,则不会跳转!
<IfModule proxy_module>
  ProxyPass /shibo/admin/*  http://www.kevin.com/missing.html
  ProxyPassMatch  /shibo/admin/*  !
</IfModule>

下面配置表示:
访问http://www.kevin.com/shibo/admin/下匹配的所有资源时,页面跳转到 http://www.kevin.com/missing.html 的404错误页面。
不管admin下匹配path资源存在还是不存在,都会跳转!
<IfModule proxy_module>
  ProxyPass /shibo/admin/  http://www.kevin.com/missing.html
  ProxyPassMatch  /shibo/admin/  !
</IfModule>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
轻量应用服务器
轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门软件打包实现一键构建应用,提供极简上云体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档