apache配置https 支持ssl
1. 安装openssl
apache2.0 建议安装0.9版本,我曾经试过2.0.59 对openssl-1.0编译不过去
下载Openssl:http://www.openssl.org/source/
tar -zxf openssl-0.9.8k.tar.gz //解压安装包
cd openssl-0.9.8k //进入已经解压的安装包
./config //配置安装。推荐使用默认配置
make && make install //编译及安装
openssl默认将被安装到/usr/local/ssl
2. 让apache支持ssl,编译的时候,要指定ssl支持。
静态或者动态
静态方法即 --enable-ssl=static --with-ssl=/usr/local/ssl
动态方法 --enable-ssl=shared --with-ssl=/usr/local/ssl
其中第二种方法会在module/ 目录下生成 mod_ssl.so 模块,而静态不会有,当然第二种方法也需要在httpd.conf 中加入
LoadModule ssl_module modules/mod_ssl.so
3. 1 创建私钥
在创建证书请求之前,您需要首先生成服务器证书私钥文件。
cd /usr/local/ssl/bin //进入openssl安装目录
openssl genrsa -out server.key 2048 //运行openssl命令,生成2048位长的私钥server.key文件。如果您需要对 server.key 添加保护密码,请使用 -des3 扩展命令。Windows环境下不支持加密格式私钥,Linux环境下使用加密格式私钥时,每次重启Apache都需要您输入该私钥密码(例:openssl genrsa -des3 -out server.key 2048)。
cp server.key /usr/local/apache/conf/ssl.key/
3.2 生成证书请求(CSR)文件
openssl req -new -key server.key -out certreq.csr
Country Name: //您所在国家的ISO标准代号,中国为CN
State or Province Name: //您单位所在地省/自治区/直辖市
Locality Name: //您单位所在地的市/县/区
Organization Name: //您单位/机构/企业合法的名称
Organizational Unit Name: //部门名称
Common Name: //通用名,例如:www.itrus.com.cn。此项必须与您访问提供SSL服务的服务器时所应用的域名完全匹配。
Email Address: //您的邮件地址,不必输入,直接回车跳过
"extra"attributes //以下信息不必输入,回车跳过直到命令执行完毕。
3.3 备份私钥并提交证书请求
请将证书请求文件certreq.csr提交给天威诚信,并备份保存证书私钥文件server.key,等待证书的签发。服务器证书密钥对必须配对使用,私钥文件丢失将导致证书不可用。
4.安装证书
4.1 获取服务器证书中级CA证书
为保障服务器证书在客户端的兼容性,服务器证书需要安装两张中级CA证书(不同品牌证书,可能只有一张中级证书)。
从邮件中获取中级CA证书:
将证书签发邮件中的从BEGIN到 END结束的两张中级CA证书内容(包括“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”)粘贴到同一个记事本等文本编辑器中,中间用回车换行分隔。修改文件扩展名,保存为conf/ssl.crt/intermediatebundle.crt文件(如果只有一张中级证书,则只需要保存并安装一张中级证书)。
4.2 获取EV服务器证书
将证书签发邮件中的从BEGIN到 END结束的服务器证书内容(包括“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”) 粘贴到记事本等文本编辑器中,保存为ssl.crt/server.crt文件
4.3 apache的配置 2.0的配置
httpd.conf 中增加
Listen 443
NameVirtualHost *:443
<VirtualHost *:443>
DocumentRoot "/data/web/www"
ServerName aaa.com:443
ErrorLog "logs/error.log"
CustomLog "logs/access.log" combined
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key
SSLCertificateChainFile /usr/local/apache/conf/ssl.crt/intermediatebundle.crt
</IfModule>
</VirtualHost>
----------------------------------------------------------------------------------------------------------------------
Apache配置静态缓存
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif "access plus 1 days"
ExpiresByType image/jpeg "access plus 24 hours"
ExpiresByType image/png "access plus 24 hours"
ExpiresByType text/css "now plus 2 hour"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
ExpiresDefault "now plus 0 min"
</IfModule>
--------------------------------------------------------------------------------------------------------------------------
apache options 参数
指令控制了在特定目录中将使用哪些服务器特性。Options属性有一个非常特别的功能: 如果你没有用“+”或者“-”来增加或者减少一个功能的时候,每个之前定义的Options的所有功能都会被取消, 直到你又为它指定一些功能。所以options属性在整体设置和虚拟主机设置的是不相关的, 互相不起作用,因为他们在特定的范围内被重载了。 如果要在虚拟主机里面使用在整体设置中的Options的设置, 那么就不要在虚拟主机设置中指定Options属性。如果要增加或者减少功能, 那么用“+”或者“-”符号来实 Options 指令控制了在特定目录中将使用哪些服务器特性。 可选项能设置为 None ,在这种情况下,将不启用任何额外特性。或设置为以下选项中的一个或多个:
All 除MultiViews之外的所有特性。这是默认设置。
ExecCGI 允许执行CGI脚本.
FollowSymLinks 服务器会在此目录中使用符号连接。 注意:即便服务器会使用符号连接,但它不会改变用于匹配<Directory>配置段的路径名。 如果此配置位于<Location>配置段中,则此设置会被忽略。
Includes 允许服务器端包含。
IncludesNOEXEC 允许服务器端包含,但禁用#exec命令和#exec CGI。但仍可以从ScriptAliase目录使用#include 虚拟CGI脚本。
Indexes 如果一个映射到目录的URL被请求,而此目录中又没有DirectoryIndex(例如:index.html),那么服务器会返回一个格式化后的目录 列表。
MultiViews 允许内容协商的多重视图。
SymLinksIfOwnerMatch 服务器仅在符号连接与其目的目录或文件拥有者具有同样的用户id时才使用它。 注意:如果此配置出现在<Location>配置段中,此选项将被忽略。 一般来说,如果一个目录被多次设置了 Options ,则最特殊的一个会被完全接受,而各个可选项的设定彼此并不融合。然而,如果所有施用于 Options 指令的可选项前都加有+或-符号,此可选项将被合并。所有前面加有+号的可选项将强制覆盖当前可选项设置,而所有前面有-号的可选项将强制从当前可选项设置中去除。
比如说,没有任何+和-符号:
01.<Directory /web/docs>
02. Options Indexes FollowSymLinks
03. </Directory>
04.
05.<Directory /web/docs/spec>
06. Options Includes
07.</Directory>
复制代码则只有 Includes 设置到/web/docs/spec目录上。
然而如果第二个 Options 指令使用了+和-符号:
01.<Directory /web/docs>
02. Options Indexes FollowSymLinks
03. </Directory>
04.
05.<Directory /web/docs/spec>
06. Options +Includes -Indexes
07.</Directory>
复制代码那么就会有 FollowSymLinks 和 Includes 设置到/web/docs/spec目录上。
-------------------------------------------------------------------------------------------------
针对apache的虚拟主机开启php短标签
在对应的 虚拟主机 配置文件中加入
<VirtualHost *>
......
......
......
php_admin_flag short_open_tag on
</VirtualHost>
--------------------------------------------------------------
apache开启压缩功能
首先,需要看一下我们的apache是否支持压缩功能。
/usr/local/apache2/bin/apachectl -l
看看是否有mod_deflate
如果这里没有,那继续看一下
ls /usr/local/apache2/modules/
下面有没有 mod_deflate.so 这个文件
如果这里也没有,那说明你的apache不支持压缩,需要重编译一下,或者扩展形式安装,或者重新编译apache, 需要在编译的时候,加上 --enable-deflate=shared
好,如果你的apache有了deflate这个模块支持,也就支持了压缩功能。
下面该配置httpd.conf 了。
在httpd.conf 中增加 :
LoadModule deflate_module modules/mod_deflate.so
然后再增加如下配置:
<IfModule mod_deflate.c>
DeflateCompressionLevel 5
AddOutputFilterByType DEFLATE text/html text/plain text/xml
AddOutputFilter DEFLATE js css
</IfModule>
其中DeflateCompressionLevel 是指压缩程度的等级,从1到9,9是最高等级。
----------------------------------------------------------------------------------------------------------
apache几种限制IP的方法
1. 禁止访问某些文件/目录
增加Files选项来控制,比如要不允许访问 .inc 扩展名的文件,保护php类库:
<Files ~ "\.insc$">
2. 禁止访问某些指定的目录:(可以用 <DirectoryMatch> 来进行正则匹配)
<Directory ~ "/var/www/(.+)*[0-9]{3}">
当然也可以写目录全局路径
<Directory /var/www/111>
3. 通过文件匹配来进行禁止,比如禁止所有针对图片的访问:
<Filesmatch (.*)php>
4. 针对URL相对路径的禁止访问
<Location /dir/>
--------------------------------------------------------------------------------------------
apachef2.4访问控制
1.所有请求被拒绝
Require all denied #拒绝所有
2.所有请求被允许
Require all granted #允许所有
除^/aaa/.* 外拒绝所有
Require host ^/aaa/.*
apache Require 指令
Require all granted #允许所有
Require all denied #拒绝所有
Require env env-var [env-var] ... #允许,匹配环境变量中任意一个
Require method http-method [http-method] ... #允许,特定的HTTP方法
Require expr expression #允许,表达式为true
Require user userid [ userid ] ... #允许,特定用户
Require group group-name [group-name] ... #允许,特定用户组
Require valid-user # #允许,有效用户
Require ip 10 172.20 192.168.2 #允许 特定IP
-----------------------------------------------------------------------------
Apache不记录指定日志类型
SetEnvIf Request_URI ".*\.gif$" image-requet
SetEnvIf Request_URI ".*\.jpg$" image-requet
SetEnvIf Request_URI ".*\.png$" image-requet
SetEnvIf Request_URI ".*\.bmp$" image-requet
SetEnvIf Request_URI ".*\.swf$" image-requet
SetEnvIf Request_URI ".*\.js$" image-requet
SetEnvIf Request_URI ".*\.css$" image-requet
apache只记录指定URI的日志
我的需求是,把类似请求 www.aaa.com/aaa/... 这样的请求才记录日志。
在httpd.conf 或者 相关的虚拟主机配置文件中添加
SetEnvIf Request_URI "^/aaa/.*" aaa-request
CustomLog "|/usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/aaa-access_%Y%m%d.log 86400" combined env=aaa-request
apache记录代理IP和真实客户端IP
默认情况下log日志格式为:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
其中%h 是记录访问者的IP,如果在web的前端有一层代理,那么这个%h其实就是代理机器的IP,这不是我们想要的。在这种情况下,
%{X-FORWARDED-FOR}i 字段会记录客户端真实的IP。所以log日志改为:
LogFormat "%h %{X-FORWARDED-FOR}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
------------------------------------------------------------------------------------------------------------------------------------------------
Apache日志切割
访问日志时间长了会很大,所以要进行切割,每天或者每周切割一次,并以当前的日期命名
在对应的虚拟主机中加入:
Errorlog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-error_%Y%m%d.log 86400"
CustomLog "/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-access_%Y$m$d.log 86400" combined
Errorlog是错误日志,Customlog是访问日志,-l的一是是校准时间为UTC
---------------------------------------------------------------------------------------------------
方法一: 使用 cronolog 为每一天建立一个新的日志
CustomLog "|bin/cronolog logs/access_%Y%m%d.log" combined
也可以按小时
CustomLog "|bin/cronolog logs/access_%Y%m%d%h.log" combined
方法二:使用 rotatelogs 每一天记录一个日志
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
每小时
CustomLog "|bin/rotatelogs -l logs/access_%Y%m%d%H.log 3600" combined
再看apache rotatelogs语法
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]
选项
-l
使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。所以一定要加上-l 否则出现的日志时间和实际时间是相差8小时的。
logfile
它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime
日志文件滚动的以秒为单位的间隔时间。
offset
相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。
filesizeM
指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。
--------------------------------------------------------------------------------------------------------------------------------------
apache扩展模块安装
使用扩展工具 apxs
先确认是否已经加载 mod_so模块:
/usr/local/apache2/bin/httpd -l
加载模块:
/usr/local/apache2/bin/apxs -i -a -c /usr/local/src/httpd-2.0.59/modules/generators/mod_*
--------------------------------------------------------------------------------------------------------------------------------
Apache用户认证
后台有些东西不能给游客看到,要进行用户认证
#vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
在应的虚拟主机下面添加
<Directory /data/www/admin.php>
AllowOverride AuthConfig
AuthName "djfdjnfdnfdf"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</Directory>
首先制定或对哪个目录进行验证,AuthName自定义,AuthUserFile指定密码在哪里
#/usr/local/apache2/bin/htpasswd -cm /data/.httpasswd aming
创建进行验证的用户,回车输入密码
重启阿帕奇服务
#/usr/local/apache2/bin/apachectl graceful
重新加载
---------------------------------------------------------------------------------
php.ini配置详解
/usr/local/php/bin/php -i |head 查看php.ini文件位置
vim /usr/local/php/etc/php.ini
禁止的函数:
disable_functions=
eval,assert,popen,passthru,escapesshellarg,escapeshellcmd,passthru,exec,
错误日志
error_log
displey_error=on 错误会显示在页面上
log_errors=on 打开错误日志
error_log=/usr/local/php/logs/error.log 错误日志路径
先创建该文件 然后修改权限
error_reporting=E_ALL & ~E_NOTICE
配置open_basedir
只允许用户访问需要的网站代码
open_basedir=/data/www/:dir
多个网站可以在apache里设置
php_admin_value open_basedir "data/www/"
每一个虚拟主机设置一个
----------------------------------------------------------------------------
Apache配置防盗链
SetEnvIfNoCase Referer "^http://.*\.apelearn\.com" local_ref
SetEnvIfNoCase Referer ".*\.aminglinux\.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
---------------------------------------------------------------------------------------
Apache禁止解析php,禁止指定user_agent
禁止这个目录下面的访问解析PHP,并禁止下载PHP
<Directory /data/www/data/>
php_admin_flag engine off
<filesmatch "(.*)php">
Order deny,allow
Deny from all
</fiesmatch>
</Directory
禁止指定uerl_agent
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^*Firefox/4.0* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^*Tomato Bot/1.0* [NC]
RewriteRule .* -[F]
</IfModule>
-----------------------------------------------------------------------------------------------
Apache通过rewrite限制某个目录
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^.*/tmp/* [NC]
RewriteRule .* -[F]
</IfModule>
-------------------------------------------------------------------------------------------------
Apache访问控制
Allow允许 deny拒绝
对某个目录做限制:
<Directoy /data/www/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directoy>
要先看Order后面的哪个在前 哪个在后
针对请求的uri做限制:
<filesmatch "(.*)admin(.*)">
order deny,allow
Deny from all
Allow from 127.0.0.1
</filesmatch>
-------------------------------------------------------------------------------------
默认虚拟主机,域名301跳转
把第一个虚拟主机的配置清除,禁止解析php
-----------------------------------------------------------------------------------------------
一个站点有多个域名,把所有域名跳转到一个域名上 叫域名301跳转
#vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
在对应的虚拟主机里加入
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.aaa.com$
RewriteRule ^/(.*)$ http://www.123.com/forum.php/$1 [R=301,L]
</IfModule>
第一个是副域名,第二个是主域名 要是有两个副域名,要在第一个后面加上[OR]
重启阿帕奇