LAMP优化

apache配置https 支持ssljavascript

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]
 
重启阿帕奇
相关文章
相关标签/搜索