第 四 十 三 天:Apache 的 相 关 问 题

小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'


你可能感兴趣的:(http,linux)