上海isp 发表于 2018-11-20 13:47:43

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

  小Q:人生的意志和劳动将创造奇迹般的奇迹。       —— 涅克拉索夫
  apache设置自定义header-----------------------------------------
  1. 在设置自定义header前,需要先检测一下你的httpd是否加载了mod_headers

  /usr/local/apache2/bin/apachectl-l
  否则需要重新编译一下了

  2.在httpd.conf 中加入

  
  Header add MyHeader "Hello"
  
  保存重启;双引号中的内容为自定义内容
  3. 测试
  curl-I http://localhost      看是否显示有MyHeader"Hello"
  Apache设置禁止访问.txt文件---------------------------------------

  Options -Indexes   FollowSymLinks
  AllowOverride All
  Order allow,deny
  Deny from all
  访问总是指向第一个虚拟主机--------------------------------------

  在配置apache多个虚拟主机的时候,访问总是指向第一个虚拟主机,
  加上 NameVirtualHost * 后解决问题.

  NameVirtualHost *
  
  DocumentRoot "F:/web/"
  ServerName localhost
  
  日志中记录代理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-cmod_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源代码,注意,一定是要相同版本的,否则编译不能成功。
  下载后,解压
  cdhttpd-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 (这句是要手动添加的)
  更改配置文件


    ServerName www.test.com
    CustomLog "/dev/null" combined
   ProxyRequests Off
      
      Order deny,allow
      Allow from all
      
    ProxyPass / http://www.test.com/
   ProxyPa***everse / 192.168.13.111/
  另外需要注意的是,需要在/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/apachectlgraceful
  

  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
  把该行最前面的#去掉,然后修改:

    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all

改为

    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
  再 vimconf/extra/httpd-vhosts.conf 根据实际需求修改
  

  13. 如何配置apache的用户验证
  vi   httpd.conf
  在相应的虚拟主机配置文件段,加入

            AllowOverride AuthConfig
            AuthName "自定义的"
            AuthType Basic
            AuthUserFile /data/.htpasswd    // 这个目录你可以随便写一个,没有限制
      require valid-user
  保存后,然后创建apache的验证用户 htpasswd -c /data/.htpasswdtest

  

  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 中加入


    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"
  

  16. 如何限定某个目录下的php文件没有执行权限
  vim httpd.conf   在相关的虚拟主机段,加入

    php_admin_flag engine off

其中 /www/htdocs/path 为要限制的目录  

  17. 如何配置apache的域名重定向
  要把访问域名 www.domain1.com 的域名转发到 www.domain2.com 上
  实现:
在相关的虚拟主机中增加
   
      RewriteEngine on
      RewriteCond %{HTTP_HOST} ^www.domain1.com$
      RewriteRule ^(.*)$ http://www.domain2.com/$1
   
如果是多个域名重定向到一个域名
   
      RewriteEngine on
      RewriteCond %{HTTP_HOST} ^www.domain.com
      RewriteCond %{HTTP_HOST} ^www.domain1.com$
      RewriteRule ^(.*)$ http://www.domain2.com/$1
      

  18. 如何配置php的错误日志
  vim php.ini 检查并配置如下两项
  log_errors = On
  error_log = logs/error.log
  

  19. 如何在php中配置open_basedir, 是否可以在httpd.conf 中针对虚拟主机配置open_basedir?
  vimphp.ini
  加入open_basedir=/var/www/
  httpd.conf中也可以针对虚拟主机限制openbasedir:
  在相对应的虚拟主机配置文件中加入:
  php_admin_value open_basedir "/var/www/htdocs"
  

  20. 如何禁止php的函数exec
  vimphp.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'
  




页: [1]
查看完整版本: 第 四 十 三 天:Apache 的 相 关 问 题