Apache是使用最广泛的Web服务器应用程序。之前都是照着网上的命令配置,没有真正去理解一下配置的缘由,这次就好好学习一下啦。
ubuntu
安装
1 |
apt install apache2 |
目录文件
1 |
ye1s@ye1s:/etc/apache2$ ls |
文件/目录 | 功能 |
---|---|
apache2.conf | Apache在启动时会自动读取这个文件的配置信息而其他的一些配置文件,通过Include指令包含一些文件。在apache2.conf中可以找到这些Include行:例IncludeOptional mods-enabled/*.load |
ports.conf | Apache使用的端口,必须在这里开启端口的监听,不然只在virtualhosts里设置的端口不起作用 |
sites-enabled/ | apache2.conf中引用了这里面的虚拟主机配置,通过ls -l可以发现,这里得到文件都是链接向../sites-available/的,而apache2.conf只引用sites-enabled/而不引用/sites-available/,所以我们在/sites-available/里面配置好虚拟主机配置后,还要连接到sites-enabled/目录 |
sites-available/ | 虚拟主机的配置目录,但是不会被引用,需要链接到../site-enabled |
mods-enabled/ | 存放apache功能模块,与sites-enabled类似,是链接目录,而且被apache2.conf引用 |
mods-available/ | 存放apache功能模块,与sites-available类似,是真实配置,不被引用,需要连接 |
envvars | 存放相关变量 |
网站配置
配置流程
新建虚拟主机/网站
1 |
root@VM-10-194-ubuntu:/# cd /etc/apache2/sites-available |
虚拟主机/网站配置规则
语法
1 |
<VirtualHost 地址[:端口号] [地址[:端口号]] > |
端口号需要在ports.conf里添加监听 一个端口号只能被一个VirtualHost监听
建立连接
1 |
ln -s /etc/apache2/sites-available/test-site.conf /etc/apache2/sites-enabled/test.site.conf |
将网站根目录
1 |
chown -R www-data:www-data /var/www/html/xxx |
重启Apache
1 |
/etc/init.d/apache2 restart |
配置实例
虚拟主机
1 |
ServerName 主机名/域名 |
需有多个ip
1 |
<VirtualHost IP1:80> |
1 |
<VirtualHost *:80> |
需要开启端口监听配置
1 |
Listen 80 |
网站配置
1 |
<VirtualHost IP:80> |
反向代理
启用代理模块
1 |
a2enmod proxy proxy_balancer proxy_http |
修改配置
1 |
vi /etc/apache2/sites-available/000-default.conf |
在最前面添加
1 |
<VirtualHost *:80> |
重启生效
1 |
/etc/init.d/apache2 restart |
centos
安装
1 |
yum install httpd |
启动
1 |
service httpd start |
配置文件
1 |
[ye1s@localhost httpd]$ ls |
Apache配置片段
配置片段容器的类型
<IfDefine>,<IfModule>和<IfVersion>
容器仅在服务器启动和重新启动时进行评估。
<IfDefine>
指令包含只有在httpd命令行中定义了适当参数时才会应用的指令。
1 |
#使用httpd -DClosedForNow启动服务器时,所有请求才会重定向到另一个站点 |
<IfModule>
指令与上面<IfDefine>
指令也非常相似,除了它包含只有在服务器中有特定模块可用时才会应用的指令.
1 |
#仅当mod_mime_magic可用时才会应用MimeMagicFile指令。 |
<IfVersion>
指令包含的指令只会在特定版本的服务器执行时才会应用。
1 |
<IfVersion >= 2.4> |
<IfDefine>,<IfModule>和<IfVersion>
可以通过在测试前加上!符号来应用否定条件
文件系统和网站空间
文件系统是操作系统可以看到的磁盘视图。网站空间是由Web服务器提供并由客户端查看的站点视图。
包含在<Directory>
部分中的指令适用于指定的文件系统目录和该目录的所有子目录(以及这些目录中的文件)
1 |
#以下配置中,将为/var/web/dir1目录和所有子目录启用目录索引。 |
包含在<Files>
部分中的指令适用于具有指定名称的任何文件,无论它位于何种目录中。
1 |
#以下配置指令在放置在配置文件的主部分时将拒绝访问任何文件。文件名为private.html,无论它在哪里找到。 |
可以组合<Files>和<Directory>
片段
1 |
#拒绝访问/var/www/dir1/ 目录下的所有private.html文件 |
<Location>
指令及其正则表达式对应方更改了Webspace中内容的配置
1 |
#以下配置可防止访问以/private开头的任何URL路径 |
<Location>
指令不需要与文件系统有任何关系
1 |
#将特定URL映射到mod_status提供的内部Apache HTTP Server处理程序 |
为了有两个重叠的URL,必须考虑评估某些部分或指令的顺序。对于<Location>
将是:
1 |
<Location "/foo"> |
另一方面,<Alias>
映射反之亦然:
1 |
Alias "/foo/bar" "/srv/www/uncommon/bar" |
ProxyPass指令也是如此:
1 |
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10 |
<Directory>,<Files>和<Location>
指令都可以使用shell样式的通配符,如C标准库中的fnmatch。
*
匹配任何字符序列?
匹配任何单个字符[seq]
匹配seq中的任何字符/
字符不会被任何通配符匹配
1 |
#可以一次拒绝访问多种类型的图像文件 |
<If>
指令根据可由布尔表达式表示的条件更改配置。
1 |
#如果HTTP Referer标头不以http://www.example.com/开头,则以下配置拒绝访问。 |
1 |
# 只允许客户使用代理服务器访问www.example.com网站的一个子集 |
配置文件httpd.conf
基本配置
1 |
ServerRoot "/mnt/software/apache2" #你的apache软件安装的位置。其它指定的目录如果没有指定绝对路径,则目录是相对于该目录。 |
对主站点的目录进行访问控制:
1 |
<Directory "/mnt/web/clusting"> |
参数详解:
-
Options:配置在特定目录使用哪些特性,常用的值和基本含义如下:
- ExecCGI: 在该目录下允许执行CGI脚本。
- FollowSymLinks: 在该目录下允许文件系统使用符号连接。
- Indexes: 当用户访问该目录时,如果用户找不到DirectoryIndex指定的主页文件(例如index.html),则返回该目录下的文件列表给用户。
- SymLinksIfOwnerMatch: 当使用符号连接时,只有当符号连接的文件拥有者与实际文件的拥有者相同时才可以访问。
-
AllowOverride:允许存在于.htaccess文件中的指令类型(.htaccess文件名是可以改变的,其文件名由AccessFileName指令决定)
- None: 当AllowOverride被设置为None时。不搜索该目录下的.htaccess文件(可以减小服务器开销)。
- All: 在.htaccess文件中可以使用所有的指令。
-
Order:控制在访问时Allow和Deny两个访问规则哪个优先:
- Allow:允许访问的主机列表(可用域名或子网,例如:Allow from 192.168.0.0/16)。
- Deny:拒绝访问的主机列表。
-
DirectoryIndex index.html index.htm index.php #主页文件的设置
服务器的优化 (MPM: Multi-Processing Modules)
apache2主要的优势就是对多处理器的支持更好,在编译时同过使用--with-mpm
选项来决定apache2的工作模式。
-
prefork:如果httpd -l列出prefork.c,则需要对下面的段进行配置。
1
2
3
4
5
6
7<IfModule prefork.c>
StartServers 5 #启动apache时启动的httpd进程个数。
MinSpareServers 5 #服务器保持的最小空闲进程数。
MaxSpareServers 10 #服务器保持的最大空闲进程数。
MaxClients 150 #最大并发连接数。
MaxRequestsPerChild 1000 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。
</IfModule>在该工作模式下,服务器启动后起动5个httpd进程(加父进程共6个,通过ps -ax|grep httpd命令可以看到)。当有用户连接时,apache会使用一个空闲进程为该连接服务,同时父进程会fork一个子进程。直到内存中的空闲进程达到MaxSpareServers。该模式是为了兼容一些旧版本的程序。我缺省编译时的选项。
-
worker:如果httpd -l列出worker.c,则需要对下面的段进行配置:
1
2
3
4
5
6
7
8<IfModule worker.c>
StartServers 2 #启动apache时启动的httpd进程个数。
MaxClients 150 #最大并发连接数。
MinSpareThreads 25 #服务器保持的最小空闲线程数。
MaxSpareThreads 75 #服务器保持的最大空闲线程数。
ThreadsPerChild 25 #每个子进程的产生的线程数。
MaxRequestsPerChild 0 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。
</IfModule>该模式是由线程来监听客户的连接。当有新客户连接时,由其中的一个空闲线程接受连接。服务器在启动时启动两个进程,每个进程产生的线程数是固定的(ThreadsPerChild决定),因此启动时有50个线程。当50个线程不够用时,服务器自动fork一个进程,再产生25个线程。
-
perchild:如果httpd -l列出perchild.c,则需要对下面的段进行配置:
1
2
3
4
5
6
7
8<IfModule perchild.c>
NumServers 5 #服务器启动时启动的子进程数
StartThreads 5 #每个子进程启动时启动的线程数
MinSpareThreads 5 #内存中的最小空闲线程数
MaxSpareThreads 10 #最大空闲线程数
MaxThreadsPerChild 2000 #每个线程最多被请求多少次后退出。0不受限制。
MaxRequestsPerChild 10000 #每个子进程服务多少次后被重新fork。0表示不受限制。
</IfModule>该模式下,子进程的数量是固定的,线程数不受限制。当客户端连接到服务器时,又空闲的线程提供服务。 如果空闲线程数不够,子进程自动产生线程来为新的连接服务。该模式用于多站点服务器。
如果知道当前的apache2使用什么工作机制,可以通过httpd -l
命令列出apache的所有模块,就可以知道其工作方式
HTTP返头回信息配置
- ServerTokens Prod #该参数设置http头部返回的apache版本信息,可用的值和含义如下:
1
2
3
4
5
6Prod:仅软件名称,例如: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 Off #在页面产生错误时是否出现服务器版本信息。推荐设置为Off
持久性连接设置
1 |
KeepAlive On #开启持久性连接功能。即当客户端连接到服务器,下载完数据后仍然保持连接状态。 |
别名设置
对于不在DocumentRoot指定的目录内的页面,既可以使用符号连接,也可以使用别名。别名的设置如下:
1 |
Alias /download/ "/var/www/download/" #访问时可以输入:http://www.custing.com/download/ |
CGI设置
1 |
# 访问时可以:http://www.clusting.com/cgi-bin/,但是该目录下的CGI脚本文件要加可执行权限 |
日志的设置
(1) 错误日志的设置
1 |
ErrorLog logs/error_log #日志的保存位置 |
(2) 访问日志设置
日志的缺省格式有如下几种:
1 |
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined |
格式中的各个参数如下:
1 |
%h --客户端的ip地址或主机名 |
.htaccess文件
.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
可以在服务器配置文件中按以下方法配置:
1 |
AccessFileName .config #将.htaccess修改为.config |
下面两个配置是等同的
.htaccess文件在目录/www/htdocs/example之中:
1 |
AddType text/example ".exm" |
httpd.conf文件中的内容:
1 |
<Directory "/www/htdocs/example"> |
在.htaccess文件中找到的配置指令将应用于找到.htaccess文件的目录。
特定目录中的.htaccess文件可能会覆盖在目录树中较高位置的.htaccess文件中找到的指令。
例如:/www/htdocs/example1/example2下的.htaccess覆盖了/www/htdocs/example1/下的.htaccess 。
参考文章:
Apache HTTP 服务器 2.4 文档
Apache学习
Apache配置实例
Apache 反向代理
Apache教程
Apache配置文件httpd.conf详解
FROM :blog.cfyqy.com | Author:cfyqy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论