apache2日常笔记

2016-10-21

.htaccess

反向代理

依赖模块:

LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteRule ^(.*)$ http://malu.me/$1 [P]
</IfModule>

给特定文件后缀添加header头

<FilesMatch ".json" >
	Header set Access-Control-Allow-Origin: "*"
</FilesMatch>

禁止用户访问特定文件

<Files config.json>
	order allow,deny
	deny from all 
</Files>

禁止访问特定后缀-正则匹配

<FilesMatch "\.(sql|py|db|sh)$">
	order allow,deny
	deny from all
</FilesMatch>

静态项目重写

<IfModule mod_rewrite.c>
	RewriteEngine on
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^(.*)$ /index.html [L]
</IfModule>

动态项目重写

<IfModule mod_rewrite.c>
	RewriteEngine on
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

设置.htaccess后出现页面500错误

查看apache2的错误日志出现:.htaccess: order not allowed here

解决办法:

在apache的配置文件中修改AllowOverride的属性为all:

AllowOverride All

表示允许用户自定义.htaccess文件。

升级apache2

系统环境:Ubuntu 14.04、apache2

apache 2.4.9以后php-fpm协同apache一起工作所需要的配置没有以前那么复杂了,所以有必要升级一下。

查看apache版本

apachectl -v

1.添加并更新源

LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/apache2
apt-get update

注意,命令前加了 LC_ALL=en_US.UTF-8,为了防止添加期间编码报错问题!

如果还是出现编码问题则:

locale-gen en_US en_US.UTF-8
dpkg-reconfigure locales
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

注:

locale    # 查看当前编码环境

locale -a  # 查看所有支持的语言环境

如果add-apt-repository在您的VPS中不可用,请安装它。

apt-get install software-properties-common

或者,在较旧的Ubuntu版本上:

apt-get install python-software-properties

2.安装

安装前您可以通过以下方式查看存储库中的可用版本:

$ apt-cache policy apache2
apache2:
  Installed: 2.4.7-1ubuntu4.18
  Candidate: 2.4.33-1+ubuntu14.04.1+deb.sury.org+1
  Version table:
     2.4.33-1+ubuntu14.04.1+deb.sury.org+1 0
        500 http://ppa.launchpad.net/ondrej/apache2/ubuntu/ trusty/main amd64 Packages
 *** 2.4.7-1ubuntu4.18 0
        500 http://mirrors.aliyun.com/ubuntu/ trusty-updates/main amd64 Packages
        500 http://mirrors.aliyun.com/ubuntu/ trusty-security/main amd64 Packages
        100 /var/lib/dpkg/status
     2.4.7-1ubuntu4 0
        500 http://mirrors.aliyun.com/ubuntu/ trusty/main amd64 Packages

开始安装吧:

apt install apache2

系统会自动更新至最新版本 2.4.33

安装模块

安装mod_qos模块

apt-get install libapache2-mod-qos

安装模块后, 它将自动注册并启用自身。

配置文件路径:

/etc/apache2/mods-enabled/qos.conf

重启apache2

service apache2 restart

重新加载apache2的配置文件

apachectl graceful

使用a2enmod开启模块:

a2enmod qos

缓慢的http拒绝服务攻击处理

使用mod_reqtimeout和mod_qos两个模块相互配合来防护。

1、mod_reqtimeout用于控制每个连接上请求发送的速率。配置例如:

#请求头部分,设置超时时间初始为10秒,并在收到客户端发送的数据后,每接收到500字节数据就将超时时间延长1秒,但最长不超过40秒。可以防护slowloris型的慢速攻击。

RequestReadTimeout header=10-40,minrate=500

#请求正文部分,设置超时时间初始为10秒,并在收到客户端发送的数据后,每接收到500字节数据就将超时时间延长1秒,但最长不超过40秒。可以防护slow message body型的慢速攻击。

RequestReadTimeout body=10-40,minrate=500

需注意,对于HTTPS站点,需要把初始超时时间上调,比如调整到20秒。

2、mod_qos用于控制并发连接数。配置例如:

当服务器并发连接数超过600时,关闭keepalive

QS_SrvMaxConnClose 600

限制每个源IP最大并发连接数为50

QS_SrvMaxConnPerIP 50

这两个数值可以根据服务器的性能调整。

配置缓存

1.进入apache模块目录:

cd /etc/apache2/mods-enabled

2.给expires、headers两个模块建立软链:

ln -s ../mods-available/expires.load
ln -s ../mods-available/headers.load

3.建立配置文件、以及软链:

ln -s ../mods-available/expires.conf
ln -s ../mods-available/headers.conf

或者使用a2enmod开启模块:

a2enmod expires
a2enmod headers

4.编辑配置文件:

cat ../mods-available/expires.conf

<IfModule mod_expires.c>
ExpiresActive On  
ExpiresByType text/html "now plus 1 day"  
ExpiresByType text/css "now plus 1 month"  
ExpiresByType application/x-javascript "now plus 5 day"  
ExpiresByType image/jpeg "access plus 1 month"  
ExpiresByType image/gif "access plus 1 month"  
ExpiresByType image/bmp "access plus 1 month"  
ExpiresByType image/x-icon "access plus 1 month"  
ExpiresByType image/png "access plus 1 month"  
ExpiresByType application/x-shockwave-flash "access plus 1 month"  
</IfModule>

cat ../mods-available/headers.conf

<IFModule mod_headers.c>
Header add Pragma "cache"
</IFModule>

5.重启apache2:

/etc/init.d/apache2 restart

内存优化

利用mpm_prefork模块调整内存占用:

apt-get install apache2-mpm-prefork

比如需要对低内存设备优化:

1.修改:/etc/apache2/mods-enabled/mpm_prefork.conf

<IfModule mpm_prefork_module>
       StartServers              1
       MinSpareServers           1
       MaxSpareServers           10
       MaxRequestWorkers         150
       MaxConnectionsPerChild    2
</IfModule>

StartServers 启动时建立的子进程数量

MinSpareservers和MaxSpareServers分别设置空闲子进程的最小和最大数量

MaxConnectionsPerChild 子进程最大连接数 (超过了释放内存)

2.修改:/etc/apache2/apache2.conf

KeepAlive off

KeepAlive 配置的含义:

对于HTTP/1.1的客户端来说,将会尽量的保持客户的HTTP连接,通过一个连接传送多份HTTP请求响应。

这样对于客户端来说,可以提高50%左右的响应时间,而于服务器端来说则降低了更多个连接的开销。

不过这个依赖于客户端是否想保持连接。IE默认是保持连接的,当你打开100个图片的网站时,IE有可能只打开2个连接,通过这两个连接传送数据,而不是开100个连接。

在 Apache 服务器中,KeepAlive 是一个布尔值,On 代表打开,Off 代表关闭,这个指令在其他众多的 HTTPD 服务器中都是存在的。

KeepAliveTimeout 为持久连接保持的时间,也就是说,在这此连接结束后开始计时,多长时间内没有重新发送HTTP请求,就断掉连接。默认设置为5秒,这个值可以大点,但不能太大,否则会出现同时等候过多连接,导致多的内存被占用。

解决403错误

一般是权限不够导致,尝试在<Directory /**>目录下添加

Require all granted