小Q:人生的意志和劳动将创造奇迹般的奇迹。 ―― 涅克拉索夫
apache设置自定义header-----------------------------------------
1. 在设置自定义header前,需要先检测一下你的httpd是否加载了mod_headers
/usr/local/apache2/bin/apachectl -l
否则需要重新编译一下了
2. 在httpd.conf 中加入
<IFModule mod_headers.c>
Header add MyHeader "Hello"
</IFModule>
保存重启;双引号中的内容为自定义内容
3. 测试
curl -I http://localhost 看是否显示有 MyHeader "Hello"
Apache设置禁止访问.txt文件---------------------------------------
Options -Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Deny from all
访问总是指向第一个虚拟主机--------------------------------------
在配置apache多个虚拟主机的时候,访问总是指向第一个虚拟主机,
加上 NameVirtualHost * 后解决问题.
NameVirtualHost *
<VirtualHost *>
DocumentRoot "F:/web/"
ServerName localhost
</VirtualHost>
日志中记录代理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的扩展模块安装 -------------------------------------------
这个用到了apache的扩展工具 apxs ;请先确认是否已经加载了 mod_so 模块,方法是:
/usr/local/apache2/bin/httpd -l
下面,如何编译安装扩展模块 mod_status.so 这个模块
/usr/local/apache2/bin/apxs -i -a -c mod_status.c
请注意,这里的mod_status.c 的路径一定要写对了,不然会报错,一般情况下,这个C文件在你的源码包下,比如:
/usr/local/src/httpd-2.0.59/modules/generators/mod_status.c
编译的结果类似这样:
/usr/local/services/apache-2.0.59/build/libtool --silent --mode=compile gcc -prefer-pic -DAP_HAVE_DESIGNATED_INITIALIZER -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/services/apache-2.0.59/include -I/usr/local/services/apache-2.0.59/include -I/usr/local/services/apache-2.0.59/include -c -o /root/httpd-2.0.64/modules/generators/mod_status.lo /root/httpd-2.0.64/modules/generators/mod_status.c && touch /root/httpd-2.0.64/modules/generators/mod_status.slo /usr/local/services/apache-2.0.59/build/libtool --silent --mode=link gcc -o /root/httpd-2.0.64/modules/generators/mod_status.la -rpath /usr/local/services/apache-2.0.59/modules -module -avoid-version /root/httpd-2.0.64/modules/generators/mod_status.lo /usr/local/services/apache-2.0.59/build/instdso.sh SH_LIBTOOL='/usr/local/services/apache-2.0.59/build/libtool' /root/httpd-2.0.64/modules/generators/mod_status.la /usr/local/services/apache-2.0.59/modules /usr/local/services/apache-2.0.59/build/libtool --mode=install cp /root/httpd-2.0.64/modules/generators/mod_status.la /usr/local/services/apache-2.0.59/modules/ PATH="$PATH:/sbin" ldconfig -n /usr/local/services/apache-2.0.59/modules ---------------------------------------------------------- Libraries have been installed in: /usr/local/services/apache-2.0.59/modules
完成后,请看提示 Libraries have been installed in: 模块就会安装到这里了。
通过http上传大文件超时的问题-------------------------------------
架构是 LAMP , 上传文件的操作,并没有连接mysql,但是却使用了php资源,所以修改设置,不仅要设置apache还要设置php.ini
1. apache httpd.conf 的设置
Timeout 600 这个可以设置成 3600, 单位是s
2. php.ini 相关的参数
file_uploads = on ; #默认为开 upload_max_filesize = 1024M ; #上传最大值 post_max_size = 1024M ; #通过表单POST给PHP的所能接收的最大值 如果还不行,那就修改以下几个参数吧。 max_execution_time = 0 ; #每个php脚本的最大执行时间,单位是秒。0表示不限制 max_input_time = 600000 ; #传送请求数据的最大时间,秒。改的大大的… memory_limit = 500M ; #一个脚本占用内存的上限。这个不建议太大。万一有攻击,你的机器就崩溃了。建议最高256M。
mod_proxy 扩展模块安装-----------------------------------------
首先在编译的时候加上参数--enable-proxy --enable-proxy-http;
如果没有编译进这个模块去?怎么办呢,可以通过扩展的方式编译一下。
下载相同版本的apache源代码,注意,一定是要相同版本的,否则编译不能成功。
下载后,解压
cd httpd-2.0.59/modules/proxy
/usr/local/apache2/bin/apxs -c -i -a mod_proxy.c proxy_connect.c proxy_http.c proxy_util.c
从输出里面看到apache的modules目录下已经产生了mod_proxy.so,且已经在httpd.conf中激活了
cd /usr/local/apache2/conf/
ls ../modules/ 看到确实有mod_prxoy.so
编辑配置文件
vi httpd.conf
修改如下
加载模块
LoadModule proxy_module modules/mod_proxy.so (这句是编译激活时产生的)
LoadModule proxy_http_module modules/mod_proxy.so (这句是要手动添加的)
更改配置文件
<VirtualHost *:80> ServerName www.test.com CustomLog "/dev/null" combined ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://www.test.com/ ProxyPassReverse / 192.168.13.111/ </VirtualHost>
另外需要注意的是,需要在/etc/hosts 中加一条记录
192.168.13.111 www.test.com
====================================练习题==========================================
1. 为什么下载源码包需要到官网上去下载?
简单说就是为了安全,如果是非官方下载的源码包,有可能被别有用心的人动过手脚,毕竟是源码的,任何人都可以修改代码。
2. 64位机器是否可以安装32位rpm包?64位机器是否可以安装32位的mysql二进制免编译包?
64位机器是可以安装32位rpm包的,同样的64位机器也能安装32位的mysql二进制免编译包(centos5.x的确是支持,但是centos6.x不支持)。
3. 编译安装apache时, 如果不加--with-included-apr 会有什么问题?
会报错,Cannot use an external APR with the bundled APR-util,因为apr是一个底层的接口库,编译apache必须要有这个支持。
4. 编译php时,必须加上 --with-apxs2=/usr/local/apache2/bin/apxs 这是什么意思呢?
apxs是apache编译动态模块并自动配置加载到httpd.conf文件的一个工具,由于php也是作为apache的一个动态加载模块,我们编译php的目的就是为了生成这个模块,所以必须要指定apxs的地址。
5. 当配置好apache的配置文件后,如何检验配置文件是否正确?
/usr/local/apache2/bin/apachectl -t
6. 如何查看80端口是否启动?
netstat -lnp |grep ':80'
7. 更改apache配置文件httpd.conf后,如何重新加载配置文件?
/usr/local/apache2/bin/apachectl graceful
8. 如何查看apache加载了哪些模块?
/usr/local/apache2/bin/apachectl -M
9. 怎么查看php加载了哪些模块?
/usr/local/php/bin/php -m
10. 简单描述静态加载和动态共享模块的区别。
不管编译httpd还是php,都会有一个静态模块和动态模块的概念。首先,动态和静态模块宏观上分析,静态会直接编译进httpd这个可执行文件内,而动态的模块是单独的一个文件;其次,静态模块是和httpd这个文件一同加载的,只要服务一开启就会加载所有的静态模块,而动态模块是根据需求什么时候用什么时候加载。
11. 当我们配置好lamp环境后,访问php程序无法解析,你如何去排查这个问题呢?
(1) apachectl -M 看是否加载了libphp5.so
(2) 如果没有加载,那查看/usr/local/apache2/modules/是否有libphp5.so,然后查看httpd.conf 中是否有LoadModule libphp5.so
(3) 再看httpd.conf中是否有 AddType application/x-httpd-php .php
(4) apache一定要重启服务
12. 如何配置apache的虚拟主机
vim httpd.conf
#Include conf/extra/httpd-vhosts.conf
把该行最前面的#去掉,然后修改:
<Directory /> Options FollowSymLinks AllowOverride None Order deny,allow Deny from all </Directory> 改为 <Directory /> Options FollowSymLinks AllowOverride None Order deny,allow Allow from all </Directory>
再 vim conf/extra/httpd-vhosts.conf 根据实际需求修改
13. 如何配置apache的用户验证
vi httpd.conf
在相应的虚拟主机配置文件段,加入
<Directory *> AllowOverride AuthConfig AuthName "自定义的" AuthType Basic AuthUserFile /data/.htpasswd // 这个目录你可以随便写一个,没有限制 require valid-user </Directory>
保存后,然后创建apache的验证用户 htpasswd -c /data/.htpasswd test
14. 如何配置apache的日志以及日志按天切割
在httpd.conf 在相应的虚拟主机配置段,加入
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/www.yourdomain.com-access_%Y%m%d.log 86400" combined
注意,需要写成绝对路径,写成相对的路径可能不生效
15. 如何配置apache的图片等静态文件的过期时间
httpd.conf 中加入
<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/x-shockwave-flash "now plus 2 hours" ExpiresDefault "now plus 0 min" </IfModule>
16. 如何限定某个目录下的php文件没有执行权限
vim httpd.conf 在相关的虚拟主机段,加入
<Directory /www/htdocs/path> php_admin_flag engine off </Directory> 其中 /www/htdocs/path 为要限制的目录
17. 如何配置apache的域名重定向
要把访问域名 www.domain1.com 的域名转发到 www.domain2.com 上
实现:
在相关的虚拟主机中增加 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^www.domain1.com$ RewriteRule ^(.*)$ http://www.domain2.com/$1 [R=301,L] </IfModule> 如果是多个域名重定向到一个域名 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^www.domain.com[OR] RewriteCond %{HTTP_HOST} ^www.domain1.com$ RewriteRule ^(.*)$ http://www.domain2.com/$1 [R=301,L] </IfModule>
18. 如何配置php的错误日志
vim php.ini 检查并配置如下两项
log_errors = On
error_log = logs/error.log
19. 如何在php中配置open_basedir, 是否可以在httpd.conf 中针对虚拟主机配置open_basedir?
vim php.ini
加入 open_basedir=/var/www/
httpd.conf中也可以针对虚拟主机限制openbasedir:
在相对应的虚拟主机配置文件中加入:
php_admin_value open_basedir "/var/www/htdocs"
20. 如何禁止php的函数exec
vim php.ini 找到
disable_functions =
改为
disable_functions = exec 如果是多个函数,可以在exec后面继续增加函数名用逗号分开即可
21. 我们以源码安装LAMP环境时,先安装哪个,后安装哪个?为什么呢?
安装顺序可以是 mysql apache php 也可以是 apache mysql php
把php放到最后,这是因为安装php时,需要指定mysql安装目录,也需要指定apache的apxs工具
22. 怎么确定你的php.ini 在哪个目录下?
php -i |grep 'Configuration File' 或 usr/local/php/bin/php -i |head
23. 怎么确定你的php的extension_dir 在哪里?
php -i |grep 'extension_dir'