分类 Apache 下的文章

浏览器自动请求favicon导致重新访问一次主程序

语言:PHP
问题描述:自己写了一套程序实现简单的伪静态,就是将所有请求重定向到index.php,然后根据URI分发给不同的脚本处理。但运行起来发现,index.php总是比预想的多执行了一遍。

开始,自己以为是程序哪个地方出了问题,所以从头到尾检查,结果并没发现不合理的地方。最后没办法了,通过浏览器的network查看是不是访问时多发送了一次请求。
这一看就找到原因了:浏览器自动请求favicon.ico文件,但网站根目录不存在此文件,所以会重定向给index.php处理,于是主程序又背地里被执行了一遍。于是,我在伪静态里把类似的静态文件给排除掉了,无论找不找得到,都不会触发程序执行。

- 阅读剩余部分 -

apache按天生成访问日志,并指定存放位置

一、日志格式及按天分割

# 错误日志
ErrorLog "logs/error_log"

# 默认可用的访问日志格式,combined common referer ajent 是别名,CustomLog 时通过指定别名来使用相应的格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# 默认访问日志
CustomLog "logs/access_log" common

# 按天生成日志
CustomLog "| /usr/sbin/rotatelogs /etc/httpd/logs/access_log-%Y%m%d 86400 480" combined

二 关闭日志
错误日志没有开启关闭设置,只能通过设定不同级别来减少错误日志的记录,达到减慢日志生成速度。
其中,LogLevel用于调整记于错误日志中的信息的详细程度。(参阅ErrorLog指令)。可以选择下列级别,依照重要性降序排列:
Level Description Example
emerg 紧急 – 系统无法使用。 “Child cannot open lock file. Exiting”
alert 必须立即采取措施。 “getpwuid: couldn’t determine user name from uid”
crit 致命情况。 “socket: Failed to get a socket, exiting child”
error 错误情况。 “remature end of script headers”
warn 警告情况。 “child process 1234 did not exit, sending another SIGHUP”
notice 一般重要情况。 “httpd: caught SIGBUS, attempting to dump core in …”
info 普通信息。 “Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)…”
debug 出错级别信息 “Opening config file …”

默认级别是warn,那么warn级别以上的日志都会记录,会产生大量“文件不存在”的erro级别的错误日志。建议使用 crit 级别的设置,这样只记录致命级别以上的日志,有效减少日志数量。

访问日志关闭只需要注释 CustomLog 设置即可。

Apache禁止非法域名(未绑定域名) 访问服务器

针对Apache2.4.1 以前的版本


NameVirtualHost *:80 # 非常重要的虚拟主机设置,如果忽略此处,则特定主机设置无法生效。

# 直接拒绝所有非法域名
<VirtualHost *:80>
  ServerName *
  ServerAlias *
  <Location />
    Order Allow,Deny
    Deny from all
  </Location>
  ErrorLog "logs/error.log"
  CustomLog "logs/error.log" common
</VirtualHost>

针对Apache2.4.1 以后的版本

http2.4.1 以后不再需要NameVirtualHost以及不再支持ServerName * 这种写法。
使用ServerName 会报Invalid ServerName “” use ServerAlias to set multiple server names。
<VirtualHost *:80>
  ServerName 服务器ip
  ServerAlias *
  <Location />
    Order Allow,Deny
    Deny from all
  </Location>
</VirtualHost>

Apache 配置多个https站点

工作中经常会遇到在同一台服务器上部署多个https站点的情况,本文简单介绍实现方法。

假设apache已经安装了ssl模块。检测方法:cd /etc/httpd/modules;ll|grep ssl,如结果为 mod_ssl.so ,表示已经安装,如结果为空,则未安装。安装方法请自行搜索。

如服务器开启了iptables防火墙,请放开443端口

申请ssl证书,下载,部署到服务器相关目录

本人在腾讯云申请的免费 TrustAsia TLS RSA CA 证书
cd /etc/httpd/conf.d
mkdir crt
# 上传三个证书文件到 crt 目录
# 文件分别是:1_root_bundle.crt,2_www.domain.com_cert.crt 和私钥文件 3_www.domain.com.key
# 以上www.domain.com 请替换成自己的域名

修改apache配置

LoadModule ssl_module modules/mod_ssl.so
Listen 443
NameVirtualHost *:443 # 这一句很关键,否则只有第一个虚拟主机生效
# 第一个虚拟主机
<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName domaintest.cn
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/default/2_domaintest.cn.crt
SSLCertificateKeyFile /etc/httpd/ssl/default/3_domaintest.cn.key
SSLCertificateChainFile /etc/httpd/ssl/default/1_root_bundle.crt
</VirtualHost>
#第二个虚拟主机
<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName web.domaintest.cn
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/web/2_web.domaintest.cn.crt
SSLCertificateKeyFile /etc/httpd/ssl/web/3_web.domaintest.cn.key
SSLCertificateChainFile /etc/httpd/ssl/web/1_root_bundle.crt
</VirtualHost>

测试配置文件,无误后重启apache服务

httpd -t # 检测配置文件
httpd -k restart # 重启服务

Chrome浏览器检查元素,如看到绿色的 This page is secure(valid HTTPS). 字样,表示安装成功。

微信图片_20181205114633.png
至此,多站点https服务部署完成。

如何给 apache 开启 gzip 压缩

服务器设置 gzip 压缩是 web 开发里很普遍的做法。假设你要请求一个 100k 的文件,网络传输速度为 50k/s,需要 2s 才能得到数据,但是如果在服务器设置了 gzip 压缩,将服务端的文件压缩到了 50k(实际上的压缩率往往小于 50%),这时候只需 1s 就能得到数据,然后在客户端解压即可。

对比同一个文件在开启 gzip 前后的大小:

gzip压缩对比

那么如何给 apache 开启 gzip 服务呢?步骤如下:

- 阅读剩余部分 -