Apache安装
参看此文章 https://xbug.top/index.php/archives/195.html
基础命令
# 启动服务
/server/httpd/bin/apachectl -k start
# 立即停止
kill -TERM `cat /server/httpd/logs/httpd.pid`
# 立即停止2
/server/httpd/bin/apachectl -k stop
# 优雅重启
# 此方式重启不会停止服务
# 在重启过程中确保有适当数量的进程和线程以响应客户端的请求
/server/httpd/bin/apachectl -k graceful
# 立即重启
/server/httpd/bin/apachectl -k restart
# 优雅停止
# 进程会完成现有的服务再退出,如果没有服务,立刻退出
/server/httpd/bin/apachectl -k graceful-stop
# 检测配置文件语法错误
/server/httpd/bin/apachectl -t
配置文件详解
主配置文件httpd.conf详解
# 常用配置及配置详解
# apache安目录,编译时指定,不指定路径时默认路径为/usr/local/apache2
ServerRoot "/server/httpd"
# 主站监听端口,可以监听多个端口
#Listen 12.34.56.78:80
# Listen 443
Listen 80
# 模块动态加载,这里只列举几个用到的模块
# 别名
LoadModule alias_module modules/mod_alias.so
# url重写
LoadModule rewrite_module modules/mod_rewrite.so
# php以模块的形式处理请求
LoadModule php5_module modules/libphp5.so
# <Ifxxxx > 容器下文与详细说明
<IfModule unixd_module>
# 运行httod服务的用户
User www
# 运行httod服务的用户组
Group www
</IfModule>
# 管理员邮件地址
ServerAdmin you@example.com
# 出错时是否显示服务器信息
ServerSignature On
# On显示
# Off不显示,默认Off
# Email,On的升级版,显示且点击ServerName就会向ServerAdmin中设置的邮箱发邮件
#显示的内容如下
# Apache/2.4.38 (Unix) PHP/5.6.38 Server at 192.168.73.129 Port 80
# 控制Response Header中的Server显示
ServerTokens Full
# 选项有 Major | Minor | Min[imal] | Prod[uctOnly] | OS | Full
# 默认是Full 这里的选项也会影响ServerSignature的显示内容,主要是详细的服务器版本号内容
# 主站点名称,域名或者IP皆可
ServerName 127.0.0.1:80
# 保持长连接设置
KeepAlive On
# 一个连接服务最多请求次数
MaxKeepAliveRequests 100
# 长连接持续时间,超过该时间没有请求数据则断开连接
KeepAliveTimeOut 15
# 记录父进程PID的文件,默认值如下
PidFile "logs/httpd.pid"
# 常用的资源限制配置,可减轻DOS攻击
# 设置客户端发送的HTTP请求的最大字节数 默认0 不限制
LimitRequestBody 0
# 限制为500K
# LimitRequestBody 512000
# 设置客户端向服务器请求中HTTP请求头域的数量
LimitRequestFields 100
# 默认值一般为100
# 设置客户端发送的HTTP请求头的最大字节数 一般不要改动
LimitRequestFieldsize 8190
# 设置客户端发送的HTTP请求行的最大字节数
# GET / HTTP/1.1
LimitRequestLine 8190
# Dirctory容器对根目录的限制
<Directory />
# indexs 没有默认文件的情况下展示目录结构 options更多选项下文详细叙述
options indexes
# 禁用.htaccess文件
AllowOverride none
Require all denied
</Directory>
# 主站访问的根目录
DocumentRoot "/server/www/htdocs"
# 对根目录的限制
<Directory "/server/www/htdocs">
# indexes允许显示文件目录 FollowSymLinks 允许文件系统使用符号连接
Options FollowSymLinks indexes
# 允许使用.htacess文件
AllowOverride All
Require all granted
</Directory>
<IfModule dir_module>
# 设置默认访问文件,顺序为从左到右
DirectoryIndex index.php index.html
</IfModule>
# 拒绝用户访问.ht开头的文件(.htaccess)
<Files ".ht*">
Require all denied
</Files>
# 匹配.php后缀文件,使用php处理器处理该文件
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
# 错误日志配置 未指定的目录都是相对于ServerRoot
ErrorLog "logs/error_log"
# 日志级别
LogLevel warn
<IfDefine tes1>
Redirect / http://www.baidu.com/
</IfDefine>
# 日志格式
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
# 访问日志
CustomLog "logs/access_log" common
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/server/www/cgi-bin/"
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory "/server/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule headers_module>
RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
# 设置mime.types文件的位置,此文件规定了apache识别的文件后缀
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
容器详解
分两种基本类型
1. 启动时生效的容器
<IfDefine>
# 此容器只在启动时添加了-D参数才会生效
# 配置
<IfDefine test> # 这里的test和-D参数指定的一致 否则不起作用
Redirect / http://www.baidu.com/
</IfDefine>
# 使用如下命令启动服务
/server/httpd/bin/apachectl -k start -D test
# 访问根域名的请求就会被转发到百度
<IfModule>
# 该容器代表xxx模块被装载了 才会起作用
# 不装载对应模块 配置文件也不会报错
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
<IfVersion>
# 判断服务器版本的容器
<IfVersion >= 2.1>
# 仅在版本高于 2.1.0 的时候才生效
</IfVersion>
2.常规容器(配置段),一般都是针对各种请求
常规容器的配置语法基本相同,主要有以下几项:Options
选项
规定当前配置段可使用的特性
语法:
Options: None|All|[[+|-]Indexes][FllowSymLinks][Includes][SymLinksifOwnerMatch][ExecCGI][MultiViews]
参数:None
: 不启用任何额外特性;
All
: 除 MultiViews
之外的所有特性。这也是Options指令的 默认设置;
Indexes
:如果输入的网址对应服务器上的一个文件目录,而此目录中又没有 DirectoryIndex指令(例如: DirectoryIndex index.html index.php),那么服务器会返回目录列表;
FllowSymLinks
:服务器允许在此目录中使用符号连接(简单来说就是ln -s 创建的链接文件是否可用)。如果该配置选项位于 <Location>
配置段中,将会被忽略;
MultiViews
:允许使用多重视图(基本用不到);
SymLinksIfOwnerMatch
:服务器仅在符号连接与目标文件或目录的所有者具有相同的用户ID时才使用它。简而言之,只有当符号连接和符号连接指向的目标文件或目录的所有者是同一用户时,才会使用符号连接。该选项需要开启FllowSymLinks
前置;如果该配置选项位于 <Location>
配置段中,将会被忽略;
ExecCGI
:允许使用 mod_cgi
模块执行CGI脚本;
Includes
:允许使用 mod_include
模块提供的服务器端包含功能。
IncludesNOEXEC
:允许服务器端包含,但禁用"#exec cmd"和"#exec cgi"。但仍可以从ScriptAlias
目录使用"#include virtual"虚拟CGI脚本。
备注
参数中+-的含义
Apache允许在一个目录配置中设置多个Options
指令,Options
选项存在继承关系。一般来说,如果一个目录被多次设置了Options
,则指定特性数量最多的一个Options
指令会被完全接受(其它的被忽略),而各个Options
指令之间并不会合并。但是如果我们在可选配置项前加上了符号"+"或"-",那么表示该可选项将会被合并。所有前面加有"+"号的可选项将强制覆盖当前的可选项设置,而所有前面有"-"号的可选项将强制从当前可选项设置中去除。
混合使用前面带"+"/"-"和前面不带"+"/"-"的同一可选项,可能会导致出现意料之外的结果。
#示例1
<Directory /web/file>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/file/image>
Options Includes
</Directory>
#目录/web/file/image只会被设置Includes特性
#示例2
<Directory /web/file>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/file/image>
Options +Includes -Indexes
</Directory>
#目录/web/file/image将会被设置Includes、FollowSymLinks两种特性
AllowOverride
选项
规定.htaccess文件是否可用,可用哪些配置项
语法:
AllowOverride: None|All|AuthConfig|FileInfo|Indexes|Limit|Options
参数:None
: 禁止使用.htaccess(由AccessFileName决定名字)文件
All
: 可以使用.htaccess,且支持所有选项
AuthConfig
:允许使用与认证授权相关的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。
FileInfo
:允许使用控制文档类型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add 和 Remove 指令等等)、控制文档元数据的指令(Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。
Indexes
:允许使用控制目录索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。
Limit
:允许使用控制主机访问的指令(Allow, Deny, Order)。
Options[=Option,...]
:允许使用控制指定目录功能的指令(Options和XBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令使用哪些选项。
Allow
选项
规定允许访问的来源
语法:
Allow from All|ip地址|域名|其它
示例:
Allow form all # 全部允许访问
Allow from a.com
Allow from .net c.top # 域名方式的限制
Allow from 10.1
Allow from 192.168.1.1 192.168.1.2 # 支持部分IP地址、完整IP地址
# 其它特征控制
SetEnvIf User-Agent ^Mozilla/5\.0 let_me_in
<Directory "/docroot">
Order Deny,Allow
Deny from all
Allow from env=let_me_in
</Directory>
# 只允许代理头为 Mozilla/5.0 的用户访问
Deny
选项
规定拒绝访问的来源
语法:
Deny from All|ip地址|域名|其它
# 完全同Allow一致
Order
选项
控制默认访问状态
语法:
Order Allow,Deny
# 或者
Order Deny,Allow
参数:
Allow,Deny
:先匹配Allow
的规则,再匹配Deny
的规则,都匹配不上的请求默认拒绝。
Deny,Allow
:先匹配Deny
的规则,再匹配Allow
的规则,都匹配不上的请求默认允许。
2.4版本的授权方式
2.4版本的访问控制方式与2.2不同,兼容2.2的授权语句Order、Allow、Deny(不推荐使用此方式授权,未来的版本会不再提供支持)
# 2.2版本 拒绝全部访问
Order Allow,Deny
Deny from All
# 2.4版本
Require all denied
# 2.2版本 允许全部
Order Allow,Deny
Allow from All
# 2.4版本
Require all granted
# 2.4版本常用
Require all granted #允许所有来源访问
Require all denied #拒绝所有来源访问
Require expr expression #允许表达式为true时访问
Require ip 10 172.20 192.168.2 #允许 特定IP段访问,多个段之前用空格隔开。每个段使用开头几项表示
#只允许来自域名splaybow.com的主机访问
Require host splaybow.com
# 来自10.1.1.2的访问将被拒绝
Require not ip 10.1.1.2
# 只允许GET方法访问
Require method GET
# 只允许代理为 Mozilla/5.0 的用户连接
SetEnvIf User-Agent ^Mozilla/5\.0 let_me_in
<Directory "/server/www/htdocs/v1">
Require env let_me_in
</Directory>
# 授权容器(2.4新增)组合多条授权语句
# RequireAll 在此元素中包含的规则,拒绝优先执行
<RequireAll>
Require all granted # 允许所有
Require not ip 192.168.1.1 # 拒绝指定ip下的访问
</RequireAll>
# RequireAny 在此元素中包含的规则,允许优先执行
# 除Require All denied外,不能写其他否定规则(简单来说就是不能写not条件)
<RequireAny>
Require all denied
Require ip 192.168.1.1
</RequireAny>
# 不会用 会了在补上
<RequireNone>
...
<RequireNone>
常规容器主要有文件系统、网络空间、其他,容器支持嵌套
# 文件系统主要有一下几种<Directory>,<DirectoryMatch>,<Files>,<FilesMatch>
<Directory '/a/b'>
# 针对目录/a/b的设置
# 支持使用 Unix shell 风格匹配的通配符字符串
# ?匹配单个字符; * 匹配任意字符序列
# <Directory ~ '/^.*?/'> 可使用 ~ 设置正则(不建议,建议正则使用DirectoryMatch)
<Directory>
<DirectoryMatch "/.*img.*/">
# 针对正则匹配的设置
# 所有路径名中带img的
</DirectoryMatch>
<Files ".htaccess">
# 匹配指定文件
# 支持使用 Unix shell 风格匹配的通配符字符串
# ~ 支持正则(不建议)
</Files>
<FilesMatch "/.*.txt/">
# 正则匹配
# 匹配所有的txt文件
</FilesMatch>
#网络空间
# 匹配常规url
<Location "/images">
</Location>
# 正则匹配url
<LocationMatch regex>
</LocationMatch>
# 代理部分在下面做基础说明
<Proxy>
<ProxyMatch>
# 虚拟主机容器
<VirtualHost>
# 基本虚拟主机配置
<VirtualHost *:80> # xxx:8080
DocumentRoot "/www/vhost1" # 主目录
ServerName www.test.com # IP地址或域名
ServerAlias www.test1.cn #可省略 别名,也可通过别名访问
ServerAdmin stefan321@qq.com #可省略 网站管理员
ErrorLog logs/dev-error.log #可省略 错误日志
CustomLog logs/dev-access.log common #可省略 访问日志
ErrorDocument 404 logs/404.html #可省略 404错误页面
<Directory "/www/vhost1">
Options Indexes FollowSymLinks
AllowOverride All
Order Allow,Deny
Allow from all
RewriteEngine on # rewirte重写规则 也可以使用.htaccess
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</Directory>
</VirtualHost>
代理基本设置
Apache官方文档
使用代理功能需要加载代理模块
基础代理模块 proxy_module
代理模块与协议的对应关系
Protocol | Module |
---|---|
AJP13 (Apache JServe Protocol version 1.3) | mod_proxy_ajp |
CONNECT (for SSL) | mod_proxy_connect |
FastCGI | mod_proxy_fcgi |
ftp | mod_proxy_ftp |
HTTP/0.9, HTTP/1.0, and HTTP/1.1 | mod_proxy_http |
SCGI | mod_proxy_scgi |
WS and WSS (Web-sockets) | mod_proxy_wstunnel |
一些简单的代理示例
注意 结尾的/
一定要同步
# 将到/foo的请求转发到 后面的http 服务
ProxyPass "/foo" "http://foo.example.com/bar"
ProxyPassReverse "/foo" "http://foo.example.com/bar"
# 设置其它参数
ProxyPass "/test" "http://127.0.0.1" connectiontimeout=5 timeout=30
# 通过代理块设置限制
<Proxy "/test">
Require ip 192.168.0
</Proxy>
# 不代理目标子目录
<Location "/mirror/foo/">
ProxyPass "http://backend.example.com/"
</Location>
<Location "/mirror/foo/i">
ProxyPass "!"
</Location>
# 等同如下 不可混用
ProxyPass "/mirror/foo/i" "!"
ProxyPass "/mirror/foo" "http://backend.example.com"
# 反向代理 负载均衡示例
<VirtualHost 192.168.73.129:80> # 虚拟机做负载均衡入口
DocumentRoot "/server/www/htdocs" # 静态资源目录
ServerName 192.168.73.129
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy "balancer://mycluster">
BalancerMember "http://127.0.0.1:8080" route=1
BalancerMember "http://127.0.0.2:8080" route=2
# BalancerMember "http://127.0.0.3:8080"
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass "/index/" "balancer://mycluster/"
ProxyPassReverse "/index/" "balancer://mycluster/"
<Location /bm> # 设置负载均衡查看器
SetHandler balancer-manager
Require all granted
ProxyPass !
</Location>
</VirtualHost>
设置apache支持php文件解析
apahce解析php文件有三种方式module、fastcgi、phpfpm,这里只说明模块化的方式
将php编译为apache的一个模块
# 加载模块
LoadModule php5_module modules/libphp5.so
# 设置方式1
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
# 设置方式2
# 在<IfModule mime_module>中添加如下内容
AddType application/x-httpd-php .php
CGI、FastCgi、php-fpm请参考这篇文章
点我
Apache文件解析可以看这篇文章 点我
一些常用的特殊指令
# Location LocationMatch
ForceType image/gif # 强制设置HTTP Content-Type
# 别名设置
Alias /download/ /root/download/
<Directory "/root/download"> ... </Directory>
# 预留的带cgi执行权限的别名
ScriptAlias /cgi-bin/ /root/cgi/
# 将制定扩展的文件和处理程序绑定
AddHandler xxx .php
# 与下面放的效果相同
<FilesMatch '/*.php$'>
SetHandler xxx
</FilesMatch>
# 允许跨域访问
# 在VirtualHost或Directory中设置
Header set Access-Control-Allow-Origin "http://a.com" # 或者 "*"